>> Выступающий 1: Давайте напишем программу, которая получает строку от пользователя без
используя CS50 библиотеки функционировать GetString.
Чтобы сделать это, мы будем идти вперед и использовать зсапЕ, функция, что GetString
Функция фактически использует под капотом.
Но я собираюсь сделать это намеренно в багги образом.
Я собираюсь сделать таким образом, что я думаю, было бы правильно, но оказывается, что
мое предположение собирается быть совсем, совсем ошибочным.
И в самом деле, довольно опасно.
Потому что ошибки, подобные той, я собираюсь сделать может быть использована противниками
таким образом, чтобы ваша машина или ваша программа могут быть взяты на потенциально.
>> Давайте начнем в следующем.
Прежде всего, давайте объявить нашу строку, иначе известный теперь как сЬаг звезды,
и вызвать его с.
Давайте следующий запрашивать у пользователя строку, как с "строки пожалуйста." И
давайте теперь получить строку от пользователя используя зсапЕ, цитирую конец цитаты, "% ы". В
Другими словами, давайте информировать зсапЕ этого мы у на самом деле ожидать, чтобы получить строку
от пользователя.
>> Но теперь мы должны сказать зсапЕ еще одна вещь -
где поставить строку, пользователь предоставляет.
Ну, я собираюсь просто-напросто начать с запятой с, уточнив, что я хотел бы
зсапЕ поместите строку там.
Я рядом собираюсь распечатать что-то как Е "спасибо за% с
косая черта п запятая. "И, как всегда, я собирается пройти в строке, с.
Теперь давайте сохранить, скомпилировать и запустить этот Программа, и посмотреть, если мы не можем вызвать
проблема, которую я предсказал.
>> Сделать SCANF-1.
./scanf-1.
Строка пожалуйста.
Давайте предоставить что-то вроде, "привет". "Спасибо за нуль". Хм, это не
что я ожидал.
Так что же здесь происходит?
>> Ну, оказывается, потому, что мы объявили с как сЬаг звезды, но мы не сделали
на самом деле хранится в ы адрес фактическая часть памяти, зсапЕ не сделал
негде поставить строку что пользователь ввел дюйма
Действительно, если пользователь в настоящее время ввести гораздо дольше, чем строка "привет",
например несколько строк текста или несколько абзацев текста, это довольно
Возможно, что мы могли бы вызвать так называемая сегментация вина.
>> Потому зсапЕ не будет знать, что Я фактически не положить адрес
внутри с.
Скорее, это будет увидеть некоторое значение в с, некоторые картины из битов, которые могут
очень хорошо иметь значение мусора, там просто случайно.
И зсапЕ по-прежнему будет пытаться писать пользователь строка по этому адресу,
даже если это значение мусор, который действительно может вызвать аварию.
>> Так как мы собираемся это исправить?