>> SPEAKER 1: Pojďme napsat program, který dostane řetězec od uživatele bez
pomocí CS50 Knihovna je fungovat GetString.
Chcete-li to, budeme pokračovat a používat scanf, funkce, která GetString
Funkce ve skutečnosti využívá pod kapotou.
Ale budu to dělat záměrně v kočárku způsobem.
Chystám se dělat tak, že si myslím, že by bylo v pořádku, ale ukazuje se, že
můj předpoklad se děje na docela, docela špatná.
A ve skutečnosti, docela nebezpečné.
Protože chyby, jako ten, který jsem Chystám se aby mohou být využívány protivníky
tak, aby váš počítač nebo váš program mohou být převzaty potenciálně.
>> Začněme takto.
Nejprve pojďme prohlašujeme, že náš řetězec, jinak nyní známý jako char hvězda,
a volat to je.
Umožňuje další vyzve uživatele k zadání řetězce, jako s "řetězec, prosím." A
pojďme se dostat řetězec od uživatele pomocí scanf, citace konec citátu, "% s". V
Jinými slovy, pojďme informovat scanf, že jsme se ve skutečnosti očekávat, že si řetězec
od uživatele.
>> Ale teď musíme říci, scanf ještě jedna věc -
kam umístit řetězec, který uživatel poskytuje.
No, budu se prostě začít s čárka s upřesněním, že bych chtěl
scanf, aby řetězec zde.
Já jsem vedle jít vytisknout něco jako printf "Díky za% s
zpětné lomítko n čárka. "A jako vždy, jsem jít projít do řetězce, s..
Nyní se pojďme šetřit, zkompilovat a spustit tento programu, a uvidíme, jestli se to může vyvolat
Problém jsem předpovídal.
>> Ujistěte se scanf-1.
./scanf-1.
String prosím.
Pojďme poskytnout něco jako, "Dobrý den." "Díky za null." Hmm, to není
to, co jsem očekával.
Tak co se to tady děje?
>> No, ukázalo se, protože jsme deklarovali s jako char hvězda, ale my ne
ve skutečnosti uloženy v s adresou Skutečný kus paměti, scanf ne
mít kam dát řetězec že uživatel zadali palců
Ve skutečnosti, v případě, že uživatel měl nyní zadat mnohem delší řetězec než "ahoj,"
například několik řádků textu nebo několik odstavců textu, je to docela
možné, že by mohl vyvolat tzv. poruchy segmentace.
>> Vzhledem k tomu, scanf nebude vědět, že Jsem skutečně dát adresu
uvnitř s.
Spíše to bude vidět nějakou hodnotu v s, někteří vzor bitů, které mohou být
velmi dobře být hodnota odpadky, tam jen náhodou.
A scanf se stále bude snažit psát uživatel řetězec na tuto adresu,
i v případě, že je hodnota odpadky, které by skutečně mohla vyvolat nehodu.
>> Tak, jak budeme tento problém vyřešit?