>> SPEAKER 1: Să scrie un program care devine un șir de către utilizator, fără
folosind CS50 Bibliotecii funcționeze getString.
Pentru a face acest lucru, vom merge mai departe și de a folosi scanf, funcția pe care getString
Funcția utilizează de fapt sub capota.
Dar am de gând să facă acest lucru în mod deliberat într-un mod buggy.
Am de gând să facă în așa fel încât cred ar fi bine, dar se pare că
presupunerea mea va fi destul, destul de eronate.
Și, de fapt, destul de periculos.
Deoarece bug-uri, cum ar fi cea pe care am Sunt pe cale să face pot fi exploatate de adversari
astfel încât mașina dvs. sau programul pot fi luate peste potențial.
>> Să începem, după cum urmează.
În primul rând haideți să declare șir nostru, altfel cunoscut acum ca o stea char,
și apelul e.
Permite solicita lângă utilizatorul de un șir de caractere, ca cu "șir te rog." Și
sa trecem acum șirul de utilizator folosind scanf, citez, "% s". În
Cu alte cuvinte, să informeze scanf care ne-am Nu, de fapt, se așteaptă pentru a obține un șir
de la utilizator.
>> Dar acum trebuie să-i spuneți scanf un alt lucru -
în cazul în care pentru a pune șirul care utilizatorul oferă.
Ei bine, am de gând să înceapă destul de simplu cu virgulă s, precizând că mi-ar plăcea
scanf pentru a pune șirul acolo.
Am lângă gând să imprima ceva cum ar fi printf "mulțumiri pentru% s
backslash n virgulă. "Și, ca întotdeauna, eu sunt O să treacă în șir, s.
Acum, haideți să salva, compila, și a alerga acest programul, și să vedem dacă nu putem induce
problema am prezis.
>> Face scanf-1.
./scanf-1.
Șir te rog.
Să ofere ceva de genul, "salut". "Multumesc pentru nul." Hmm, asta nu e
ceea ce mă așteptam.
Deci, ce se întâmplă aici?
>> Ei bine, se pare că ne-a declarat e ca o stea char, dar nu am făcut-o
de fapt stocate în e adresa unei bucată reală de memorie, scanf nu a făcut
au oriunde pentru a pune în șirul că utilizatorul tastat inch
Într-adevăr, în cazul în care utilizatorul a fost să tastați acum în un șir de mult mai mult decat "salut",
de exemplu, mai multe linii de text sau mai multe paragrafe de text, este destul de
posibil ca am putea induce un așa-numita eroare de segmentare.
>> Deoarece scanf nu este de gând să știe că Nu am pus de fapt o adresă
interiorul s.
Mai degrabă, se va vedea o anumită valoare în s, unele model de biți care pot
foarte bine să fie o valoare de gunoi, nu doar din întâmplare.
Și scanf este încă în curs de a încerca să scrie șirul de utilizator la acea adresă,
chiar dacă aceasta este o valoare gunoi, care ar putea determina într-adevăr un accident.
>> Deci, cum vom rezolva această problemă?