1 00:00:00,000 --> 00:00:00,180 2 00:00:00,180 --> 00:00:02,920 >> Виступаючий 1: Давайте напишемо програму, яка отримує рядок від користувача без 3 00:00:02,920 --> 00:00:05,700 використовуючи CS50 бібліотеки функціонувати GetString. 4 00:00:05,700 --> 00:00:08,720 Щоб зробити це, ми будемо йти вперед і використовувати зсапЕ, функція, що GetString 5 00:00:08,720 --> 00:00:10,950 Функція фактично використовує під капотом. 6 00:00:10,950 --> 00:00:13,780 Але я збираюся зробити це навмисно в баггі чином. 7 00:00:13,780 --> 00:00:17,230 Я збираюся зробити таким чином, що я думаю, було б правильно, але виявляється, що 8 00:00:17,230 --> 00:00:19,380 моє припущення збирається бути зовсім, зовсім помилковим. 9 00:00:19,380 --> 00:00:20,800 І справді, досить небезпечно. 10 00:00:20,800 --> 00:00:24,750 Тому що помилки, подібні тій, я збираюся зробити може бути використана противниками 11 00:00:24,750 --> 00:00:28,870 таким чином, щоб ваша машина або ваша програма можуть бути взяті на потенційно. 12 00:00:28,870 --> 00:00:30,200 >> Давайте почнемо в наступному. 13 00:00:30,200 --> 00:00:33,540 Перш за все, давайте оголосити нашу рядок, інакше відомий тепер як сЬаг зірки, 14 00:00:33,540 --> 00:00:34,750 і викликати його с. 15 00:00:34,750 --> 00:00:39,400 Давайте наступне запитувати у користувача рядок, як з "рядки будь ласка." І 16 00:00:39,400 --> 00:00:44,250 давайте тепер отримати рядок від користувача використовуючи зсапЕ, цитую кінець цитати, "% и." У 17 00:00:44,250 --> 00:00:47,760 Іншими словами, давайте інформувати зсапЕ цього ми у насправді очікувати, щоб отримати рядок 18 00:00:47,760 --> 00:00:48,630 від користувача. 19 00:00:48,630 --> 00:00:50,810 >> Але тепер ми повинні сказати зсапЕ ще одна річ - 20 00:00:50,810 --> 00:00:53,350 де поставити рядок, користувач надає. 21 00:00:53,350 --> 00:00:57,840 Ну, я збираюся просто-напросто почати з комою с, уточнивши, що я хотів би 22 00:00:57,840 --> 00:00:59,320 зсапЕ помістіть рядок там. 23 00:00:59,320 --> 00:01:04,818 Я поруч збираюся роздрукувати щось як Е "спасибі за% з 24 00:01:04,818 --> 00:01:10,670 коса риса п кома. "І, як завжди, я збирається пройти в рядку, с. 25 00:01:10,670 --> 00:01:14,920 Тепер давайте зберегти, скомпілювати і запустити цей Програма, і подивитися, якщо ми не можемо викликати 26 00:01:14,920 --> 00:01:16,590 проблема, яку я передбачив. 27 00:01:16,590 --> 00:01:18,650 >> Зробити SCANF-1. 28 00:01:18,650 --> 00:01:20,960 ./scanf-1. 29 00:01:20,960 --> 00:01:21,830 Рядок будь ласка. 30 00:01:21,830 --> 00:01:25,540 Давайте надати щось на зразок, "привіт". "Спасибі за нуль". Хм, це не 31 00:01:25,540 --> 00:01:26,750 що я очікував. 32 00:01:26,750 --> 00:01:28,240 Так що ж тут відбувається? 33 00:01:28,240 --> 00:01:32,040 >> Ну, виявляється, тому, що ми оголосили з як сЬаг зірки, але ми не зробили 34 00:01:32,040 --> 00:01:36,120 насправді зберігається в и адреса фактична частина пам'яті, зсапЕ не зробив 35 00:01:36,120 --> 00:01:38,940 ніде поставити рядок що користувач ввів дюйма 36 00:01:38,940 --> 00:01:42,510 Дійсно, якщо користувач в даний час ввести набагато довше, ніж рядок "привіт", 37 00:01:42,510 --> 00:01:46,780 наприклад кілька рядків тексту або кілька абзаців тексту, це досить 38 00:01:46,780 --> 00:01:50,280 Можливо, що ми могли б викликати так звана сегментація вина. 39 00:01:50,280 --> 00:01:53,570 >> Тому зсапЕ не знатиме, що Я практично не покласти адресу 40 00:01:53,570 --> 00:01:54,610 всередині с. 41 00:01:54,610 --> 00:01:58,000 Скоріше, це буде побачити деяке значення в с, деякі картини з бітів, які можуть 42 00:01:58,000 --> 00:02:00,910 дуже добре мати значення сміття, там просто випадково. 43 00:02:00,910 --> 00:02:04,600 І зсапЕ раніше буде намагатися писати користувач рядок за цією адресою, 44 00:02:04,600 --> 00:02:08,789 навіть якщо це значення сміття, який дійсно може викликати аварію. 45 00:02:08,789 --> 00:02:10,130 >> Так як ми збираємося це виправити? 46 00:02:10,130 --> 00:02:12,523