>> ПРЕДСЕДНИК 1: Хајде да напише програм који добија низ од корисника без
користећи ЦС50 Библиотека је функционишу ГетСтринг.
Да бисте то урадили, ми ћемо ићи напред и користите сцанф, функција да ГетСтринг
Функција заправо користи испод хаубе.
Али ја ћу то урадити намерно у бугги начин.
Ја ћу да урадим на начин који мислим би било у реду, али се испоставља да
моја претпоставка је да ће бити сасвим, сасвим погрешан.
А у ствари, прилично опасно.
Због грешке попут оног да сам о томе да направи може да се експлоатише од стране противника
тако да ваша машина или ваш програм може се узети преко потенцијално.
>> Почнимо као што следи.
Прво ћемо прогласити нашу жицу, сада иначе познат као цхар звезда,
и зову је с.
Омогућава следећи питати корисника за ниску, као са "стринг молим." И
хајде сада да стринг од корисника користећи сцанф, цитат завршен цитат, "% с." У
Другим речима, хајде да обавести да смо сцанф Не, у ствари, очекујем да добијем стринг
од корисника.
>> Али сада морамо да кажемо сцанф једна друга ствар -
где да ставим ниску која корисник даје.
Па, ја ћу сасвим једноставно почне са зарезом а, наводећи да бих волео
сцанф да стави ту ниску.
Ја поред ћу одштампате нешто као принтф "хвала за% с
косих н зарез. "И као и увек, ја сам ће проћи у стринг, с.
Сада ћемо сачувати, компајлирати, и покренути овај Програм, а видим да не можемо изазвати
Проблем сам предвидео.
>> Направите сцанф-1.
./сцанф-1.
Стринг молим.
Хајде да пружи нешто слично, "здраво." "Хвала на нулл." Хм, то није
оно што сам очекивао.
Дакле, шта се овде дешава?
>> Па, испоставило се, јер смо прогласили а као цхар звезде, али нисмо
заправо чувају у ова адресу стварни комад меморије, сцанф зар не
имали где да стави ниску да корисник унесе
Заиста, ако корисник требало да сада куцате у много дуже него низ "здраво"
на пример неколико редова текста или неколико пасуса текста, то је сасвим
могуће да ми индукују такозвани сегментација грешка.
>> Јер сцанф неће да знају да Нисам заправо ставили адресу
унутар с.
Уместо тога, она ће видети неку вредност у с, неки образац бита који могу
врло добро бити вредност смеће, постоји само случајно.
И сцанф и даље ће покушати да пишу корисник стринг на ту адресу,
чак и ако је вредност за смеће, који могао заиста изазвати судар.
>> Па како ћемо поправити ово?