>> SPEAKER 1: Napišimo program, ki dobi niz od uporabnika brez
uporabo CS50 Knjižnica je delovanje GetString.
Da bi to naredili, bomo šli naprej in uporabo scanf, funkcija, ki GetString
funkcija dejansko uporablja Pod pokrovom.
Ampak bom to naredil namerno v buggy način.
Jaz bom naredil tako, da mislim, bi bilo prav, vendar se izkaže, da
Moja predpostavka se dogaja, da precej, precej pomanjkljiva.
In dejansko zelo nevarna.
Ker hroščev, kot tisti, sem približno da bi bilo mogoče izkoristiti z nasprotniki
, tako da je vaš računalnik ali vaš program lahko prevzamejo potencialno.
>> Začnimo takole.
Najprej si izrekamo niz, sicer znan že kot char zvezde,
in poklicati to je to.
Lets naslednji poziv uporabniku za vrvico, kot z "vrvico, prosim." In
dajmo zdaj dobili niz od uporabnika uporabo scanf, citiram konec citata, "% s". V
Z drugimi besedami, kaj je obvestiti scanf tem smo pa v resnici pričakujejo, da bodo dobili niz
od uporabnika.
>> Toda zdaj se moramo povedati scanf še ena stvar -
kje postaviti niz, ki uporabniku omogoča.
No, bom preprosto začeti z vejico s, z navedbo, da bi rad
scanf postaviti niz tam.
Jaz sem zraven bo izpisal nekaj kot "Hvala printf za% s
backslash n vejico. "In kot vedno, sem tekoč prehod v nizu, s.
Zdaj pa shranite, pripravijo in vodijo to programa, in videli, če mi ne more voditi
Problem sem napovedal.
>> Naredite scanf-1.
./scanf-1.
String prosim.
Oglejmo zagotoviti nekaj podobnega, "zdravo". "Hvala za nič." Hmm, to ni
tisto, kar sem pričakoval.
Torej, kaj se dogaja?
>> No, izkazalo se je, ker smo se razglasi i kot char zvezdo, vendar nismo
dejansko shranjeni na e naslov Dejanska kos pomnilnika, scanf ni
Nikamor postaviti niz da uporabnik vtipka
Dejansko, če bi uporabnik za zdaj vnesti precej daljši niz kot "zdravo"
na primer več vrstic besedila ali več odstavkov besedila, je precej
možno, da povzročimo ti segmentacija napaka.
>> Ker je scanf ne bo vedel, da je Nisem pravzaprav dal naslov
znotraj s.
Namesto, da se dogaja, da vidim nekaj vrednosti v S, nekateri vzorec bitov, ki lahko
Zelo dobro je smeti vrednost, tam samo po naključju.
In scanf je še vedno tekoč, da bi poskušali napisati Uporabnik niz na ta naslov,
tudi če je vrednost smeti, ki lahko dejansko sprožijo nesrečo.
>> Torej, kako bomo to popraviti?