1 00:00:00,000 --> 00:00:00,180 2 00:00:00,180 --> 00:00:02,920 >> SPEAKER 1: Scriviamo un programma che ottiene una stringa dall'utente senza 3 00:00:02,920 --> 00:00:05,700 utilizzando il CS50 Biblioteca funzionamento GetString. 4 00:00:05,700 --> 00:00:08,720 Per fare questo, andremo avanti e utilizziamo scanf, la funzione che la GetString 5 00:00:08,720 --> 00:00:10,950 funzione utilizza effettivamente sotto la cappa. 6 00:00:10,950 --> 00:00:13,780 Ma ho intenzione di fare questo deliberatamente in modo buggy. 7 00:00:13,780 --> 00:00:17,230 Io vado a fare in un modo che credo sarebbe giusto, ma si scopre che 8 00:00:17,230 --> 00:00:19,380 la mia ipotesi sta per essere molto, molto imperfetto. 9 00:00:19,380 --> 00:00:20,800 E infatti, molto pericoloso. 10 00:00:20,800 --> 00:00:24,750 Perché bug come quello che sto per fare può essere sfruttata dagli avversari 11 00:00:24,750 --> 00:00:28,870 in modo tale che la macchina o il vostro programma può essere ripreso potenzialmente. 12 00:00:28,870 --> 00:00:30,200 >> Cominciamo come segue. 13 00:00:30,200 --> 00:00:33,540 Prima di tutto dichiariamo la nostra stringa, altrimenti noto ora come una stella char, 14 00:00:33,540 --> 00:00:34,750 e chiamare s. 15 00:00:34,750 --> 00:00:39,400 Consente prossima richiedere all'utente una stringa, come con "string per favore." E 16 00:00:39,400 --> 00:00:44,250 andiamo ora ottenere la stringa da parte dell'utente utilizzando scanf, tra virgolette, "% s". In 17 00:00:44,250 --> 00:00:47,760 altre parole, cerchiamo di informare scanf che abbiamo in effetti si aspettano di ottenere una stringa 18 00:00:47,760 --> 00:00:48,630 dall'utente. 19 00:00:48,630 --> 00:00:50,810 >> Ma ora abbiamo bisogno di dire scanf un'altra cosa - 20 00:00:50,810 --> 00:00:53,350 dove mettere la stringa che l'utente fornisce. 21 00:00:53,350 --> 00:00:57,840 Beh, ho intenzione di iniziare semplicemente con virgola s, precisando che vorrei 22 00:00:57,840 --> 00:00:59,320 scanf per mettere la stringa lì. 23 00:00:59,320 --> 00:01:04,818 Sto accanto intenzione di stampare qualcosa come printf "grazie per l'% s 24 00:01:04,818 --> 00:01:10,670 backslash n virgola. «E, come sempre, sono intenzione di passare nella stringa, s. 25 00:01:10,670 --> 00:01:14,920 Ora salviamo, compilare ed eseguire questo programma e vedere se non siamo in grado di indurre 26 00:01:14,920 --> 00:01:16,590 il problema che ho predetto. 27 00:01:16,590 --> 00:01:18,650 >> Fai scanf-1. 28 00:01:18,650 --> 00:01:20,960 ./scanf-1. 29 00:01:20,960 --> 00:01:21,830 String favore. 30 00:01:21,830 --> 00:01:25,540 Facciamo fornire qualcosa come "ciao". "Grazie per il nulla." Hmm, non è 31 00:01:25,540 --> 00:01:26,750 quello che mi aspettavo. 32 00:01:26,750 --> 00:01:28,240 Allora, cosa sta succedendo qui? 33 00:01:28,240 --> 00:01:32,040 >> Beh, si scopre perché abbiamo dichiarato s come una stella char, ma non abbiamo 34 00:01:32,040 --> 00:01:36,120 effettivamente memorizzati in s l'indirizzo di un blocco effettivo di memoria, scanf non ha 35 00:01:36,120 --> 00:01:38,940 avere ovunque a mettere la stringa che l'utente ha digitato dentro 36 00:01:38,940 --> 00:01:42,510 Infatti, se l'utente fosse ora digitare una stringa molto più lunga di "ciao" 37 00:01:42,510 --> 00:01:46,780 per esempio alcune righe di testo o diversi paragrafi di testo, è abbastanza 38 00:01:46,780 --> 00:01:50,280 possibile che si possa indurre un cosiddetto segmentation fault. 39 00:01:50,280 --> 00:01:53,570 >> Perché scanf non sta andando per sapere che Non ho effettivamente messo un indirizzo 40 00:01:53,570 --> 00:01:54,610 all'interno di s. 41 00:01:54,610 --> 00:01:58,000 Piuttosto, sta andando a vedere un certo valore in s, qualche modello di bit che possono 42 00:01:58,000 --> 00:02:00,910 benissimo essere un valore spazzatura, lì solo per caso. 43 00:02:00,910 --> 00:02:04,600 E scanf è ancora in corso per cercare di scrivere la stringa utente a tale indirizzo, 44 00:02:04,600 --> 00:02:08,789 anche se è un valore spazzatura, che potrebbe effettivamente indurre un incidente. 45 00:02:08,789 --> 00:02:10,130 >> Così come faremo a risolvere questo problema? 46 00:02:10,130 --> 00:02:12,523