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