>> HÖGTALARE 1: Låt oss skriva ett program som får en sträng från användaren utan
använder CS50 bibliotekets fungera GetString.
För att göra detta, kommer vi att gå vidare och använda scanf, den funktion som GetString
Funktionen använder faktiskt under huven.
Men jag ska göra det här medvetet i en buggy sätt.
Jag kommer att göra på ett sätt som jag tror skulle vara rätt, men det visar sig att
mitt antagande kommer att vara ganska, ganska bristfällig.
Och i själva verket är ganska farliga.
Eftersom buggar som den jag är på väg att gör kan utnyttjas av motståndare
så att din maskin eller ditt program kan tas över potentiellt.
>> Låt oss börja så här.
Först ska vi förklara vår sträng, annars känd nu som en röding stjärna,
och kallar det är.
Lets nästa fråga användaren efter en sträng, som med "sträng snälla." Och
Låt oss nu få strängen från användaren använda scanf, citat unquote, "% s." I
andra ord, låt oss informera scanf att vi tror faktiskt räkna med att få en sträng
från användaren.
>> Men nu måste vi tala om för scanf en annan sak -
var att sätta den sträng som användaren ger.
Tja, jag ska helt enkelt starta med kommatecken s, anger att jag vill
scanf sätta strängen där.
Jag nästa kommer att skriva ut något som printf "tack för% s
backslash n kommatecken. "Och som alltid, jag är kommer att passera i strängen, s..
Nu ska vi spara, kompilera och köra programmet, och se om vi inte kan förmå
problemet jag förutspådde.
>> Gör scanf-1.
./scanf-1.
String snälla.
Låt oss ge något i stil med "Hej." "Tack för den null." Hmm, det är inte
vad jag hade förväntat mig.
Så vad händer här?
>> Jo, det visar sig att vi förklarade s som en char stjärna men vi gjorde inte
faktiskt lagras i er adressen till en faktiska bit av minnet, gjorde scanf inte
har någonstans att sätta strängen att användaren skrivit i.
Faktum är att om användaren skulle nu skriva in en mycket längre sträng än "hej"
exempelvis flera textrader eller flera textstycken, det är ganska
möjligt att vi skulle kunna framkalla en så kallad segmentering fel.
>> Eftersom scanf inte kommer att veta att Jag har faktiskt inte lagt en adress
insidan av er.
Snarare kommer det att se något värde i s, vissa mönster av bitar som kan
mycket väl vara ett skräp värde, det bara av en slump.
Och scanf fortfarande kommer att försöka skriva instruktionssträngen till den adressen,
även om det är en soptunna värde, vilket kan faktiskt framkalla en krasch.
>> Så hur ska vi fixa detta?