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