>> SPEAKER 1: Lad os skrive et program, får en snor fra brugeren uden
ved hjælp af CS50 Biblioteks fungere getString.
For at gøre dette, vil vi gå videre og bruge scanf, den funktion, at den getString
Funktionen bruger faktisk under hætten.
Men jeg har tænkt mig at gøre dette bevidst i en fejlbehæftet måde.
Jeg har tænkt mig at gøre på en måde, som jeg tror ville være rigtigt, men det viser sig, at
min antagelse kommer til at være helt, helt forkert.
Og faktisk ganske farlig.
Fordi bugs som den jeg er ved at gøre kan udnyttes af modstandere
sådan, at din maskine eller dit program kan overtages potentielt.
>> Lad os begynde som følger.
Først lad os erklære vores streng, ellers kendt nu som en char stjerne,
og kalder det er.
Lader næste bede brugeren om en streng, som med "streng venligst." Og
lad os nu få snoren fra brugeren bruge scanf, citat citat slut, "% s". I
andre ord, lad os meddele scanf at vi rent faktisk forventer at få en streng
fra brugeren.
>> Men nu er vi nødt til at fortælle scanf en anden ting -
hvor til at sætte den streng, brugeren giver.
Nå, jeg har tænkt mig at ganske enkelt at starte med komma s, præciserer, at jeg gerne vil
scanf at sætte strengen der.
Jeg næste kommer til at udskrive noget ligesom printf "tak for% s
backslash n komma ". Og som altid, er jeg vil passere i strengen, s.
Lad os nu gemme, kompilere og køre dette program, og se om vi ikke kan fremkalde
det problem, jeg forudsagde.
>> Make scanf-1.
./scanf-1.
String tak.
Lad os give noget lignende, "hej." "Tak for null." Hmm, det er ikke
hvad jeg havde forventet.
Så hvad sker der her?
>> Tja, det viser sig, fordi vi erklærede s som en char stjerne, men det gjorde vi ikke
faktisk er gemt i e adressen på en faktiske luns af hukommelse, scanf ikke
har et sted at sætte strengen at brugeren skrevet i.
Ja, hvis brugeren skulle nu skrive en meget længere snor end "hello"
for eksempel flere linjer af tekst eller flere tekstafsnit, det er ganske
muligt, at vi kan fremkalde en såkaldt segmenteringsfejl.
>> Fordi scanf ikke kommer til at vide, at Jeg har faktisk ikke sætte en adresse
indersiden af ​​s.
Snarere er det kommer til at se en vis værdi i s, nogle mønster af bits, der kan
meget vel være en skraldespand værdi, der bare tilfældigt.
Og scanf stadig vil forsøge at skrive brugeren streng til denne adresse,
selv om det er en skraldespand værdi, hvilket kunne faktisk fremkalde et styrt.
>> Så hvordan skal vi løse dette?