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