>> SPEAKER 1: Scriviamo un programma che ottiene una stringa dall'utente senza
utilizzando il CS50 Biblioteca funzionamento GetString.
Per fare questo, andremo avanti e utilizziamo scanf, la funzione che la GetString
funzione utilizza effettivamente sotto la cappa.
Ma ho intenzione di fare questo deliberatamente in modo buggy.
Io vado a fare in un modo che credo sarebbe giusto, ma si scopre che
la mia ipotesi sta per essere molto, molto imperfetto.
E infatti, molto pericoloso.
Perché bug come quello che sto per fare può essere sfruttata dagli avversari
in modo tale che la macchina o il vostro programma può essere ripreso potenzialmente.
>> Cominciamo come segue.
Prima di tutto dichiariamo la nostra stringa, altrimenti noto ora come una stella char,
e chiamare s.
Consente prossima richiedere all'utente una stringa, come con "string per favore." E
andiamo ora ottenere la stringa da parte dell'utente utilizzando scanf, tra virgolette, "% s". In
altre parole, cerchiamo di informare scanf che abbiamo in effetti si aspettano di ottenere una stringa
dall'utente.
>> Ma ora abbiamo bisogno di dire scanf un'altra cosa -
dove mettere la stringa che l'utente fornisce.
Beh, ho intenzione di iniziare semplicemente con virgola s, precisando che vorrei
scanf per mettere la stringa lì.
Sto accanto intenzione di stampare qualcosa come printf "grazie per l'% s
backslash n virgola. «E, come sempre, sono intenzione di passare nella stringa, s.
Ora salviamo, compilare ed eseguire questo programma e vedere se non siamo in grado di indurre
il problema che ho predetto.
>> Fai scanf-1.
./scanf-1.
String favore.
Facciamo fornire qualcosa come "ciao". "Grazie per il nulla." Hmm, non è
quello che mi aspettavo.
Allora, cosa sta succedendo qui?
>> Beh, si scopre perché abbiamo dichiarato s come una stella char, ma non abbiamo
effettivamente memorizzati in s l'indirizzo di un blocco effettivo di memoria, scanf non ha
avere ovunque a mettere la stringa che l'utente ha digitato dentro
Infatti, se l'utente fosse ora digitare una stringa molto più lunga di "ciao"
per esempio alcune righe di testo o diversi paragrafi di testo, è abbastanza
possibile che si possa indurre un cosiddetto segmentation fault.
>> Perché scanf non sta andando per sapere che Non ho effettivamente messo un indirizzo
all'interno di s.
Piuttosto, sta andando a vedere un certo valore in s, qualche modello di bit che possono
benissimo essere un valore spazzatura, lì solo per caso.
E scanf è ancora in corso per cercare di scrivere la stringa utente a tale indirizzo,
anche se è un valore spazzatura, che potrebbe effettivamente indurre un incidente.
>> Così come faremo a risolvere questo problema?