1 00:00:00,000 --> 00:00:00,180 2 00:00:00,180 --> 00:00:02,920 >> SPEAKER 1: Să scrie un program care devine un șir de către utilizator, fără 3 00:00:02,920 --> 00:00:05,700 folosind CS50 Bibliotecii funcționeze getString. 4 00:00:05,700 --> 00:00:08,720 Pentru a face acest lucru, vom merge mai departe și de a folosi scanf, funcția pe care getString 5 00:00:08,720 --> 00:00:10,950 Funcția utilizează de fapt sub capota. 6 00:00:10,950 --> 00:00:13,780 Dar am de gând să facă acest lucru în mod deliberat într-un mod buggy. 7 00:00:13,780 --> 00:00:17,230 Am de gând să facă în așa fel încât cred ar fi bine, dar se pare că 8 00:00:17,230 --> 00:00:19,380 presupunerea mea va fi destul, destul de eronate. 9 00:00:19,380 --> 00:00:20,800 Și, de fapt, destul de periculos. 10 00:00:20,800 --> 00:00:24,750 Deoarece bug-uri, cum ar fi cea pe care am Sunt pe cale să face pot fi exploatate de adversari 11 00:00:24,750 --> 00:00:28,870 astfel încât mașina dvs. sau programul pot fi luate peste potențial. 12 00:00:28,870 --> 00:00:30,200 >> Să începem, după cum urmează. 13 00:00:30,200 --> 00:00:33,540 În primul rând haideți să declare șir nostru, altfel cunoscut acum ca o stea char, 14 00:00:33,540 --> 00:00:34,750 și apelul e. 15 00:00:34,750 --> 00:00:39,400 Permite solicita lângă utilizatorul de un șir de caractere, ca cu "șir te rog." Și 16 00:00:39,400 --> 00:00:44,250 sa trecem acum șirul de utilizator folosind scanf, citez, "% s". În 17 00:00:44,250 --> 00:00:47,760 Cu alte cuvinte, să informeze scanf care ne-am Nu, de fapt, se așteaptă pentru a obține un șir 18 00:00:47,760 --> 00:00:48,630 de la utilizator. 19 00:00:48,630 --> 00:00:50,810 >> Dar acum trebuie să-i spuneți scanf un alt lucru - 20 00:00:50,810 --> 00:00:53,350 în cazul în care pentru a pune șirul care utilizatorul oferă. 21 00:00:53,350 --> 00:00:57,840 Ei bine, am de gând să înceapă destul de simplu cu virgulă s, precizând că mi-ar plăcea 22 00:00:57,840 --> 00:00:59,320 scanf pentru a pune șirul acolo. 23 00:00:59,320 --> 00:01:04,818 Am lângă gând să imprima ceva cum ar fi printf "mulțumiri pentru% s 24 00:01:04,818 --> 00:01:10,670 backslash n virgulă. "Și, ca întotdeauna, eu sunt O să treacă în șir, s. 25 00:01:10,670 --> 00:01:14,920 Acum, haideți să salva, compila, și a alerga acest programul, și să vedem dacă nu putem induce 26 00:01:14,920 --> 00:01:16,590 problema am prezis. 27 00:01:16,590 --> 00:01:18,650 >> Face scanf-1. 28 00:01:18,650 --> 00:01:20,960 ./scanf-1. 29 00:01:20,960 --> 00:01:21,830 Șir te rog. 30 00:01:21,830 --> 00:01:25,540 Să ofere ceva de genul, "salut". "Multumesc pentru nul." Hmm, asta nu e 31 00:01:25,540 --> 00:01:26,750 ceea ce mă așteptam. 32 00:01:26,750 --> 00:01:28,240 Deci, ce se întâmplă aici? 33 00:01:28,240 --> 00:01:32,040 >> Ei bine, se pare că ne-a declarat e ca o stea char, dar nu am făcut-o 34 00:01:32,040 --> 00:01:36,120 de fapt stocate în e adresa unei bucată reală de memorie, scanf nu a făcut 35 00:01:36,120 --> 00:01:38,940 au oriunde pentru a pune în șirul că utilizatorul tastat inch 36 00:01:38,940 --> 00:01:42,510 Într-adevăr, în cazul în care utilizatorul a fost să tastați acum în un șir de mult mai mult decat "salut", 37 00:01:42,510 --> 00:01:46,780 de exemplu, mai multe linii de text sau mai multe paragrafe de text, este destul de 38 00:01:46,780 --> 00:01:50,280 posibil ca am putea induce un așa-numita eroare de segmentare. 39 00:01:50,280 --> 00:01:53,570 >> Deoarece scanf nu este de gând să știe că Nu am pus de fapt o adresă 40 00:01:53,570 --> 00:01:54,610 interiorul s. 41 00:01:54,610 --> 00:01:58,000 Mai degrabă, se va vedea o anumită valoare în s, unele model de biți care pot 42 00:01:58,000 --> 00:02:00,910 foarte bine să fie o valoare de gunoi, nu doar din întâmplare. 43 00:02:00,910 --> 00:02:04,600 Și scanf este încă în curs de a încerca să scrie șirul de utilizator la acea adresă, 44 00:02:04,600 --> 00:02:08,789 chiar dacă aceasta este o valoare gunoi, care ar putea determina într-adevăr un accident. 45 00:02:08,789 --> 00:02:10,130 >> Deci, cum vom rezolva această problemă? 46 00:02:10,130 --> 00:02:12,523