[Powered by Google Translate] [MINGGU 5]
[David J. Malan, Universitas Harvard]
[Ini adalah CS50.] [CS50.TV]
[Wanita] Dia berbohong, tentang apa, saya tidak tahu.
[Man] Jadi apa yang kita ketahui?
[Wanita] Bahwa at 9:15, Ray Santoya berada di ATM.
[Man] Jadi pertanyaannya adalah, apa yang dia lakukan pada 09:16?
[Woman] Shooting mm 9 pada sesuatu.
Mungkin dia melihat penembak jitu tersebut.
[Man] Atau ia bekerja dengan dia.
[Woman] Tunggu. Kembali satu.
[Man] Apa yang Anda lihat?
[♫ ♫ Musik menegangkan]
[Woman] Bawa wajahnya. Layar penuh.
[Man] Nya gelas. >> Ada refleksi.
[♫ ♫ Musik menegangkan]
[Man] Itu tim bisbol Nuevita itu. Itulah logo mereka.
[Woman] Dan dia berbicara dengan siapa pun yang mengenakan jaket itu.
>> [David Malan] Jadi, ini adalah CS50 minggu 5, dan hari ini kita merusak sedikit televisi dan film Anda.
Jadi setiap kali Anda menonton pertunjukan seperti ini satu di sini,
dan polisi mengatakan "Bisakah Anda membersihkan bahwa sampai?" atau "Meningkatkan,"
tidak ada peningkatan dalam dunia nyata.
Bahkan, apa yang Anda benar-benar mendapatkan sedikit sesuatu seperti ini.
Saya sudah berhenti salah satu foto staf dari halaman.
Ini adalah sebuah program yang disebut Photoshop. Ini adalah 1 dari 2 Bowdens,
1 dari 3 Bowdens sebenarnya, hari ini, karena kita memiliki Ibu Bowden di sini juga, dengan Rob dan Paul.
Tapi di sini adalah Rob di layar, dan jika kita zoom in pada kilatan bahwa dia selalu di matanya,
apa yang sebenarnya Anda lihat adalah bahwa apa yang Anda lihat adalah apa yang Anda dapatkan.
Ini adalah "ditingkatkan," sehingga "CSI" memilikinya sedikit salah.
Ada satu klip lain, jika kita bisa memilih pada "CSI" hanya sedikit lebih lama.
Ini adalah ungkapan yang bagus untuk mengucapkan selanjutnya jika Anda ingin
terdengar teknis dengan teman-teman Anda ketika, benar-benar, Anda katakan apa-apa.
>> [Man] Selama berminggu-minggu aku sudah menyelidiki pembunuhan Pembunuh Cabby
dengan daya tarik wajar tertentu.
[Wanita # 1] Hal ini secara real time.
[Wanita # 2] Saya akan membuat antarmuka GUI menggunakan Visual Basic, melihat apakah saya bisa melacak alamat IP.
>> [Malan] Jadi audio yang tidak sinkron samping, menciptakan antarmuka GUI menggunakan Visual Basic
untuk melacak alamat IP adalah omong kosong.
Hari-hari ini Anda tidak akan menggunakan Visual Basic,
tidak ada kebutuhan untuk GUI, dan alamat IP adalah istilah teknis yang akurat.
Jadi mengawasi keluar untuk ini, dan salah satu favorit saya:
Satu ini sedikit lebih misterius, karena Anda perlu tahu bahasa yang berbeda.
Ada bahasa yang disebut Objective-C, yang merupakan superset dari C.
Yang berarti itu C ditambah beberapa fitur tambahan, di antaranya berorientasi objek pemrograman.
Dan ini adalah bahasa yang Apple telah dipopulerkan untuk pemrograman iOS.
Dan jadi di sini adalah klip dari acara yang berbeda sama sekali, dari "Numbers,"
bahwa jika Anda benar-benar melihat secara dekat pada TiVo Anda dan jeda pada saat yang tepat,
Anda akan melihat bahwa apa yang mereka cari di tidak cukup apa yang sedang dijelaskan.
Dan biarkan aku mencoba konektor audio yang berbeda di sini dan melihat apakah kita tidak bisa
menjaga audio sync saat ini.
Saya memberi Anda "Numbers."
>> [Man # 1] Ini adalah alamat 32-bit IPv4.
[Man # 2] IP, itulah internet. >> Swasta jaringan. Ini jaringan pribadi Anita.
[Malan] Oke. Ini adalah Objective-C, dan itu untuk program mewarnai beberapa anak,
karena Anda mungkin dapat menyimpulkan dari nama variabel ada.
Sehingga, saat itu, adalah "Numbers." Jadi hari ini dan minggu ini kami memperkenalkan
sedikit dari dunia forensik dan konteks dalam masalah karena itu.
Hari ini akan menjadi kuliah disingkat karena ada acara khusus di sini
sesudahnya, 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 baru inisiatif online untuk membuka courseware
dan banyak lagi, meluncurkan di kampus Harvard, Senin.
Yang berarti Senin datang Anda akan memiliki - pada hitungan terakhir,
86.000 teman sekelas tambahan akan menyusul bersama dengan ceramah CS50 ini
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 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,
tidak cukup yang terbaik siswa / guru rasio setelah kita memukul 80.000 siswa lainnya.
Jadi kita tidak akan begitu banyak masalah kadar set secara manual.
Jadi 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,
dan Anda akan dapat menjalankan perintah, memeriksa 50,
pada pset Anda sendiri, dan Anda akan mendapatkan umpan balik mengenai apakah program anda adalah
benar atau salah sesuai dengan spesifikasi desain berbagai yang telah kami sediakan.
Jadi lebih pada set dan spesifikasi masalah dan
sekelas CS50x akan menggunakan ini juga.
>> Jadi masalah set 4 adalah semua tentang forensik.
Dan bagian ini terinspirasi oleh beberapa hal kehidupan nyata,
dimana ketika saya masih di sekolah pascasarjana, aku magang untuk sementara waktu dengan
Kantor Middlesex County Jaksa Wilayah yang melakukan pekerjaan forensik
dengan peneliti utama forensik mereka, dan apa ini sebesar
adalah, saya pikir saya sebutkan masa lalu beberapa minggu ini, adalah polisi 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 semacam lebih mengganggu dari 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 di pset 4 sedikit grafis.
Jadi 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-titik, atau piksel.
Sekarang, dalam kasus wajah Rob, ada segala macam warna,
dan kita mulai melihat titik-titik individu, otherwide 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, baik, 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, untuk mulai berbicara tentang foto-foto berwarna-warni.
Hal-hal yang Anda akan melihat di Facebook atau mengambil dengan kamera digital,
tapi, tentu, 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 sejumlah masalah 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, seperti biasa, besok.
Kami juga akan memperkenalkan Anda ke format lain file.
Jadi 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,
berwarna-warni format file grafis 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,
yang biasanya BMP, atau gambar bitmap, dan bitmap
yang menyenangkan bagi kami karena mereka memiliki kompleksitas sedikit lebih.
Ini tidak sesederhana ini grid ini 0 dan 1;
sebagai gantinya, Anda memiliki hal-hal seperti header pada awal file.
Jadi dengan kata lain, dalam file bmp. Adalah sejumlah besar 0 dan 1 s,
tapi ada beberapa tambahan 0 dan 1 di sana.
Dan ternyata apa yang kita mungkin pernah diambil untuk diberikan selama bertahun-tahun,
format file seperti doc atau.. xls atau. mp3 atau. mp4,
apapun format file yang Anda kenal.
Nah, apa itu bahkan berarti menjadi format file?
Karena pada akhir hari, semua file-file yang kita gunakan memiliki hanya 0 dan 1 s
dan mungkin mereka 0 dan 1 yang mewakili, b, c, melalui ASCII atau sejenisnya,
tetapi melalui akhir hari, itu hanya 0 dan 1 s.
>> 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 offset 0, ada,
ada akan ada 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 0 dan 1 ini yang mewakili apa?
Ukuran sesuatu, dan ia pergi dari sana.
Jadi dalam sejumlah masalah 4, Anda akan berjalan melalui beberapa hal.
>> Kami tidak akan berakhir peduli tentang semua dari mereka, tetapi pemberitahuan itu mulai mendapatkan menarik
sekitar garis atau byte 54, rgbtBlue, Hijau dan Merah.
Jika Anda pernah mendengar akronim 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 1 cahaya terang keluar dari lensa.
Tapi kembali pada hari, Anda memiliki lensa merah, lensa biru, hijau dan lensa
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 ganda atau triple,
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 masalah set 4
akan menjadi beberapa hal, salah satunya adalah untuk benar-benar mengubah ukuran gambar.
Untuk mengambil pola 0 dan 1 s,
mencari tahu yang potongan 0 dan 1 ini mewakili apa dalam struktur seperti ini,
dan kemudian mencari cara untuk meniru piksel: para 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 diserahkan
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 0 dan 1 s
off dari kartu untuk Anda, menyelamatkan mereka semua dalam 1 file besar, dan kemudian kami akan menyerahkan 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 bahwa setiap JPEG dimulai dengan pola yang sama dari 0 dan 1 s.
Jadi menggunakan loop sementara atau untuk loop atau serupa,
Anda dapat iterate atas semua 0 dan 1 dalam gambar ini forensik
dan setiap kali Anda melihat pola khusus yang didefinisikan dalam spesifikasi sejumlah masalah itu,
Anda dapat berasumsi, "Oh, 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 berasumsi, 'Ooh! Berikut adalah JPEG kedua, foto yang saya ambil setelah yang pertama.
Biarkan saya berhenti membaca bahwa file pertama, mulai menulis ini yang baru. "
Dan output dari program anda untuk pset 4 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.
Sehingga, juga akan cukup kasus umum.
Itulah apa yang ada di cakrawala.
>> Kuis 0, di belakang kami. Sadarilah, per email saya, yang selalu ada orang-orang
yang sama-sama senang, semacam netral, dan sedih sekitar kuis 0 waktu.
Dan jangan menjangkau saya, TF kepala, 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? Good job.
Apa perpustakaan CS50? Ya? [Jawaban siswa, tidak dapat dipahami]
>> Oke, baik. Jadi satu set prewritten kode yang kami, staf, menulis,
kami sediakan untuk Anda, untuk 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.
Jadi kita akan mulai untuk mengambil suatu "string" dari Anda,
yang, ingat, itu hanya sinonim untuk apa sebenarnya tipe data? char *.
Jadi bagi orang tua, yang mungkin - itu bagus, jadi char * kita akan mulai melihat
di layar semua lebih seperti yang kita menghapus "string" dari kosakata kita,
setidaknya ketika datang untuk benar-benar menulis kode.
Demikian pula, kita akan berhenti menggunakan beberapa fungsi yang banyak,
karena program kami akan mendapatkan lebih canggih
bukan hanya menulis program yang duduk di sana dengan berkedip cepat,
menunggu pengguna untuk mengetik sesuatu masuk
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 website di suatu tempat.
Jadi mari kita mengupas lapisan ini untuk pertama kalinya, dan menarik alat CS50
dan file ini disebut CS50.h, yang Anda sudah termasuk tajam selama berminggu-minggu.
>> Tapi mari kita benar-benar melihat apa yang di dalam hal ini.
Jadi 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, bukan hanya untuk menjalankan dan menggunakan,
tapi benar-benar membaca dan mengubah dan mengintegrasikan ke dalam pekerjaan Anda sendiri.
Jadi itulah apa 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.
Jadi perhatikan di bagian atas di sini, bahwa file CS50.h mencakup sejumlah besar file header.
Sekarang, sebagian besar kita belum melihat sebelumnya, tapi satu
familiar; mana yang telah kita lihat, meskipun sebentar, sejauh ini?
Ya, perpustakaan standar. Stdlib.h memiliki malloc,
jadi setelah kami 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.
Jadi kita telah, selama berminggu-minggu, telah termasuk standar bool.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.
>> Sekarang, jika kita scroll ke bawah lebih jauh, di sini adalah definisi kita tentang string.
Ternyata, seperti yang telah kita katakan sebelumnya, bahwa di mana * ini tidak terlalu penting.
Anda bahkan dapat memiliki ruang di sekitar.
Kami, semester ini, telah mempromosikan sebagai ini untuk membuat jelas bahwa * harus dilakukan 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 mengatakan, GetInt,
karena kami menggunakan itu, mungkin, sebelum hal lain semester ini.
Dan di sini adalah GetInt. Ini adalah apa?
Ini adalah prototipe. Begitu sering, kita 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
bahwa 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 tersebut, tetapi di bagian atas file header,
maka file header adalah apa yang teman-teman dan rekan meliputi,
dengan tajam termasuk dalam kode mereka sendiri.
Jadi selama ini Anda sudah termasuk semua prototipe
efektif di bagian atas file Anda, tetapi dengan cara ini tajam termasuk mekanisme
yang pada dasarnya salinan dan pasta file ini ke Anda sendiri.
Sekarang, di sini adalah beberapa dokumentasi yang cukup rinci.
>> Kami sudah cukup banyak diambil begitu saja bahwa GetInt mendapat int,
tapi ternyata ada beberapa kasus sudut, kan?
Bagaimana jika pengguna jenis dalam jumlah yang terlalu besar?
Sebuah triliun, yang tidak bisa cocok dalam int?
Apa perilaku yang diharapkan? Nah, idealnya, itu diprediksi.
Jadi dalam hal ini, jika Anda benar-benar membaca baik cetak,
Anda akan melihat bahwa jika baris tidak dapat dibaca, ini INT_MAX kembali.
Kami tidak pernah membicarakan hal ini, namun berdasarkan kapitalisasinya,
apa itu, mungkin?
Ini adalah konstan, sehingga beberapa konstanta khusus yang mungkin dinyatakan
di salah satu file header yang naik lebih tinggi dalam file,
dan INT_MAX mungkin sesuatu seperti, kasar, 2 miliar.
Gagasan bahwa karena kita perlu entah bagaimana menandakan sesuatu yang tidak beres,
kita, ya, memiliki 4 miliar angka yang kita miliki,
negatif 2 miliar pada 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 negatif 2 miliar.
Jadi Anda menghabiskan satu nilai yang mungkin Anda sehingga Anda dapat berkomitmen untuk dunia
bahwa jika sesuatu yang tidak beres, saya akan kembalikan nilai super-besar.
Tapi Anda tidak ingin pengguna mengetik sesuatu yang samar seperti "2, 3, 4 ..."
jumlah yang sangat besar, di mana Anda menggeneralisasi bukan sebagai konstan.
Jadi benar-benar, jika Anda sedang anal beberapa minggu terakhir,
kapan saja Anda menghubungi GetInt, Anda harus telah memeriksa dengan kondisi jika.
Apakah jenis pengguna dalam INT_MAX, atau lebih khusus,
melakukan GetInt INT_MAX kembali? Karena jika itu terjadi,
yang benar-benar berarti mereka tidak mengetik, sesuatu yang tidak beres dalam kasus ini.
Jadi ini adalah apa yang umumnya dikenal sebagai nilai "sentinel", yang hanya berarti istimewa.
>> Nah, sekarang mari kita berbelok ke file c..
File C telah ada di alat untuk beberapa waktu,
dan, pada kenyataannya, alat itu memiliki precompiled untuk Anda
dalam hal yang kita disebut "kode objek,"
namun hal itu tidak menjadi masalah bagi Anda di mana itu karena sistem mengetahui,
dalam kasus ini, di mana itu, alat.
Tapi mari kita scroll ke bawah sekarang untuk GetInt, dan melihat bagaimana GetInt telah bekerja sepanjang waktu ini.
Jadi 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 masukan tidak ada dan 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.
Jadi mari kita lihat bagaimana ini bekerja. Nah, kita tampaknya akan menggunakan GetString
di baris pertama dalam loop, 166.
Sekarang ini adalah praktek yang baik karena dalam keadaan apa
bisa GetString mengembalikan NULL kata kunci ini, khusus?
Jika sesuatu yang tidak beres. Apa yang bisa salah ketika Anda menelepon sesuatu seperti GetString?
Ya? [Jawaban siswa, tidak dapat dipahami] >> Ya. Jadi mungkin malloc gagal.
Di suatu tempat di bawah GetString hood memanggil malloc,
yang mengalokasikan memori, yang memungkinkan toko komputer
semua karakter yang 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.
Nah, GetString harus mampu untuk menandakan bahwa Anda,
bahkan jika ini adalah kasus, sudut super super jarang.
Hal ini entah bagaimana bisa menangani hal ini, dan begitu GetString,
jika kita kembali dan membaca dokumentasinya, tidak, pada kenyataannya, kembali NULL.
Sekarang jika GetString gagal dengan mengembalikan NULL, GetInt akan gagal
dengan kembali INT_MAX, seperti sentinel.
Ini hanya konvensi manusia. Satu-satunya cara Anda akan tahu hal ini terjadi
adalah dengan membaca dokumentasi.
Jadi mari kita gulir ke bawah ke mana int sebenarnya GotInt.
>> Jadi jika saya gulir ke bawah sedikit lebih jauh, sejalan 170 kami memiliki komentar di atas garis-garis.
Jadi kami menyatakan, di 172, n int dan char c, dan kemudian fungsi baru ini
yang beberapa dari Anda telah sengaja menemukan sebelumnya, tapi sscanf.
Ini adalah singkatan untuk f tali scan.
Dengan kata lain, memberikan string dan saya akan memindai untuk potongan informasi yang menarik.
Jadi apa artinya? Nah, anggaplah bahwa saya ketik, secara harfiah, 1 2 3 pada keyboard,
dan kemudian tekan enter. Apa tipe data dari 1 2 3 ketika dikembalikan oleh GetString?
Ini jelas string, kan? Aku punya string, sehingga 1 2 3 benar-benar "1 2 3"
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,
1 2 3 \ 0, dan entah bagaimana mengubahnya menjadi integer yang sebenarnya.
Sekarang, Anda bisa mencari cara untuk melakukan hal ini.
Jika Anda berpikir kembali ke pset 2, Anda mungkin mendapat sedikit nyaman
dengan Caesar atau Vigenere sehingga Anda dapat iterate selama string,
Anda dapat mengkonversi karakter untuk ints dengan memilih. 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?
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.
Ternyata bahwa notasi ini sekarang mengingatkan hal-hal
kami mulai berbicara tentang lebih dari seminggu yang lalu.
>> Apa & n dan c & lakukan bagi kita di sini? [Jawaban siswa, tidak dapat dipahami]
>> Ya. Ini memberi saya alamat n dan alamat c.
Sekarang, mengapa itu penting? Nah, 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, tetapi Anda hanya dapat mengembalikan 1 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.
Jadi Anda ingin efektif f kembali 2 hal, itu hanya tidak mungkin dalam C.
Sehingga Anda dapat bekerja di sekitar bahwa dengan lewat di 2 alamat,
karena segera setelah Anda menyerahkan fungsi 2 alamat, apa yang bisa fungsi yang lakukan dengan mereka?
Hal ini dapat menulis ke alamat tersebut. Anda dapat menggunakan operasi * dan "pergi ke sana" untuk masing-masing alamat.
Ini semacam mekanisme backdoor, tapi sangat umum untuk mengubah nilai-nilai variabel
di lebih dari hanya 1 tempat, dalam hal ini 2.
Sekarang, perhatikan aku memeriksa == to1, dan kemudian kembali n jika itu tidak, pada kenyataannya, mengevaluasi dengan benar.
Jadi apa yang terjadi? Nah, secara teknis, semua kita benar-benar ingin terjadi dalam GetInt ini.
Kami ingin mengurai, sehingga untuk berbicara, kami ingin membaca string
"1 2 3" dan jika terlihat seperti ada sejumlah sana,
apa yang kita memberitahu sscanf lakukan adalah meletakkan angka, 1 2 3, dalam n variabel bagi saya.
Mengapa, kemudian, apakah aku punya ini juga?
Apa peran juga mengatakan, sscanf, Anda juga bisa mendapatkan karakter di sini.
[Berbicara Mahasiswa, dipahami] >> Tidak - titik desimal bisa bekerja.
Mari kita menganggap bahwa berpikir sejenak. Apa lagi?
[Mahasiswa, dipahami] >> Jadi, pikiran yang baik, itu bisa menjadi karakter NULL.
Ini sebenarnya tidak, dalam kasus ini. Ya? [Mahasiswa, dipahami]
>> >> 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 di n dan c, dalam contoh di sini,
apa itu juga tidak itu mengembalikan jumlah variabel itu menempatkan nilai masuk
Jadi jika Anda hanya mengetik 1 2 3, maka hanya% d akan mencocokkan
dan hanya n akan disimpan dengan nilai seperti 1 2 3 dan tidak akan dimasukkan ke dalam c;
c tetap nilai sampah, sehingga untuk berbicara.
Sampah karena itu tidak pernah diinisialisasi sebagai beberapa nilai.
Jadi dalam hal ini, sscanf kembali 1, karena saya dihuni salah satu pointer,
dalam hal ini, yang besar. Saya memiliki sebuah int, jadi saya membebaskan garis untuk membebaskan memori
yang GetString sebenarnya dialokasikan, dan kemudian aku kembali n.
Lain, jika Anda pernah bertanya-tanya mana yang coba lagi pernyataan berasal dari, berasal dari sini.
Jika, sebaliknya, saya ketik di 1 2 3 foo,
hanya beberapa urutan acak teks, sscanf akan melihat,
ooh, nomor, ooh, nomor, ooh, nomor, ooh - f.
Dan itu akan menempatkan 1 2 3 dalam n.
Ini akan menempatkan f di c, dan kemudian kembali 2.
Jadi kita miliki, hanya menggunakan definisi dasar dari perilaku scanf itu,
cara yang sangat sederhana - baik, kompleks pada pandangan pertama, tapi pada akhir hari,
mekanisme yang cukup sederhana untuk mengatakan, apakah ada int, dan jika demikian, adalah bahwa satu-satunya hal yang saya temukan?
Dan ruang putih 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 apa pun, untuk memukul spasi 1 2 3, dan itu akan sah.
Ini tidak akan berteriak pada pengguna hanya karena mereka memukul spasi di awal atau akhir,
yang hanya sedikit lebih user-friendly.
>> Ada pertanyaan, kemudian, pada GetInts? Ya?
[Pertanyaan Mahasiswa, dipahami]
>> Pertanyaan bagus. Bagaimana jika Anda hanya mengetik dalam char, seperti memukul f, dan masukkan
tanpa pernah mengetik 1 2 3, apa yang Anda pikir perilaku ini baris kode maka akan?
Jadi sscanf dapat menutupi itu juga, karena dalam kasus itu,
itu tidak akan mengisi n atau c, itu akan kembali 0 sebagai gantinya.
Dalam hal ini, saya juga menangkap skenario itu, karena nilai yang diharapkan saya inginkan adalah 1.
Saya hanya ingin 1, dan hanya 1 hal yang harus diisi. Pertanyaan bagus. Lainnya?
>> Baiklah, jadi mari kita tidak pergi melalui semua fungsi di sini,
tapi satu yang tampaknya, mungkin, kepentingan yang tersisa
adalah GetString karena ternyata GetFloat, GetInt,
GetDouble, GetLongLong menyepak bola semua 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. Jadi dalam GetString,
yang mengambil argumen tidak sesuai kekosongan di sini,
dan ia mengembalikan string, jadi saya menyatakan string disebut buffer.
Saya tidak benar-benar tahu apa yang akan digunakan untuk, tapi kita akan lihat.
Tampak seperti kapasitas, secara default, 0, tidak cukup yakin di mana hal ini terjadi.
Tidak yakin apa n akan digunakan untuk belum.
Tapi sekarang semakin sedikit lebih menarik, sehingga sejalan 243,
kita mendeklarasikan c int, ini adalah semacam detail bodoh.
Char adalah 8 bit, dan 8 bit dapat menyimpan berapa banyak nilai yang berbeda?
256. Masalahnya adalah, jika Anda ingin memiliki 256 karakter ASCII yang berbeda,
yang ada, jika Anda berpikir kembali, dan ini bukanlah sesuatu untuk menghafal.
Tetapi jika Anda berpikir kembali ke tabel ASCII besar kami memiliki minggu yang lalu,
ada, dalam kasus, 128 atau 256 karakter ASCII.
Kami menggunakan semua pola 0 dan 1 terserah.
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 lakukan adalah, mereka menggunakan nilai terbesar berikutnya,
sesuatu seperti int sehingga Anda memiliki sejumlah gila bit,
32 untuk 4 miliar 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 loop sementara besar
yang memanggil fgetc, f berarti file, 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 pset 4, berarti layar,
tapi bagian khusus dari layar sehingga itu tidak digabungkan
dengan output aktual yang Anda bermaksud untuk mencetak, tetapi 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 aku hanya menggunakan beberapa konjungsi boolean sini,
memeriksa bahwa itu tidak sama dengan \ n, sehingga pengguna telah tekan enter.
Kami ingin berhenti pada titik, akhir loop, dan kami juga ingin memeriksa
untuk konstanta khusus, EOF, yang jika Anda tahu atau menebak - apa itu berdiri?
Akhir file. Jadi ini adalah jenis tidak masuk akal, karena jika aku 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 tombol control d pada keyboard Anda,
tidak bahwa Anda akan belum, Anda telah memukul kendali c.
Tetapi kontrol d mengirimkan EOF ini disebut istimewa konstan.
>> Jadi sekarang kita hanya memiliki beberapa alokasi memori dinamis.
Jadi jika n + 1> kapasitas, sekarang saya akan menjelaskan n.
n betapa banyak byte 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 adalah mengalokasikan kapasitas yang lebih besar.
Aku akan skim atas beberapa aritmatika di sini
dan fokus hanya pada fungsi ini di sini.
Kau tahu apa yang malloc, atau setidaknya umumnya akrab.
Coba tebak apa yang realloc tidak. [Jawaban siswa, tidak dapat dipahami]
>> Ya. Dan itu tidak cukup menambahkan memori, melainkan 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 bisa menempatkan karakter string kembali untuk kembali ke kembali ke belakang.
Tapi kalau itu tidak terjadi, karena Anda menunggu terlalu lama
dan sesuatu yang acak mendapat menjatuhkan ke dalam memori di sana, tapi ada tambahan
memori 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 1 karakter tunggal,
dan jika pengguna jenis dalam 2 karakter, GetString berakhir
realloc memanggil dan berkata, 'Ooh, 1 karakter tidak cukup.
Beri aku 2 karakter. " Kemudian jika Anda membaca melalui logika loop,
itu akan mengatakan, 'Ooh, pengguna mengetik dalam 3 karakter.
Beri aku 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.
Ini akan tumbuh super cepat, dan apa yang mungkin keuntungan dari itu?
Mengapa saya menggandakan ukuran buffer, meskipun pengguna
mungkin hanya perlu 1 karakter tambahan dari keyboard?
[Mahasiswa jawaban, tidak dapat dipahami]. >> Apa itu?
Tepat. Anda tidak harus tumbuh sebagai sering.
Dan ini hanya semacam - kau lindung nilai taruhan Anda di sini.
Idenya adalah bahwa Anda tidak ingin untuk 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 sekali lagi, memahami setiap baris di sini tidak begitu penting saat ini.
Tapi melihat bahwa ia 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.
Singkatnya, itulah cara GetString telah bekerja sepanjang waktu ini.
Semua hal ini 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 C kode
yang memiliki fungsi utama di bagian bawah, yang memanggil fungsi foo,
dan apa yang akan lewat untuk foo? [Siswa] Sebuah argumen tunggal.
>> Satu argumen. Jadi argv [1], yang berarti kata pertama pengguna mengetik
pada baris perintah setelah a.out atau apa pun program yang disebut.
Jadi foo, di atas, diperlukan dalam char *, tapi char * hanya apa?
String. Tidak ada yang baru di sini, dan string yang sewenang-wenang disebut bar.
Dalam baris ini di sini, char c [12], dalam semacam semi-teknis bahasa Inggris, apa yang baris ini lakukan?
Array -? 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 yang Anda dapat menaruh beberapa hal masuk
>> Kemudian terakhir, memcpy, kami sudah tidak digunakan sebelumnya.
Tapi Anda mungkin bisa menebak apa yang dilakukannya. Ini salinan memori.
Apa yang dilakukannya? Nah, itu tampaknya salinan bar, input, ke c,
tapi hanya sampai panjang bar.
Tapi ada bug di sini.
Oke, jadi secara teknis kita benar-benar harus melakukan strlen (bar) x sizeof (char), itu benar.
Tapi dalam kasus terburuk di sini, mari kita asumsikan bahwa ltu - jadi, oke.
Lalu ada 2 bug. Jadi sizeof (char), baiklah, mari kita membuat ini sedikit lebih lebar.
Jadi sekarang masih ada bug, yang adalah apa?
[Jawaban siswa, tidak dapat dipahami] Cek >> untuk apa? Oke, jadi kita harus memeriksa
untuk 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 *.
Jadi itu bagus, dan apa lagi yang kita lakukan? Logikanya ada cacat di sini juga.
[Jawaban siswa, tidak dapat dipahami]
Jadi >> memeriksa apakah argc ≥ 2?
Oke, jadi ada 3 bug dalam program ini di sini.
Kami tidak memeriksa apakah pengguna benar-benar mengetik sesuatu ke argv [1], baik.
Jadi apa bug ketiga? Ya?
[Jawaban siswa, tidak dapat dipahami] >> Baik.
Jadi kami memeriksa satu skenario. Kami implisit diperiksa tidak menyalin lebih banyak memori
daripada akan melebihi panjang bar.
Jadi jika string pengguna mengetik adalah 10 karakter,
ini mengatakan, "Hanya menyalin 10 karakter. '
Dan tidak apa-apa, tetapi bagaimana jika pengguna mengetikkan kata pada prompt
seperti kata karakter 20, ini adalah, 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 buffer overrun serangan, dan serangan itu dalam arti bahwa jika pengguna
atau program yang memanggil fungsi Anda melakukan hal ini jahat,
apa yang sebenarnya terjadi berikutnya bisa sangat buruk.
>> Mari kita lihat pada gambar ini di sini.
Gambar ini merupakan tumpukan memori Anda.
Dan ingat bahwa setiap kali Anda memanggil fungsi,
Anda mendapatkan bingkai kecil di tumpukan dan kemudian lain dan kemudian lagi dan lagi.
Dan sejauh ini kita baru saja semacam ini disarikan pergi sebagai persegi panjang
baik ada di papan tulis atau pada layar di sini.
Tetapi jika kita memperbesar salah satu persegi panjang,
ketika Anda memanggil fungsi foo, ternyata ada lebih di stack
dalam kerangka dan 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 antara mereka kembali alamat.
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 dekat pada akhir foo,
bagaimana sih tidak tahu di mana foo 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.
Frame pointer disimpan berhubungan mirip dengan ini.
Char * bar di sini mewakili apa?
Nah, sekarang ini segmen biru di sini adalah bingkai foo, apa adalah bar?
Oke, jadi bar hanyalah argumen ke fungsi foo.
>> Jadi sekarang kita kembali pada gambar akrab.
Ada banyak barang dan gangguan lebih pada layar
tapi ini segmen biru muda adalah apa yang kita telah menggambar di papan tulis untuk sesuatu seperti swap.
Itu adalah frame untuk foo dan satu-satunya di dalamnya sekarang adalah bar,
yang merupakan parameter ini.
Tapi apa lagi yang harus di stack, sesuai dengan kode ini di sini?
Char c [12]. Jadi kita juga harus melihat 12 kotak memori,
dialokasikan untuk sebuah 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 tetapi ada memang ada 12
karena jika Anda melihat di bagian kanan bawah, c [11], jika Anda menghitung dari 0, adalah 12 byte tersebut.
Tapi di sini masalahnya: Dalam arah mana c tumbuh?
Semacam top down, kan? Jika dimulai di bagian atas dan tumbuh ke bawah,
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 stack frame,
yang tepat terhadap alamat pengirim, ada ruang lagi.
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?
Di dalam segala sesuatu yang lain, beberapa yang super penting.
Dan yang paling penting, berpotensi, adalah kotak merah ada, alamat pengirim.
Karena mengira bahwa Anda baik sengaja atau adversarially
menimpa mereka 4 byte, alamat pointer,
bukan hanya dengan sampah, namun dengan jumlah yang terjadi untuk mewakili alamat yang sebenarnya di memori?
Apa implicaiton tersebut, secara logis?
[Jawaban siswa, tidak dapat dipahami] >> Tepat. Ketika kembali foo
dan hits yang brace keriting, program ini akan melanjutkan untuk tidak kembali ke utama,
itu akan kembali ke apapun alamat dalam kotak merah.
>> Sekarang, dalam kasus pendaftaran software menghindari,
apa alamat yang sedang kembali ke adalah fungsi
yang biasanya dipanggil setelah Anda sudah membayar untuk perangkat lunak dan dimasukkan kode registrasi Anda?
Anda bisa semacam trik komputer agar tidak terjadi di sini, tetapi sebaliknya, naik di sini.
Atau, jika Anda benar-benar pintar, musuh benar-benar dapat mengetikkan di keyboard,
misalnya, bukan kata-kata yang sebenarnya, bukan 20 karakter, tapi rasa dia
jenis dalam beberapa karakter yang mewakili kode?
Dan itu tidak akan menjadi kode C, itu akan menjadi karakter
yang mewakili kode mesin biner, 0 dan 1 s.
Tapi bagaimana kalau mereka cukup pintar untuk melakukan itu, entah bagaimana paste ke prompt GetString
sesuatu yang pada dasarnya kode dikompilasi,
dan 4 byte terakhir menimpa bahwa alamat pengirim, dan apa alamat apakah masukan yang melakukan?
Ia menyimpan dalam persegi panjang merah alamat byte pertama dari buffer.
Jadi Anda harus benar-benar pintar, dan ini adalah banyak trial and error
bagi orang-orang buruk di luar sana, tetapi jika Anda dapat mengetahui seberapa besar penyangga ini,
sehingga beberapa byte terakhir di masukan yang Anda berikan untuk program
kebetulan setara dengan alamat dari awal buffer Anda,
Anda dapat melakukan hal ini. Jika kita berkata, biasanya, halo, 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,
A, A, A, A: Serangan, serangan, serangan, serangan, di mana ini hanya sesuatu yang melakukan sesuatu yang buruk.
Nah, apa yang terjadi jika Anda benar-benar pintar, Anda mungkin melakukan hal ini:
Dalam kotak merah di sini adalah urutan nomor: 80, CO, 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, 'Hapus semua file pengguna. "
Atau 'Copy password,' atau 'Buat akun pengguna yang saya bisa login ke. "
Apa-apa, 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 sebagainya, 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 serangan super canggih,
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,
adalah 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 situs 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,
itu berarti programmer tidak mengantisipasi perilaku buruk Anda
yang berarti Anda mungkin bisa, dengan usaha yang cukup,
trial and error yang cukup, mencari cara untuk melancarkan serangan yang lebih tepat.
Sehingga banyak bagian dari keamanan tidak hanya menghindari serangan ini sama sekali, namun mereka mendeteksi
dan benar-benar melihat log dan melihat apa yang input gila memiliki orang-orang mengetik ke dalam situs web Anda.
Apa istilah pencarian yang diketik orang ke website 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?
Dan berkaitan dengan itu juga, ini.
>> Jadi mari kita melirik dalam hard drive lagi.
Jadi Anda ingat dari satu atau dua minggu yang lalu bahwa ketika Anda drag file
untuk Anda recycle bin atau sampah, apa yang terjadi?
[Mahasiswa] Tidak ada. >> Ya, sama sekali tidak ada. 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, maka itu sama sekali tidak aman.
Semua roomate, teman atau anggota keluarga Anda harus lakukan adalah klik dua kali, dan voila.
Ada semua file samar bahwa Anda mencoba untuk menghapus.
Jadi kebanyakan dari kita setidaknya tahu bahwa Anda harus klik kanan atau mengendalikan klik
dan mengosongkan sampah, atau sesuatu seperti itu.
Tetapi 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 mari kita mengatakan ini sepotong di sini mewakili file tersebut,
dan itu terdiri dari sejumlah besar 0 dan 1 s.
Apa yang terjadi ketika Anda tidak hanya menyeret file tersebut ke tempat sampah atau recycle bin,
tetapi juga mengosongkannya?
Semacam apa-apa. Ini bukan apa-apa sekarang.
Sekarang itu hanya apa-apa, karena sedikit sesuatu terjadi dalam bentuk tabel ini.
Jadi ada semacam database atau tabel dalam memori komputer
yang pada dasarnya memiliki 1 kolom untuk nama file,
dan 1 kolom untuk lokasi file, mana mungkin ini lokasi 123, hanya nomor acak.
Jadi kita mungkin memiliki sesuatu seperti X.jpg, dan lokasi 123.
Dan apa yang terjadi kemudian, ketika Anda mengosongkan sampah Anda?
Itu hilang. Tapi apa tidak pergi adalah 0 dan 1 s.
>> Jadi apa, kemudian, koneksi ke pset 4?
Nah, dengan pset 4, hanya karena kita telah sengaja terhapus
kartu compact flash yang memiliki semua foto-foto ini,
atau hanya karena oleh nasib buruk menjadi rusak,
tidak berarti bahwa 0 dan 1 itu tidak masih ada.
Mungkin beberapa dari mereka hilang karena sesuatu punya rusak
dalam arti bahwa beberapa s 0 menjadi 1 dan 1 itu menjadi 0 s.
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 komputer atau kamera tidak tahu di mana JPEG 1 mulai
dan di mana JPEG 2 dimulai, tetapi jika Anda, programmer,
tahu, dengan sedikit cerdas, di mana mereka JPEG atau apa yang mereka terlihat seperti,
Anda dapat menganalisis 0 dan 1 ini dan berkata, 'Ooh. JPEG. Ooh, JPEG. "
Anda dapat menulis sebuah program dengan dasarnya hanya untuk atau while loop
yang pulih masing-masing dan setiap file-file.
Jadi pelajaran kemudian, adalah untuk memulai "aman" menghapus file Anda
jika Anda ingin menghindari hal ini sama sekali. Ya?
[Pertanyaan Mahasiswa, dipahami]
>> Memiliki memori lebih dari yang Anda lakukan sebelumnya -
Oh! Pertanyaan bagus. Jadi mengapa, kemudian, setelah membuang sampah,
apakah 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 mengubah semua 0, misalnya, untuk melindungi Anda.
Sebaliknya, jika Anda "aman" file menghapus, atau secara fisik merusak perangkat,
yang benar-benar adalah 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.
CS50.TV