1 00:00:00,000 --> 00:00:00,180 2 00:00:00,180 --> 00:00:02,920 >> INTERLOCUTEUR 1: Écrivons un programme qui obtient une chaîne de l'utilisateur sans 3 00:00:02,920 --> 00:00:05,700 en utilisant la bibliothèque de CS50 GetString fonctionner. 4 00:00:05,700 --> 00:00:08,720 Pour ce faire, nous allons aller de l'avant et d'utiliser scanf, la fonction que le GetString 5 00:00:08,720 --> 00:00:10,950 fonction utilise effectivement sous la hotte. 6 00:00:10,950 --> 00:00:13,780 Mais je vais le faire délibérément d'une manière buggy. 7 00:00:13,780 --> 00:00:17,230 Je vais faire d'une manière que je crois serait bon, mais il s'avère que 8 00:00:17,230 --> 00:00:19,380 mon hypothèse va tout à fait, tout à fait erronée. 9 00:00:19,380 --> 00:00:20,800 Et en fait, très dangereux. 10 00:00:20,800 --> 00:00:24,750 Parce que les bugs comme celui que je suis sur le point de faire peut être exploitée par les adversaires 11 00:00:24,750 --> 00:00:28,870 de telle sorte que votre machine ou votre programme peut être pris en charge potentiellement. 12 00:00:28,870 --> 00:00:30,200 >> Commençons comme suit. 13 00:00:30,200 --> 00:00:33,540 D'abord nous allons déclarer notre chaîne, autrement connu maintenant comme une étoile de char, 14 00:00:33,540 --> 00:00:34,750 et l'appeler l'art. 15 00:00:34,750 --> 00:00:39,400 Permet prochaine inviter l'utilisateur à une chaîne, comme "chaîne s'il vous plaît." Et 16 00:00:39,400 --> 00:00:44,250 passons maintenant la chaîne de l'utilisateur utilisant scanf, je cite, "% s." Dans 17 00:00:44,250 --> 00:00:47,760 Autrement dit, nous allons informer scanf que nous ne en effet s'attendre à obtenir une chaîne 18 00:00:47,760 --> 00:00:48,630 à partir de l'utilisateur. 19 00:00:48,630 --> 00:00:50,810 >> Mais maintenant, nous devons dire à scanf une autre chose - 20 00:00:50,810 --> 00:00:53,350 où mettre la chaîne fournit à l'utilisateur. 21 00:00:53,350 --> 00:00:57,840 Eh bien, je vais commencer tout simplement par des virgules s, en précisant que je voudrais 22 00:00:57,840 --> 00:00:59,320 scanf pour mettre la chaîne il. 23 00:00:59,320 --> 00:01:04,818 Je prochaine va imprimer quelque chose comme printf "merci pour l'% s 24 00:01:04,818 --> 00:01:10,670 barre oblique inverse n virgule. "Et comme toujours, je suis va passer dans la chaîne, s. 25 00:01:10,670 --> 00:01:14,920 Maintenant, nous allons sauver, compiler et exécuter ce programme, et de voir si nous ne pouvons pas induire 26 00:01:14,920 --> 00:01:16,590 le problème que j'ai prédit. 27 00:01:16,590 --> 00:01:18,650 >> Faire scanf-1. 28 00:01:18,650 --> 00:01:20,960 ./scanf-1. 29 00:01:20,960 --> 00:01:21,830 Chaîne s'il vous plaît. 30 00:01:21,830 --> 00:01:25,540 Donnons quelque chose comme, «bonjour». "Merci pour le nul." Hmm, ce n'est pas 31 00:01:25,540 --> 00:01:26,750 à quoi je m'attendais. 32 00:01:26,750 --> 00:01:28,240 Alors qu'est-ce qui se passe ici? 33 00:01:28,240 --> 00:01:32,040 >> Eh bien, il s'avère que nous déclarions s comme une étoile char mais nous n'avons pas 34 00:01:32,040 --> 00:01:36,120 effectivement stockée dans l'adresse d'un s morceau de mémoire réelle, scanf n'a pas 35 00:01:36,120 --> 00:01:38,940 avoir n'importe où pour mettre la chaîne que l'utilisateur a tapé po 36 00:01:38,940 --> 00:01:42,510 En effet, si l'utilisateur venait à entrer à présent dans une chaîne beaucoup plus longue que "bonjour" 37 00:01:42,510 --> 00:01:46,780 par exemple plusieurs lignes de texte ou plusieurs paragraphes de texte, il est tout à fait 38 00:01:46,780 --> 00:01:50,280 possible que nous pourrions provoquer un soi-disant erreur de segmentation. 39 00:01:50,280 --> 00:01:53,570 >> Parce que scanf ne va pas de savoir que Je n'ai pas vraiment mettre une adresse 40 00:01:53,570 --> 00:01:54,610 l'intérieur de l'art. 41 00:01:54,610 --> 00:01:58,000 Au contraire, il va voir une certaine valeur à s, certains motifs de bits qui peut 42 00:01:58,000 --> 00:02:00,910 très bien être une valeur d'ordures, il par hasard. 43 00:02:00,910 --> 00:02:04,600 Et scanf va encore essayer d'écrire la chaîne de l'utilisateur à cette adresse, 44 00:02:04,600 --> 00:02:08,789 même s'il s'agit d'une valeur d'ordures, qui pourrait en effet induire un accident. 45 00:02:08,789 --> 00:02:10,130 >> Alors, comment allons-nous résoudre ce problème? 46 00:02:10,130 --> 00:02:12,523