[Powered by Google Translate] [Minggu 5]
[David J. Malan - Universitas Harvard]
[Ini adalah CS50. - CS50.TV]
>> Ini adalah CS50, Minggu 5.
Hari ini dan minggu ini, kami memperkenalkan sedikit dunia forensik
dalam konteks Masalah Set 4.
Hari ini akan menjadi kuliah disingkat karena ada acara khusus di sini setelah itu.
Jadi kita akan mengintip dan menggoda para siswa dan orang tua sama hari ini
dengan beberapa hal yang ada di cakrawala.
>> Di antara mereka, pada hari Senin, Anda akan memiliki teman sekelas lagi.
EDX, Harvard dan MIT inisiatif online baru untuk OpenCourseWare dan lebih,
meluncurkan di kampus Harvard, Senin, yang berarti datang Senin
Anda akan memiliki, pada hitungan terakhir, 86.000 sekelas tambahan
yang akan mengikuti kuliah bersama dengan CS50 dan bagian
dan walkthrough dan set masalah.
Dan sebagai bagian dari ini, Anda akan menjadi anggota dari kelas perdana CS50 dan sekarang CS50x.
Sebagai bagian dari hal ini sekarang, menyadari bahwa akan ada beberapa upsides juga.
Untuk bersiap-siap untuk ini, untuk jumlah besar mahasiswa,
Cukuplah untuk mengatakan bahwa meskipun kita memiliki 108 TF dan CA,
itu tidak cukup terbaik rasio siswa-guru setelah kita memukul 80.000 dari siswa.
Kita tidak akan begitu banyak masalah kadar set manual,
sehingga diperkenalkan minggu ini di sejumlah masalah akan CS50 Check,
yang akan menjadi utilitas baris perintah dalam alat
bahwa Anda akan mendapatkan setelah Anda memperbarui nanti akhir pekan ini.
Anda akan dapat menjalankan perintah, check50, pada pset sendiri,
dan Anda akan mendapatkan umpan balik instan, apakah program anda sudah benar atau salah
sesuai dengan spesifikasi desain berbagai yang telah kami sediakan.
Lagi di dalam spesifikasi sejumlah masalah.
Para teman sekelas CS50x akan menggunakan ini juga.
>> Masalah Set 4 adalah semua tentang forensik,
dan pset ini benar-benar terinspirasi oleh beberapa hal kehidupan nyata
dimana ketika saya masih di sekolah pascasarjana, saya magang untuk sementara waktu
dengan kantor Middlesex County Jaksa Wilayah melakukan pekerjaan forensik
dengan peneliti utama forensik mereka.
Apa ini sebesar, karena saya pikir saya sebutkan beberapa minggu terakhir,
adalah Kepolisian Negara Misa atau orang lain akan datang,
mereka akan drop off hal-hal seperti hard drive dan CD dan disket dan sejenisnya,
dan kemudian tujuan kantor forensik adalah untuk memastikan
apakah ada atau tidak bukti dari beberapa macam.
Ini adalah Unit Investigasi Khusus, sehingga kejahatan kerah putih.
Itu adalah semacam lebih mengganggu kejahatan, apa pun yang melibatkan beberapa jenis media digital.
Ternyata tidak banyak orang menulis email yang mengatakan, "Aku melakukannya."
Jadi cukup sering, pencarian tersebut forensik tidak muncul semua yang banyak buah,
tapi kadang-kadang orang akan menulis email tersebut.
Jadi kadang-kadang, upaya dihargai.
>> Tapi untuk mengarah ke ini pset forensik, kami akan memperkenalkan pada pset4 sedikit grafis.
Anda mungkin mengambil hal-hal untuk diberikan - JPEG, GIF, dan sejenisnya - hari ini.
Tetapi jika Anda benar-benar berpikir tentang hal ini, gambar, seperti wajah Rob,
dapat dimodelkan sebagai urutan titik atau piksel.
Dalam kasus wajah Rob, ada segala macam warna,
dan kita mulai melihat titik-titik individu, atau dikenal sebagai piksel,
setelah kami mulai zoom in
Tetapi jika kita menyederhanakan dunia sedikit dan hanya mengatakan bahwa ini di sini adalah Rob dalam warna hitam dan putih,
untuk mewakili hitam dan putih, kita hanya bisa menggunakan biner.
Dan jika kita akan menggunakan biner, 1 atau 0, kita dapat mengungkapkan ini gambar yang sama
wajah Rob tersenyum dengan pola bit.
11000011 mewakili putih, putih, hitam, hitam, hitam, hitam, putih, putih.
Dan sehingga tidak lompatan besar kemudian mulai berbicara tentang foto-foto berwarna-warni,
hal-hal yang Anda akan melihat di Facebook atau mengambil dengan kamera digital.
Namun yang pasti ketika datang ke warna, Anda membutuhkan lebih banyak bit.
Dan cukup umum di dunia foto-foto adalah dengan menggunakan tidak 1-bit warna,
karena hal ini menunjukkan, tapi 24-bit warna, di mana Anda benar-benar mendapatkan jutaan warna.
Jadi seperti dalam kasus ketika kita menyorot mata Rob,
itu sejumlah jutaan kemungkinan warna-warni yang berbeda.
Jadi kita akan memperkenalkan dalam Set Soal 4 serta dalam walkthrough,
yang akan hari ini pada pukul 3:30 bukannya 02:30 biasanya karena kuliah hari Jumat di sini.
Tapi video akan online karena besok biasa.
>> Kami juga akan memperkenalkan Anda ke format lain file.
Hal ini sengaja dimaksudkan untuk terlihat menakutkan pada awalnya,
tapi ini hanya beberapa dokumentasi untuk struct C.
Ternyata Microsoft tahun lalu membantu mempopulerkan format ini
disebut format file bitmap, bmp, dan ini adalah super sederhana, format file grafis warna-warni
yang digunakan untuk beberapa waktu dan kadang-kadang masih untuk wallpaper di desktop.
Jika Anda berpikir kembali ke Windows XP dan bukit-bukit dan langit biru,
itu biasanya gambar bmp atau bitmap.
Bitmap yang menyenangkan bagi kami karena mereka memiliki kompleksitas sedikit lebih.
Ini tidak sesederhana ini grid 0s dan 1s.
Sebaliknya, Anda memiliki hal-hal seperti header pada awal file.
Jadi dengan kata lain, dalam sebuah file bmp. Adalah sejumlah besar 0s dan 1s,
tapi ada beberapa tambahan dan 0s 1s di sana.
Dan ternyata apa yang kita mungkin pernah diambil untuk diberikan selama bertahun-tahun -
format file seperti doc atau.. xls atau mp3,. mp4,. apapun format file
bahwa Anda akrab dengan - apa bahkan berarti menjadi format file,
karena pada akhir hari semua file-file kita menggunakan hanya memiliki 0s dan 1s.
Dan mungkin mereka 0s dan 1s mewakili ABC melalui ASCII atau sejenisnya,
tapi pada akhir hari, itu masih hanya 0s dan 1s.
Jadi manusia hanya sesekali memutuskan untuk menciptakan sebuah format file baru
di mana mereka standarisasi apa pola bit akan benar-benar berarti.
Dan dalam hal ini di sini, orang-orang yang merancang format file bitmap
mengatakan bahwa pada byte pertama dalam file bitmap, seperti yang dilambangkan dengan 0 mengimbangi sana,
ada akan beberapa bfType samar bernama disebut variabel,
yang hanya singkatan dari jenis file bitmap, apa jenis file bitmap ini.
Anda dapat menyimpulkan mungkin dari baris kedua yang diimbangi 2, byte nomor 2,
memiliki pola 0s dan 1s yang mewakili apa? Ukuran sesuatu.
Dan ia pergi dari sana.
Jadi dalam Set Soal 4, Anda akan berjalan melalui beberapa hal.
Kami tidak akan berakhir peduli tentang mereka semua.
Tapi perhatikan itu mulai mendapatkan menarik di sekitar byte 54: rgbtBlue, Hijau, dan Merah.
Jika Anda pernah mendengar singkatan RGB - merah, hijau, biru - ini adalah referensi untuk itu
karena ternyata Anda bisa melukis semua warna pelangi
dengan beberapa kombinasi merah dan biru dan hijau.
Dan pada kenyataannya, orang tua di dalam ruangan ingat beberapa proyektor awal.
Hari-hari ini, Anda hanya melihat satu cahaya terang keluar dari lensa,
tapi kembali pada hari Anda memiliki lensa merah, lensa biru, dan lensa hijau,
dan bersama-sama mereka bertujuan untuk layar dan membentuk gambar berwarna-warni.
Dan cukup sering, sekolah menengah dan sekolah tinggi akan memiliki orang-lensa
pernah jadi sedikit miring, sehingga Anda semacam melihat gambar dua atau tiga.
Tapi itu ide. Anda memiliki lampu merah dan hijau dan biru melukis gambar.
Dan prinsip yang sama digunakan dalam komputer.
>> Jadi salah satu tantangan maka untuk Anda dalam Soal Set 4 akan menjadi beberapa hal.
Salah satunya adalah untuk benar-benar mengubah ukuran gambar, untuk mengambil dalam pola 0s dan 1s,
mencari tahu yang potongan 0s dan 1s mewakili apa dalam struktur seperti ini,
dan kemudian mencari cara untuk meniru piksel - yang merah, blues, hijau -
dalam sehingga ketika gambar terlihat seperti ini pada awalnya,
mungkin terlihat seperti ini, bukan setelah itu.
Di antara tantangan lain juga akan menjadi bahwa Anda akan menyerahkan gambar forensik
dari file yang sebenarnya dari kamera digital.
Dan pada kamera itu, sekali waktu, adalah sejumlah foto.
Masalahnya adalah kita tidak sengaja terhapus atau memiliki gambar rusak entah bagaimana.
Hal-hal buruk terjadi dengan kamera digital.
Dan jadi kita cepat menyalin semua off 0s dan 1s kartu itu untuk Anda,
menyelamatkan mereka semua dalam satu file besar, dan kemudian kami akan menyerahkan mereka kepada Anda dalam Masalah Set 4
sehingga Anda dapat menulis sebuah program dalam C yang dapat digunakan untuk memulihkan semua orang JPEG, idealnya.
Dan ternyata JPEG, meskipun mereka sedikit dari format file yang kompleks -
mereka jauh lebih kompleks dari ini wajah tersenyum di sini -
ternyata setiap JPEG dimulai dengan pola yang sama dari 0s dan 1s.
Jadi menggunakan, pada akhirnya, while loop atau untuk loop atau serupa,
Anda dapat iterate atas semua 0s dan 1s dalam gambar forensik,
dan setiap kali Anda melihat pola khusus yang didefinisikan dalam spesifikasi sejumlah masalah,
Anda dapat mengasumsikan di sini adalah, dengan probabilitas yang sangat tinggi, awal dari JPEG.
Dan segera setelah Anda menemukan pola yang sama beberapa jumlah byte
atau kilobyte atau megabyte kemudian, Anda dapat mengasumsikan di sini adalah JPEG kedua,
foto saya ambil setelah yang pertama.
Biarkan saya berhenti membaca bahwa file pertama, mulai menulis satu ini baru,
dan output dari program anda untuk pset4 akan menjadi sebanyak 50 JPEGs.
Dan jika itu bukan 50 JPEGs, Anda memiliki sedikit loop.
Jika Anda memiliki jumlah tak terbatas file JPEG, Anda memiliki loop tak terbatas.
Jadi itu juga akan cukup kasus umum.
Jadi itulah apa yang ada di cakrawala.
>> Kuis 0 di belakang kami, menyadari per email saya yang selalu ada orang-orang yang sama-sama senang,
semacam netral, dan sedih sekitar kuis 0 waktu.
Dan jangan menjangkau saya, kepala TF Zamyla, TF sendiri,
atau salah satu dari CA yang Anda tahu jika Anda ingin membahas bagaimana hal-hal pergi.
>> Jadi untuk mengesankan orang tua di sini di dalam ruangan, apa perpustakaan CS50?
[Tertawa] Good job.
Apa perpustakaan CS50? Ya. >> [Mahasiswa] Ini satu set pra-tertulis kode [tak terdengar]
Oke, baik.
Ini adalah set pra-tertulis kode yang kita tulis staf, kami sediakan untuk Anda,
yang menyediakan beberapa fungsi umum,
hal-hal seperti mendapatkan saya string, mendapatkan saya int - semua fungsi yang tercantum di sini.
>> Mulai sekarang, kita mulai untuk benar-benar mengambil langkah-roda pelatihan off.
Kita akan mulai mengambil string dari Anda,
yang ingat hanya sinonim untuk apa sebenarnya tipe data? >> [Siswa beberapa] Char *.
Char *. Bagi orang tua, yang mungkin [membuat suara mendesing]. Itu bagus.
* Char kita akan mulai melihat pada layar semua lebih seperti yang kita menghapus string dari kosakata kami,
setidaknya ketika datang untuk benar-benar menulis kode.
Demikian pula, kita akan berhenti menggunakan beberapa fungsi sebanyak
karena program kami akan mendapatkan lebih canggih.
Daripada hanya menulis program yang duduk di sana dengan berkedip cepat,
menunggu pengguna untuk mengetik sesuatu di, Anda akan mendapatkan masukan Anda dari tempat lain.
Misalnya, Anda akan mendapatkan mereka dari serangkaian bit pada hard drive lokal.
Anda malah akan mendapatkan mereka di masa depan dari koneksi jaringan,
beberapa situs di suatu tempat.
>> Jadi mari kita mengupas lapisan ini untuk pertama kalinya dan naikkan Appliance CS50
dan file ini disebut cs50.h, yang Anda telah # termasuk selama berminggu-minggu,
tetapi mari kita benar-benar melihat apa yang di dalam hal ini.
Bagian atas dari file dengan warna biru adalah hanya sekelompok seluruh komentar:
Informasi garansi dan lisensi.
Ini adalah semacam paradigma umum dalam perangkat lunak
karena banyak perangkat lunak hari ini adalah apa yang disebut open source,
yang berarti bahwa seseorang telah menulis kode dan membuatnya tersedia secara bebas
tidak hanya untuk menjalankan dan menggunakan tetapi untuk benar-benar membaca dan mengubah dan mengintegrasikan ke dalam pekerjaan Anda sendiri.
Jadi itulah yang Anda telah menggunakan, perangkat lunak open source, meskipun dalam bentuk yang sangat kecil.
Jika saya scroll ke bawah melewati komentar, meskipun, kita akan mulai melihat beberapa hal yang lebih akrab.
Perhatikan di bagian atas di sini bahwa file cs50.h mencakup sejumlah besar file header.
Sebagian besar, kita belum melihat sebelumnya, tapi satu akrab.
Mana yang telah kita lihat, meskipun sebentar, sejauh ini? >> [Mahasiswa] perpustakaan Standard.
Ya, perpustakaan standar. stdlib.h memiliki malloc.
Begitu kita mulai berbicara tentang alokasi memori dinamis,
yang kita akan kembali ke minggu depan juga, kami mulai termasuk file tersebut.
Ternyata bool dan benar dan salah tidak benar-benar ada di C per se
kecuali Anda menyertakan file ini di sini.
Kami telah selama berminggu-minggu telah termasuk stdbool.h
sehingga Anda dapat menggunakan gagasan bool, benar atau salah.
Tanpa ini, Anda harus semacam palsu dan menggunakan int
sewenang-wenang dan hanya berasumsi bahwa 0 adalah palsu dan 1 adalah benar.
Jika kita scroll ke bawah lebih jauh, di sini adalah definisi kita tentang string.
Ternyata, seperti yang telah kita katakan sebelumnya, bahwa di mana bintang ini tidak terlalu penting.
Anda bahkan dapat memiliki ruang di sekitar.
Kami semester ini telah mempromosikan sebagai ini untuk membuat jelas
bahwa bintang hubungannya dengan jenis,
tapi menyadari seperti biasa, jika tidak sedikit lebih umum,
adalah untuk menaruhnya di sana, tapi fungsional itu adalah hal yang sama.
Tapi sekarang jika kita membaca turun lebih jauh, mari kita lihat GetInt
karena kami menggunakan bahwa mungkin pertama sebelum hal lain semester ini.
Berikut adalah GetInt. Ini adalah apa? >> [Mahasiswa] prototipe. >> Ini hanya prototipe.
Seringkali, kami telah menempatkan prototipe pada puncak-puncak kami. File c,
tetapi Anda juga dapat menempatkan prototipe di file header, file h., seperti ini satu di sini
sehingga ketika Anda menulis beberapa fungsi yang Anda ingin orang lain dapat menggunakan,
yang persis terjadi dengan perpustakaan CS50,
Anda tidak hanya melaksanakan fungsi Anda dalam sesuatu seperti cs50.c,
Anda juga menempatkan prototipe tidak di bagian atas file itu, tetapi di bagian atas file header.
Kemudian file header apa yang teman-teman dan rekan termasuk
dengan # include dalam kode mereka sendiri.
Jadi sepanjang waktu ini, Anda sudah termasuk semua prototipe,
efektif di bagian atas file Anda, tetapi dengan cara ini # include mekanisme,
yang pada dasarnya salinan dan pasta file ini ke Anda sendiri.
Berikut adalah beberapa dokumentasi yang cukup rinci.
Kami sudah cukup banyak diambil begitu saja bahwa GetInt mendapat int,
tapi ternyata ada beberapa kasus sudut.
Bagaimana jika pengguna jenis dalam jumlah yang terlalu besar, triliun,
yang tidak bisa cocok dalam int? Apa perilaku yang diharapkan?
Idealnya, itu diprediksi.
Jadi dalam hal ini, jika Anda benar-benar membaca baik cetak,
Anda benar-benar akan melihat bahwa jika baris tidak dapat dibaca, ini INT_MAX kembali.
Kami tidak pernah membicarakan hal ini, namun berdasarkan kapitalisasinya, apa mungkin?
[Mahasiswa] A konstan. >> Ini adalah konstan.
Ini adalah beberapa konstanta khusus yang mungkin dinyatakan dalam salah satu file header
itu terserah lebih tinggi dalam file, dan INT_MAX mungkin sesuatu seperti sekitar 2 miliar,
gagasan bahwa karena kita perlu entah bagaimana menandakan sesuatu yang tidak beres,
kita, ya, memiliki 4 miliar angka yang kita miliki: -2 miliar hingga 2 miliar, memberi atau mengambil.
Nah, apa yang umum dalam pemrograman adalah Anda mencuri hanya salah satu dari angka-angka,
mungkin 0, mungkin 2 miliar, mungkin -2000000000,
sehingga Anda menghabiskan satu nilai yang mungkin Anda sehingga Anda dapat berkomitmen untuk dunia
bahwa jika sesuatu yang tidak beres, saya akan kembali nilai ini super besar.
Tapi Anda tidak ingin pengguna mengetik sesuatu yang samar seperti 234 ..., jumlah yang sangat besar.
Anda menggeneralisasikannya bukan sebagai konstan.
Jadi benar-benar, jika Anda sedang anal beberapa minggu terakhir, setiap kali Anda disebut GetInt,
Anda seharusnya memeriksa dengan jika kondisi melakukan tipe user di INT_MAX,
atau, lebih khusus, melakukan INT_MAX kembali GetInt, karena jika itu terjadi,
yang benar-benar berarti mereka tidak mengetiknya. Sesuatu yang tidak beres dalam kasus ini.
Jadi ini adalah apa yang umumnya dikenal sebagai nilai sentinel, yang hanya berarti istimewa.
>> Mari kita sekarang berubah menjadi file c..
File C telah ada di alat untuk beberapa waktu.
Dan pada kenyataannya, alat itu memiliki pra-dikompilasi untuk Anda ke dalam hal yang kita disebut kode obyek,
namun hal itu tidak menjadi masalah bagi Anda di mana itu karena sistem mengetahui
dalam kasus ini di mana itu adalah: alat.
Mari kita scroll ke bawah sekarang untuk GetInt dan melihat bagaimana GetInt telah bekerja sepanjang waktu ini.
Di sini kita memiliki komentar serupa dari sebelumnya.
Biarkan aku memperbesar hanya bagian kode.
Dan apa yang kita miliki untuk GetInt adalah sebagai berikut.
Dibutuhkan tidak ada masukan.
Ini mengembalikan sebuah int, sementara (benar), jadi kami memiliki loop tak terbatas yang disengaja,
tapi mungkin kita akan keluar dari ini entah bagaimana atau kembali dari dalam ini.
>> Mari kita lihat bagaimana ini bekerja.
Kami tampaknya akan menggunakan GetString di baris pertama dalam lingkaran, 166.
Sekarang ini adalah praktek yang baik karena dalam keadaan apa bisa kembali GetString
NULL khusus kata kunci? >> [Mahasiswa] Jika sesuatu yang tidak beres.
Jika sesuatu yang tidak beres. Dan apa yang bisa salah ketika Anda menelepon sesuatu seperti GetString?
Ya. >> [Mahasiswa] malloc gagal untuk memberikan para ints.
Ya. Mungkin malloc gagal.
Suatu tempat di bawah kap mesin, GetString memanggil malloc, yang mengalokasikan memori,
yang memungkinkan toko komputer semua karakter
bahwa pengguna jenis ke keyboard.
Dan misalkan pengguna memiliki seluruh banyak waktu luang dan mengetik lebih, misalnya,
dari 2 miliar karakter, karakter lebih dari komputer bahkan memiliki RAM.
GetString harus mampu untuk menandakan bahwa Anda.
Bahkan jika ini adalah kasus, sudut super super biasa,
itu entah bagaimana bisa menangani hal ini,
dan begitu GetString, jika kami kembali dan membaca dokumentasinya, tidak dalam kenyataannya NULL kembali.
Jadi sekarang jika GetString gagal dengan mengembalikan NULL, GetInt akan gagal dengan kembali INT_MAX
hanya sebagai sentinel. Ini hanya konvensi manusia.
Satu-satunya cara Anda akan tahu hal ini terjadi adalah dengan membaca dokumentasi.
>> Mari kita gulir ke bawah ke mana int sebenarnya mendapat.
Jika saya gulir ke bawah sedikit lebih jauh, sejalan 170, kami memiliki komentar di atas garis-garis.
Kami menyatakan di 172 int, n, dan char, c, dan kemudian fungsi baru ini,
yang beberapa dari Anda telah sengaja menemukan sebelumnya, sscanf.
Ini adalah singkatan untuk scanf string.
Dengan kata lain, memberikan string dan saya akan memindai untuk potongan informasi yang menarik.
Apa artinya?
Misalkan bahwa saya ketik, secara harfiah, 123 di keyboard dan kemudian tekan Enter.
Apa tipe data dari 123 saat dikembalikan oleh GetString? >> [Mahasiswa] String.
Ini jelas string, kan? Aku punya string.
Jadi benar-benar 123, kutipan-tanda kutip, 123 dengan \ 0 pada akhir itu.
Itu bukan sebuah int. Itu bukan angka. Sepertinya nomor tapi itu tidak benar-benar.
Jadi apa GetInt lakukan?
Hal ini untuk memindai bahwa string kiri ke kanan - 123 \ 0 - dan entah bagaimana mengkonversi ke integer yang sebenarnya.
Anda bisa mencari cara untuk melakukan hal ini.
Jika Anda berpikir kembali ke pset2, Anda mungkin mendapat sedikit nyaman dengan Caesar
atau Vigenere, sehingga Anda dapat iterate selama string, Anda dapat mengkonversi karakter untuk ints.
Tapi heck, itu seluruh banyak pekerjaan.
Mengapa tidak memanggil fungsi seperti sscanf yang melakukan itu untuk Anda?
Jadi sscanf mengharapkan argumen - dalam hal ini disebut garis, yang merupakan string.
Anda kemudian tentukan dalam tanda kutip, sangat mirip dengan printf, apa yang Anda harapkan untuk melihat dalam string ini.
Dan apa yang saya katakan di sini adalah saya berharap untuk melihat angka desimal dan mungkin karakter.
Dan kita akan melihat mengapa hal ini terjadi hanya dalam beberapa saat.
Dan ternyata bahwa notasi ini sekarang mengingatkan hal-hal yang kita mulai berbicara tentang
lebih dari seminggu yang lalu.
Apa & n dan c & lakukan bagi kita di sini? >> [Mahasiswa] Alamat n dan alamat c.
Ya. Ini memberi saya alamat n dan alamat c. Mengapa itu penting?
Anda tahu bahwa dengan fungsi di C, Anda selalu dapat mengembalikan nilai atau nilai sama sekali.
Anda dapat mengembalikan int, string, pelampung, char, apapun, atau Anda dapat kembali batal,
tapi Anda hanya dapat kembali satu hal maksimal.
Tapi di sini kami ingin sscanf untuk kembali saya mungkin sebuah int, angka desimal,
dan juga char, dan saya akan menjelaskan mengapa char dalam sekejap.
Anda ingin efektif sscanf kembali dua hal, tapi itu hanya tidak mungkin dalam C.
Anda dapat bekerja di sekitar bahwa dengan lewat di dua alamat
karena segera setelah Anda menyerahkan fungsi dua alamat,
apa yang bisa fungsi yang lakukan dengan mereka? >> [Mahasiswa] Menulis ke alamat tersebut.
Hal ini dapat menulis ke alamat tersebut.
Anda dapat menggunakan operasi bintang dan pergi ke sana, ke masing-masing alamat.
Ini semacam mekanisme back-pintu tapi sangat umum untuk mengubah nilai-nilai variabel
lebih dari hanya satu tempat - dalam hal ini, dua.
Sekarang perhatikan aku memeriksa == 1 dan kemudian kembali n jika itu tidak, pada kenyataannya, mengevaluasi dengan benar.
Jadi apa yang terjadi? Secara teknis, semua kita benar-benar ingin terjadi dalam GetInt ini.
Kami ingin mengurai, sehingga untuk berbicara, kita ingin membaca string - kutipan-tanda kutip 123 -
dan jika terlihat seperti ada sejumlah sana, apa yang kita memberitahu sscanf untuk melakukan
yang menempatkan bahwa nomor - 123 - dalam hal ini variabel n bagi saya.
Jadi mengapa kemudian aku benar-benar memiliki ini juga?
Apa peran sscanf mengatakan Anda mungkin juga mendapatkan karakter di sini?
[Respon siswa terdengar] >> Sebuah titik desimal benar-benar bisa bekerja.
Mari kita menganggap bahwa berpikir sejenak. Apa lagi?
[Mahasiswa] Ini bisa menjadi NULL. Baik >> pikiran. Ini bisa menjadi karakter null.
Ini sebenarnya tidak dalam kasus ini. Ya. >> [Mahasiswa] ASCII.
ASCII. Atau biarkan aku menggeneralisasi lebih jauh.
The c% ada hanya untuk pengecekan error.
Kami tidak ingin ada karakter setelah nomor,
tapi apa ini memungkinkan saya lakukan adalah sebagai berikut.
Ternyata sscanf, selain menyimpan nilai-nilai dalam n dan c dalam contoh ini di sini,
apa itu juga tidak itu mengembalikan jumlah variabel itu menempatkan nilai masuk
Jadi jika Anda hanya mengetik 123, maka hanya% d akan cocok,
dan hanya n akan disimpan dengan nilai seperti 123,
dan tidak akan dimasukkan ke dalam c.
C tetap menjadi nilai sampah, sehingga untuk berbicara -
sampah karena itu tidak pernah diinisialisasi untuk beberapa nilai.
Jadi dalam hal ini, sscanf mengembalikan 1 karena saya penduduknya 1 dari mereka pointer,
dalam hal yang besar, saya memiliki sebuah int jadi saya membebaskan garis untuk membebaskan memori
GetString yang benar-benar dialokasikan, dan kemudian aku kembali n,
lain jika Anda pernah bertanya-tanya mana yang Retry pernyataan berasal dari, itu berasal dari sini.
Jadi jika, sebaliknya, saya ketik di 123foo - hanya beberapa urutan acak teks -
sscanf akan melihat nomor, nomor, nomor, f,
dan itu akan menempatkan 123 dalam n, itu akan menempatkan f di c dan kemudian kembali 2.
Jadi kita miliki, hanya menggunakan definisi dasar dari perilaku sscanf itu, cara yang sangat sederhana -
baik, kompleks pada pandangan pertama tetapi pada akhir hari mekanisme yang cukup sederhana -
mengatakan ada int dan jika demikian, adalah bahwa satu-satunya hal yang saya temukan?
Dan spasi di sini adalah disengaja.
Jika Anda membaca dokumentasi untuk sscanf, ia memberitahu Anda bahwa jika Anda memasukkan sepotong spasi
di awal atau akhir, sscanf juga akan memungkinkan pengguna, untuk alasan apapun,
untuk memukul 123 ruang bar dan yang akan sah.
Anda tidak akan berteriak pada pengguna hanya karena mereka memukul spasi
di awal atau akhir, yang hanya sedikit lebih user-friendly.
>> Setiap pertanyaan kemudian pada GetInt? Ya. >> [Mahasiswa] Bagaimana jika Anda hanya dimasukkan ke dalam char?
Pertanyaan bagus.
Bagaimana jika Anda hanya mengetik dalam char seperti f dan tekan Enter tanpa pernah mengetik 123?
Apa yang Anda pikir perilaku ini baris kode maka akan?
[Respon siswa tidak terdengar]
Ya, sehingga sscanf dapat menutupi itu juga karena dalam kasus itu, itu tidak akan mengisi n atau c.
Ini akan bukannya kembali 0, dalam hal ini saya juga menangkap skenario itu
karena nilai yang diharapkan saya inginkan adalah 1.
Aku hanya ingin satu dan hanya satu hal yang harus diisi. Pertanyaan bagus.
>> Lainnya? Baiklah.
>> Jangan pergi melalui semua fungsi di sini,
tapi satu yang tampaknya mungkin sisa saham yang GetString
karena ternyata GetFloat, GetInt, GetDouble, GetLongLong
semua tendangan banyak fungsi mereka untuk GetString.
Jadi mari kita lihat bagaimana ia diimplementasikan di sini.
Ini terlihat sedikit rumit, tetapi menggunakan dasar-dasar yang sama
bahwa kita mulai berbicara tentang minggu lalu.
Dalam GetString, yang mengambil argumen tidak sesuai kekosongan di sini
dan ia mengembalikan string, saya ternyata saya menyatakan string disebut buffer.
Saya tidak benar-benar tahu apa yang akan digunakan untuk, tapi kita akan lihat.
Sepertinya kapasitas secara default 0.
Tidak yakin di mana ini akan, tidak yakin apa n akan digunakan untuk belum,
tapi sekarang itu mendapatkan sedikit lebih menarik.
Sejalan 243, kami mendeklarasikan int, c.
Ini adalah semacam detail bodoh.
Char adalah 8 bit, dan 8 bit dapat menyimpan berapa banyak nilai yang berbeda? >> [Mahasiswa] 256. >> 256.
Masalahnya adalah jika Anda ingin memiliki 256 karakter ASCII yang berbeda, yang ada
jika Anda berpikir kembali - dan ini bukan sesuatu untuk menghafal.
Tetapi jika Anda berpikir kembali ke tabel ASCII besar kami memiliki minggu yang lalu,
ada dalam kasus itu 128 atau 256 karakter ASCII.
Kami menggunakan semua pola sampai 0s dan 1s.
Itulah masalah jika Anda ingin dapat mendeteksi kesalahan
karena jika Anda telah menggunakan 256 nilai untuk karakter Anda,
Anda tidak benar-benar merencanakan ke depan karena sekarang Anda tidak memiliki cara untuk mengatakan,
ini bukan karakter legit, ini adalah beberapa pesan yang keliru.
Jadi apa yang dunia tidak adalah mereka menggunakan nilai terbesar berikutnya, sesuatu seperti int,
sehingga Anda memiliki sejumlah gila bit, 32, 4 miliar untuk nilai yang mungkin
sehingga Anda hanya dapat berakhir dengan menggunakan dasarnya 257 dari mereka,
1 dari yang memiliki beberapa arti khusus sebagai kesalahan.
>> Jadi mari kita lihat bagaimana ini bekerja.
Sejalan 246, aku punya while loop besar yang memanggil fgetc,
f berarti file, sehingga getc, dan kemudian stdin.
Ternyata ini hanya cara yang lebih tepat untuk mengatakan membaca input dari keyboard.
Input keyboard cara standar, output standar berarti layar,
dan standard error, yang akan kita lihat di pset4, berarti layar
tapi bagian khusus dari layar sehingga itu tidak digabungkan dengan output aktual
yang dimaksudkan untuk mencetak. Tapi lebih pada bahwa di masa depan.
Jadi fgetc hanya berarti membaca satu karakter dari keyboard dan menyimpannya di mana?
Menyimpannya dalam c.
Dan kemudian memeriksa - jadi saya hanya menggunakan beberapa konjungsi Boolean sini -
memeriksa bahwa itu tidak sama - \ n, sehingga pengguna telah menekan Enter, kami ingin berhenti di titik itu,
akhir loop - dan kami juga ingin untuk memeriksa EOF konstan khusus,
yang jika Anda tahu atau menebak, apa berdiri? >> [Mahasiswa] Akhir file. Akhir >> file.
Ini adalah jenis masuk akal karena jika saya sedang mengetik di keyboard,
ada benar-benar ada file yang terlibat dalam hal ini,
tapi ini hanya semacam istilah generik yang digunakan untuk berarti
bahwa tidak ada lagi yang berasal dari jari-jari manusia.
EOF - akhir file.
Sebagai samping, jika Anda pernah menekan Control D di keyboard Anda, bahwa Anda tidak akan belum -
Anda telah memukul Kontrol C - Kontrol D mengirimkan konstan ini khusus yang disebut EOF.
Jadi sekarang kita hanya memiliki beberapa alokasi memori dinamis.
>> Jadi, jika (n + 1> kapasitas). Sekarang saya akan menjelaskan n.
N hanya berapa banyak byte yang saat ini dalam buffer,
string yang saat ini Anda membangun dari pengguna.
Jika Anda memiliki lebih banyak karakter dalam buffer Anda daripada Anda memiliki kapasitas buffer,
intuitif apa yang perlu kita lakukan kemudian mengalokasikan kapasitas yang lebih besar.
Jadi aku akan skim atas beberapa aritmatika sini dan fokus hanya pada fungsi ini di sini.
Anda tahu apa yang malloc atau setidaknya umumnya akrab.
Coba tebak apa yang realloc tidak. >> [Mahasiswa] Menambahkan memori.
Ini tidak cukup menambahkan memori. Ini direalokasi memori sebagai berikut.
Jika masih ada ruang di akhir string untuk memberikan Anda lebih banyak memori yang
daripada awalnya memberi Anda, maka Anda akan mendapatkan memori tambahan.
Jadi Anda hanya dapat tetap menempatkan karakter string yang kembali untuk kembali ke kembali ke belakang.
Tapi kalau itu tidak terjadi karena Anda menunggu terlalu lama
dan sesuatu yang acak mendapat plopped di memori ada
tapi ada memori tambahan di sini, tidak apa-apa.
Realloc akan melakukan semua angkat berat untuk Anda,
memindahkan string yang Anda sudah membaca dalam sehingga jauh dari sini, meletakkannya di sana,
dan kemudian memberikan landasan pacu lagi pada saat itu.
>> Jadi dengan gelombang tangan, saya katakan bahwa apa yang dilakukan GetString
yang itu dimulai dengan buffer kecil, mungkin satu karakter tunggal,
dan jika pengguna jenis dalam dua karakter, GetString berakhir menelepon dan mengatakan realloc
satu karakter tidak cukup, memberi saya dua karakter.
Kemudian jika Anda membaca melalui logika loop, itu akan mengatakan
pengguna mengetik dalam 3 karakter, memberi saya sekarang tidak 2 tapi 4 karakter,
kemudian memberikan saya 8, kemudian memberi saya 16 dan 32.
Fakta bahwa aku dua kali lipat kapasitas setiap kali
berarti bahwa buffer tidak akan tumbuh perlahan-lahan, itu akan tumbuh super cepat.
Dan apa yang mungkin keuntungan dari itu?
Mengapa saya menggandakan ukuran buffer
meskipun pengguna mungkin hanya perlu satu karakter tambahan dari keyboard?
[Respon siswa terdengar] >> Apa itu? >> [Mahasiswa] Anda tidak harus tumbuh sebagai sering.
Tepat. Anda tidak harus tumbuh sebagai sering.
Dan ini hanya semacam Anda lindung nilai taruhan Anda di sini,
gagasan bahwa Anda tidak ingin memanggil realloc banyak karena itu cenderung menjadi lambat.
Setiap kali Anda meminta sistem operasi untuk memori,
karena Anda akan segera melihat dalam satu set masalah masa depan, ia cenderung untuk mengambil beberapa waktu.
Jadi meminimalkan jumlah waktu, bahkan jika Anda membuang-buang beberapa ruang,
cenderung menjadi hal yang baik.
>> Tetapi jika kita membaca bagian akhir dari GetString sini -
dan lagi memahami setiap baris di sini tidak begitu penting saat ini -
melihat bahwa hal itu akhirnya panggilan malloc lagi
dan mengalokasikan persis seperti byte yang dibutuhkan untuk string
dan kemudian membuang dengan menelepon bebas buffer terlalu besar
jika memang mendapat dua kali lipat kali terlalu banyak.
Jadi singkatnya, itulah cara GetString telah bekerja sepanjang waktu ini.
Semua yang dilakukannya adalah membaca satu karakter pada satu waktu lagi dan lagi dan lagi,
dan setiap kali dibutuhkan beberapa memori tambahan, ia meminta sistem operasi untuk itu
dengan menelepon realloc.
>> Ada pertanyaan? Baiklah.
>> Serangan.
Sekarang kita mengerti pointer atau setidaknya semakin akrab dengan pointer,
mari kita mempertimbangkan bagaimana seluruh dunia mulai runtuh
jika Anda tidak cukup mempertahankan terhadap pengguna permusuhan,
orang-orang yang mencoba untuk hack ke dalam sistem Anda,
orang-orang yang mencoba untuk mencuri perangkat lunak Anda dengan menghindari beberapa kode registrasi
bahwa mereka dinyatakan mungkin harus mengetik masuk
>> Lihatlah contoh ini di sini, yang hanya kode C yang memiliki fungsi utama di bagian bawah
yang memanggil fungsi foo. Dan apa itu lewat untuk foo?
[Mahasiswa] Sebuah argumen tunggal. >> [Malan] Sebuah argumen tunggal.
Jadi argv [1], yang berarti kata pertama yang pengguna mengetik di baris perintah
setelah a.out atau apa pun program yang disebut.
Jadi foo di atas diperlukan dalam char *. Tapi char * hanya apa? >> [Mahasiswa] Sebuah string.
[Malan] string, jadi tidak ada yang baru di sini.
Itu string sewenang-wenang yang disebut bar.
Dalam baris ini di sini, char c [12], dalam semacam semi-teknis bahasa Inggris, apa yang baris ini lakukan?
[Mahasiswa] Array - Array >> dari? >> [Mahasiswa] Karakter. Karakter >>.
Berikan saya sebuah array dari 12 karakter. Jadi kita sebut ini buffer.
Ini secara teknis disebut c, tapi penyangga dalam pemrograman hanya berarti sekelompok ruang
bahwa Anda dapat menaruh beberapa hal masuk
Kemudian yang terakhir, memcpy kita sudah tidak digunakan sebelumnya, tapi Anda mungkin bisa menebak apa yang dilakukannya.
Ini salinan memori. Apa yang dilakukannya?
Ini rupanya salinan bar, input, ke c tapi hanya sampai panjang bar.
Tapi ada bug di sini. >> [Mahasiswa] Anda perlu karakter sizeof. Oke >>.
Secara teknis, kita benar-benar harus melakukan strlen (bar) * sizeof (char)). Itu benar.
Tapi dalam kasus terburuk di sini, mari kita asumsikan bahwa ltu -
Oke. Lalu ada dua bug.
Jadi sizeof (char));
Mari kita membuat ini sedikit lebih lebar.
Jadi sekarang masih ada bug, yang adalah apa? >> [Respon siswa tidak terdengar]
Periksa apa? >> [Mahasiswa] Periksa NULL.
Kita umumnya harus memeriksa NULL karena hal-hal buruk terjadi
ketika pointer Anda adalah NULL karena Anda mungkin berakhir pergi ke sana,
dan Anda seharusnya tidak pernah pergi ke NULL dengan dereferencing dengan operator bintang.
Jadi itu bagus. Dan apa lagi yang kita lakukan? Logikanya, ada cacat di sini juga.
[Mahasiswa] Periksa apakah argc adalah> = untuk 2.
Jadi memeriksa apakah argc adalah> = 2. Oke, jadi ada tiga bug dalam program ini di sini.
Kami sekarang memeriksa apakah pengguna benar-benar mengetik sesuatu ke argv [1]. Baik.
Jadi apa bug ketiga? Ya. >> [Mahasiswa] C mungkin tidak cukup besar.
Baik. Kami memeriksa satu skenario.
Kami implisit diperiksa tidak menyalin memori lebih dari akan melebihi panjang bar.
Jadi jika string pengguna mengetik adalah 10 karakter,
ini mengatakan hanya menyalin 10 karakter. Dan tidak apa-apa.
Tapi bagaimana jika pengguna mengetik sebuah kata pada prompt seperti kata 20-karakter?
Ini mengatakan copy 20 karakter dari bar ke dalam apa?
C, atau dikenal sebagai penyangga kami, yang berarti Anda hanya menulis data yang
sampai 8 byte lokasi yang bukan milik Anda,
dan Anda tidak memiliki mereka dalam arti bahwa Anda tidak pernah dialokasikan mereka.
Jadi ini adalah apa yang umumnya dikenal sebagai serangan buffer overflow atau serangan buffer overrun.
Dan itu serangan dalam arti bahwa jika pengguna atau program yang memanggil fungsi Anda
melakukan ini jahat, apa yang sebenarnya terjadi berikutnya benar-benar bisa menjadi sangat buruk.
>> Jadi mari kita lihat gambar ini di sini.
Gambar ini merupakan tumpukan memori Anda.
Ingat bahwa setiap kali Anda memanggil fungsi Anda mendapatkan bingkai kecil di stack
dan kemudian lain dan kemudian dan lain lain.
Dan sejauh ini, kami sudah hanya jenis ini disarikan sebagai persegi panjang
baik di papan tulis atau pada layar di sini.
Tetapi jika kita memperbesar salah satu persegi panjang, ketika Anda memanggil foo fungsi,
ternyata ada lebih di bagian dalam tumpukan bingkai bahwa dalam persegi panjang yang
dari sekedar x dan y dan a dan b, seperti kita berbicara tentang swap.
Ternyata bahwa ada beberapa tingkat rendah rincian, di antaranya Alamat Kembali.
Jadi ternyata saat utama panggilan foo, utamanya harus menginformasikan foo
apa alamat utama adalah dalam memori komputer
karena jika tidak, segera setelah foo dilakukan mengeksekusi, seperti dalam kasus ini di sini,
setelah Anda mencapai ini tanda kurung kurawal tertutup pada akhir foo,
bagaimana sih tidak foo tahu di mana kontrol program ini harus pergi?
Ternyata bahwa jawaban untuk pertanyaan itu adalah dalam persegi panjang merah di sini.
Ini merupakan pointer, dan terserah ke komputer untuk menyimpan sementara
pada tumpukan yang disebut alamat utama sehingga sesegera foo dilakukan mengeksekusi,
komputer tahu di mana dan apa yang baris dalam utama untuk kembali ke.
Pointer Bingkai Disimpan berhubungan mirip dengan ini.
Char * bar di sini mewakili apa?
Sekarang ini segmen biru di sini adalah bingkai foo itu. Apa bar?
Bar adalah hanya argumen ke fungsi foo.
Jadi sekarang kita kembali pada semacam gambar akrab.
Ada banyak barang dan gangguan lebih pada layar,
tapi ini segmen biru muda saja apa yang telah kita menggambar di papan tulis
untuk sesuatu seperti swap. Itu adalah frame untuk foo.
Dan satu-satunya hal di dalamnya sekarang adalah bar, yang merupakan parameter ini.
Tapi apa lagi yang harus di tumpukan sesuai dengan kode ini di sini?
[Mahasiswa] char c [12]. >> [Malan] char c [12].
Kita juga harus melihat 12 kotak memori yang dialokasikan untuk variabel yang disebut c,
dan memang kita memiliki di layar.
Bagian paling atas ada c [0], dan kemudian penulis diagram ini
tidak repot-repot menggambar semua kotak, tapi memang ada 12 ada
karena jika Anda melihat di bagian kanan bawah, c [11] jika Anda menghitung dari 0 adalah byte tersebut 12.
Tapi di sini masalahnya.
Dalam arah mana c tumbuh?
Semacam top down jika dimulai di bagian atas dan tumbuh ke bawah.
Ini tidak terlihat seperti kami meninggalkan diri kita sendiri landasan pacu banyak di sini sama sekali.
Kami sudah seperti dicat diri ke sudut,
dan bahwa c [11] yang tepat terhadap bar, yang tepat terhadap pointer Bingkai Disimpan,
yang tepat terhadap Alamat Kembali. Tidak ada lebih banyak ruang.
Jadi apa implikasinya maka jika Anda mengacaukan
dan Anda mencoba membaca 20 byte dalam buffer 12-byte?
Di mana orang-orang 8 byte tambahan akan pergi? >> [Mahasiswa] Inside -
Di dalam segala sesuatu yang lain, beberapa yang super penting.
Dan yang paling penting, berpotensi, adalah kotak merah di sana, Alamat Kembali,
karena menganggap bahwa Anda baik sengaja atau adversarially menimpa mereka 4 byte,
bahwa alamat pointer, tidak hanya dengan sampah tetapi dengan nomor
yang terjadi untuk mewakili alamat yang sebenarnya di memori.
Apa implikasinya, logis? >> [Mahasiswa] Fungsi akan kembali ke tempat yang berbeda.
Tepat.
Ketika kembali foo dan hits yang brace keriting, program ini akan dilanjutkan
tidak kembali ke utama, itu akan kembali ke apapun alamat dalam kotak merah.
>> Dalam hal pendaftaran software menghindari,
bagaimana jika alamat yang sedang kembali ke adalah fungsi yang biasanya dipanggil
setelah Anda sudah membayar untuk perangkat lunak dan dimasukkan kode registrasi Anda?
Anda dapat semacam trik komputer menjadi tidak akan di sini tapi bukannya pergi di sini.
Atau jika Anda benar-benar pintar, musuh benar-benar dapat mengetikkan di keyboard, misalnya,
bukan kata yang sebenarnya, bukan 20 karakter, tapi rasa dia benar-benar jenis di
beberapa karakter yang mewakili kode.
Dan itu tidak akan menjadi kode C, itu benar-benar akan menjadi karakter
yang mewakili kode mesin biner, 0 dan 1.
Tapi bagaimana kalau mereka cukup pintar untuk melakukan itu,
entah bagaimana paste ke sesuatu yang cepat GetString yang adalah kode dasarnya dikompilasi,
dan 4 byte terakhir menimpa bahwa alamat pengirim.
Dan apa alamat apakah masukan yang melakukan?
Ini sebenarnya menyimpan dalam persegi panjang merah alamat byte pertama dari buffer.
Jadi Anda harus benar-benar pintar, dan ini adalah banyak trial and error untuk orang jahat di luar sana,
tapi jika Anda dapat mengetahui seberapa besar penyangga ini
sehingga beberapa byte terakhir di input yang Anda berikan kepada program
kebetulan setara dengan alamat dari awal buffer Anda, Anda dapat melakukan hal ini.
Jika kita mengatakan biasanya hello dan \ 0, itulah yang berakhir di buffer.
Tetapi jika kita lebih pintar dan kita mengisi buffer yang dengan apa yang kita akan menelepon umum kode serangan -
AAA, serangan, serangan, serangan - di mana ini hanya sesuatu yang melakukan sesuatu yang buruk,
apa yang terjadi jika Anda benar-benar pintar, Anda mungkin melakukan hal ini.
Dalam kotak merah di sini adalah urutan angka - 80, C0, 35, 08.
Perhatikan bahwa yang sama dengan nomor yang di sini.
Ada dalam urutan terbalik, tetapi lebih pada lain waktu.
Perhatikan bahwa alamat pengirim telah sengaja diubah
untuk sama alamat di sini, bukan alamat utama.
Jadi jika orang jahat adalah super pintar, ia akan dimasukkan ke dalam kode serangan
sesuatu seperti menghapus semua file pengguna atau menyalin password
atau membuat akun pengguna yang saya kemudian dapat masuk ke - apa sama sekali.
>> Dan ini adalah baik bahaya dan kekuatan C.
Karena Anda memiliki akses ke memori melalui pointer
dan karena itu Anda dapat menulis apapun yang Anda inginkan ke dalam memori komputer,
Anda dapat membuat komputer melakukan apa pun yang Anda inginkan
hanya dengan setelah itu melompat-lompat di dalam ruang memori sendiri.
Dan begitu sampai hari ini begitu banyak program dan begitu banyak website yang dikompromikan
mendidih ke orang mengambil keuntungan dari hal ini.
Dan ini mungkin tampak seperti sebuah serangan canggih super, tetapi tidak selalu mulai dengan cara itu.
Kenyataannya adalah bahwa apa yang orang jahat biasanya akan lakukan adalah,
apakah itu sebuah program pada baris perintah atau program GUI atau website,
Anda hanya mulai memberikan omong kosong.
Anda mengetikkan sebuah kata yang sangat besar ke dalam kolom pencarian dan tekan Enter,
dan Anda menunggu untuk melihat apakah website crash
atau Anda menunggu untuk melihat apakah program memanifestasikan beberapa pesan kesalahan
karena jika Anda beruntung sebagai orang jahat dan Anda memberikan beberapa masukan gila
yang crash program, yang berarti programmer tidak mengantisipasi perilaku buruk Anda,
yang berarti Anda mungkin bisa dengan usaha yang cukup, percobaan cukup and error,
mencari cara untuk melancarkan serangan yang lebih tepat.
Sehingga banyak bagian dari keamanan tidak hanya menghindari serangan ini sama sekali
tapi mendeteksi mereka dan benar-benar melihat log
dan melihat apa yang input gila memiliki orang-orang mengetik ke website Anda,
apa istilah pencarian orang yang telah diketik ke dalam situs web Anda
dengan harapan meluap beberapa buffer.
Dan ini semua bermuara pada dasar-dasar yang sederhana dari apa yang array
dan apa artinya untuk mengalokasikan dan menggunakan memori.
>> Terkait dengan itu kemudian juga ini.
Mari kita melirik dalam hard drive lagi.
Anda ingat dari satu atau dua minggu yang lalu bahwa ketika Anda tarik file ke recycle bin atau sampah,
apa yang terjadi? >> [Mahasiswa] Tidak ada. >> Sama sekali tidak ada, kan?
Akhirnya jika Anda menjalankan rendah pada ruang disk,
Windows atau Mac OS akan mulai menghapus file untuk Anda.
Tetapi jika Anda tarik sesuatu di sana, yang sama sekali tidak aman.
Semua teman sekamar Anda atau teman atau anggota keluarga harus lakukan adalah klik dua kali dan, voila,
ada semua file samar bahwa Anda mencoba untuk menghapus.
Sebagian besar dari kita setidaknya tahu bahwa Anda harus klik kanan atau klik Kontrol
dan mengosongkan sampah atau sesuatu seperti itu.
Tapi bahkan kemudian itu tidak cukup melakukan trik
karena apa yang terjadi ketika Anda memiliki sebuah file pada hard drive Anda
yang mewakili beberapa dokumen Word atau JPEG, dan ini merupakan hard drive Anda,
dan katakanlah ini sepotong di sini mewakili file tersebut,
dan itu terdiri dari sejumlah besar 0s dan 1s.
Apa yang terjadi ketika Anda tidak hanya menyeret file itu ke tempat sampah dapat atau recycle bin
tetapi juga mengosongkannya? Semacam apa-apa.
Ini bukan apa-apa sekarang.
Sekarang itu hanya apa-apa karena sesuatu yang kecil terjadi dalam bentuk tabel ini.
Jadi ada semacam database atau tabel dalam memori komputer
yang pada dasarnya memiliki satu kolom untuk file 'nama dan satu kolom untuk file' lokasi,
mana mungkin ini lokasi 123, hanya nomor acak.
Jadi kita mungkin memiliki sesuatu seperti x.jpeg dan lokasi 123.
Apa yang terjadi kemudian ketika Anda benar-benar mengosongkan sampah Anda?
Itu hilang.
Tapi apa tidak pergi adalah 0s dan 1s.
>> Jadi apa yang kemudian sambungan ke pset4?
Nah, dengan pset4, hanya karena kita telah sengaja terhapus kartu compact flash
yang memiliki semua foto atau hanya karena oleh nasib buruk menjadi rusak
tidak berarti bahwa 0s dan 1s tidak masih ada.
Mungkin beberapa dari mereka hilang karena sesuatu punya rusak
dalam arti bahwa beberapa 0s 1s dan menjadi 1s menjadi 0s.
Hal-hal buruk bisa terjadi karena perangkat lunak kereta atau kerusakan hardware.
Tetapi banyak dari mereka bit, bahkan mungkin 100% dari mereka, masih ada.
Hanya saja bahwa komputer atau kamera tidak tahu di mana mulai JPEG1
dan di mana JPEG2 dimulai.
Tetapi jika Anda, programmer, tahu dengan sedikit cerdas di mana mereka berada JPEG
atau apa yang mereka terlihat seperti sehingga Anda dapat menganalisis JPEG 0s dan 1s dan berkata, JPEG,
Anda dapat menulis sebuah program dengan dasarnya hanya untuk atau while loop
yang pulih masing-masing file tersebut.
Jadi pelajaran itu adalah mulai aman menghapus file Anda
jika Anda ingin menghindari hal ini sama sekali. Ya.
>> [Mahasiswa] Kenapa ia mengatakan pada komputer Anda
bahwa Anda memiliki memori lebih dari yang Anda lakukan sebelumnya?
Memiliki memori lebih dari yang Anda lakukan sebelumnya - >> [mahasiswa] memori lebih tersedia.
Oh. Pertanyaan bagus.
Jadi mengapa kemudian setelah mengosongkan sampah tidak komputer Anda memberitahu Anda
bahwa Anda memiliki lebih banyak ruang bebas dari yang Anda lakukan sebelumnya?
Singkatnya, karena berbohong.
Lebih teknis, Anda memiliki lebih banyak ruang karena sekarang Anda telah mengatakan
Anda dapat menempatkan hal-hal lain di mana file yang dulu.
Tapi itu tidak berarti bit akan pergi,
dan itu tidak berarti bit sedang berubah menjadi semua 0s, misalnya,
untuk melindungi Anda.
Jadi sebaliknya, jika Anda aman menghapus file atau fisik merusak perangkat,
yang benar-benar satu-satunya cara kadang-kadang di sekitar itu.
>> Jadi kenapa tidak kita meninggalkan pada catatan semi-menakutkan, dan kita akan melihat Anda pada hari Senin.
[Tepuk tangan]
>> [CS50.TV]