>> INTERLOCUTEUR 1: Écrivons un programme qui obtient une chaîne de l'utilisateur sans
en utilisant la bibliothèque de CS50 GetString fonctionner.
Pour ce faire, nous allons aller de l'avant et d'utiliser scanf, la fonction que le GetString
fonction utilise effectivement sous la hotte.
Mais je vais le faire délibérément d'une manière buggy.
Je vais faire d'une manière que je crois serait bon, mais il s'avère que
mon hypothèse va tout à fait, tout à fait erronée.
Et en fait, très dangereux.
Parce que les bugs comme celui que je suis sur le point de faire peut être exploitée par les adversaires
de telle sorte que votre machine ou votre programme peut être pris en charge potentiellement.
>> Commençons comme suit.
D'abord nous allons déclarer notre chaîne, autrement connu maintenant comme une étoile de char,
et l'appeler l'art.
Permet prochaine inviter l'utilisateur à une chaîne, comme "chaîne s'il vous plaît." Et
passons maintenant la chaîne de l'utilisateur utilisant scanf, je cite, "% s." Dans
Autrement dit, nous allons informer scanf que nous ne en effet s'attendre à obtenir une chaîne
à partir de l'utilisateur.
>> Mais maintenant, nous devons dire à scanf une autre chose -
où mettre la chaîne fournit à l'utilisateur.
Eh bien, je vais commencer tout simplement par des virgules s, en précisant que je voudrais
scanf pour mettre la chaîne il.
Je prochaine va imprimer quelque chose comme printf "merci pour l'% s
barre oblique inverse n virgule. "Et comme toujours, je suis va passer dans la chaîne, s.
Maintenant, nous allons sauver, compiler et exécuter ce programme, et de voir si nous ne pouvons pas induire
le problème que j'ai prédit.
>> Faire scanf-1.
./scanf-1.
Chaîne s'il vous plaît.
Donnons quelque chose comme, «bonjour». "Merci pour le nul." Hmm, ce n'est pas
à quoi je m'attendais.
Alors qu'est-ce qui se passe ici?
>> Eh bien, il s'avère que nous déclarions s comme une étoile char mais nous n'avons pas
effectivement stockée dans l'adresse d'un s morceau de mémoire réelle, scanf n'a pas
avoir n'importe où pour mettre la chaîne que l'utilisateur a tapé po
En effet, si l'utilisateur venait à entrer à présent dans une chaîne beaucoup plus longue que "bonjour"
par exemple plusieurs lignes de texte ou plusieurs paragraphes de texte, il est tout à fait
possible que nous pourrions provoquer un soi-disant erreur de segmentation.
>> Parce que scanf ne va pas de savoir que Je n'ai pas vraiment mettre une adresse
l'intérieur de l'art.
Au contraire, il va voir une certaine valeur à s, certains motifs de bits qui peut
très bien être une valeur d'ordures, il par hasard.
Et scanf va encore essayer d'écrire la chaîne de l'utilisateur à cette adresse,
même s'il s'agit d'une valeur d'ordures, qui pourrait en effet induire un accident.
>> Alors, comment allons-nous résoudre ce problème?