1 00:00:00,000 --> 00:00:02,760 [Powered by Google Translate] [MINGGU 5] 2 00:00:02,760 --> 00:00:04,760 [David J. Malan, Universitas Harvard] 3 00:00:04,760 --> 00:00:11,990 [Ini adalah CS50.] [CS50.TV] 4 00:00:11,990 --> 00:00:17,780 [Wanita] Dia berbohong, tentang apa, saya tidak tahu. 5 00:00:17,780 --> 00:00:20,300 [Man] Jadi apa yang kita ketahui? 6 00:00:20,300 --> 00:00:24,120 [Wanita] Bahwa at 9:15, Ray Santoya berada di ATM. 7 00:00:24,120 --> 00:00:27,420 [Man] Jadi pertanyaannya adalah, apa yang dia lakukan pada 09:16? 8 00:00:27,420 --> 00:00:29,980 [Woman] Shooting mm 9 pada sesuatu. 9 00:00:29,980 --> 00:00:31,900 Mungkin dia melihat penembak jitu tersebut. 10 00:00:31,900 --> 00:00:34,000 [Man] Atau ia bekerja dengan dia. 11 00:00:34,000 --> 00:00:36,330 [Woman] Tunggu. Kembali satu. 12 00:00:36,330 --> 00:00:38,330 [Man] Apa yang Anda lihat? 13 00:00:38,330 --> 00:00:44,520 [♫ ♫ Musik menegangkan] 14 00:00:44,520 --> 00:00:48,320 [Woman] Bawa wajahnya. Layar penuh. 15 00:00:48,320 --> 00:00:51,230 [Man] Nya gelas. >> Ada refleksi. 16 00:00:51,230 --> 00:01:00,810 [♫ ♫ Musik menegangkan] 17 00:01:00,810 --> 00:01:03,580 [Man] Itu tim bisbol Nuevita itu. Itulah logo mereka. 18 00:01:03,580 --> 00:01:07,790 [Woman] Dan dia berbicara dengan siapa pun yang mengenakan jaket itu. 19 00:01:07,790 --> 00:01:13,730 >> [David Malan] Jadi, ini adalah CS50 minggu 5, dan hari ini kita merusak sedikit televisi dan film Anda. 20 00:01:13,730 --> 00:01:16,170 Jadi setiap kali Anda menonton pertunjukan seperti ini satu di sini, 21 00:01:16,170 --> 00:01:19,910 dan polisi mengatakan "Bisakah Anda membersihkan bahwa sampai?" atau "Meningkatkan," 22 00:01:19,910 --> 00:01:21,900 tidak ada peningkatan dalam dunia nyata. 23 00:01:21,900 --> 00:01:25,220 Bahkan, apa yang Anda benar-benar mendapatkan sedikit sesuatu seperti ini. 24 00:01:25,220 --> 00:01:27,570 Saya sudah berhenti salah satu foto staf dari halaman. 25 00:01:27,570 --> 00:01:30,980 Ini adalah sebuah program yang disebut Photoshop. Ini adalah 1 dari 2 Bowdens, 26 00:01:30,980 --> 00:01:36,300 1 dari 3 Bowdens sebenarnya, hari ini, karena kita memiliki Ibu Bowden di sini juga, dengan Rob dan Paul. 27 00:01:36,300 --> 00:01:41,950 Tapi di sini adalah Rob di layar, dan jika kita zoom in pada kilatan bahwa dia selalu di matanya, 28 00:01:41,950 --> 00:01:47,600 apa yang sebenarnya Anda lihat adalah bahwa apa yang Anda lihat adalah apa yang Anda dapatkan. 29 00:01:47,600 --> 00:01:51,690 Ini adalah "ditingkatkan," sehingga "CSI" memilikinya sedikit salah. 30 00:01:51,690 --> 00:01:55,190 Ada satu klip lain, jika kita bisa memilih pada "CSI" hanya sedikit lebih lama. 31 00:01:55,190 --> 00:01:58,500 Ini adalah ungkapan yang bagus untuk mengucapkan selanjutnya jika Anda ingin 32 00:01:58,500 --> 00:02:10,280 terdengar teknis dengan teman-teman Anda ketika, benar-benar, Anda katakan apa-apa. 33 00:02:10,280 --> 00:02:12,970 >> [Man] Selama berminggu-minggu aku sudah menyelidiki pembunuhan Pembunuh Cabby 34 00:02:12,970 --> 00:02:15,360 dengan daya tarik wajar tertentu. 35 00:02:15,360 --> 00:02:17,160 [Wanita # 1] Hal ini secara real time. 36 00:02:17,160 --> 00:02:22,930 [Wanita # 2] Saya akan membuat antarmuka GUI menggunakan Visual Basic, melihat apakah saya bisa melacak alamat IP. 37 00:02:22,930 --> 00:02:29,570 >> [Malan] Jadi audio yang tidak sinkron samping, menciptakan antarmuka GUI menggunakan Visual Basic 38 00:02:29,570 --> 00:02:31,820 untuk melacak alamat IP adalah omong kosong. 39 00:02:31,820 --> 00:02:33,840 Hari-hari ini Anda tidak akan menggunakan Visual Basic, 40 00:02:33,840 --> 00:02:38,920 tidak ada kebutuhan untuk GUI, dan alamat IP adalah istilah teknis yang akurat. 41 00:02:38,920 --> 00:02:41,730 Jadi mengawasi keluar untuk ini, dan salah satu favorit saya: 42 00:02:41,730 --> 00:02:45,070 Satu ini sedikit lebih misterius, karena Anda perlu tahu bahasa yang berbeda. 43 00:02:45,070 --> 00:02:47,860 Ada bahasa yang disebut Objective-C, yang merupakan superset dari C. 44 00:02:47,860 --> 00:02:51,960 Yang berarti itu C ditambah beberapa fitur tambahan, di antaranya berorientasi objek pemrograman. 45 00:02:51,960 --> 00:02:55,070 Dan ini adalah bahasa yang Apple telah dipopulerkan untuk pemrograman iOS. 46 00:02:55,070 --> 00:02:58,760 Dan jadi di sini adalah klip dari acara yang berbeda sama sekali, dari "Numbers," 47 00:02:58,760 --> 00:03:02,450 bahwa jika Anda benar-benar melihat secara dekat pada TiVo Anda dan jeda pada saat yang tepat, 48 00:03:02,450 --> 00:03:07,700 Anda akan melihat bahwa apa yang mereka cari di tidak cukup apa yang sedang dijelaskan. 49 00:03:07,700 --> 00:03:11,170 Dan biarkan aku mencoba konektor audio yang berbeda di sini dan melihat apakah kita tidak bisa 50 00:03:11,170 --> 00:03:13,780 menjaga audio sync saat ini. 51 00:03:13,780 --> 00:03:20,530 Saya memberi Anda "Numbers." 52 00:03:20,530 --> 00:03:23,240 >> [Man # 1] Ini adalah alamat 32-bit IPv4. 53 00:03:23,240 --> 00:03:38,930 [Man # 2] IP, itulah internet. >> Swasta jaringan. Ini jaringan pribadi Anita. 54 00:03:38,930 --> 00:03:43,810 [Malan] Oke. Ini adalah Objective-C, dan itu untuk program mewarnai beberapa anak, 55 00:03:43,810 --> 00:03:51,140 karena Anda mungkin dapat menyimpulkan dari nama variabel ada. 56 00:03:51,140 --> 00:03:54,410 Sehingga, saat itu, adalah "Numbers." Jadi hari ini dan minggu ini kami memperkenalkan 57 00:03:54,410 --> 00:03:57,740 sedikit dari dunia forensik dan konteks dalam masalah karena itu. 58 00:03:57,740 --> 00:04:00,590 Hari ini akan menjadi kuliah disingkat karena ada acara khusus di sini 59 00:04:00,590 --> 00:04:05,530 sesudahnya, jadi kita akan mengintip, dan menggoda para siswa dan orang tua sama hari ini 60 00:04:05,530 --> 00:04:07,420 dengan beberapa hal yang ada di cakrawala. 61 00:04:07,420 --> 00:04:12,240 Di antara mereka, pada hari Senin, Anda akan memiliki teman sekelas lagi. 62 00:04:12,240 --> 00:04:16,050 EDX, Harvard dan MIT baru inisiatif online untuk membuka courseware 63 00:04:16,050 --> 00:04:19,120 dan banyak lagi, meluncurkan di kampus Harvard, Senin. 64 00:04:19,120 --> 00:04:21,490 Yang berarti Senin datang Anda akan memiliki - pada hitungan terakhir, 65 00:04:21,490 --> 00:04:26,210 86.000 teman sekelas tambahan akan menyusul bersama dengan ceramah CS50 ini 66 00:04:26,210 --> 00:04:29,170 dan bagian dan walkthrough dan set masalah. 67 00:04:29,170 --> 00:04:32,350 Dan sebagai bagian dari ini, Anda akan menjadi anggota dari kelas perdana 68 00:04:32,350 --> 00:04:35,090 CS50 dan sekarang CS50x. 69 00:04:35,090 --> 00:04:39,310 >> Sebagai bagian dari ini, sekarang, menyadari bahwa akan ada beberapa upsides juga. 70 00:04:39,310 --> 00:04:43,790 Untuk bersiap-siap untuk ini, untuk jumlah besar mahasiswa, 71 00:04:43,790 --> 00:04:47,180 Cukuplah untuk mengatakan bahwa meskipun kita memiliki 108 TF dan CA, 72 00:04:47,180 --> 00:04:50,790 tidak cukup yang terbaik siswa / guru rasio setelah kita memukul 80.000 siswa lainnya. 73 00:04:50,790 --> 00:04:52,850 Jadi kita tidak akan begitu banyak masalah kadar set secara manual. 74 00:04:52,850 --> 00:04:55,920 Jadi diperkenalkan minggu ini di sejumlah masalah akan CS50 Check, 75 00:04:55,920 --> 00:04:58,450 yang akan menjadi utilitas baris perintah dalam alat 76 00:04:58,450 --> 00:05:01,200 bahwa Anda akan mendapatkan setelah Anda memperbarui nanti akhir pekan ini, 77 00:05:01,200 --> 00:05:03,200 dan Anda akan dapat menjalankan perintah, memeriksa 50, 78 00:05:03,200 --> 00:05:06,500 pada pset Anda sendiri, dan Anda akan mendapatkan umpan balik mengenai apakah program anda adalah 79 00:05:06,500 --> 00:05:11,160 benar atau salah sesuai dengan spesifikasi desain berbagai yang telah kami sediakan. 80 00:05:11,160 --> 00:05:13,580 Jadi lebih pada set dan spesifikasi masalah dan 81 00:05:13,580 --> 00:05:17,240 sekelas CS50x akan menggunakan ini juga. 82 00:05:17,240 --> 00:05:19,230 >> Jadi masalah set 4 adalah semua tentang forensik. 83 00:05:19,230 --> 00:05:21,940 Dan bagian ini terinspirasi oleh beberapa hal kehidupan nyata, 84 00:05:21,940 --> 00:05:24,620 dimana ketika saya masih di sekolah pascasarjana, aku magang untuk sementara waktu dengan 85 00:05:24,620 --> 00:05:28,650 Kantor Middlesex County Jaksa Wilayah yang melakukan pekerjaan forensik 86 00:05:28,650 --> 00:05:31,650 dengan peneliti utama forensik mereka, dan apa ini sebesar 87 00:05:31,650 --> 00:05:35,260 adalah, saya pikir saya sebutkan masa lalu beberapa minggu ini, adalah polisi Negara Misa atau orang lain 88 00:05:35,260 --> 00:05:39,000 akan datang, mereka akan drop off hal-hal seperti hard drive dan CD dan disket 89 00:05:39,000 --> 00:05:42,340 dan sejenisnya, dan kemudian tujuan kantor forensik adalah untuk memastikan apakah 90 00:05:42,340 --> 00:05:44,600 ada atau tidak bukti dari beberapa macam. 91 00:05:44,600 --> 00:05:48,010 Ini adalah Unit Investigasi Khusus, sehingga kejahatan kerah putih, 92 00:05:48,010 --> 00:05:52,350 itu semacam lebih mengganggu dari kejahatan, 93 00:05:52,350 --> 00:05:55,990 apa pun yang melibatkan beberapa jenis media digital, ternyata tidak banyak orang 94 00:05:55,990 --> 00:05:59,370 menulis email yang mengatakan "Aku melakukannya." 95 00:05:59,370 --> 00:06:03,290 Jadi cukup sering pencarian tersebut forensik tidak muncul semua yang banyak buah, 96 00:06:03,290 --> 00:06:05,850 tapi kadang-kadang orang akan menulis email tersebut. 97 00:06:05,850 --> 00:06:08,490 Jadi kadang-kadang upaya dihargai. 98 00:06:08,490 --> 00:06:14,420 >> Tapi untuk mengarah ke ini pset forensik, kami akan memperkenalkan di pset 4 sedikit grafis. 99 00:06:14,420 --> 00:06:18,260 Jadi Anda mungkin mengambil hal-hal untuk diberikan, JPEG, GIF dan sejenisnya hari ini, 100 00:06:18,260 --> 00:06:21,640 tetapi jika Anda benar-benar berpikir tentang hal ini, gambar, seperti wajah Rob, 101 00:06:21,640 --> 00:06:24,430 dapat dimodelkan sebagai urutan titik-titik, atau piksel. 102 00:06:24,430 --> 00:06:26,680 Sekarang, dalam kasus wajah Rob, ada segala macam warna, 103 00:06:26,680 --> 00:06:29,940 dan kita mulai melihat titik-titik individu, otherwide dikenal sebagai piksel, 104 00:06:29,940 --> 00:06:31,610 setelah kami mulai zoom in 105 00:06:31,610 --> 00:06:35,590 Tetapi jika kita menyederhanakan dunia sedikit, dan hanya mengatakan bahwa ini di sini adalah Rob 106 00:06:35,590 --> 00:06:40,560 dalam warna hitam dan putih, baik, untuk mewakili hitam dan putih kita hanya bisa menggunakan biner. 107 00:06:40,560 --> 00:06:44,960 Dan jika kita akan menggunakan biner, 1 atau 0, kita dapat mengungkapkan ini gambar yang sama 108 00:06:44,960 --> 00:06:51,970 wajah Rob tersenyum dengan pola bit: 11000011 mewakili 109 00:06:51,970 --> 00:06:55,160 putih, putih, hitam, hitam, hitam, hitam, putih putih. 110 00:06:55,160 --> 00:06:59,290 Dan sehingga tidak lompatan besar, kemudian, untuk mulai berbicara tentang foto-foto berwarna-warni. 111 00:06:59,290 --> 00:07:01,920 Hal-hal yang Anda akan melihat di Facebook atau mengambil dengan kamera digital, 112 00:07:01,920 --> 00:07:04,730 tapi, tentu, ketika datang ke warna, Anda membutuhkan lebih banyak bit. 113 00:07:04,730 --> 00:07:08,470 Dan cukup umum di dunia foto-foto adalah dengan menggunakan tidak 1-bit warna, 114 00:07:08,470 --> 00:07:12,730 karena hal ini menunjukkan, tapi 24-bit warna, di mana Anda benar-benar mendapatkan jutaan warna. 115 00:07:12,730 --> 00:07:15,430 Jadi seperti dalam kasus ketika kita menyorot mata Rob, 116 00:07:15,430 --> 00:07:19,270 itu sejumlah jutaan kemungkinan warna-warni yang berbeda. 117 00:07:19,270 --> 00:07:22,260 >> Jadi kita akan memperkenalkan dalam sejumlah masalah 4 serta dalam walkthrough, 118 00:07:22,260 --> 00:07:27,050 yang akan hari ini pada pukul 3:30 bukannya 02:30 biasanya karena kuliah hari Jumat di sini. 119 00:07:27,050 --> 00:07:29,930 Tapi video akan online, seperti biasa, besok. 120 00:07:29,930 --> 00:07:31,880 Kami juga akan memperkenalkan Anda ke format lain file. 121 00:07:31,880 --> 00:07:34,150 Jadi ini sengaja dimaksudkan untuk terlihat menakutkan pada awalnya, 122 00:07:34,150 --> 00:07:38,980 tapi ini hanya beberapa dokumentasi untuk struct C. 123 00:07:38,980 --> 00:07:42,280 Ternyata Microsoft, tahun lalu, membantu mempopulerkan format ini, 124 00:07:42,280 --> 00:07:46,630 disebut format file bitmap, BMP, dan ini adalah super-sederhana, 125 00:07:46,630 --> 00:07:50,390 berwarna-warni format file grafis yang digunakan untuk beberapa waktu 126 00:07:50,390 --> 00:07:53,640 dan kadang-kadang masih untuk wallpaper di desktop. 127 00:07:53,640 --> 00:07:57,410 Jika Anda berpikir kembali ke Windows XP dan bukit-bukit dan langit biru, 128 00:07:57,410 --> 00:08:00,660 yang biasanya BMP, atau gambar bitmap, dan bitmap 129 00:08:00,660 --> 00:08:03,340 yang menyenangkan bagi kami karena mereka memiliki kompleksitas sedikit lebih. 130 00:08:03,340 --> 00:08:05,640 Ini tidak sesederhana ini grid ini 0 dan 1; 131 00:08:05,640 --> 00:08:10,680 sebagai gantinya, Anda memiliki hal-hal seperti header pada awal file. 132 00:08:10,680 --> 00:08:15,520 Jadi dengan kata lain, dalam file bmp. Adalah sejumlah besar 0 dan 1 s, 133 00:08:15,520 --> 00:08:18,070 tapi ada beberapa tambahan 0 dan 1 di sana. 134 00:08:18,070 --> 00:08:21,450 Dan ternyata apa yang kita mungkin pernah diambil untuk diberikan selama bertahun-tahun, 135 00:08:21,450 --> 00:08:27,040 format file seperti doc atau.. xls atau. mp3 atau. mp4, 136 00:08:27,040 --> 00:08:29,910 apapun format file yang Anda kenal. 137 00:08:29,910 --> 00:08:31,900 Nah, apa itu bahkan berarti menjadi format file? 138 00:08:31,900 --> 00:08:35,740 Karena pada akhir hari, semua file-file yang kita gunakan memiliki hanya 0 dan 1 s 139 00:08:35,740 --> 00:08:39,950 dan mungkin mereka 0 dan 1 yang mewakili, b, c, melalui ASCII atau sejenisnya, 140 00:08:39,950 --> 00:08:42,030 tetapi melalui akhir hari, itu hanya 0 dan 1 s. 141 00:08:42,030 --> 00:08:45,300 >> Jadi manusia hanya sesekali memutuskan untuk menciptakan sebuah format file baru 142 00:08:45,300 --> 00:08:49,420 di mana mereka standarisasi apa pola bit akan benar-benar berarti. 143 00:08:49,420 --> 00:08:52,790 Dan dalam hal ini di sini, orang-orang yang merancang format file bitmap 144 00:08:52,790 --> 00:08:58,260 mengatakan bahwa pada byte pertama dalam file bitmap, seperti yang dilambangkan dengan offset 0, ada, 145 00:08:58,260 --> 00:09:02,320 ada akan ada beberapa bfType samar bernama disebut variabel, 146 00:09:02,320 --> 00:09:06,510 yang hanya singkatan dari jenis file bitmap, apa jenis file bitmap ini. 147 00:09:06,510 --> 00:09:10,780 Anda dapat menyimpulkan, mungkin, dari baris kedua yang diimbangi 2, byte nomor 2, 148 00:09:10,780 --> 00:09:15,980 memiliki pola 0 dan 1 ini yang mewakili apa? 149 00:09:15,980 --> 00:09:18,320 Ukuran sesuatu, dan ia pergi dari sana. 150 00:09:18,320 --> 00:09:20,660 Jadi dalam sejumlah masalah 4, Anda akan berjalan melalui beberapa hal. 151 00:09:20,660 --> 00:09:24,480 >> Kami tidak akan berakhir peduli tentang semua dari mereka, tetapi pemberitahuan itu mulai mendapatkan menarik 152 00:09:24,480 --> 00:09:30,780 sekitar garis atau byte 54, rgbtBlue, Hijau dan Merah. 153 00:09:30,780 --> 00:09:35,280 Jika Anda pernah mendengar akronim RGB, merah hijau biru, ini adalah referensi untuk itu. 154 00:09:35,280 --> 00:09:37,840 Karena ternyata Anda bisa melukis semua warna pelangi 155 00:09:37,840 --> 00:09:41,580 dengan beberapa kombinasi merah dan biru dan hijau. 156 00:09:41,580 --> 00:09:46,560 Dan, pada kenyataannya, orang tua di dalam ruangan ingat beberapa proyektor awal. 157 00:09:46,560 --> 00:09:49,360 Hari-hari ini, Anda hanya melihat 1 cahaya terang keluar dari lensa. 158 00:09:49,360 --> 00:09:52,870 Tapi kembali pada hari, Anda memiliki lensa merah, lensa biru, hijau dan lensa 159 00:09:52,870 --> 00:09:56,620 dan bersama-sama mereka bertujuan untuk layar dan membentuk gambar berwarna-warni. 160 00:09:56,620 --> 00:09:59,590 Dan cukup sering sekolah menengah dan sekolah tinggi akan memiliki orang-lensa 161 00:09:59,590 --> 00:10:02,680 pernah-jadi-sedikit miring, sehingga Anda semacam melihat gambar ganda atau triple, 162 00:10:02,680 --> 00:10:07,500 tapi itu ide. Anda memiliki lampu merah dan hijau dan biru melukis gambar. 163 00:10:07,500 --> 00:10:09,570 Dan prinsip yang sama digunakan dalam komputer. 164 00:10:09,570 --> 00:10:12,000 >> Jadi salah satu tantangan, maka, untuk Anda dalam masalah set 4 165 00:10:12,000 --> 00:10:16,080 akan menjadi beberapa hal, salah satunya adalah untuk benar-benar mengubah ukuran gambar. 166 00:10:16,080 --> 00:10:18,050 Untuk mengambil pola 0 dan 1 s, 167 00:10:18,050 --> 00:10:22,840 mencari tahu yang potongan 0 dan 1 ini mewakili apa dalam struktur seperti ini, 168 00:10:22,840 --> 00:10:26,800 dan kemudian mencari cara untuk meniru piksel: para merah, blues, hijau 169 00:10:26,800 --> 00:10:32,460 dalam sehingga ketika gambar terlihat seperti ini pada awalnya, mungkin terlihat seperti ini, bukan setelah itu. 170 00:10:32,460 --> 00:10:35,590 Di antara tantangan lain, juga akan menjadi bahwa Anda akan diserahkan 171 00:10:35,590 --> 00:10:38,900 gambar forensik dari file yang sebenarnya dari kamera digital 172 00:10:38,900 --> 00:10:42,410 dan pada kamera itu, sekali waktu, adalah sejumlah foto. 173 00:10:42,410 --> 00:10:47,030 Masalahnya adalah, kita tidak sengaja terhapus atau memiliki gambar rusak entah bagaimana. 174 00:10:47,030 --> 00:10:51,040 Hal-hal buruk terjadi dengan kamera digital, dan jadi kita cepat menyalin semua 0 dan 1 s 175 00:10:51,040 --> 00:10:55,410 off dari kartu untuk Anda, menyelamatkan mereka semua dalam 1 file besar, dan kemudian kami akan menyerahkan kepada Anda 176 00:10:55,410 --> 00:11:00,000 dalam masalah set 4 sehingga Anda dapat menulis sebuah program dalam C yang dapat digunakan untuk memulihkan 177 00:11:00,000 --> 00:11:02,660 semua orang JPEG, idealnya. 178 00:11:02,660 --> 00:11:06,280 Dan ternyata JPEG, meskipun mereka sedikit dari format file yang kompleks, 179 00:11:06,280 --> 00:11:09,580 mereka jauh lebih kompleks dari ini wajah tersenyum di sini. 180 00:11:09,580 --> 00:11:14,320 Ternyata bahwa setiap JPEG dimulai dengan pola yang sama dari 0 dan 1 s. 181 00:11:14,320 --> 00:11:18,820 Jadi menggunakan loop sementara atau untuk loop atau serupa, 182 00:11:18,820 --> 00:11:22,350 Anda dapat iterate atas semua 0 dan 1 dalam gambar ini forensik 183 00:11:22,350 --> 00:11:26,670 dan setiap kali Anda melihat pola khusus yang didefinisikan dalam spesifikasi sejumlah masalah itu, 184 00:11:26,670 --> 00:11:29,770 Anda dapat berasumsi, "Oh, di sini adalah, dengan probabilitas yang sangat tinggi, 185 00:11:29,770 --> 00:11:33,520 awal dari JPEG, dan segera setelah Anda menemukan pola yang sama, 186 00:11:33,520 --> 00:11:36,050 beberapa jumlah byte atau kilobyte atau megabyte kemudian, 187 00:11:36,050 --> 00:11:40,550 Anda dapat berasumsi, 'Ooh! Berikut adalah JPEG kedua, foto yang saya ambil setelah yang pertama. 188 00:11:40,550 --> 00:11:44,720 Biarkan saya berhenti membaca bahwa file pertama, mulai menulis ini yang baru. " 189 00:11:44,720 --> 00:11:49,980 Dan output dari program anda untuk pset 4 akan menjadi sebanyak 50 JPEGs. 190 00:11:49,980 --> 00:11:52,400 Dan jika itu bukan 50 JPEGs, Anda memiliki sedikit loop. 191 00:11:52,400 --> 00:11:55,580 Jika Anda memiliki jumlah tak terbatas file JPEG, Anda memiliki loop tak terbatas. 192 00:11:55,580 --> 00:11:58,280 Sehingga, juga akan cukup kasus umum. 193 00:11:58,280 --> 00:12:00,280 Itulah apa yang ada di cakrawala. 194 00:12:00,280 --> 00:12:03,740 >> Kuis 0, di belakang kami. Sadarilah, per email saya, yang selalu ada orang-orang 195 00:12:03,740 --> 00:12:06,820 yang sama-sama senang, semacam netral, dan sedih sekitar kuis 0 waktu. 196 00:12:06,820 --> 00:12:10,160 Dan jangan menjangkau saya, TF kepala, Zamyla, TF sendiri 197 00:12:10,160 --> 00:12:14,120 atau salah satu dari CA yang Anda tahu jika Anda ingin membahas bagaimana hal-hal pergi. 198 00:12:14,120 --> 00:12:16,460 >> Jadi untuk mengesankan orang tua di sini di dalam ruangan, 199 00:12:16,460 --> 00:12:23,990 apa perpustakaan CS50? Good job. 200 00:12:23,990 --> 00:12:32,280 Apa perpustakaan CS50? Ya? [Jawaban siswa, tidak dapat dipahami] 201 00:12:32,280 --> 00:12:35,730 >> Oke, baik. Jadi satu set prewritten kode yang kami, staf, menulis, 202 00:12:35,730 --> 00:12:38,460 kami sediakan untuk Anda, untuk menyediakan beberapa fungsi umum. 203 00:12:38,460 --> 00:12:42,290 Hal-hal seperti mendapatkan saya string, mendapatkan saya int, semua fungsi yang tercantum di sini. 204 00:12:42,290 --> 00:12:45,260 Mulai sekarang, kita mulai untuk benar-benar mengambil langkah-roda pelatihan off. 205 00:12:45,260 --> 00:12:48,230 Jadi kita akan mulai untuk mengambil suatu "string" dari Anda, 206 00:12:48,230 --> 00:12:52,790 yang, ingat, itu hanya sinonim untuk apa sebenarnya tipe data? char *. 207 00:12:52,790 --> 00:12:57,020 Jadi bagi orang tua, yang mungkin - itu bagus, jadi char * kita akan mulai melihat 208 00:12:57,020 --> 00:13:00,810 di layar semua lebih seperti yang kita menghapus "string" dari kosakata kita, 209 00:13:00,810 --> 00:13:02,760 setidaknya ketika datang untuk benar-benar menulis kode. 210 00:13:02,760 --> 00:13:06,240 Demikian pula, kita akan berhenti menggunakan beberapa fungsi yang banyak, 211 00:13:06,240 --> 00:13:08,390 karena program kami akan mendapatkan lebih canggih 212 00:13:08,390 --> 00:13:11,370 bukan hanya menulis program yang duduk di sana dengan berkedip cepat, 213 00:13:11,370 --> 00:13:13,580 menunggu pengguna untuk mengetik sesuatu masuk 214 00:13:13,580 --> 00:13:15,220 Anda akan mendapatkan masukan Anda dari tempat lain. 215 00:13:15,220 --> 00:13:18,720 Misalnya, Anda akan mendapatkan mereka dari serangkaian bit pada hard drive lokal. 216 00:13:18,720 --> 00:13:23,340 Anda malah akan mendapatkan mereka di masa depan dari koneksi jaringan, beberapa website di suatu tempat. 217 00:13:23,340 --> 00:13:27,460 Jadi mari kita mengupas lapisan ini untuk pertama kalinya, dan menarik alat CS50 218 00:13:27,460 --> 00:13:32,300 dan file ini disebut CS50.h, yang Anda sudah termasuk tajam selama berminggu-minggu. 219 00:13:32,300 --> 00:13:34,380 >> Tapi mari kita benar-benar melihat apa yang di dalam hal ini. 220 00:13:34,380 --> 00:13:38,250 Jadi bagian atas dari file dengan warna biru adalah hanya sekelompok seluruh komentar, 221 00:13:38,250 --> 00:13:41,340 Informasi garansi dan lisensi. Ini adalah semacam paradigma umum 222 00:13:41,340 --> 00:13:44,600 dalam perangkat lunak, karena banyak perangkat lunak hari ini adalah apa yang disebut "open source," 223 00:13:44,600 --> 00:13:46,940 yang berarti bahwa seseorang telah menulis kode 224 00:13:46,940 --> 00:13:50,060 dan membuatnya tersedia secara bebas, bukan hanya untuk menjalankan dan menggunakan, 225 00:13:50,060 --> 00:13:53,660 tapi benar-benar membaca dan mengubah dan mengintegrasikan ke dalam pekerjaan Anda sendiri. 226 00:13:53,660 --> 00:13:55,790 Jadi itulah apa yang Anda telah menggunakan, perangkat lunak open source, 227 00:13:55,790 --> 00:13:58,030 meskipun dalam bentuk yang sangat kecil. 228 00:13:58,030 --> 00:14:01,860 Jika saya scroll ke bawah melewati komentar, meskipun, kita akan mulai melihat beberapa hal yang lebih akrab. 229 00:14:01,860 --> 00:14:08,090 Jadi perhatikan di bagian atas di sini, bahwa file CS50.h mencakup sejumlah besar file header. 230 00:14:08,090 --> 00:14:11,160 Sekarang, sebagian besar kita belum melihat sebelumnya, tapi satu 231 00:14:11,160 --> 00:14:15,640 familiar; mana yang telah kita lihat, meskipun sebentar, sejauh ini? 232 00:14:15,640 --> 00:14:18,720 Ya, perpustakaan standar. Stdlib.h memiliki malloc, 233 00:14:18,720 --> 00:14:21,590 jadi setelah kami mulai berbicara tentang alokasi memori dinamis, 234 00:14:21,590 --> 00:14:24,960 yang kita akan kembali ke minggu depan juga, kami mulai termasuk file tersebut. 235 00:14:24,960 --> 00:14:29,660 Ternyata bool dan benar dan salah tidak benar-benar ada di C, per se, 236 00:14:29,660 --> 00:14:32,460 kecuali Anda menyertakan file ini di sini. 237 00:14:32,460 --> 00:14:35,770 Jadi kita telah, selama berminggu-minggu, telah termasuk standar bool.h 238 00:14:35,770 --> 00:14:39,020 sehingga Anda dapat menggunakan gagasan bool, benar atau salah. 239 00:14:39,020 --> 00:14:41,830 Tanpa ini, Anda harus semacam palsu dan menggunakan int 240 00:14:41,830 --> 00:14:45,920 sewenang-wenang dan hanya berasumsi bahwa 0 adalah palsu dan 1 adalah benar. 241 00:14:45,920 --> 00:14:49,980 >> Sekarang, jika kita scroll ke bawah lebih jauh, di sini adalah definisi kita tentang string. 242 00:14:49,980 --> 00:14:54,820 Ternyata, seperti yang telah kita katakan sebelumnya, bahwa di mana * ini tidak terlalu penting. 243 00:14:54,820 --> 00:14:56,750 Anda bahkan dapat memiliki ruang di sekitar. 244 00:14:56,750 --> 00:15:01,550 Kami, semester ini, telah mempromosikan sebagai ini untuk membuat jelas bahwa * harus dilakukan dengan jenis. 245 00:15:01,550 --> 00:15:05,370 Tapi menyadari, seperti biasa, jika tidak sedikit lebih umum, adalah untuk menaruhnya di sana 246 00:15:05,370 --> 00:15:07,480 tapi fungsional itu adalah hal yang sama. 247 00:15:07,480 --> 00:15:11,070 Tapi sekarang, jika kita membaca turun lebih jauh, mari kita lihat mengatakan, GetInt, 248 00:15:11,070 --> 00:15:15,350 karena kami menggunakan itu, mungkin, sebelum hal lain semester ini. 249 00:15:15,350 --> 00:15:19,620 Dan di sini adalah GetInt. Ini adalah apa? 250 00:15:19,620 --> 00:15:24,650 Ini adalah prototipe. Begitu sering, kita telah menempatkan prototipe pada puncak-puncak kami. File c, 251 00:15:24,650 --> 00:15:28,190 tetapi Anda juga dapat menempatkan prototipe di file header, file h., 252 00:15:28,190 --> 00:15:32,110 seperti ini satu di sini, sehingga ketika Anda menulis beberapa fungsi 253 00:15:32,110 --> 00:15:36,790 bahwa Anda ingin orang lain dapat menggunakan, yang persis terjadi dengan perpustakaan CS50, 254 00:15:36,790 --> 00:15:40,900 Anda tidak hanya melaksanakan fungsi Anda dalam sesuatu seperti CS50.c, 255 00:15:40,900 --> 00:15:46,720 Anda juga menempatkan prototipe tidak di bagian atas file tersebut, tetapi di bagian atas file header, 256 00:15:46,720 --> 00:15:50,810 maka file header adalah apa yang teman-teman dan rekan meliputi, 257 00:15:50,810 --> 00:15:52,800 dengan tajam termasuk dalam kode mereka sendiri. 258 00:15:52,800 --> 00:15:55,440 Jadi selama ini Anda sudah termasuk semua prototipe 259 00:15:55,440 --> 00:15:59,870 efektif di bagian atas file Anda, tetapi dengan cara ini tajam termasuk mekanisme 260 00:15:59,870 --> 00:16:03,320 yang pada dasarnya salinan dan pasta file ini ke Anda sendiri. 261 00:16:03,320 --> 00:16:06,400 Sekarang, di sini adalah beberapa dokumentasi yang cukup rinci. 262 00:16:06,400 --> 00:16:08,880 >> Kami sudah cukup banyak diambil begitu saja bahwa GetInt mendapat int, 263 00:16:08,880 --> 00:16:10,740 tapi ternyata ada beberapa kasus sudut, kan? 264 00:16:10,740 --> 00:16:14,320 Bagaimana jika pengguna jenis dalam jumlah yang terlalu besar? 265 00:16:14,320 --> 00:16:17,350 Sebuah triliun, yang tidak bisa cocok dalam int? 266 00:16:17,350 --> 00:16:21,180 Apa perilaku yang diharapkan? Nah, idealnya, itu diprediksi. 267 00:16:21,180 --> 00:16:23,460 Jadi dalam hal ini, jika Anda benar-benar membaca baik cetak, 268 00:16:23,460 --> 00:16:27,850 Anda akan melihat bahwa jika baris tidak dapat dibaca, ini INT_MAX kembali. 269 00:16:27,850 --> 00:16:30,800 Kami tidak pernah membicarakan hal ini, namun berdasarkan kapitalisasinya, 270 00:16:30,800 --> 00:16:33,030 apa itu, mungkin? 271 00:16:33,030 --> 00:16:36,610 Ini adalah konstan, sehingga beberapa konstanta khusus yang mungkin dinyatakan 272 00:16:36,610 --> 00:16:39,460 di salah satu file header yang naik lebih tinggi dalam file, 273 00:16:39,460 --> 00:16:43,400 dan INT_MAX mungkin sesuatu seperti, kasar, 2 miliar. 274 00:16:43,400 --> 00:16:48,160 Gagasan bahwa karena kita perlu entah bagaimana menandakan sesuatu yang tidak beres, 275 00:16:48,160 --> 00:16:51,090 kita, ya, memiliki 4 miliar angka yang kita miliki, 276 00:16:51,090 --> 00:16:53,980 negatif 2 miliar pada hingga 2 miliar, memberi atau mengambil. 277 00:16:53,980 --> 00:16:58,030 Nah, apa yang umum dalam pemrograman adalah Anda mencuri hanya salah satu dari angka-angka. 278 00:16:58,030 --> 00:17:02,250 Mungkin 0, mungkin 2 miliar, mungkin negatif 2 miliar. 279 00:17:02,250 --> 00:17:06,720 Jadi Anda menghabiskan satu nilai yang mungkin Anda sehingga Anda dapat berkomitmen untuk dunia 280 00:17:06,720 --> 00:17:10,089 bahwa jika sesuatu yang tidak beres, saya akan kembalikan nilai super-besar. 281 00:17:10,089 --> 00:17:13,329 Tapi Anda tidak ingin pengguna mengetik sesuatu yang samar seperti "2, 3, 4 ..." 282 00:17:13,329 --> 00:17:17,079 jumlah yang sangat besar, di mana Anda menggeneralisasi bukan sebagai konstan. 283 00:17:17,079 --> 00:17:19,380 Jadi benar-benar, jika Anda sedang anal beberapa minggu terakhir, 284 00:17:19,380 --> 00:17:23,800 kapan saja Anda menghubungi GetInt, Anda harus telah memeriksa dengan kondisi jika. 285 00:17:23,800 --> 00:17:27,109 Apakah jenis pengguna dalam INT_MAX, atau lebih khusus, 286 00:17:27,109 --> 00:17:29,900 melakukan GetInt INT_MAX kembali? Karena jika itu terjadi, 287 00:17:29,900 --> 00:17:35,140 yang benar-benar berarti mereka tidak mengetik, sesuatu yang tidak beres dalam kasus ini. 288 00:17:35,140 --> 00:17:38,970 Jadi ini adalah apa yang umumnya dikenal sebagai nilai "sentinel", yang hanya berarti istimewa. 289 00:17:38,970 --> 00:17:41,020 >> Nah, sekarang mari kita berbelok ke file c.. 290 00:17:41,020 --> 00:17:44,500 File C telah ada di alat untuk beberapa waktu, 291 00:17:44,500 --> 00:17:47,540 dan, pada kenyataannya, alat itu memiliki precompiled untuk Anda 292 00:17:47,540 --> 00:17:49,720 dalam hal yang kita disebut "kode objek," 293 00:17:49,720 --> 00:17:52,940 namun hal itu tidak menjadi masalah bagi Anda di mana itu karena sistem mengetahui, 294 00:17:52,940 --> 00:17:54,780 dalam kasus ini, di mana itu, alat. 295 00:17:54,780 --> 00:18:00,620 Tapi mari kita scroll ke bawah sekarang untuk GetInt, dan melihat bagaimana GetInt telah bekerja sepanjang waktu ini. 296 00:18:00,620 --> 00:18:02,380 Jadi di sini kita memiliki komentar serupa dari sebelumnya. 297 00:18:02,380 --> 00:18:04,930 Biarkan aku memperbesar hanya bagian kode, 298 00:18:04,930 --> 00:18:07,410 dan apa yang kita miliki untuk GetInt adalah sebagai berikut. 299 00:18:07,410 --> 00:18:12,770 Dibutuhkan masukan tidak ada dan mengembalikan sebuah int, sementara (benar), jadi kami memiliki loop tak terbatas yang disengaja 300 00:18:12,770 --> 00:18:16,560 tapi, mungkin, kita akan keluar dari ini, entah bagaimana, atau kembali dari dalam ini. 301 00:18:16,560 --> 00:18:19,890 Jadi mari kita lihat bagaimana ini bekerja. Nah, kita tampaknya akan menggunakan GetString 302 00:18:19,890 --> 00:18:22,550 di baris pertama dalam loop, 166. 303 00:18:22,550 --> 00:18:25,320 Sekarang ini adalah praktek yang baik karena dalam keadaan apa 304 00:18:25,320 --> 00:18:30,820 bisa GetString mengembalikan NULL kata kunci ini, khusus? 305 00:18:30,820 --> 00:18:38,460 Jika sesuatu yang tidak beres. Apa yang bisa salah ketika Anda menelepon sesuatu seperti GetString? 306 00:18:38,460 --> 00:18:42,550 Ya? [Jawaban siswa, tidak dapat dipahami] >> Ya. Jadi mungkin malloc gagal. 307 00:18:42,550 --> 00:18:45,310 Di suatu tempat di bawah GetString hood memanggil malloc, 308 00:18:45,310 --> 00:18:48,210 yang mengalokasikan memori, yang memungkinkan toko komputer 309 00:18:48,210 --> 00:18:50,950 semua karakter yang pengguna jenis ke keyboard. 310 00:18:50,950 --> 00:18:53,270 Dan misalkan pengguna memiliki seluruh banyak waktu luang 311 00:18:53,270 --> 00:18:56,470 dan mengetik lebih, misalnya, dari 2 miliar karakter. 312 00:18:56,470 --> 00:18:59,600 Karakter lebih dari komputer bahkan memiliki RAM. 313 00:18:59,600 --> 00:19:02,350 Nah, GetString harus mampu untuk menandakan bahwa Anda, 314 00:19:02,350 --> 00:19:05,650 bahkan jika ini adalah kasus, sudut super super jarang. 315 00:19:05,650 --> 00:19:08,490 Hal ini entah bagaimana bisa menangani hal ini, dan begitu GetString, 316 00:19:08,490 --> 00:19:11,850 jika kita kembali dan membaca dokumentasinya, tidak, pada kenyataannya, kembali NULL. 317 00:19:11,850 --> 00:19:16,150 Sekarang jika GetString gagal dengan mengembalikan NULL, GetInt akan gagal 318 00:19:16,150 --> 00:19:19,370 dengan kembali INT_MAX, seperti sentinel. 319 00:19:19,370 --> 00:19:22,650 Ini hanya konvensi manusia. Satu-satunya cara Anda akan tahu hal ini terjadi 320 00:19:22,650 --> 00:19:24,840 adalah dengan membaca dokumentasi. 321 00:19:24,840 --> 00:19:28,200 Jadi mari kita gulir ke bawah ke mana int sebenarnya GotInt. 322 00:19:28,200 --> 00:19:34,220 >> Jadi jika saya gulir ke bawah sedikit lebih jauh, sejalan 170 kami memiliki komentar di atas garis-garis. 323 00:19:34,220 --> 00:19:38,470 Jadi kami menyatakan, di 172, n int dan char c, dan kemudian fungsi baru ini 324 00:19:38,470 --> 00:19:41,870 yang beberapa dari Anda telah sengaja menemukan sebelumnya, tapi sscanf. 325 00:19:41,870 --> 00:19:44,190 Ini adalah singkatan untuk f tali scan. 326 00:19:44,190 --> 00:19:48,580 Dengan kata lain, memberikan string dan saya akan memindai untuk potongan informasi yang menarik. 327 00:19:48,580 --> 00:19:53,820 Jadi apa artinya? Nah, anggaplah bahwa saya ketik, secara harfiah, 1 2 3 pada keyboard, 328 00:19:53,820 --> 00:19:59,730 dan kemudian tekan enter. Apa tipe data dari 1 2 3 ketika dikembalikan oleh GetString? 329 00:19:59,730 --> 00:20:05,010 Ini jelas string, kan? Aku punya string, sehingga 1 2 3 benar-benar "1 2 3" 330 00:20:05,010 --> 00:20:07,260 dengan \ 0 pada akhir itu. Itu bukan sebuah int. 331 00:20:07,260 --> 00:20:10,420 Itu bukan angka. Sepertinya nomor tapi itu tidak benar-benar. 332 00:20:10,420 --> 00:20:14,680 Jadi apa GetInt lakukan? Hal ini untuk memindai bahwa string kiri ke kanan, 333 00:20:14,680 --> 00:20:19,010 1 2 3 \ 0, dan entah bagaimana mengubahnya menjadi integer yang sebenarnya. 334 00:20:19,010 --> 00:20:21,010 Sekarang, Anda bisa mencari cara untuk melakukan hal ini. 335 00:20:21,010 --> 00:20:24,240 Jika Anda berpikir kembali ke pset 2, Anda mungkin mendapat sedikit nyaman 336 00:20:24,240 --> 00:20:26,810 dengan Caesar atau Vigenere sehingga Anda dapat iterate selama string, 337 00:20:26,810 --> 00:20:29,800 Anda dapat mengkonversi karakter untuk ints dengan memilih. Itu seluruh banyak pekerjaan. 338 00:20:29,800 --> 00:20:32,800 Mengapa tidak memanggil fungsi seperti sscanf yang melakukan itu untuk Anda? 339 00:20:32,800 --> 00:20:37,520 Jadi sscanf mengharapkan argumen, dalam hal ini disebut garis, yang merupakan string. 340 00:20:37,520 --> 00:20:41,310 Anda kemudian tentukan, dalam tanda kutip, sangat mirip dengan printf, 341 00:20:41,310 --> 00:20:44,960 apa yang Anda harapkan untuk melihat dalam string ini? 342 00:20:44,960 --> 00:20:52,980 Apa yang saya katakan di sini adalah, saya berharap untuk melihat angka desimal dan mungkin karakter. 343 00:20:52,980 --> 00:20:54,990 Dan kita akan melihat mengapa hal ini terjadi hanya dalam beberapa saat. 344 00:20:54,990 --> 00:20:58,440 Ternyata bahwa notasi ini sekarang mengingatkan hal-hal 345 00:20:58,440 --> 00:21:00,840 kami mulai berbicara tentang lebih dari seminggu yang lalu. 346 00:21:00,840 --> 00:21:05,430 >> Apa & n dan c & lakukan bagi kita di sini? [Jawaban siswa, tidak dapat dipahami] 347 00:21:05,430 --> 00:21:07,610 >> Ya. Ini memberi saya alamat n dan alamat c. 348 00:21:07,610 --> 00:21:10,440 Sekarang, mengapa itu penting? Nah, Anda tahu bahwa dengan fungsi di C 349 00:21:10,440 --> 00:21:13,440 Anda selalu dapat mengembalikan nilai atau nilai sama sekali. 350 00:21:13,440 --> 00:21:16,630 Anda dapat mengembalikan int, string, pelampung, char, apapun. 351 00:21:16,630 --> 00:21:21,150 Atau Anda dapat kembali batal, tetapi Anda hanya dapat mengembalikan 1 hal maksimal. 352 00:21:21,150 --> 00:21:26,100 Tapi di sini kami ingin sscanf untuk kembali saya mungkin sebuah int, angka desimal, 353 00:21:26,100 --> 00:21:29,240 dan juga char, dan saya akan menjelaskan mengapa char dalam sekejap. 354 00:21:29,240 --> 00:21:34,250 Jadi Anda ingin efektif f kembali 2 hal, itu hanya tidak mungkin dalam C. 355 00:21:34,250 --> 00:21:38,460 Sehingga Anda dapat bekerja di sekitar bahwa dengan lewat di 2 alamat, 356 00:21:38,460 --> 00:21:43,710 karena segera setelah Anda menyerahkan fungsi 2 alamat, apa yang bisa fungsi yang lakukan dengan mereka? 357 00:21:43,710 --> 00:21:49,880 Hal ini dapat menulis ke alamat tersebut. Anda dapat menggunakan operasi * dan "pergi ke sana" untuk masing-masing alamat. 358 00:21:49,880 --> 00:21:54,320 Ini semacam mekanisme backdoor, tapi sangat umum untuk mengubah nilai-nilai variabel 359 00:21:54,320 --> 00:21:58,020 di lebih dari hanya 1 tempat, dalam hal ini 2. 360 00:21:58,020 --> 00:22:04,590 Sekarang, perhatikan aku memeriksa == to1, dan kemudian kembali n jika itu tidak, pada kenyataannya, mengevaluasi dengan benar. 361 00:22:04,590 --> 00:22:09,340 Jadi apa yang terjadi? Nah, secara teknis, semua kita benar-benar ingin terjadi dalam GetInt ini. 362 00:22:09,340 --> 00:22:12,340 Kami ingin mengurai, sehingga untuk berbicara, kami ingin membaca string 363 00:22:12,340 --> 00:22:16,210 "1 2 3" dan jika terlihat seperti ada sejumlah sana, 364 00:22:16,210 --> 00:22:21,360 apa yang kita memberitahu sscanf lakukan adalah meletakkan angka, 1 2 3, dalam n variabel bagi saya. 365 00:22:21,360 --> 00:22:26,060 Mengapa, kemudian, apakah aku punya ini juga? 366 00:22:26,060 --> 00:22:33,750 Apa peran juga mengatakan, sscanf, Anda juga bisa mendapatkan karakter di sini. 367 00:22:33,750 --> 00:22:36,890 [Berbicara Mahasiswa, dipahami] >> Tidak - titik desimal bisa bekerja. 368 00:22:36,890 --> 00:22:40,650 Mari kita menganggap bahwa berpikir sejenak. Apa lagi? 369 00:22:40,650 --> 00:22:42,570 [Mahasiswa, dipahami] >> Jadi, pikiran yang baik, itu bisa menjadi karakter NULL. 370 00:22:42,570 --> 00:22:44,970 Ini sebenarnya tidak, dalam kasus ini. Ya? [Mahasiswa, dipahami] 371 00:22:44,970 --> 00:22:47,100 >> >> ASCII. Atau, biarkan aku menggeneralisasi lebih jauh. 372 00:22:47,100 --> 00:22:49,670 The c% ada hanya untuk pengecekan error. 373 00:22:49,670 --> 00:22:52,510 Kami tidak ingin ada karakter setelah nomor, 374 00:22:52,510 --> 00:22:54,980 tapi apa ini memungkinkan saya lakukan adalah sebagai berikut: 375 00:22:54,980 --> 00:23:01,270 Ternyata sscanf, selain menyimpan nilai-nilai di n dan c, dalam contoh di sini, 376 00:23:01,270 --> 00:23:08,170 apa itu juga tidak itu mengembalikan jumlah variabel itu menempatkan nilai masuk 377 00:23:08,170 --> 00:23:13,330 Jadi jika Anda hanya mengetik 1 2 3, maka hanya% d akan mencocokkan 378 00:23:13,330 --> 00:23:18,830 dan hanya n akan disimpan dengan nilai seperti 1 2 3 dan tidak akan dimasukkan ke dalam c; 379 00:23:18,830 --> 00:23:20,870 c tetap nilai sampah, sehingga untuk berbicara. 380 00:23:20,870 --> 00:23:23,550 Sampah karena itu tidak pernah diinisialisasi sebagai beberapa nilai. 381 00:23:23,550 --> 00:23:29,390 Jadi dalam hal ini, sscanf kembali 1, karena saya dihuni salah satu pointer, 382 00:23:29,390 --> 00:23:33,650 dalam hal ini, yang besar. Saya memiliki sebuah int, jadi saya membebaskan garis untuk membebaskan memori 383 00:23:33,650 --> 00:23:37,150 yang GetString sebenarnya dialokasikan, dan kemudian aku kembali n. 384 00:23:37,150 --> 00:23:42,210 Lain, jika Anda pernah bertanya-tanya mana yang coba lagi pernyataan berasal dari, berasal dari sini. 385 00:23:42,210 --> 00:23:45,770 Jika, sebaliknya, saya ketik di 1 2 3 foo, 386 00:23:45,770 --> 00:23:48,640 hanya beberapa urutan acak teks, sscanf akan melihat, 387 00:23:48,640 --> 00:23:51,500 ooh, nomor, ooh, nomor, ooh, nomor, ooh - f. 388 00:23:51,500 --> 00:23:54,190 Dan itu akan menempatkan 1 2 3 dalam n. 389 00:23:54,190 --> 00:23:59,970 Ini akan menempatkan f di c, dan kemudian kembali 2. 390 00:23:59,970 --> 00:24:02,980 Jadi kita miliki, hanya menggunakan definisi dasar dari perilaku scanf itu, 391 00:24:02,980 --> 00:24:06,170 cara yang sangat sederhana - baik, kompleks pada pandangan pertama, tapi pada akhir hari, 392 00:24:06,170 --> 00:24:11,460 mekanisme yang cukup sederhana untuk mengatakan, apakah ada int, dan jika demikian, adalah bahwa satu-satunya hal yang saya temukan? 393 00:24:11,460 --> 00:24:14,950 Dan ruang putih di sini adalah disengaja. Jika Anda membaca dokumentasi untuk sscanf, 394 00:24:14,950 --> 00:24:18,690 ia memberitahu Anda bahwa jika Anda memasukkan sepotong spasi di awal atau akhir, 395 00:24:18,690 --> 00:24:24,990 sscanf juga akan memungkinkan pengguna, untuk alasan apa pun, untuk memukul spasi 1 2 3, dan itu akan sah. 396 00:24:24,990 --> 00:24:28,310 Ini tidak akan berteriak pada pengguna hanya karena mereka memukul spasi di awal atau akhir, 397 00:24:28,310 --> 00:24:32,160 yang hanya sedikit lebih user-friendly. 398 00:24:32,160 --> 00:24:34,160 >> Ada pertanyaan, kemudian, pada GetInts? Ya? 399 00:24:34,160 --> 00:24:36,820 [Pertanyaan Mahasiswa, dipahami] 400 00:24:36,820 --> 00:24:40,740 >> Pertanyaan bagus. Bagaimana jika Anda hanya mengetik dalam char, seperti memukul f, dan masukkan 401 00:24:40,740 --> 00:24:47,830 tanpa pernah mengetik 1 2 3, apa yang Anda pikir perilaku ini baris kode maka akan? 402 00:24:47,830 --> 00:24:50,500 Jadi sscanf dapat menutupi itu juga, karena dalam kasus itu, 403 00:24:50,500 --> 00:24:56,280 itu tidak akan mengisi n atau c, itu akan kembali 0 sebagai gantinya. 404 00:24:56,280 --> 00:25:01,540 Dalam hal ini, saya juga menangkap skenario itu, karena nilai yang diharapkan saya inginkan adalah 1. 405 00:25:01,540 --> 00:25:07,310 Saya hanya ingin 1, dan hanya 1 hal yang harus diisi. Pertanyaan bagus. Lainnya? 406 00:25:07,310 --> 00:25:09,610 >> Baiklah, jadi mari kita tidak pergi melalui semua fungsi di sini, 407 00:25:09,610 --> 00:25:11,820 tapi satu yang tampaknya, mungkin, kepentingan yang tersisa 408 00:25:11,820 --> 00:25:14,530 adalah GetString karena ternyata GetFloat, GetInt, 409 00:25:14,530 --> 00:25:19,490 GetDouble, GetLongLong menyepak bola semua banyak fungsi mereka untuk GetString. 410 00:25:19,490 --> 00:25:22,860 Jadi mari kita lihat bagaimana ia diimplementasikan di sini. 411 00:25:22,860 --> 00:25:27,040 Ini terlihat sedikit rumit tetapi menggunakan dasar-dasar yang sama 412 00:25:27,040 --> 00:25:29,680 bahwa kita mulai berbicara tentang minggu lalu. Jadi dalam GetString, 413 00:25:29,680 --> 00:25:32,670 yang mengambil argumen tidak sesuai kekosongan di sini, 414 00:25:32,670 --> 00:25:37,110 dan ia mengembalikan string, jadi saya menyatakan string disebut buffer. 415 00:25:37,110 --> 00:25:39,670 Saya tidak benar-benar tahu apa yang akan digunakan untuk, tapi kita akan lihat. 416 00:25:39,670 --> 00:25:42,950 Tampak seperti kapasitas, secara default, 0, tidak cukup yakin di mana hal ini terjadi. 417 00:25:42,950 --> 00:25:44,920 Tidak yakin apa n akan digunakan untuk belum. 418 00:25:44,920 --> 00:25:47,860 Tapi sekarang semakin sedikit lebih menarik, sehingga sejalan 243, 419 00:25:47,860 --> 00:25:51,760 kita mendeklarasikan c int, ini adalah semacam detail bodoh. 420 00:25:51,760 --> 00:25:58,080 Char adalah 8 bit, dan 8 bit dapat menyimpan berapa banyak nilai yang berbeda? 421 00:25:58,080 --> 00:26:03,310 256. Masalahnya adalah, jika Anda ingin memiliki 256 karakter ASCII yang berbeda, 422 00:26:03,310 --> 00:26:06,210 yang ada, jika Anda berpikir kembali, dan ini bukanlah sesuatu untuk menghafal. 423 00:26:06,210 --> 00:26:09,100 Tetapi jika Anda berpikir kembali ke tabel ASCII besar kami memiliki minggu yang lalu, 424 00:26:09,100 --> 00:26:13,780 ada, dalam kasus, 128 atau 256 karakter ASCII. 425 00:26:13,780 --> 00:26:16,220 Kami menggunakan semua pola 0 dan 1 terserah. 426 00:26:16,220 --> 00:26:19,410 Itulah masalah jika Anda ingin dapat mendeteksi kesalahan. 427 00:26:19,410 --> 00:26:23,290 Karena jika Anda telah menggunakan 256 nilai untuk karakter Anda, 428 00:26:23,290 --> 00:26:26,390 Anda tidak benar-benar merencanakan ke depan, karena sekarang Anda tidak memiliki cara untuk mengatakan, 429 00:26:26,390 --> 00:26:29,750 "Ini bukan karakter legit, ini adalah beberapa pesan yang keliru." 430 00:26:29,750 --> 00:26:32,430 Jadi apa yang dunia lakukan adalah, mereka menggunakan nilai terbesar berikutnya, 431 00:26:32,430 --> 00:26:35,790 sesuatu seperti int sehingga Anda memiliki sejumlah gila bit, 432 00:26:35,790 --> 00:26:39,610 32 untuk 4 miliar nilai yang mungkin, sehingga Anda hanya dapat berakhir dengan menggunakan, 433 00:26:39,610 --> 00:26:44,800 dasarnya, 257 dari mereka, 1 dari yang memiliki beberapa arti khusus sebagai kesalahan. 434 00:26:44,800 --> 00:26:49,190 >> Jadi mari kita lihat bagaimana ini bekerja. Sejalan 246, aku punya loop sementara besar 435 00:26:49,190 --> 00:26:54,530 yang memanggil fgetc, f berarti file, getc, dan kemudian stdin. 436 00:26:54,530 --> 00:26:59,030 Ternyata ini hanya cara yang lebih tepat untuk mengatakan "membaca input dari keyboard." 437 00:26:59,030 --> 00:27:02,730 Input keyboard cara standar, output standar berarti layar, 438 00:27:02,730 --> 00:27:06,920 dan standard error, yang akan kita lihat di pset 4, berarti layar, 439 00:27:06,920 --> 00:27:09,670 tapi bagian khusus dari layar sehingga itu tidak digabungkan 440 00:27:09,670 --> 00:27:13,760 dengan output aktual yang Anda bermaksud untuk mencetak, tetapi lebih pada bahwa di masa depan. 441 00:27:13,760 --> 00:27:19,430 Jadi fgetc hanya berarti membaca satu karakter dari keyboard, dan menyimpannya di mana? 442 00:27:19,430 --> 00:27:24,000 Menyimpannya dalam c, dan kemudian memeriksa, jadi aku hanya menggunakan beberapa konjungsi boolean sini, 443 00:27:24,000 --> 00:27:28,430 memeriksa bahwa itu tidak sama dengan \ n, sehingga pengguna telah tekan enter. 444 00:27:28,430 --> 00:27:31,510 Kami ingin berhenti pada titik, akhir loop, dan kami juga ingin memeriksa 445 00:27:31,510 --> 00:27:36,170 untuk konstanta khusus, EOF, yang jika Anda tahu atau menebak - apa itu berdiri? 446 00:27:36,170 --> 00:27:39,860 Akhir file. Jadi ini adalah jenis tidak masuk akal, karena jika aku mengetik di keyboard, 447 00:27:39,860 --> 00:27:41,900 ada benar-benar ada file yang terlibat dalam hal ini, 448 00:27:41,900 --> 00:27:44,330 tapi ini hanya semacam istilah generik yang digunakan untuk berarti 449 00:27:44,330 --> 00:27:50,320 bahwa tidak ada lagi yang berasal dari jari-jari manusia. EOF. Akhir file. 450 00:27:50,320 --> 00:27:52,600 Sebagai samping, jika Anda pernah menekan tombol control d pada keyboard Anda, 451 00:27:52,600 --> 00:27:54,680 tidak bahwa Anda akan belum, Anda telah memukul kendali c. 452 00:27:54,680 --> 00:27:57,920 Tetapi kontrol d mengirimkan EOF ini disebut istimewa konstan. 453 00:27:57,920 --> 00:28:03,100 >> Jadi sekarang kita hanya memiliki beberapa alokasi memori dinamis. 454 00:28:03,100 --> 00:28:06,460 Jadi jika n + 1> kapasitas, sekarang saya akan menjelaskan n. 455 00:28:06,460 --> 00:28:09,380 n betapa banyak byte saat ini dalam buffer, 456 00:28:09,380 --> 00:28:11,970 string yang saat ini Anda membangun dari pengguna. 457 00:28:11,970 --> 00:28:16,240 Jika Anda memiliki lebih banyak karakter dalam buffer Anda daripada Anda memiliki kapasitas buffer, 458 00:28:16,240 --> 00:28:20,760 intuitif, apa yang perlu kita lakukan adalah mengalokasikan kapasitas yang lebih besar. 459 00:28:20,760 --> 00:28:24,490 Aku akan skim atas beberapa aritmatika di sini 460 00:28:24,490 --> 00:28:26,900 dan fokus hanya pada fungsi ini di sini. 461 00:28:26,900 --> 00:28:29,170 Kau tahu apa yang malloc, atau setidaknya umumnya akrab. 462 00:28:29,170 --> 00:28:32,380 Coba tebak apa yang realloc tidak. [Jawaban siswa, tidak dapat dipahami] 463 00:28:32,380 --> 00:28:35,690 >> Ya. Dan itu tidak cukup menambahkan memori, melainkan direalokasi memori sebagai berikut: 464 00:28:35,690 --> 00:28:40,530 Jika masih ada ruang di akhir string untuk memberikan Anda lebih banyak memori yang 465 00:28:40,530 --> 00:28:43,370 daripada awalnya memberi Anda, maka Anda akan mendapatkan memori tambahan. 466 00:28:43,370 --> 00:28:46,640 Jadi Anda hanya bisa menempatkan karakter string kembali untuk kembali ke kembali ke belakang. 467 00:28:46,640 --> 00:28:49,290 Tapi kalau itu tidak terjadi, karena Anda menunggu terlalu lama 468 00:28:49,290 --> 00:28:51,700 dan sesuatu yang acak mendapat menjatuhkan ke dalam memori di sana, tapi ada tambahan 469 00:28:51,700 --> 00:28:56,480 memori di sini, tidak apa-apa. Realloc akan melakukan semua angkat berat untuk Anda, 470 00:28:56,480 --> 00:28:58,810 memindahkan string yang Anda sudah membaca dalam sehingga jauh dari sini, 471 00:28:58,810 --> 00:29:02,550 meletakkannya di sana, dan kemudian memberikan landasan pacu lagi pada saat itu. 472 00:29:02,550 --> 00:29:05,610 Jadi dengan gelombang tangan, saya katakan bahwa apa yang dilakukan GetString 473 00:29:05,610 --> 00:29:09,540 yang itu dimulai dengan buffer kecil, mungkin 1 karakter tunggal, 474 00:29:09,540 --> 00:29:12,300 dan jika pengguna jenis dalam 2 karakter, GetString berakhir 475 00:29:12,300 --> 00:29:15,210 realloc memanggil dan berkata, 'Ooh, 1 karakter tidak cukup. 476 00:29:15,210 --> 00:29:18,480 Beri aku 2 karakter. " Kemudian jika Anda membaca melalui logika loop, 477 00:29:18,480 --> 00:29:21,070 itu akan mengatakan, 'Ooh, pengguna mengetik dalam 3 karakter. 478 00:29:21,070 --> 00:29:25,690 Beri aku sekarang tidak 2 tapi 4 karakter, kemudian memberikan saya 8, kemudian memberi saya 16 dan 32. " 479 00:29:25,690 --> 00:29:28,180 Fakta bahwa aku dua kali lipat kapasitas setiap kali 480 00:29:28,180 --> 00:29:30,320 berarti bahwa buffer tidak akan tumbuh perlahan-lahan. 481 00:29:30,320 --> 00:29:35,870 Ini akan tumbuh super cepat, dan apa yang mungkin keuntungan dari itu? 482 00:29:35,870 --> 00:29:38,540 Mengapa saya menggandakan ukuran buffer, meskipun pengguna 483 00:29:38,540 --> 00:29:41,450 mungkin hanya perlu 1 karakter tambahan dari keyboard? 484 00:29:41,450 --> 00:29:44,830 [Mahasiswa jawaban, tidak dapat dipahami]. >> Apa itu? 485 00:29:44,830 --> 00:29:46,750 Tepat. Anda tidak harus tumbuh sebagai sering. 486 00:29:46,750 --> 00:29:48,870 Dan ini hanya semacam - kau lindung nilai taruhan Anda di sini. 487 00:29:48,870 --> 00:29:54,150 Idenya adalah bahwa Anda tidak ingin untuk memanggil realloc banyak, karena itu cenderung menjadi lambat. 488 00:29:54,150 --> 00:29:56,840 Setiap kali Anda meminta sistem operasi untuk memori, karena Anda akan segera melihat 489 00:29:56,840 --> 00:30:00,620 dalam satu set masalah masa depan, ia cenderung untuk mengambil beberapa waktu. 490 00:30:00,620 --> 00:30:04,980 Jadi meminimalkan jumlah waktu, bahkan jika Anda membuang-buang beberapa ruang, cenderung menjadi hal yang baik. 491 00:30:04,980 --> 00:30:07,250 >> Tetapi jika kita membaca bagian akhir dari GetString sini, 492 00:30:07,250 --> 00:30:10,880 dan sekali lagi, memahami setiap baris di sini tidak begitu penting saat ini. 493 00:30:10,880 --> 00:30:14,830 Tapi melihat bahwa ia akhirnya panggilan malloc lagi, dan mengalokasikan 494 00:30:14,830 --> 00:30:16,980 persis seperti byte yang dibutuhkan untuk string 495 00:30:16,980 --> 00:30:21,620 dan kemudian membuang dengan menelepon bebas, buffer terlalu besar, 496 00:30:21,620 --> 00:30:23,510 jika memang mendapat dua kali lipat kali terlalu banyak. 497 00:30:23,510 --> 00:30:25,970 Singkatnya, itulah cara GetString telah bekerja sepanjang waktu ini. 498 00:30:25,970 --> 00:30:30,100 Semua hal ini adalah membaca satu karakter pada satu waktu lagi dan lagi dan lagi 499 00:30:30,100 --> 00:30:37,930 dan setiap kali dibutuhkan beberapa memori tambahan, ia meminta sistem operasi untuk itu dengan menelepon realloc. 500 00:30:37,930 --> 00:30:41,660 Ada pertanyaan? Baiklah. 501 00:30:41,660 --> 00:30:45,220 >> Serangan. Sekarang kita mengerti pointer, atau setidaknya 502 00:30:45,220 --> 00:30:47,560 semakin akrab dengan pointer, 503 00:30:47,560 --> 00:30:50,020 mari kita mempertimbangkan bagaimana seluruh dunia mulai runtuh 504 00:30:50,020 --> 00:30:53,160 jika Anda tidak cukup mempertahankan terhadap pengguna permusuhan, 505 00:30:53,160 --> 00:30:55,180 orang-orang yang mencoba untuk hack ke dalam sistem Anda. 506 00:30:55,180 --> 00:31:00,260 Orang-orang yang mencoba untuk mencuri perangkat lunak Anda dengan menghindari beberapa kode registrasi 507 00:31:00,260 --> 00:31:02,150 bahwa mereka dinyatakan mungkin harus mengetik masuk 508 00:31:02,150 --> 00:31:04,860 Lihatlah contoh ini di sini, yang hanya C kode 509 00:31:04,860 --> 00:31:07,920 yang memiliki fungsi utama di bagian bawah, yang memanggil fungsi foo, 510 00:31:07,920 --> 00:31:12,100 dan apa yang akan lewat untuk foo? [Siswa] Sebuah argumen tunggal. 511 00:31:12,100 --> 00:31:15,660 >> Satu argumen. Jadi argv [1], yang berarti kata pertama pengguna mengetik 512 00:31:15,660 --> 00:31:19,150 pada baris perintah setelah a.out atau apa pun program yang disebut. 513 00:31:19,150 --> 00:31:24,920 Jadi foo, di atas, diperlukan dalam char *, tapi char * hanya apa? 514 00:31:24,920 --> 00:31:28,860 String. Tidak ada yang baru di sini, dan string yang sewenang-wenang disebut bar. 515 00:31:28,860 --> 00:31:36,090 Dalam baris ini di sini, char c [12], dalam semacam semi-teknis bahasa Inggris, apa yang baris ini lakukan? 516 00:31:36,090 --> 00:31:40,640 Array -? Karakter. Berikan saya sebuah array dari 12 karakter. 517 00:31:40,640 --> 00:31:44,970 Jadi kita sebut ini buffer. Ini secara teknis disebut c, tapi penyangga dalam pemrograman 518 00:31:44,970 --> 00:31:47,890 hanya berarti sekelompok ruang yang Anda dapat menaruh beberapa hal masuk 519 00:31:47,890 --> 00:31:49,940 >> Kemudian terakhir, memcpy, kami sudah tidak digunakan sebelumnya. 520 00:31:49,940 --> 00:31:52,380 Tapi Anda mungkin bisa menebak apa yang dilakukannya. Ini salinan memori. 521 00:31:52,380 --> 00:31:58,790 Apa yang dilakukannya? Nah, itu tampaknya salinan bar, input, ke c, 522 00:31:58,790 --> 00:32:03,420 tapi hanya sampai panjang bar. 523 00:32:03,420 --> 00:32:07,440 Tapi ada bug di sini. 524 00:32:07,440 --> 00:32:14,500 Oke, jadi secara teknis kita benar-benar harus melakukan strlen (bar) x sizeof (char), itu benar. 525 00:32:14,500 --> 00:32:17,920 Tapi dalam kasus terburuk di sini, mari kita asumsikan bahwa ltu - jadi, oke. 526 00:32:17,920 --> 00:32:23,760 Lalu ada 2 bug. Jadi sizeof (char), baiklah, mari kita membuat ini sedikit lebih lebar. 527 00:32:23,760 --> 00:32:28,860 Jadi sekarang masih ada bug, yang adalah apa? 528 00:32:28,860 --> 00:32:31,630 [Jawaban siswa, tidak dapat dipahami] Cek >> untuk apa? Oke, jadi kita harus memeriksa 529 00:32:31,630 --> 00:32:35,010 untuk NULL, karena hal-hal buruk terjadi ketika pointer Anda adalah NULL, 530 00:32:35,010 --> 00:32:38,490 Karena Anda mungkin berakhir pergi ke sana, dan Anda seharusnya tidak pernah pergi ke NULL 531 00:32:38,490 --> 00:32:40,890 dengan dereferencing dengan operator *. 532 00:32:40,890 --> 00:32:45,250 Jadi itu bagus, dan apa lagi yang kita lakukan? Logikanya ada cacat di sini juga. 533 00:32:45,250 --> 00:32:47,650 [Jawaban siswa, tidak dapat dipahami] 534 00:32:47,650 --> 00:32:51,340 Jadi >> memeriksa apakah argc ≥ 2? 535 00:32:51,340 --> 00:32:54,130 Oke, jadi ada 3 bug dalam program ini di sini. 536 00:32:54,130 --> 00:33:00,080 Kami tidak memeriksa apakah pengguna benar-benar mengetik sesuatu ke argv [1], baik. 537 00:33:00,080 --> 00:33:02,240 Jadi apa bug ketiga? Ya? 538 00:33:02,240 --> 00:33:04,420 [Jawaban siswa, tidak dapat dipahami] >> Baik. 539 00:33:04,420 --> 00:33:09,590 Jadi kami memeriksa satu skenario. Kami implisit diperiksa tidak menyalin lebih banyak memori 540 00:33:09,590 --> 00:33:12,800 daripada akan melebihi panjang bar. 541 00:33:12,800 --> 00:33:15,720 Jadi jika string pengguna mengetik adalah 10 karakter, 542 00:33:15,720 --> 00:33:18,260 ini mengatakan, "Hanya menyalin 10 karakter. ' 543 00:33:18,260 --> 00:33:21,140 Dan tidak apa-apa, tetapi bagaimana jika pengguna mengetikkan kata pada prompt 544 00:33:21,140 --> 00:33:29,360 seperti kata karakter 20, ini adalah, mengatakan copy 20 karakter dari bar ke dalam apa? 545 00:33:29,360 --> 00:33:32,840 c, atau dikenal sebagai penyangga kami, yang berarti Anda hanya menulis data yang 546 00:33:32,840 --> 00:33:35,950 sampai 8 byte lokasi yang bukan milik Anda, 547 00:33:35,950 --> 00:33:38,320 dan Anda tidak memiliki mereka dalam arti bahwa Anda tidak pernah dialokasikan mereka. 548 00:33:38,320 --> 00:33:41,190 Jadi ini adalah apa yang umumnya dikenal sebagai serangan buffer overflow, 549 00:33:41,190 --> 00:33:46,650 atau buffer overrun serangan, dan serangan itu dalam arti bahwa jika pengguna 550 00:33:46,650 --> 00:33:50,650 atau program yang memanggil fungsi Anda melakukan hal ini jahat, 551 00:33:50,650 --> 00:33:53,780 apa yang sebenarnya terjadi berikutnya bisa sangat buruk. 552 00:33:53,780 --> 00:33:55,690 >> Mari kita lihat pada gambar ini di sini. 553 00:33:55,690 --> 00:33:59,070 Gambar ini merupakan tumpukan memori Anda. 554 00:33:59,070 --> 00:34:01,050 Dan ingat bahwa setiap kali Anda memanggil fungsi, 555 00:34:01,050 --> 00:34:04,520 Anda mendapatkan bingkai kecil di tumpukan dan kemudian lain dan kemudian lagi dan lagi. 556 00:34:04,520 --> 00:34:07,250 Dan sejauh ini kita baru saja semacam ini disarikan pergi sebagai persegi panjang 557 00:34:07,250 --> 00:34:09,380 baik ada di papan tulis atau pada layar di sini. 558 00:34:09,380 --> 00:34:12,219 Tetapi jika kita memperbesar salah satu persegi panjang, 559 00:34:12,219 --> 00:34:16,460 ketika Anda memanggil fungsi foo, ternyata ada lebih di stack 560 00:34:16,460 --> 00:34:18,739 dalam kerangka dan persegi panjang yang 561 00:34:18,739 --> 00:34:23,370 dari sekedar x dan y dan a dan b, seperti kita berbicara tentang swap. 562 00:34:23,370 --> 00:34:25,949 Ternyata bahwa ada beberapa tingkat rendah rincian, 563 00:34:25,949 --> 00:34:27,780 di antara mereka kembali alamat. 564 00:34:27,780 --> 00:34:33,020 Jadi ternyata saat utama panggilan foo, utamanya harus menginformasikan foo 565 00:34:33,020 --> 00:34:36,760 apa alamat utama adalah dalam memori komputer. 566 00:34:36,760 --> 00:34:40,659 Karena jika tidak, segera setelah foo dilakukan mengeksekusi, seperti dalam kasus ini di sini, 567 00:34:40,659 --> 00:34:43,790 setelah Anda mencapai ini tanda kurung kurawal dekat pada akhir foo, 568 00:34:43,790 --> 00:34:48,860 bagaimana sih tidak tahu di mana foo kontrol program ini harus pergi? 569 00:34:48,860 --> 00:34:52,460 Ternyata bahwa jawaban untuk pertanyaan itu adalah dalam persegi panjang merah di sini. 570 00:34:52,460 --> 00:34:56,130 Ini merupakan pointer, dan terserah ke komputer untuk menyimpan, sementara, 571 00:34:56,130 --> 00:35:00,250 pada tumpukan yang disebut alamat utama sehingga sesegera foo dilakukan mengeksekusi, 572 00:35:00,250 --> 00:35:04,110 komputer tahu di mana dan apa yang baris dalam utama untuk kembali ke. 573 00:35:04,110 --> 00:35:06,900 Frame pointer disimpan berhubungan mirip dengan ini. 574 00:35:06,900 --> 00:35:09,620 Char * bar di sini mewakili apa? 575 00:35:09,620 --> 00:35:14,740 Nah, sekarang ini segmen biru di sini adalah bingkai foo, apa adalah bar? 576 00:35:14,740 --> 00:35:18,300 Oke, jadi bar hanyalah argumen ke fungsi foo. 577 00:35:18,300 --> 00:35:20,720 >> Jadi sekarang kita kembali pada gambar akrab. 578 00:35:20,720 --> 00:35:22,960 Ada banyak barang dan gangguan lebih pada layar 579 00:35:22,960 --> 00:35:27,490 tapi ini segmen biru muda adalah apa yang kita telah menggambar di papan tulis untuk sesuatu seperti swap. 580 00:35:27,490 --> 00:35:31,890 Itu adalah frame untuk foo dan satu-satunya di dalamnya sekarang adalah bar, 581 00:35:31,890 --> 00:35:34,630 yang merupakan parameter ini. 582 00:35:34,630 --> 00:35:39,840 Tapi apa lagi yang harus di stack, sesuai dengan kode ini di sini? 583 00:35:39,840 --> 00:35:44,280 Char c [12]. Jadi kita juga harus melihat 12 kotak memori, 584 00:35:44,280 --> 00:35:46,260 dialokasikan untuk sebuah variabel yang disebut c. 585 00:35:46,260 --> 00:35:48,340 Dan memang kita memiliki di layar. 586 00:35:48,340 --> 00:35:51,650 Bagian paling atas ada c [0], dan kemudian penulis diagram ini 587 00:35:51,650 --> 00:35:55,130 tidak repot-repot menggambar semua kotak tetapi ada memang ada 12 588 00:35:55,130 --> 00:36:00,120 karena jika Anda melihat di bagian kanan bawah, c [11], jika Anda menghitung dari 0, adalah 12 byte tersebut. 589 00:36:00,120 --> 00:36:06,190 Tapi di sini masalahnya: Dalam arah mana c tumbuh? 590 00:36:06,190 --> 00:36:10,390 Semacam top down, kan? Jika dimulai di bagian atas dan tumbuh ke bawah, 591 00:36:10,390 --> 00:36:13,480 tidak terlihat seperti kami meninggalkan diri kita sendiri landasan pacu banyak di sini sama sekali. 592 00:36:13,480 --> 00:36:15,320 Kami sudah seperti dicat diri ke sudut, 593 00:36:15,320 --> 00:36:20,210 dan bahwa c [11] yang tepat terhadap bar, yang tepat terhadap pointer stack frame, 594 00:36:20,210 --> 00:36:23,800 yang tepat terhadap alamat pengirim, ada ruang lagi. 595 00:36:23,800 --> 00:36:26,100 Jadi apa implikasinya, maka, jika Anda mengacaukan, 596 00:36:26,100 --> 00:36:30,460 dan Anda mencoba membaca 20 byte dalam buffer 12-byte? 597 00:36:30,460 --> 00:36:33,460 Di mana orang-orang 8 byte tambahan akan pergi? 598 00:36:33,460 --> 00:36:36,370 Di dalam segala sesuatu yang lain, beberapa yang super penting. 599 00:36:36,370 --> 00:36:40,480 Dan yang paling penting, berpotensi, adalah kotak merah ada, alamat pengirim. 600 00:36:40,480 --> 00:36:44,720 Karena mengira bahwa Anda baik sengaja atau adversarially 601 00:36:44,720 --> 00:36:48,040 menimpa mereka 4 byte, alamat pointer, 602 00:36:48,040 --> 00:36:53,190 bukan hanya dengan sampah, namun dengan jumlah yang terjadi untuk mewakili alamat yang sebenarnya di memori? 603 00:36:53,190 --> 00:36:55,930 Apa implicaiton tersebut, secara logis? 604 00:36:55,930 --> 00:36:59,080 [Jawaban siswa, tidak dapat dipahami] >> Tepat. Ketika kembali foo 605 00:36:59,080 --> 00:37:03,560 dan hits yang brace keriting, program ini akan melanjutkan untuk tidak kembali ke utama, 606 00:37:03,560 --> 00:37:08,320 itu akan kembali ke apapun alamat dalam kotak merah. 607 00:37:08,320 --> 00:37:11,560 >> Sekarang, dalam kasus pendaftaran software menghindari, 608 00:37:11,560 --> 00:37:14,400 apa alamat yang sedang kembali ke adalah fungsi 609 00:37:14,400 --> 00:37:18,820 yang biasanya dipanggil setelah Anda sudah membayar untuk perangkat lunak dan dimasukkan kode registrasi Anda? 610 00:37:18,820 --> 00:37:23,160 Anda bisa semacam trik komputer agar tidak terjadi di sini, tetapi sebaliknya, naik di sini. 611 00:37:23,160 --> 00:37:27,950 Atau, jika Anda benar-benar pintar, musuh benar-benar dapat mengetikkan di keyboard, 612 00:37:27,950 --> 00:37:32,500 misalnya, bukan kata-kata yang sebenarnya, bukan 20 karakter, tapi rasa dia 613 00:37:32,500 --> 00:37:36,200 jenis dalam beberapa karakter yang mewakili kode? 614 00:37:36,200 --> 00:37:38,860 Dan itu tidak akan menjadi kode C, itu akan menjadi karakter 615 00:37:38,860 --> 00:37:42,920 yang mewakili kode mesin biner, 0 dan 1 s. 616 00:37:42,920 --> 00:37:46,740 Tapi bagaimana kalau mereka cukup pintar untuk melakukan itu, entah bagaimana paste ke prompt GetString 617 00:37:46,740 --> 00:37:49,460 sesuatu yang pada dasarnya kode dikompilasi, 618 00:37:49,460 --> 00:37:56,900 dan 4 byte terakhir menimpa bahwa alamat pengirim, dan apa alamat apakah masukan yang melakukan? 619 00:37:56,900 --> 00:38:01,860 Ia menyimpan dalam persegi panjang merah alamat byte pertama dari buffer. 620 00:38:01,860 --> 00:38:04,270 Jadi Anda harus benar-benar pintar, dan ini adalah banyak trial and error 621 00:38:04,270 --> 00:38:08,500 bagi orang-orang buruk di luar sana, tetapi jika Anda dapat mengetahui seberapa besar penyangga ini, 622 00:38:08,500 --> 00:38:12,170 sehingga beberapa byte terakhir di masukan yang Anda berikan untuk program 623 00:38:12,170 --> 00:38:15,970 kebetulan setara dengan alamat dari awal buffer Anda, 624 00:38:15,970 --> 00:38:22,270 Anda dapat melakukan hal ini. Jika kita berkata, biasanya, halo, dan \ 0, itulah yang berakhir di buffer. 625 00:38:22,270 --> 00:38:27,860 Tetapi jika kita lebih pintar, dan kita mengisi buffer yang dengan apa yang kita akan menelepon umum kode serangan, 626 00:38:27,860 --> 00:38:31,920 A, A, A, A: Serangan, serangan, serangan, serangan, di mana ini hanya sesuatu yang melakukan sesuatu yang buruk. 627 00:38:31,920 --> 00:38:35,190 Nah, apa yang terjadi jika Anda benar-benar pintar, Anda mungkin melakukan hal ini: 628 00:38:35,190 --> 00:38:41,740 Dalam kotak merah di sini adalah urutan nomor: 80, CO, 35, 08. 629 00:38:41,740 --> 00:38:44,890 Perhatikan bahwa yang sama dengan nomor yang di sini. 630 00:38:44,890 --> 00:38:47,280 Ada dalam urutan terbalik, tetapi lebih pada lain waktu. 631 00:38:47,280 --> 00:38:51,430 Perhatikan bahwa alamat pengirim telah sengaja diubah 632 00:38:51,430 --> 00:38:54,970 untuk sama alamat di sini, bukan alamat utama. 633 00:38:54,970 --> 00:39:00,170 Jadi jika orang jahat adalah super pintar, ia akan dimasukkan ke dalam kode serangan 634 00:39:00,170 --> 00:39:02,890 sesuatu seperti, 'Hapus semua file pengguna. " 635 00:39:02,890 --> 00:39:06,320 Atau 'Copy password,' atau 'Buat akun pengguna yang saya bisa login ke. " 636 00:39:06,320 --> 00:39:10,130 Apa-apa, dan ini adalah baik bahaya dan kekuatan C. 637 00:39:10,130 --> 00:39:12,900 Karena Anda memiliki akses ke memori melalui pointer 638 00:39:12,900 --> 00:39:15,950 dan karena itu Anda dapat menulis apapun yang Anda inginkan ke dalam memori komputer. 639 00:39:15,950 --> 00:39:19,290 Anda dapat membuat komputer melakukan apa pun yang Anda inginkan hanya dengan 640 00:39:19,290 --> 00:39:22,780 setelah itu melompat-lompat di dalam ruang memori sendiri. 641 00:39:22,780 --> 00:39:27,230 Dan sebagainya, sampai hari ini, begitu banyak program dan begitu banyak website yang dikompromikan 642 00:39:27,230 --> 00:39:29,730 mendidih ke orang mengambil keuntungan dari hal ini. 643 00:39:29,730 --> 00:39:32,510 Dan ini mungkin tampak seperti serangan super canggih, 644 00:39:32,510 --> 00:39:34,220 tetapi tidak selalu mulai dengan cara itu. 645 00:39:34,220 --> 00:39:36,770 >> Kenyataannya adalah bahwa apa yang orang jahat biasanya akan lakukan adalah, 646 00:39:36,770 --> 00:39:41,470 apakah itu sebuah program pada baris perintah atau program GUI atau website, 647 00:39:41,470 --> 00:39:43,290 adalah Anda hanya mulai memberikan omong kosong. 648 00:39:43,290 --> 00:39:46,940 Anda mengetikkan sebuah kata yang sangat besar ke dalam kolom pencarian dan tekan enter, 649 00:39:46,940 --> 00:39:49,030 dan Anda menunggu untuk melihat apakah situs crash. 650 00:39:49,030 --> 00:39:53,270 Atau Anda menunggu untuk melihat apakah program memanifestasikan beberapa pesan kesalahan. 651 00:39:53,270 --> 00:39:55,480 Karena jika Anda beruntung, sebagai orang jahat, 652 00:39:55,480 --> 00:39:59,610 dan Anda memberikan beberapa masukan gila yang crash program, 653 00:39:59,610 --> 00:40:02,280 itu berarti programmer tidak mengantisipasi perilaku buruk Anda 654 00:40:02,280 --> 00:40:05,420 yang berarti Anda mungkin bisa, dengan usaha yang cukup, 655 00:40:05,420 --> 00:40:09,870 trial and error yang cukup, mencari cara untuk melancarkan serangan yang lebih tepat. 656 00:40:09,870 --> 00:40:15,900 Sehingga banyak bagian dari keamanan tidak hanya menghindari serangan ini sama sekali, namun mereka mendeteksi 657 00:40:15,900 --> 00:40:20,250 dan benar-benar melihat log dan melihat apa yang input gila memiliki orang-orang mengetik ke dalam situs web Anda. 658 00:40:20,250 --> 00:40:26,040 Apa istilah pencarian yang diketik orang ke website Anda dengan harapan meluap beberapa buffer? 659 00:40:26,040 --> 00:40:28,900 Dan ini semua bermuara pada dasar-dasar yang sederhana dari apa yang array, 660 00:40:28,900 --> 00:40:32,510 dan apa artinya untuk mengalokasikan dan menggunakan memori? 661 00:40:32,510 --> 00:40:34,920 Dan berkaitan dengan itu juga, ini. 662 00:40:34,920 --> 00:40:37,520 >> Jadi mari kita melirik dalam hard drive lagi. 663 00:40:37,520 --> 00:40:40,190 Jadi Anda ingat dari satu atau dua minggu yang lalu bahwa ketika Anda drag file 664 00:40:40,190 --> 00:40:45,470 untuk Anda recycle bin atau sampah, apa yang terjadi? 665 00:40:45,470 --> 00:40:47,850 [Mahasiswa] Tidak ada. >> Ya, sama sekali tidak ada. Akhirnya jika Anda menjalankan rendah 666 00:40:47,850 --> 00:40:51,370 pada ruang disk, Windows atau Mac OS akan mulai menghapus file untuk Anda. 667 00:40:51,370 --> 00:40:53,670 Tetapi jika Anda tarik sesuatu di sana, maka itu sama sekali tidak aman. 668 00:40:53,670 --> 00:40:56,550 Semua roomate, teman atau anggota keluarga Anda harus lakukan adalah klik dua kali, dan voila. 669 00:40:56,550 --> 00:40:59,720 Ada semua file samar bahwa Anda mencoba untuk menghapus. 670 00:40:59,720 --> 00:41:02,840 Jadi kebanyakan dari kita setidaknya tahu bahwa Anda harus klik kanan atau mengendalikan klik 671 00:41:02,840 --> 00:41:05,320 dan mengosongkan sampah, atau sesuatu seperti itu. 672 00:41:05,320 --> 00:41:07,900 Tetapi bahkan kemudian, itu tidak cukup melakukan trik. 673 00:41:07,900 --> 00:41:11,340 Karena apa yang terjadi ketika Anda memiliki sebuah file pada hard drive Anda 674 00:41:11,340 --> 00:41:14,590 yang mewakili beberapa dokumen word atau JPEG? 675 00:41:14,590 --> 00:41:18,820 Dan ini merupakan hard drive Anda, dan mari kita mengatakan ini sepotong di sini mewakili file tersebut, 676 00:41:18,820 --> 00:41:21,640 dan itu terdiri dari sejumlah besar 0 dan 1 s. 677 00:41:21,640 --> 00:41:25,470 Apa yang terjadi ketika Anda tidak hanya menyeret file tersebut ke tempat sampah atau recycle bin, 678 00:41:25,470 --> 00:41:30,390 tetapi juga mengosongkannya? 679 00:41:30,390 --> 00:41:32,820 Semacam apa-apa. Ini bukan apa-apa sekarang. 680 00:41:32,820 --> 00:41:37,630 Sekarang itu hanya apa-apa, karena sedikit sesuatu terjadi dalam bentuk tabel ini. 681 00:41:37,630 --> 00:41:41,170 Jadi ada semacam database atau tabel dalam memori komputer 682 00:41:41,170 --> 00:41:44,470 yang pada dasarnya memiliki 1 kolom untuk nama file, 683 00:41:44,470 --> 00:41:50,550 dan 1 kolom untuk lokasi file, mana mungkin ini lokasi 123, hanya nomor acak. 684 00:41:50,550 --> 00:41:58,270 Jadi kita mungkin memiliki sesuatu seperti X.jpg, dan lokasi 123. 685 00:41:58,270 --> 00:42:02,870 Dan apa yang terjadi kemudian, ketika Anda mengosongkan sampah Anda? 686 00:42:02,870 --> 00:42:06,720 Itu hilang. Tapi apa tidak pergi adalah 0 dan 1 s. 687 00:42:06,720 --> 00:42:09,690 >> Jadi apa, kemudian, koneksi ke pset 4? 688 00:42:09,690 --> 00:42:13,460 Nah, dengan pset 4, hanya karena kita telah sengaja terhapus 689 00:42:13,460 --> 00:42:15,890 kartu compact flash yang memiliki semua foto-foto ini, 690 00:42:15,890 --> 00:42:18,710 atau hanya karena oleh nasib buruk menjadi rusak, 691 00:42:18,710 --> 00:42:21,170 tidak berarti bahwa 0 dan 1 itu tidak masih ada. 692 00:42:21,170 --> 00:42:23,920 Mungkin beberapa dari mereka hilang karena sesuatu punya rusak 693 00:42:23,920 --> 00:42:26,530 dalam arti bahwa beberapa s 0 menjadi 1 dan 1 itu menjadi 0 s. 694 00:42:26,530 --> 00:42:30,460 Hal-hal buruk bisa terjadi karena perangkat lunak kereta atau kerusakan hardware. 695 00:42:30,460 --> 00:42:33,510 Tetapi banyak dari mereka bit, bahkan mungkin 100% dari mereka masih ada, 696 00:42:33,510 --> 00:42:38,330 hanya saja komputer atau kamera tidak tahu di mana JPEG 1 mulai 697 00:42:38,330 --> 00:42:41,660 dan di mana JPEG 2 dimulai, tetapi jika Anda, programmer, 698 00:42:41,660 --> 00:42:45,800 tahu, dengan sedikit cerdas, di mana mereka JPEG atau apa yang mereka terlihat seperti, 699 00:42:45,800 --> 00:42:49,570 Anda dapat menganalisis 0 dan 1 ini dan berkata, 'Ooh. JPEG. Ooh, JPEG. " 700 00:42:49,570 --> 00:42:52,830 Anda dapat menulis sebuah program dengan dasarnya hanya untuk atau while loop 701 00:42:52,830 --> 00:42:56,100 yang pulih masing-masing dan setiap file-file. 702 00:42:56,100 --> 00:42:59,360 Jadi pelajaran kemudian, adalah untuk memulai "aman" menghapus file Anda 703 00:42:59,360 --> 00:43:01,720 jika Anda ingin menghindari hal ini sama sekali. Ya? 704 00:43:01,720 --> 00:43:06,940 [Pertanyaan Mahasiswa, dipahami] 705 00:43:06,940 --> 00:43:11,150 >> Memiliki memori lebih dari yang Anda lakukan sebelumnya - 706 00:43:11,150 --> 00:43:14,790 Oh! Pertanyaan bagus. Jadi mengapa, kemudian, setelah membuang sampah, 707 00:43:14,790 --> 00:43:18,300 apakah komputer Anda memberitahu Anda bahwa Anda memiliki lebih banyak ruang bebas dari yang Anda lakukan sebelumnya? 708 00:43:18,300 --> 00:43:22,450 Singkatnya, karena berbohong. Lebih teknis, Anda memiliki lebih banyak ruang. 709 00:43:22,450 --> 00:43:26,720 Karena sekarang Anda telah mengatakan, Anda dapat menempatkan hal-hal lain di mana file yang dulu, 710 00:43:26,720 --> 00:43:28,930 tapi itu tidak berarti bit akan pergi, 711 00:43:28,930 --> 00:43:33,070 dan itu tidak berarti bit sedang mengubah semua 0, misalnya, untuk melindungi Anda. 712 00:43:33,070 --> 00:43:37,520 Sebaliknya, jika Anda "aman" file menghapus, atau secara fisik merusak perangkat, 713 00:43:37,520 --> 00:43:40,810 yang benar-benar adalah satu-satunya cara, kadang-kadang, di sekitar itu. 714 00:43:40,810 --> 00:43:45,300 Jadi kenapa tidak kita meninggalkan pada catatan semi-menakutkan, dan kita akan melihat Anda pada hari Senin. 715 00:43:45,300 --> 00:43:52,810 CS50.TV