>> Виступаючий 1: Давайте напишемо програму, яка отримує рядок від користувача без
використовуючи CS50 бібліотеки функціонувати GetString.
Щоб зробити це, ми будемо йти вперед і використовувати зсапЕ, функція, що GetString
Функція фактично використовує під капотом.
Але я збираюся зробити це навмисно в баггі чином.
Я збираюся зробити таким чином, що я думаю, було б правильно, але виявляється, що
моє припущення збирається бути зовсім, зовсім помилковим.
І справді, досить небезпечно.
Тому що помилки, подібні тій, я збираюся зробити може бути використана противниками
таким чином, щоб ваша машина або ваша програма можуть бути взяті на потенційно.
>> Давайте почнемо в наступному.
Перш за все, давайте оголосити нашу рядок, інакше відомий тепер як сЬаг зірки,
і викликати його с.
Давайте наступне запитувати у користувача рядок, як з "рядки будь ласка." І
давайте тепер отримати рядок від користувача використовуючи зсапЕ, цитую кінець цитати, "% и." У
Іншими словами, давайте інформувати зсапЕ цього ми у насправді очікувати, щоб отримати рядок
від користувача.
>> Але тепер ми повинні сказати зсапЕ ще одна річ -
де поставити рядок, користувач надає.
Ну, я збираюся просто-напросто почати з комою с, уточнивши, що я хотів би
зсапЕ помістіть рядок там.
Я поруч збираюся роздрукувати щось як Е "спасибі за% з
коса риса п кома. "І, як завжди, я збирається пройти в рядку, с.
Тепер давайте зберегти, скомпілювати і запустити цей Програма, і подивитися, якщо ми не можемо викликати
проблема, яку я передбачив.
>> Зробити SCANF-1.
./scanf-1.
Рядок будь ласка.
Давайте надати щось на зразок, "привіт". "Спасибі за нуль". Хм, це не
що я очікував.
Так що ж тут відбувається?
>> Ну, виявляється, тому, що ми оголосили з як сЬаг зірки, але ми не зробили
насправді зберігається в и адреса фактична частина пам'яті, зсапЕ не зробив
ніде поставити рядок що користувач ввів дюйма
Дійсно, якщо користувач в даний час ввести набагато довше, ніж рядок "привіт",
наприклад кілька рядків тексту або кілька абзаців тексту, це досить
Можливо, що ми могли б викликати так звана сегментація вина.
>> Тому зсапЕ не знатиме, що Я практично не покласти адресу
всередині с.
Скоріше, це буде побачити деяке значення в с, деякі картини з бітів, які можуть
дуже добре мати значення сміття, там просто випадково.
І зсапЕ раніше буде намагатися писати користувач рядок за цією адресою,
навіть якщо це значення сміття, який дійсно може викликати аварію.
>> Так як ми збираємося це виправити?