[Powered by Google Translate] [MINGGU 5] [David J. Malan, Universiti Harvard] [Ini adalah CS50.] [CS50.TV] [Wanita] Dia berbohong tentang apa, saya tidak tahu. [Man] Jadi, apa yang kita tahu? [Wanita] Bahawa pada 9:15, Ray Santoya adalah di ATM. [Man] Jadi persoalannya, apa yang dia lakukan pada 9:16? [Wanita] Menembak 9 mm pada sesuatu. Mungkin dia melihat sniper. [Man] Atau dia telah bekerjasama dengan beliau. [Wanita] Tunggu. Kembali satu. [Man] Apa yang anda lihat? [♫ muzik suspenseful ♫] [Wanita] Bawa mukanya. Skrin penuh. [Man] gelas Nya. >> Ada satu pantulan. [♫ muzik suspenseful ♫] [Man] Itulah pasukan besbol Nuevita. Itulah logo mereka. [Wanita] Dan dia bercakap kepada sesiapa yang memakai jaket yang. [David Malan] Jadi, ini adalah CS50 minggu 5, dan hari ini kita merosakkan sedikit televisyen dan filem untuk anda. Jadi, apabila anda menonton persembahan seperti ini satu di sini, dan polis mengatakan "Bolehkah anda membersihkan bahawa?" atau "Meningkatkan," tiada meningkatkan dalam dunia sebenar. Malah, apa yang anda benar-benar mendapatkan sesuatu yang kecil seperti ini. Saya telah ditarik ke atas salah satu gambar kakitangan dari halaman. Ini adalah satu program yang dipanggil Photoshop. Ini adalah 1 daripada 2 Bowdens, 1 daripada 3 Bowdens sebenarnya, hari ini, kerana kita mempunyai Puan Bowden sini juga, dengan Rob dan Paul. Tetapi di sini adalah Rob pada skrin, dan jika kita zoom di atas bersinar bahawa dia sentiasa ada dalam matanya, apa yang anda benar-benar melihat bahawa apa yang anda lihat adalah apa yang anda dapatkan. Ini adalah "dipertingkatkan," jadi "CSI" mempunyai sedikit salah. Ada satu klip lain, jika kita boleh memilih "CSI" hanya sedikit lagi. Ini adalah frasa yang bagus untuk mengucapkan selepas jika anda mahu bunyi teknikal dengan kawan-kawan anda apabila, benar-benar, anda mengatakan benar-benar tiada. [Man] Untuk minggu saya telah menyiasat pembunuhan Killer Kusir dengan daya tarikan mengerikan tertentu. [Wanita # 1] Ini adalah dalam masa sebenar. [Wanita # 2] Saya akan mewujudkan antara muka GUI menggunakan Visual Basic, lihat jika saya boleh mengesan alamat IP. [Malan] Jadi audio daripada sync selain, mewujudkan antara muka GUI menggunakan Visual Basic untuk mengesan alamat IP adalah karut lengkap. Pada hari ini, anda tidak akan menggunakan Visual Basic, tidak ada keperluan untuk GUI, dan alamat IP adalah istilah teknikal tepat. Jadi memerhatikan keluar untuk ini, dan salah satu kegemaran saya: Yang satu ini sedikit lebih batin, kerana anda perlu tahu bahasa yang berbeza. Ada bahasa yang dipanggil Objektif-C, yang merupakan superset C. Yang bermaksud C ia ditambah dengan beberapa ciri-ciri tambahan, di kalangan mereka berorientasi objek pengaturcaraan. Dan ini adalah bahasa bahawa Apple telah dipopularkan untuk pengaturcaraan IOS. Dan sebagainya di sini adalah klip dari menunjukkan yang berbeza sama sekali, daripada "Nombor" bahawa jika anda benar-benar melihat dengan teliti pada TiVo dan berhenti anda pada masa yang betul, anda akan melihat bahawa apa yang mereka sedang melihat tidak cukup apa yang sedang digambarkan. Dan biarlah saya cuba penyambung audio yang berbeza di sini dan lihat jika kita tidak boleh menyimpan audio selari masa ini. Saya memberi anda "Nombor." [Man # 1] Ia adalah alamat 32-bit IPv4. [Man # 2] IP, itulah Internet. >> Rangkaian persendirian. Ia adalah rangkaian persendirian Anita. [Malan] Okay. Ini adalah Objektif-C, dan ia adalah untuk program mewarna beberapa kanak-kanak, kerana anda mungkin boleh membuat kesimpulan dari nama pembolehubah sana. Supaya, maka, adalah "Nombor." Jadi hari ini dan minggu ini kita memperkenalkan sedikit dunia forensik dan konteks dalam masalah itu. Hari ini akan menjadi satu kuliah singkatan kerana terdapat satu acara khas di sini selepas itu, jadi kami akan mengambil mengintip, dan mengusik kedua-dua pelajar dan ibu bapa sama-sama hari ini dengan beberapa perkara yang berada di ufuk. Antaranya, seperti hari Isnin, anda akan mempunyai beberapa rakan sekelas. EDX, Harvard dan MITS inisiatif baru dalam talian untuk terbuka koswer dan banyak lagi, pelancaran di kampus Harvard pada Isnin. Yang bermaksud datang Isnin anda akan mempunyai - pada kiraan terakhir, 86.000 rakan sekelas tambahan akan mengikuti bersama-sama dengan kuliah CS50 dan seksyen dan walkthroughs dan set masalah. Dan sebagai sebahagian daripada ini, anda akan menjadi ahli kelas sulung CS50 dan kini CS50x. Sebagai sebahagian daripada ini, kini, menyedari bahawa akan ada beberapa upsides serta. Untuk mendapatkan bersedia untuk ini, bilangan pelajar yang besar, memadai untuk mengatakan bahawa walaupun kita mempunyai 108 TFS dan CA, tidak cukup nisbah pelajar / guru yang terbaik sekali kita mencapai 80,000 pelajar lain. Jadi kita tidak akan penggredan masalah begitu banyak set manual. Jadi diperkenalkan minggu ini dalam set masalah akan menjadi CS50 Semak, yang akan menjadi sebuah utiliti baris arahan dalam perkakas bahawa anda akan mendapat apabila anda mengemas kini ia kemudian hujung minggu ini, dan anda akan dapat menjalankan perintah, daftar 50, pada pset anda sendiri, dan anda akan mendapat beberapa maklum balas sama ada program anda betul atau salah mengikut spesifikasi reka bentuk pelbagai yang kami sediakan. Jadi lanjut mengenai itu dan masalah spesifikasi yang ditetapkan dan rakan sekelas CS50x akan menggunakan ini juga. Jadi set masalah 4 adalah semua tentang forensik. Dan sekeping ini telah diilhamkan oleh beberapa perkara sebenar, di mana apabila saya berada di sekolah siswazah, saya interned untuk seketika dengan Pejabat Peguam Middlesex County Daerah melakukan kerja forensik dengan penyiasat utama forensik mereka, dan apa ini berjumlah , saya fikir saya sebutkan lalu seminggu beberapa, adalah polis Negeri Massa atau lain-lain akan datang, mereka akan jatuh kira perkara-perkara seperti pemacu CD dan keras dan cakera liut dan sebagainya, dan kemudian matlamat pejabat forensik adalah untuk menentukan sama ada ada atau tidak bukti sejenis. Ini adalah Unit Siasatan Khas, jadi ia adalah jenayah kolar putih, ia adalah jenis yang lebih merisaukan jenayah, apa-apa yang melibatkan beberapa jenis media digital; ternyata bahawa tidak ramai orang menulis e-mel yang mengatakan "Saya melakukannya." Jadi agak kerap carian forensik tidak hadir semua bahawa buah-buahan yang banyak, tetapi kadang-kadang orang akan menulis e-mel itu. Jadi kadang-kadang usaha diberikan ganjaran. Tetapi untuk memimpin sehingga pset ini forensik, kita akan memperkenalkan di pset 4 sedikit grafik. Jadi anda mungkin mengambil perkara-perkara ini untuk JPEG, diberikan, GIF dan seperti hari ini, tetapi jika anda benar-benar berfikir tentang hal itu, imej, sama seperti muka Rob, boleh dimodelkan sebagai urutan titik, atau piksel. Sekarang, dalam kes muka Rob, ada pelbagai warna, dan kami mula melihat titik individu, otherwide dikenali sebagai piksel, sebaik sahaja kami mula untuk mengezum masuk Tetapi jika kita memudahkan dunia sedikit, dan hanya mengatakan bahawa ini di sini adalah Rob dalam hitam dan putih, baik, untuk mewakili hitam dan putih, kita hanya boleh menggunakan binari. Dan jika kita akan menggunakan binari, 1 atau 0, kita boleh menyatakan ini imej yang sama muka tersenyum Rob dengan corak ini bit: 11000011 mewakili putih, putih, hitam, hitam, hitam, hitam, putih putih. Dan sebagainya ia bukan lonjakan yang besar, maka, untuk memulakan bercakap tentang gambar-gambar yang berwarna-warni. Perkara yang anda akan melihat di Facebook atau mengambil dengan kamera digital, tetapi, sudah tentu, apabila ia datang kepada warna, anda perlu lebih banyak bit. Dan agak biasa di dunia gambar adalah untuk menggunakan bukan 1-bit warna, kerana ini mencadangkan, tetapi 24-bit warna, di mana anda sebenarnya mendapatkan berjuta-juta warna. Jadi, seperti dalam kes apabila kita dizum di atas mata Rob, itu adalah apa-apa bilangan berjuta-juta kemungkinan yang berbeza berwarna-warni. Jadi, kita akan memperkenalkan ini dalam set masalah 4 serta dalam Walkthrough, yang akan menjadi hari ini pada 3:30 bukannya 2:30 biasa kerana kuliah di sini Jumaat. Tetapi video akan berada dalam talian, seperti biasa, esok. Kami juga akan memperkenalkan anda kepada format fail yang lain. Jadi ini sengaja bertujuan untuk kelihatan menakutkan pada mulanya, tetapi ini adalah hanya beberapa dokumentasi untuk struct C. Ia ternyata bahawa Microsoft, tahun lalu, membantu mempopularkan format ini, dipanggil format fail bitmap, BMP, dan ini adalah super mudah, format fail grafik berwarna-warni yang telah digunakan untuk sekian lama dan kadang-kadang masih wallpaper pada desktop. Jika anda berfikir kembali ke Windows XP dan bukit-bukau dan langit biru, yang biasanya BMP, atau imej bitmap, dan bitmap yang menyeronokkan bagi kami kerana mereka mempunyai kerumitan sedikit lebih. Ia tidak cukup semudah grid ini 0 dan 1 ini; sebaliknya, anda mempunyai perkara-perkara seperti tandukan pada permulaan fail. Jadi dalam erti kata lain, di dalam sebuah fail. Bmp adalah sekumpulan keseluruhan 0 dan 1 ini, tetapi terdapat beberapa tambahan 0 dan 1 di sana. Dan ternyata bahawa apa yang kita mungkin telah diambil untuk diberikan selama bertahun-tahun, format fail seperti doc atau. xls atau. mp3 atau mp4, apa jua format fail yang anda sudah biasa dengan. Nah, apakah ia juga bermaksud untuk menjadi format fail? Kerana pada akhir hari, semua fail-fail yang kita gunakan mempunyai hanya 0 dan 1 yang dan mungkin mereka 0 dan 1 yang mewakili a, b, c, melalui ASCII atau sebagainya, tetapi melalui akhir hari, ia hanya 0 dan 1 ini. Jadi manusia hanya kadang-kadang memutuskan untuk mencipta format fail baru di mana mereka menyeragamkan apa corak bit sebenarnya akan bermakna. Dan dalam kes ini di sini, orang yang direka format fail bitmap berkata bahawa pada bait pertama dalam fail bitmap, seperti yang ditandakan oleh offset 0, di sana, ada akan menjadi beberapa bfType cryptically dinamakan ubah dipanggil, yang hanya berdiri untuk jenis fail bitmap; apa jenis fail bitmap ini. Anda boleh membuat kesimpulan, mungkin, dari baris kedua yang mengimbangi 2, bilangan bait 2, mempunyai corak daripada 0 dan 1 yang mewakili apa? Saiz sesuatu, dan ia pergi dari sana. Jadi masalah dalam set 4, anda akan berjalan melalui beberapa perkara-perkara ini. Kami tidak akan berakhir sehingga mengambil berat tentang mereka semua, tetapi notis ia bermula untuk mendapatkan menarik sekitar garis atau bait 54, rgbtBlue, Hijau dan Merah. Jika anda pernah mendengar singkatan RGB, merah hijau biru, ini adalah rujukan itu. Kerana ia ternyata anda boleh cat semua warna pelangi dengan beberapa kombinasi merah dan biru dan hijau. Dan, sebenarnya, ibu bapa di dalam bilik mungkin ingat beberapa projektor yang terawal. Hari ini, anda hanya melihat 1 cahaya terang keluar dari lensa. Tetapi kembali pada hari itu, anda mempunyai kanta merah, kanta biru, dan kanta hijau dan bersama-sama mereka bertujuan pada skrin dan membentuk gambar yang berwarna-warni. Dan seringkali sekolah menengah dan sekolah tinggi akan mempunyai orang-orang kanta sentiasa jadi-sedikit serong, jadi anda jenis melihat imej dua atau tiga kali ganda, tetapi itu adalah idea. Anda mempunyai cahaya merah dan hijau dan biru lukisan gambar. Dan prinsip yang sama digunakan dalam komputer. Jadi antara cabaran, maka, untuk anda dalam masalah menetapkan 4 akan menjadi beberapa perkara; seseorang itu sebenarnya adalah untuk mengubah saiz imej. Untuk mengambil dalam corak 0 dan 1 ini, memikirkan mana ketulan 0 dan 1 yang mewakili apa dalam struktur seperti ini, dan kemudian memikirkan bagaimana untuk meniru piksel: merah, blues, sayur-sayuran dalam supaya apabila gambar kelihatan seperti ini pada mulanya, mungkin kelihatan seperti ini dan bukannya selepas itu. Antara cabaran lain, juga, akan menjadi bahawa anda akan diserahkan imej forensik fail sebenar dari kamera digital dan pada kamera itu, pada satu ketika dahulu, sekumpulan keseluruhan gambar. Masalahnya, kita tidak sengaja dipadam atau mempunyai imej rosak entah bagaimana. Perkara-perkara buruk berlaku dengan kamera digital, dan sebagainya kita cepat disalin semua dan 0 Kenalan 1 off kad untuk anda, selamatkan mereka semua dalam 1 file besar, dan kemudian kita akan menyerahkannya kepada anda dalam masalah menetapkan 4 supaya anda boleh menulis program dalam C dengan yang untuk pulih semua mereka JPEG, ideal. Dan ternyata bahawa JPEG, walaupun mereka agak format fail yang kompleks, mereka lebih kompleks daripada wajah ini tersenyum sini. Ia ternyata bahawa setiap JPEG bermula dengan corak yang sama daripada 0 dan 1 ini. Jadi menggunakan gelung sementara atau untuk gelung atau serupa, anda boleh melelar atas semua 0 dan 1 dalam imej ini forensik dan setiap kali anda melihat corak khas yang ditakrifkan dalam penentuan set masalah, anda boleh menganggap, 'Oh, di sini ialah, dengan kebarangkalian yang sangat tinggi, permulaan JPEG, 'dan secepat anda mencari corak yang sama, beberapa nombor bait atau kilobait atau megabait kemudian, anda boleh menganggap, 'Ooh! Berikut adalah JPEG kedua, gambar yang saya ambil selepas yang pertama. Biar saya berhenti membaca bahawa fail pertama, mula menulis ini salah satu yang baru. ' Dan output program anda untuk pset 4 akan menjadi sebanyak 50 JPEG. Dan jika ia tidak 50 JPEG, anda mempunyai sedikit gelung. Jika anda mempunyai nombor terhingga JPEG, anda mempunyai gelung tidak terhingga. Supaya, juga, akan menjadi agak kes biasa. Itulah apa yang di ufuk. Kuiz 0, di belakang kita. Sedar, setiap e-mel saya, yang selalunya ada orang yang berdua gembira, jenis neutral, dan sedih sekitar kuiz time 0. Dan jangan sampai kepada saya, TFS kepala, Zamyla, TF anda sendiri atau salah satu daripada CA bahawa anda tahu jika anda ingin membincangkan bagaimana perkara pergi. Jadi untuk menarik perhatian ibu bapa di sini di dalam bilik, apakah perpustakaan CS50? Pekerjaan yang baik. Apa perpustakaan CS50? Yeah? [Jawapan Pelajar, difahami] >> Okay, baik. Jadi ia adalah satu set prewritten kod bahawa kita, kakitangan, menulis, kami sediakan untuk anda, untuk menyediakan beberapa fungsi yang biasa. Barangan ingin mendapatkan saya rentetan; mendapatkan saya int, semua fungsi yang disenaraikan di sini. Bermula sekarang, kita mula untuk benar-benar mengambil roda latihan. Jadi kita akan mula mengambil "tali" daripada anda, yang, ingat, hanya sinonim untuk apa jenis data sebenar? * char. Jadi bagi ibu bapa, adalah mungkin - yang baik, jadi * char kita akan mula melihat pada skrin semua lebih seperti yang kita keluarkan "rentetan" dari perbendaharaan kata kita, sekurang-kurangnya apabila ia datang untuk benar-benar menulis kod. Begitu juga, kita akan berhenti menggunakan beberapa fungsi-fungsi ini sebanyak, kerana program kami akan mendapat lebih canggih bukannya hanya menulis program yang duduk di sana dengan berkelip segera, menunggu pengguna untuk menaip sesuatu. Anda akan mendapat input anda dari tempat lain. Sebagai contoh, anda akan mendapat mereka dari siri bit pada hard drive tempatan. Sebaliknya anda akan mendapat mereka pada masa hadapan dari sambungan rangkaian, laman web beberapa tempat. Jadi mari kita mengupas kembali lapisan ini untuk kali pertama, dan tarik sehingga perkakas CS50 dan fail ini dipanggil CS50.h, yang anda telah tajam termasuk untuk minggu. Tetapi mari kita sebenarnya melihat apa yang ada di dalam ini. Jadi atas fail dalam biru hanya sekumpulan keseluruhan komen, maklumat waranti dan pelesenan. Ini adalah jenis paradigma biasa dalam perisian, kerana banyak perisian pada hari ini adalah apa yang dipanggil "sumber terbuka," yang bermaksud bahawa seseorang telah menulis kod dan membuat ia bebas didapati, bukan hanya untuk menjalankan dan menggunakan, tetapi sebenarnya membaca dan mengubah dan mengintegrasikan ke dalam kerja anda sendiri. Jadi itulah apa yang anda telah menggunakan, perisian sumber terbuka, walaupun dalam bentuk yang sangat kecil. Jika saya tatal ke bawah lalu komen, walaupun, kita akan mula untuk melihat beberapa perkara yang lebih biasa. Jadi notis di atas sini, bahawa fail CS50.h termasuk sekumpulan keseluruhan fail header. Kini, kebanyakan kita telah tidak dilihat sebelum ini, tetapi satu biasa; yang ini telah kita lihat, walaupun secara ringkas, setakat ini? Ya, perpustakaan standard. Stdlib.h mempunyai malloc, jadi apabila kita mula bercakap tentang peruntukan memori dinamik, yang kita akan kembali untuk minggu depan juga, kita mula termasuk fail tersebut. Ia ternyata bahawa bool dan benar dan palsu tidak benar-benar wujud dalam C, per se, melainkan jika anda termasuk fail ini di sini. Jadi kita telah, selama beberapa minggu, telah termasuk standard bool.h supaya anda boleh menggunakan tanggapan bool, benar atau palsu. Tanpa ini, anda akan mempunyai untuk menyelesaikan palsu ia dan menggunakan int dan hanya sewenang-wenangnya menganggap bahawa 0 adalah palsu dan 1 adalah benar. Sekarang, jika kita tatal ke bawah lagi, di sini adalah definisi kita rentetan. Ternyata, seperti yang kita telah berkata sebelum ini, bahawa mana * ini adalah tidak benar-benar perkara. Anda juga boleh mempunyai ruang di sekeliling. Kami, pada semester ini telah mempromosikan ia sebagai ini untuk membuat jelas bahawa * mempunyai kaitan dengan jenis. Tetapi sedar, seperti biasa, jika tidak sedikit lebih biasa, adalah untuk meletakkan ia di sana tetapi fungsi ia adalah perkara yang sama. Tetapi sekarang, jika kita membaca menurunkan lagi, mari kita melihat berkata, GetInt, kerana kita digunakan itu, mungkin, sebelum apa-apa lagi semester ini. Dan di sini adalah GetInt. Ini adalah apa? Ini adalah prototaip. Jadi selalunya, kita telah meletakkan prototaip di puncak kami. Fail c, tetapi anda juga boleh meletakkan prototaip dalam fail pengepala, h fail, seperti yang satu ini di sini, supaya apabila anda menulis beberapa fungsi yang anda mahu orang lain boleh menggunakan, yang betul-betul kes dengan perpustakaan CS50, anda bukan sahaja melaksanakan fungsi anda dalam sesuatu seperti CS50.c, anda juga meletakkan prototaip tidak di bahagian atas fail itu, tetapi di atas fail header, maka bahawa fail pengepala adalah apa yang rakan-rakan dan rakan sekerja termasuk, dengan tajam termasuk dalam kod mereka sendiri. Jadi, sepanjang masa ini, anda telah termasuk semua ini prototaip berkesan di bahagian atas fail anda, tetapi dengan cara ini tajam termasuk mekanisme bahawa pada dasarnya salinan dan Pes fail ini ke dalam anda sendiri. Sekarang, di sini adalah beberapa dokumentasi yang agak terperinci. Kami telah cukup banyak diambil untuk diberikan bahawa GetInt mendapat int an, tetapi ternyata ada beberapa kes sudut, bukan? Bagaimana jika jenis pengguna dalam bilangan yang terlalu besar? A triliun, yang hanya tidak boleh dimuatkan di dalam int? Apakah tingkah laku yang dijangkakan? Nah, sebaik-baiknya, ia diramalkan. Jadi dalam kes ini, jika anda sebenarnya membaca cetakan halus, anda akan melihat bahawa jika garisan tidak boleh dibaca, ini INT_MAX pulangan. Kami tidak pernah bercakap tentang perkara ini, tetapi berdasarkan kepada permodalan, apakah ia, mungkin? Ia adalah pemalar, maka ia adalah beberapa pemalar khas yang mungkin diisytiharkan dalam satu fail-fail header yang lebih tinggi dalam fail, dan INT_MAX mungkin sesuatu seperti, kira-kira, 2 bilion. Idea bahawa kerana kita perlu entah bagaimana menandakan sesuatu yang silapnya, kita, ya, mempunyai 4000000000 nombor di tangan kita, negatif 2 bilion pada sehingga kepada 2 bilion, memberi atau mengambil. Nah, apa adalah perkara biasa dalam pengaturcaraan anda mencuri hanya salah satu daripada nombor-nombor tersebut. Mungkin 0, mungkin 2000000000, mungkin negatif 2000000000. Jadi anda menghabiskan satu nilai yang mungkin anda supaya anda boleh melakukan untuk dunia bahawa jika sesuatu berlaku, saya akan memulangkan nilai ini super-besar. Tetapi anda tidak mahu pengguna menaip sesuatu yang samar-samar seperti "2, 3, 4 ..." nombor benar-benar besar, di mana anda umum dan bukannya sebagai pemalar. Jadi benar-benar, jika anda sedang dubur beberapa minggu lalu, bila-bila masa anda memanggil GetInt, anda perlu telah memeriksa dengan keadaan jika. Adakah jenis pengguna di INT_MAX, atau lebih khusus, lakukan pulangan GetInt INT_MAX? Kerana jika ia tidak, yang sebenarnya bermakna mereka tidak menaip sesuatu silapnya dalam kes ini. Jadi ini adalah apa yang biasanya dikenali sebagai nilai "sentinel", yang hanya bermakna istimewa. Nah, mari kita kini bertukar kepada c fail. Fail C telah wujud di dalam perkakas untuk beberapa waktu, dan, sebenarnya, perkakas mempunyai ia precompiled untuk anda ke dalam perkara yang kita dipanggil "kod objek," tetapi ia hanya tidak perkara itu kepada anda di mana ia adalah kerana sistem itu tahu, dalam kes ini, di mana ia adalah, perkakas. Tetapi mari kita tatal ke bawah sekarang GetInt, dan lihat bagaimana GetInt telah bekerja sepanjang masa ini. Jadi di sini kita mempunyai komen yang sama dari sebelum ini. Biar saya mengezum masuk pada hanya sebahagian kod, dan apa yang kita ada untuk GetInt adalah seperti berikut. Ia mengambil input dan ia kembali int, manakala (benar), jadi kita mempunyai gelung tak terhingga sengaja tetapi, mungkin, kita akan keluar ini entah bagaimana, atau kembali dari dalam ini. Jadi mari kita lihat bagaimana kerja-kerja ini. Nah, kita seolah-olah menggunakan GetString dalam barisan pertama ini di dalam gelung, 166. Ini adalah kini amalan yang baik kerana dalam apa keadaan GetString dapat kembali kata kunci ini khas, NULL? Jika sesuatu berlaku. Apa yang boleh pergi salah apabila anda memanggil sesuatu seperti GetString? Yeah? [Pelajar jawapan, difahami] >> Yeah. Jadi mungkin malloc gagal. Tempat bawah GetString hud memanggil malloc, yang memperuntukkan memori, yang membolehkan kedai komputer semua watak-watak yang pengguna jenis ke dalam keyboard. Dan andaikan pengguna mempunyai banyak keseluruhan masa lapang dan ditaip lebih, misalnya, daripada 2 bilion aksara. Lebih banyak watak-watak daripada komputer walaupun mempunyai RAM. Nah, GetString telah dapat untuk menandakan bahawa kepada anda, walaupun ini adalah super sudut, super kes luar biasa. Ia mempunyai entah bagaimana dapat untuk mengendalikan ini, dan begitu GetString, jika kita kembali dan membaca dokumentasi, tidak, sebenarnya, kembali NULL. Sekarang jika GetString gagal dengan mengembalikan NULL, GetInt akan gagal dengan kembali INT_MAX, hanya sebagai sentinel. Ini hanya konvensyen manusia. Satu-satunya cara anda akan tahu ini adalah kes itu adalah dengan membaca dokumentasi. Jadi mari kita tatal ke mana int sebenarnya GotInt. Jadi jika saya tatal ke bawah sedikit lagi, di 170 baris kita mempunyai komen di atas garisan ini. Jadi kita mengisytiharkan, 172, n dan c char int, dan maka ini fungsi baru yang sesetengah daripada anda telah terjumpa sebelum, tetapi sscanf. Ini bermaksud untuk imbasan rentetan f. Dalam erti kata lain, memberi saya rentetan dan saya akan mengimbas untuk keping maklumat kepentingan. Jadi apa maksudnya? Nah, katakan bahawa saya menaip, secara literal, 1 2 3 pada keyboard, dan kemudian tekan enter. Apakah jenis data 1 2 3 apabila dikembalikan oleh GetString? Ia jelas rentetan, betul-betul? Saya mendapat rentetan, jadi 1 2 3 adalah benar-benar "1 2 3" dengan 0 \ pada akhir ia. Yang tidak int. Itu bukan nombor. Ia kelihatan seperti nombor tetapi ia tidak sebenarnya. Jadi apakah GetInt perlu lakukan? Ia mempunyai untuk mengimbas bahawa rentetan kiri ke kanan, 1 2 3 \ 0, dan entah bagaimana menukarkan ia kepada integer sebenar. Kini, anda boleh memikirkan bagaimana untuk melakukan ini. Jika anda berfikir kembali untuk pset 2, anda mungkin mendapat sedikit selesa dengan Caesar atau vigenere supaya anda boleh melelar lebih rentetan, anda boleh menukar aksara ints dengan memilih. Itulah banyak keseluruhan kerja. Mengapa tidak memanggil fungsi seperti sscanf yang adakah itu untuk anda? Jadi sscanf menjangka hujah, dalam kes ini dipanggil talian, yang merupakan rentetan. Anda kemudian tentukan, dalam petikan, sangat serupa dengan printf, apa yang anda harapkan untuk melihat dalam rentetan ini? Apa yang saya katakan di sini ialah, saya menjangkakan untuk melihat nombor perpuluhan dan mungkin watak. Dan kita akan melihat mengapa ini adalah kes dalam hanya seketika. Ia ternyata bahawa tatatanda ini kini mengingatkan barangan kita mula bercakap tentang hanya lebih seminggu lalu. Apakah & n dan & c lakukan untuk kita di sini? [Jawapan Pelajar, difahami] >> Yeah. Ia memberikan saya alamat n dan alamat c. Sekarang, mengapa yang penting? Nah, anda tahu bahawa dengan fungsi dalam C anda sentiasa boleh kembali nilai atau tiada nilai pada semua. Anda boleh kembali int, rentetan, apungan, char, apa sahaja. Atau anda boleh kembali tidak sah, tetapi anda hanya boleh kembali 1 perkara yang maksima. Tetapi di sini kita mahu sscanf untuk kembali saya mungkin an int, nombor perpuluhan, dan juga char, dan saya akan menjelaskan mengapa char dalam seketika. Supaya anda mahu f untuk kembali 2 perkara, yang hanya tidak mungkin dalam C. Jadi, anda boleh bekerja di sekitar bahawa oleh lulus dalam 2 alamat, kerana sebaik sahaja anda menyerahkan fungsi 2 alamat, apa yang boleh fungsi yang dilakukan dengan mereka? Ia boleh menulis kepada mereka alamat. Anda boleh menggunakan operasi * dan "pergi ke sana" kepada setiap alamat mereka. Ia adalah jenis mekanisme ini backdoor, tetapi sangat biasa untuk mengubah nilai pembolehubah dalam masa lebih daripada hanya 1 tempat, dalam kes ini 2. Sekarang, notis Saya memeriksa == to1, dan kemudian kembali n jika ia, pada hakikatnya, menilai kepada true. Jadi apa yang berlaku? Secara teknikalnya, semua yang kita benar-benar mahu berlaku dalam GetInt ini. Kita mahu untuk menghuraikan, jadi untuk bercakap, kita mahu membaca rentetan "1 2 3" dan jika ia kelihatan seperti ada beberapa di sana, apa yang kita memberitahu sscanf lakukan adalah meletakkan bahawa nombor, 1 2 3, n ini berubah-ubah bagi saya. Mengapa, maka, adakah saya perlu ini serta? Apakah peranan juga berkata, sscanf, anda juga mungkin akan mendapat watak di sini. [Pengucapan Pelajar, difahami] >> Tidak - titik perpuluhan boleh bekerja. Mari kita berpendapat bahawa berfikir sejenak. Apa lagi? [Pelajar, difahami] >> Jadi, pemikiran yang baik, ia boleh menjadi watak NULL. Ia sebenarnya tidak, dalam kes ini. Yeah? [Pelajar, difahami] >> ASCII. Atau, izinkan saya umum lebih jauh. % C ada hanya untuk memeriksa kesilapan. Kita tidak mahu ada untuk menjadi watak selepas nombor, tetapi apa ini membolehkan saya lakukan adalah seperti berikut: Ia ternyata bahawa sscanf, selain menyimpan nilai dalam n dan c, dalam contoh ini di sini, apa ia juga tidak ia mengembalikan bilangan pembolehubah ia meletakkan nilai masuk Jadi jika anda hanya menaip 1 2 3, maka hanya d% akan sepadan dan n hanya mendapat disimpan dengan nilai seperti 1 2 3 dan tiada apa yang mendapat dimasukkan ke dalam c; c kekal nilai sampah, jadi untuk bercakap. Sampah kerana ia tidak pernah dimulakan sebagai nilai tertentu. Jadi, dalam kes itu, sscanf mengembalikan 1, kerana saya penduduk salah satu daripada mereka petunjuk, di mana, hebat. Saya mempunyai int, jadi saya membebaskan baris untuk membebaskan memori bahawa GetString sebenarnya diperuntukkan, dan kemudian saya kembali n. Lain, jika anda pernah tertanya-tanya mana yang cuba semula pernyataan datang dari, datang dari kanan di sini. Jika, sebaliknya, saya menaip 1 2 3 foo, hanya beberapa urutan rawak teks, sscanf akan melihat, aduh, nombor, aduh, nombor, aduh, nombor, aduh - f. Dan ia akan meletakkan 1 2 3 dalam n. Ia akan meletakkan f di c, dan kemudian kembali 2. Jadi kita ada, hanya menggunakan definisi asas tingkah laku scanf, satu cara yang sangat mudah - baik, kompleks pada pandangan pertama, tetapi pada akhir hari, mekanisme agak mudah untuk mengatakan, ada int an, dan jika demikian, adalah bahawa satu-satunya yang saya dapati? Dan ruang putih di sini adalah sengaja. Jika anda membaca dokumentasi untuk sscanf, ia memberitahu anda bahawa jika anda termasuk sekeping ruang putih di awal atau akhir, sscanf juga akan membenarkan pengguna, untuk apa jua alasan, untuk memukul bar ruang 1 2 3, dan yang akan menjadi sah. Ia tidak akan menjerit pada pengguna hanya kerana mereka melanda bar ruang pada awal atau akhir, yang hanya sedikit lebih mesra pengguna. Sebarang soalan, maka, pada GetInts? Yeah? [Pelajar soalan, difahami] >> Soalan yang baik. Apa yang jika anda hanya ditaip dalam char, seperti f, memukul dan masukkan tanpa pernah menaip 1 2 3; apa yang anda fikir kelakuan baris ini kod kemudian akan menjadi? Jadi sscanf boleh meliputi itu juga, kerana dalam kes itu, ia tidak akan mengisi n atau c; ia akan sebaliknya kembali 0. Di mana, saya juga menangkap senario yang, kerana nilai jangkaan yang saya mahu ialah 1. Saya hanya mahu 1, dan hanya 1 perkara perlu diisi. Soalan yang baik. Orang lain? Baiklah, jadi kita tidak pergi melalui semua fungsi di sini, tetapi satu yang seolah-olah, mungkin, kepentingan baki adalah GetString kerana ia ternyata bahawa GetFloat, GetInt, Dalam GetDouble, menyepak bola GetLongLong semua banyak fungsi untuk GetString mereka. Jadi mari kita lihat bagaimana dia dilaksanakan di sini. Yang satu ini kelihatan agak kompleks tetapi ia menggunakan asas yang sama bahawa kita mula bercakap tentang minggu lepas. Jadi dalam GetString, yang mengambil hujah tidak sebagai satu kekosongan di sini, dan ia mengembalikan rentetan; jadi saya mengisytiharkan rentetan yang dipanggil buffer. Saya tidak benar-benar tahu apa yang akan digunakan untuk lagi, tetapi kita akan melihat. Kelihatan seperti kapasiti, secara lalai, 0; tidak pasti di mana ini akan. Tidak pasti apa yang n akan digunakan untuk lagi. Tetapi kini ia mendapat sedikit lebih menarik, jadi dalam 243 baris, kita mengaku int c, ini adalah jenis detail bodoh. Char adalah 8 bit, dan 8 bit boleh menyimpan berapa banyak nilai-nilai yang berbeza? 256. Masalahnya ialah, jika anda mahu mempunyai 256 aksara ASCII yang berbeza, yang terdapat, jika kamu fikir kembali, dan ini bukanlah sesuatu yang menghafal. Tetapi jika anda berfikir kembali untuk carta yang ASCII besar kita telah minggu lalu, ada, dalam kes itu, 128 atau 256 aksara ASCII. Kami menggunakan semua corak Kenalan 0 dan 1 terpulang. Itulah masalah jika anda mahu menjadi mampu untuk mengesan ralat. Kerana jika anda telah menggunakan 256 nilai untuk watak anda, anda tidak benar-benar merancang ke hadapan, kerana kini anda tidak mempunyai cara untuk mengatakan, "Ini bukan watak legit; ini adalah beberapa mesej yang salah." Jadi apa yang dunia tidak adalah, mereka menggunakan nilai seterusnya terbesar, sesuatu seperti int supaya anda mempunyai beberapa gila bit, 32 untuk 4 bilion nilai yang mungkin, supaya anda hanya boleh akhirnya menggunakan, asasnya, 257 daripada mereka, 1 yang mempunyai beberapa makna khas sebagai ralat. Jadi mari kita lihat bagaimana kerja-kerja ini. Dalam baris 246, saya mempunyai gelung sementara besar yang memanggil fgetc; f fail makna, getc, dan kemudian stdin. Rupa-rupanya, ini adalah hanya cara yang lebih tepat mengatakan "membaca input dari keyboard." Cara input standard keyboard, output standard bermakna skrin, dan ralat piawai, yang kita akan melihat dalam pset 4, bermakna skrin, tetapi sebahagian khas skrin supaya ia tidak mencampur - adukkan dengan output sebenar yang anda bertujuan untuk mencetak, tetapi lebih pada itu pada masa depan. Jadi fgetc hanya bermakna membaca satu aksara dari papan kekunci, dan menyimpan mana? Simpan di c, dan kemudian menyemak, jadi saya hanya menggunakan beberapa kata hubung boolean di sini, periksa bahawa ia tidak sama \ n, jadi pengguna telah melanda masukkan. Kami mahu menghentikan pada ketika itu, akhir gelung, dan kita juga mahu menyemak bagi pemalar khas, EOF, yang jika anda tahu atau rasa - apakah ia berdiri untuk? Akhir fail. Jadi ini adalah jenis karut, kerana jika saya menaip di keyboard, ada benar-benar tiada fail yang terlibat dalam hal ini, tetapi ini hanya menyusun istilah generik yang digunakan untuk bermaksud bahawa apa-apa lagi yang datang dari jari manusia. EOF. Akhir fail. Sebagai mengetepikan, jika anda pernah melanda kawalan d di keyboard anda, tidak bahawa anda akan mempunyai lagi; anda telah melanda kawalan c. Tetapi kawalan d menghantar ini EOF khas dipanggil berterusan. Jadi sekarang kita hanya mempunyai beberapa peruntukan memori dinamik. Jadi, jika n + 1> kapasiti, sekarang saya akan terangkan n. n hanya berapa banyak bait kini dalam buffer, rentetan yang anda sedang membina daripada pengguna. Jika anda mempunyai lebih banyak watak-watak dalam buffer anda daripada anda mempunyai kapasiti dalam buffer, intuitif, apa yang perlu kita lakukan maka memperuntukkan lebih banyak kapasiti. Saya akan agunan lebih beberapa aritmetik di sini dan memberi tumpuan hanya pada fungsi ini di sini. Anda tahu apa malloc, atau sekurang-kurangnya secara amnya biasa. Mengambil meneka apa realloc tidak. [Pelajar jawapan, difahami] >> Yeah. Dan ia tidak cukup menambah memori; ia reallocates memori seperti berikut: Jika masih ada ruang pada hujung tali untuk memberi anda lebih banyak memori yang daripada ia asalnya memberikan anda, maka anda akan mendapat bahawa memori tambahan. Jadi, anda hanya boleh meletakkan watak-watak rentetan kembali ke belakang untuk kembali ke belakang. Tetapi jika itu bukan kes itu, kerana anda menunggu terlalu lama dan sesuatu rawak mendapat plopped ke dalam ingatan di sana, tetapi ada tambahan ingatan turun di sini, yang okay. Realloc akan melakukan semua mengangkat berat untuk anda, menggerakkan rentetan yang anda telah membaca setakat ini dari sini, meletakkan ia ke bawah sana, dan kemudian memberi anda beberapa lagi landasan pada ketika itu. Jadi dengan gelombang tangan, biar saya katakan bahawa apa yang GetString melakukan ia bermula dengan penampan kecil, mungkin 1 aksara tunggal, dan jika pengguna jenis dalam 2 watak, GetString berakhir memanggil realloc dan berkata, 'Ooh, 1 watak tidak cukup. Berikan saya 2 aksara. ' Kemudian jika anda membaca melalui logik gelung, ia akan berkata, 'Ooh, pengguna yang ditaip dalam 3 huruf. Berikan saya kini bukan 2 tetapi 4 watak, kemudian memberikan saya 8, kemudian memberikan saya 16 dan 32. ' Hakikat bahawa saya menggandakan kapasiti setiap kali bermakna bahawa penimbal tidak akan berkembang perlahan-lahan. Ia akan berkembang pesat super, dan apa yang mungkin kelebihan itu? Mengapa saya menggandakan saiz buffer, walaupun pengguna mungkin hanya memerlukan 1 watak tambahan dari keyboard? [Jawapan Pelajar, difahami]. >> Apa itu? Tepat sekali. Anda tidak perlu untuk berkembang ia sekerap. Dan ini adalah hanya jenis - you're melindung nilai pertaruhan anda di sini. Idea yang anda tidak mahu untuk memanggil realloc banyak, kerana ia cenderung untuk menjadi perlahan. Bila-bila masa anda bertanya kepada sistem operasi untuk ingatan, seperti yang anda akan melihat dalam set masalah masa depan, ia cenderung untuk mengambil sedikit masa. Jadi meminimumkan bahawa jumlah masa, walaupun anda membuang beberapa ruang, cenderung untuk menjadi satu perkara yang baik. Tetapi jika kita membaca melalui bahagian akhir GetString di sini, dan sekali lagi, memahami setiap baris tunggal di sini tidak begitu penting hari ini. Tetapi melihat bahawa ia akhirnya panggilan malloc lagi, dan ia memperuntukkan tepat seperti bytes banyak kerana ia perlu untuk tali dan kemudian membuang dengan panggilan percuma, penampan yang terlampau besar, jika ia benar-benar mendapat dua kali ganda terlalu banyak kali. Secara ringkas, itu bagaimana GetString telah bekerja sepanjang masa ini. Semua ia membaca satu aksara pada satu masa lagi dan lagi dan lagi dan setiap kali ia memerlukan beberapa memori tambahan, ia meminta sistem operasi untuk dengan memanggil realloc. Apa-apa soalan? Semua hak. Serangan. Sekarang kita memahami petunjuk, atau sekurang-kurangnya semakin biasa dengan petunjuk, mari kita mempertimbangkan bagaimana seluruh dunia mula runtuh jika anda tidak cukup mempertahankan terhadap pengguna pertentangan, orang yang cuba untuk menggodam ke dalam sistem anda. Orang yang cuba untuk mencuri perisian anda dengan mengelakkan beberapa kod pendaftaran bahawa mereka mungkin sebaliknya perlu menaip masuk Ambil melihat contoh ini di sini, yang hanya kod C yang mempunyai fungsi utama di bawah, yang menyeru a foo fungsi, dan apa yang ia lulus ke foo? [Pelajar] Satu hujah tunggal. >> Hujah Single. Jadi argv [1], yang bermaksud perkataan pertama pengguna ditaip pada baris arahan selepas a.out atau apa sahaja program yang dipanggil. Jadi foo, di atas, mengambil dalam * char, tetapi * char hanya apa? Tali. Tiada apa-apa yang baru di sini, dan tali yang sewenang-wenangnya yang dipanggil bar. Dalam baris ini di sini, char c [12], jenis semi-teknikal Bahasa Inggeris, apa yang garis ini melakukan? Array -? Aksara. Berikan saya pelbagai 12 aksara. Jadi kita mungkin memanggil ini penampan. Ia teknikal dipanggil c, tetapi penampan dalam pengaturcaraan hanya bermaksud sekumpulan ruang yang anda boleh meletakkan beberapa barangan. Kemudian akhir sekali, memcpy, kita telah tidak digunakan sebelum ini. Tetapi anda mungkin boleh meneka apa yang ia. Ia salinan ingatan. Apakah ia lakukan? Nah, ia nampaknya salinan bar, input, ke c, tetapi hanya sehingga panjang bar. Tetapi ada bug di sini. Okay, jadi teknikal kita benar-benar perlu melakukan strlen (bar) x sizeof (char), yang betul. Tetapi dalam kes terburuk di sini, mari kita menganggap bahawa that's - jadi, okay. Kemudian ada 2 bug. Jadi sizeof (char), hak semua, mari kita membuat ini sedikit lebih luas. Jadi sekarang masih ada bug, iaitu apa? [Pelajar jawapan, difahami] >> Semak untuk apa? Okay, jadi kita harus memeriksa untuk NULL, kerana perkara-perkara buruk berlaku apabila penunjuk anda adalah NULL, Kerana anda mungkin akhirnya pergi ke sana, dan anda harus tidak pernah akan NULL dengan dereferencing dengan operator *. Jadi itulah yang baik, dan apa lagi yang kita lakukan? Secara logiknya terdapat kecacatan di sini juga. [Pelajar jawapan, difahami] >> Jadi memeriksa jika argc ≥ 2? Okay, jadi ada 3 bug dalam program ini di sini. Kami tidak memeriksa jika pengguna sebenarnya ditaip dalam apa-apa ke dalam argv [1], yang baik. Jadi apa yang pepijat ketiga? Yeah? [Pelajar jawapan, difahami] >> Baik. Jadi kita diperiksa satu senario. Kami tersirat diperiksa tidak menyalin memori yang lebih daripada akan melebihi panjang bar. Jadi, jika rentetan pengguna ditaip dalam 10 aksara panjang, ini mengatakan, 'Hanya menyalin 10 aksara.' Dan yang okay, tetapi bagaimana jika pengguna yang ditaip dalam perkataan di prompt seperti perkataan 20 aksara; ini adalah, berkata salinan 20 aksara dari bar ke apa? c, sebaliknya dikenali sebagai penampan kita, yang bermakna anda hanya menulis data kepada 8 lokasi bait yang anda tidak sendiri, dan anda tidak memiliki mereka dalam erti kata bahawa anda tidak memperuntukkan mereka. Jadi ini adalah apa yang umumnya dikenali sebagai serangan buffer overflow, atau penampan ditakluki serangan, dan serangan itu dalam erti kata bahawa jika pengguna atau program yang memanggil fungsi anda melakukan ini berniat jahat, apa sebenarnya yang berlaku seterusnya boleh menjadi agak buruk. Mari kita melihat gambar ini di sini. Gambar ini mewakili timbunan anda memori. Dan ingat bahawa setiap kali anda memanggil fungsi, anda mendapatkan ini bingkai sedikit pada timbunan dan kemudian satu lagi dan kemudian satu lagi dan kemudian satu lagi. Dan setakat ini kita telah hanya jenis cabutan ini jauh sebagai segiempat tepat sama ada di sana pada lembaga atau pada skrin di sini. Tetapi jika kita mengezum masuk pada salah satu daripada mereka segiempat tepat, apabila anda memanggil a foo fungsi, ia ternyata bahawa terdapat lebih pada timbunan di dalam bingkai itu dan segiempat tepat yang daripada hanya x dan y dan a dan b, seperti kita tidak bercakap mengenai swap. Ia ternyata bahawa terdapat beberapa butiran yang rendah tahap, kalangan mereka kembali alamat. Jadi ia ternyata apabila utama panggilan foo, utama mempunyai memaklumkan foo apa alamat utama adalah di dalam memori komputer. Kerana jika tidak, secepat foo dilakukan melaksanakan, seperti dalam kes ini di sini, sekali anda mencapai ini bersedia kerinting ditutup pada akhir foo, bagaimana palang pintu tidak foo tahu di mana kawalan program sepatutnya untuk pergi? Ia ternyata bahawa jawapan kepada soalan itu adalah dalam segi empat tepat bahawa merah di sini. Ini merupakan penunjuk, dan ia terpulang kepada komputer untuk menyimpan, sementara, pada timbunan kononnya alamat utama supaya secepat foo dilakukan melaksanakan, komputer tahu di mana dan apa garis utama untuk kembali ke. Disimpan penunjuk bingkai berkaitan sama seperti ini. Char * bar di sini mewakili apa? Nah, sekarang ini segmen biru di sini adalah bingkai foo, apakah bar? Okay, jadi bar hanya hujah kepada fungsi foo. Jadi sekarang kita kembali pada gambar biasa. Ada barangan yang lebih dan lebih banyak gangguan pada skrin tetapi ini segmen biru muda adalah apa yang kita telah lukisan pada papan hitam untuk sesuatu seperti swap. Itu adalah rangka bagi foo dan satu-satunya di dalamnya sekarang adalah bar, yang merupakan parameter ini. Tetapi apa lagi yang perlu dalam tindanan, mengikut kod ini di sini? Char c [12]. Jadi kita juga perlu melihat 12 dataran memori, diperuntukkan kepada pembolehubah yang dipanggil c. Dan sesungguhnya kami tidak mempunyai yang pada skrin. Yang sangat atas terdapat c [0], dan kemudian pengarang rajah ini tidak mengganggu lukisan semua dataran tetapi memang terdapat 12 terdapat kerana jika anda melihat di sebelah kanan bawah, c [11], jika anda mengira dari 0, 12 bait itu. Tetapi di sini adalah masalah: Dalam arah c berkembang? Susun atas ke bawah, betul-betul? Jika ia bermula di bahagian atas dan tumbuh ke bawah, tidak kelihatan seperti kita meninggalkan diri landasan yang banyak di sini pada semua. Kami telah jenis dicat diri ke satu sudut, dan c [11] yang tepat terhadap bar, yang merupakan hak terhadap penunjuk bingkai tindanan, yang betul-betul terhadap alamat kembali, terdapat ruang yang tidak lebih. Jadi apa implikasi, maka, jika anda skru sehingga, dan anda cuba membaca 20 bait menjadi penampan 12-bait? Mana mereka 8 bait tambahan akan pergi? Di dalam segala-galanya, yang sesetengahnya adalah sangat penting. Dan perkara yang paling penting, berpotensi, adalah kotak merah sana, alamat pulangan. Kerana menganggap bahawa anda adalah sama ada secara sengaja atau adversarially menimpa mereka 4 bait, bahawa alamat penunjuk, bukan hanya dengan sampah, tetapi dengan nombor yang berlaku untuk mewakili alamat sebenar dalam ingatan? Apa implicaiton, secara logiknya? [Jawapan Pelajar, difahami] >> Tepat sekali. Apabila foo kembali dan hits bahawa pendakap kerinting, program ini akan meneruskan untuk tidak pulang ke utama, ia akan kembali kepada apa sahaja alamat dalam kotak yang merah. Sekarang, dalam kes mengelakkan pendaftaran perisian, apakah alamat yang dikembalikan kepada fungsi yang biasanya mendapat dipanggil selepas anda telah dibayar untuk perisian dan dimasukkan kod pendaftaran anda? Anda boleh menyusun helah komputer ke dalam tidak akan di sini, tetapi sebaliknya, pergi di sini. Atau, jika anda benar-benar bijak, musuh sebenarnya boleh menaip di keyboard, misalnya, bukan satu perkataan yang sebenar, bukan 20 aksara, tetapi andaikan dia jenis dalam beberapa watak-watak yang mewakili kod? Dan ia tidak akan menjadi kod C, ia akan menjadi watak-watak yang mewakili kod mesin binari, 0 dan 1 ini. Tetapi andaikan mereka sudah cukup bijak untuk berbuat demikian, entah bagaimana paste ke prompt GetString sesuatu yang pada asasnya disusun kod, dan 4 bait terakhir menimpa bahawa alamat kembali, dan apa alamat input yang melakukan? Ia menyimpan dalam segiempat tepat ini merah alamat bait pertama buffer. Jadi, anda perlu benar-benar bijak, dan ini adalah banyak percubaan dan kesilapan bagi orang-orang yang buruk di luar sana, tetapi jika anda boleh mengetahui berapa besar penampan ini adalah, seperti yang bait terakhir dalam beberapa input yang anda berikan kepada program berlaku menjadi bersamaan alamat permulaan penampan anda, anda boleh melakukan ini. Jika kita katakan, biasanya, hello, dan \ 0, itulah apa yang berakhir dalam buffer. Tetapi jika kita lebih bijak, dan kita mengisi penampan bahawa dengan apa yang kita generik akan memanggil kod serangan, A, A, A, A: Serangan, serangan, serangan, serangan, di mana ini adalah hanya sesuatu yang melakukan sesuatu yang buruk. Nah, apa yang berlaku jika anda benar-benar bijak, anda mungkin melakukan ini: Dalam kotak merah di sini adalah suatu urutan nombor: 80, CO, 35, 08. Perhatikan bahawa yang sepadan dengan nombor itu di sini. Ia adalah dalam susunan terbalik, tetapi lanjut mengenai bahawa masa lain. Perhatikan bahawa ini alamat nyata telah sengaja diubah sama alamat di sini, bukan alamat utama. Jadi, jika lelaki yang buruk adalah super pintar, dia akan termasuk dalam kod serangan itu sesuatu seperti, 'Padam semua fail pengguna.' Atau 'Salin kata laluan,' atau 'Buat akaun pengguna yang saya boleh log masuk ke dalam.' Apa-apa pada semua, dan ini adalah kedua-dua bahaya dan kuasa C. Kerana anda mempunyai akses kepada ingatan melalui petunjuk dan oleh itu anda boleh menulis apa sahaja yang anda mahu ke dalam ingatan komputer. Anda boleh membuat komputer melakukan apa sahaja yang anda mahu dengan hanya setelah ia melompat-lompat dalam ruang memorinya yang tersendiri. Dan sebagainya, hingga ke hari ini, begitu banyak program dan begitu banyak laman web yang dikompromi mendidih ke orang mengambil kesempatan ini. Dan ini mungkin kelihatan seperti serangan super canggih, tetapi ia tidak sentiasa memulakan cara itu. Realitinya adalah bahawa apa yang orang jahat biasanya akan melakukan, sama ada ia adalah program di baris arahan atau program GUI atau laman web, anda hanya mula menyediakan karut. Anda menaip dalam perkataan yang benar-benar besar ke dalam medan carian dan tekan enter, dan anda menunggu untuk melihat jika kemalangan laman web. Atau anda menunggu untuk melihat sama ada program itu menjelma beberapa mesej ralat. Kerana jika anda mendapat bernasib baik, kerana lelaki yang buruk, dan anda menyediakan beberapa input gila bahawa kemalangan program, yang bermakna pengaturcara tidak menjangka kelakuan buruk anda yang bermakna anda boleh mungkin, dengan usaha yang cukup, percubaan yang cukup dan kesilapan, memikirkan bagaimana untuk melancarkan serangan yang lebih tepat. Jadi sebagai sebahagian keselamatan bukan sahaja mengelakkan serangan ini sama sekali, tetapi mengesan mereka dan sebenarnya melihat balak dan melihat apa input gila mempunyai orang yang ditaip ke dalam laman web anda. Apakah istilah carian orang yang ditaip ke dalam laman web anda dalam harapan limpahan penimbal beberapa? Dan ini semua bisul ke asas-asas yang mudah apa yang array, dan apakah maknanya untuk memperuntukkan dan menggunakan memori? Dan berkaitan dengan itu, juga, adalah ini. Jadi mari kita hanya pandangan di dalam cakera keras sekali lagi. Jadi anda ingat daripada satu atau dua minggu lalu bahawa apabila anda menyeret fail tong kitar semula atau tong sampah, apa yang berlaku? [Pelajar] Nothing. >> Yeah, benar-benar tiada. Akhirnya jika anda menjalankan rendah pada ruang cakera, Windows atau Mac OS akan mula memotong fail untuk anda. Tetapi jika anda heret sesuatu di sana, maka ia tidak di semua selamat. Semua ahli roomate, kawan atau keluarga anda mempunyai untuk melakukan klik dua kali, dan Voilà. Terdapat semua fail lengkap yang anda cuba untuk memadam. Jadi kebanyakan kita sekurang-kurangnya tahu bahawa anda perlu klik kanan atau mengawal klik dan kosongkan sampah, atau sesuatu seperti itu. Tetapi kemudian, yang tidak cukup melakukan silap mata. Kerana apa yang berlaku apabila anda mempunyai fail pada cakera keras anda yang mewakili beberapa dokumen perkataan atau beberapa JPEG? Dan ini mewakili cakera keras anda, dan mari kita mengatakan ini sekerat sini mewakili fail tersebut, dan ia terdiri daripada sekumpulan keseluruhan 0 dan 1 ini. Apa yang berlaku apabila anda bukan sahaja seret fail yang ke tong sampah atau tong kitar semula, tetapi juga mengosongkan? Jenis apa-apa. Ia tidak benar-benar apa-apa sekarang. Kini ia hanya apa-apa, kerana sesuatu yang sedikit yang berlaku dalam bentuk jadual ini. Jadi ada beberapa jenis pangkalan data atau jadual di dalam memori komputer yang pada asasnya mempunyai 1 lajur untuk nama fail, dan 1 lajur untuk lokasi, Fail di mana ini mungkin menjadi lokasi 123, hanya nombor rawak. Jadi, kita mungkin mempunyai sesuatu seperti x.jpg, dan lokasi 123. Dan apa yang berlaku kemudian, apabila anda mengosongkan sampah anda? Itu hilang. Tetapi apa yang tidak pergi ialah 0 dan 1 ini. Jadi apa, maka, sambungan kepada pset 4? Nah, dengan pset 4, hanya kerana kita telah tidak sengaja terpadam kad kilat padat yang mempunyai semua gambar-gambar ini, atau hanya kerana ia oleh nasib malang menjadi rosak, tidak bermakna bahawa 0 dan 1 yang tidak masih ada. Mungkin segelintir daripada mereka hilang kerana sesuatu yang mendapat rosak dalam erti kata bahawa sesetengah 0 menjadi 1 dan 1 ini menjadi 0 itu. Perkara-perkara buruk boleh berlaku kerana perisian kereta atau perkakasan yang rosak. Tetapi banyak bit-bit, mungkin walaupun 100% daripada mereka masih di sana, ia hanya bahawa komputer atau kamera tidak tahu di mana JPEG 1 bermula dan mana JPEG 2 bermula, tetapi jika anda, pengaturcara, tahu, dengan sedikit celik, di mana mereka adalah JPEG atau apa yang mereka kelihatan seperti, anda boleh menganalisis 0 dan 1 yang dan berkata, 'Ooh. JPEG. Ooh, JPEG. ' Anda boleh menulis program dengan dasarnya hanya untuk atau gelung while yang pulih setiap satu dan setiap fail-fail. Jadi pelajaran maka, adalah untuk memulakan "selamat" memadam fail anda jika anda ingin untuk mengelakkan ini sama sekali. Ya? [Pelajar soalan, difahami] >> Mempunyai memori lebih daripada yang anda lakukan sebelum - Oh! Soalan yang baik. Jadi mengapa, maka, selepas mengosongkan tong sampah, adakah komputer anda memberitahu anda bahawa anda mempunyai lebih banyak ruang bebas daripada anda lakukan sebelum? Secara ringkas, kerana ia berbohong. Lebih teknikal, anda mempunyai lebih banyak ruang. Kerana sekarang anda telah berkata, anda boleh meletakkan barangan lain mana fail yang sekali, tetapi itu tidak bermakna bit akan pergi, dan yang tidak bermakna bit sedang berubah semua 0, misalnya, untuk perlindungan anda. Sebaliknya, jika anda memadam "selamat" fail, atau fizikal memusnahkan peranti, yang benar-benar adalah satu-satunya cara, kadang-kadang, di sekeliling yang. Jadi mengapa tidak kita meninggalkan nota yang separa menakutkan, dan kita akan melihat anda pada hari Isnin. CS50.TV