1 00:00:00,000 --> 00:00:00,180 2 00:00:00,180 --> 00:00:02,920 >> HÖGTALARE 1: Låt oss skriva ett program som får en sträng från användaren utan 3 00:00:02,920 --> 00:00:05,700 använder CS50 bibliotekets fungera GetString. 4 00:00:05,700 --> 00:00:08,720 För att göra detta, kommer vi att gå vidare och använda scanf, den funktion som GetString 5 00:00:08,720 --> 00:00:10,950 Funktionen använder faktiskt under huven. 6 00:00:10,950 --> 00:00:13,780 Men jag ska göra det här medvetet i en buggy sätt. 7 00:00:13,780 --> 00:00:17,230 Jag kommer att göra på ett sätt som jag tror skulle vara rätt, men det visar sig att 8 00:00:17,230 --> 00:00:19,380 mitt antagande kommer att vara ganska, ganska bristfällig. 9 00:00:19,380 --> 00:00:20,800 Och i själva verket är ganska farliga. 10 00:00:20,800 --> 00:00:24,750 Eftersom buggar som den jag är på väg att gör kan utnyttjas av motståndare 11 00:00:24,750 --> 00:00:28,870 så att din maskin eller ditt program kan tas över potentiellt. 12 00:00:28,870 --> 00:00:30,200 >> Låt oss börja så här. 13 00:00:30,200 --> 00:00:33,540 Först ska vi förklara vår sträng, annars känd nu som en röding stjärna, 14 00:00:33,540 --> 00:00:34,750 och kallar det är. 15 00:00:34,750 --> 00:00:39,400 Lets nästa fråga användaren efter en sträng, som med "sträng snälla." Och 16 00:00:39,400 --> 00:00:44,250 Låt oss nu få strängen från användaren använda scanf, citat unquote, "% s." I 17 00:00:44,250 --> 00:00:47,760 andra ord, låt oss informera scanf att vi tror faktiskt räkna med att få en sträng 18 00:00:47,760 --> 00:00:48,630 från användaren. 19 00:00:48,630 --> 00:00:50,810 >> Men nu måste vi tala om för scanf en annan sak - 20 00:00:50,810 --> 00:00:53,350 var att sätta den sträng som användaren ger. 21 00:00:53,350 --> 00:00:57,840 Tja, jag ska helt enkelt starta med kommatecken s, anger att jag vill 22 00:00:57,840 --> 00:00:59,320 scanf sätta strängen där. 23 00:00:59,320 --> 00:01:04,818 Jag nästa kommer att skriva ut något som printf "tack för% s 24 00:01:04,818 --> 00:01:10,670 backslash n kommatecken. "Och som alltid, jag är kommer att passera i strängen, s.. 25 00:01:10,670 --> 00:01:14,920 Nu ska vi spara, kompilera och köra programmet, och se om vi inte kan förmå 26 00:01:14,920 --> 00:01:16,590 problemet jag förutspådde. 27 00:01:16,590 --> 00:01:18,650 >> Gör scanf-1. 28 00:01:18,650 --> 00:01:20,960 ./scanf-1. 29 00:01:20,960 --> 00:01:21,830 String snälla. 30 00:01:21,830 --> 00:01:25,540 Låt oss ge något i stil med "Hej." "Tack för den null." Hmm, det är inte 31 00:01:25,540 --> 00:01:26,750 vad jag hade förväntat mig. 32 00:01:26,750 --> 00:01:28,240 Så vad händer här? 33 00:01:28,240 --> 00:01:32,040 >> Jo, det visar sig att vi förklarade s som en char stjärna men vi gjorde inte 34 00:01:32,040 --> 00:01:36,120 faktiskt lagras i er adressen till en faktiska bit av minnet, gjorde scanf inte 35 00:01:36,120 --> 00:01:38,940 har någonstans att sätta strängen att användaren skrivit i. 36 00:01:38,940 --> 00:01:42,510 Faktum är att om användaren skulle nu skriva in en mycket längre sträng än "hej" 37 00:01:42,510 --> 00:01:46,780 exempelvis flera textrader eller flera textstycken, det är ganska 38 00:01:46,780 --> 00:01:50,280 möjligt att vi skulle kunna framkalla en så kallad segmentering fel. 39 00:01:50,280 --> 00:01:53,570 >> Eftersom scanf inte kommer att veta att Jag har faktiskt inte lagt en adress 40 00:01:53,570 --> 00:01:54,610 insidan av er. 41 00:01:54,610 --> 00:01:58,000 Snarare kommer det att se något värde i s, vissa mönster av bitar som kan 42 00:01:58,000 --> 00:02:00,910 mycket väl vara ett skräp värde, det bara av en slump. 43 00:02:00,910 --> 00:02:04,600 Och scanf fortfarande kommer att försöka skriva instruktionssträngen till den adressen, 44 00:02:04,600 --> 00:02:08,789 även om det är en soptunna värde, vilket kan faktiskt framkalla en krasch. 45 00:02:08,789 --> 00:02:10,130 >> Så hur ska vi fixa detta? 46 00:02:10,130 --> 00:02:12,523