1 00:00:00,000 --> 00:00:02,760 [Powered by Google Translate] [SEMAINE 5] 2 00:00:02,760 --> 00:00:04,760 [David J. Malan, Université de Harvard] 3 00:00:04,760 --> 00:00:11,990 [C'est CS50.] [CS50.TV] 4 00:00:11,990 --> 00:00:17,780 [Femme] Il ment; sur quoi, je ne sais pas. 5 00:00:17,780 --> 00:00:20,300 [Homme] Alors, que savons-nous? 6 00:00:20,300 --> 00:00:24,120 [Femme] C'est à 9:15, Ray Santoya était à l'ATM. 7 00:00:24,120 --> 00:00:27,420 [Homme] Donc la question est, que faisait-il à 9:16? 8 00:00:27,420 --> 00:00:29,980 [Femme] Shooting the mm 9 à quelque chose. 9 00:00:29,980 --> 00:00:31,900 Peut-être qu'il a vu le tireur d'élite. 10 00:00:31,900 --> 00:00:34,000 [Homme] Ou il travaillait avec lui. 11 00:00:34,000 --> 00:00:36,330 [Femme] Attendez. Retour celui-ci. 12 00:00:36,330 --> 00:00:38,330 [Homme] Que voyez-vous? 13 00:00:38,330 --> 00:00:44,520 [♫ ♫ musique de suspense] 14 00:00:44,520 --> 00:00:48,320 [Femme] Apportez son visage vers le haut. Plein écran. 15 00:00:48,320 --> 00:00:51,230 [Homme] Ses lunettes. >> Il ya une réflexion. 16 00:00:51,230 --> 00:01:00,810 [♫ ♫ musique de suspense] 17 00:01:00,810 --> 00:01:03,580 [Homme] C'est l'équipe de baseball de Nuevita. C'est leur logo. 18 00:01:03,580 --> 00:01:07,790 [Femme] Et il parle à celui qui est revêtu de ce manteau. 19 00:01:07,790 --> 00:01:13,730 >> [David Malan] Donc, c'est CS50 la semaine 5, et aujourd'hui nous gâcher un peu la télévision et de film pour vous. 20 00:01:13,730 --> 00:01:16,170 Donc, chaque fois que vous regardez un spectacle comme celui-là, 21 00:01:16,170 --> 00:01:19,910 et les flics disent «Pouvez-vous nettoyer?" ou "Améliorer" 22 00:01:19,910 --> 00:01:21,900 il n'y a pas d'améliorer dans le monde réel. 23 00:01:21,900 --> 00:01:25,220 En fait, ce que vous avez vraiment un petit quelque chose comme ça. 24 00:01:25,220 --> 00:01:27,570 J'ai tiré vers le haut l'une des photos du personnel de la page. 25 00:01:27,570 --> 00:01:30,980 Il s'agit d'un programme appelé Photoshop. C'est 1 de 2 Bowdens, 26 00:01:30,980 --> 00:01:36,300 1 de 3 Bowdens en fait, aujourd'hui, parce que nous avons Mme Bowden ici aussi, avec Rob et Paul. 27 00:01:36,300 --> 00:01:41,950 Mais voici Rob à l'écran, et si l'on zoom sur cette lueur qu'il a toujours eu dans ses yeux, 28 00:01:41,950 --> 00:01:47,600 ce que vous voyez est ce que vous voyez est ce que vous obtenez. 29 00:01:47,600 --> 00:01:51,690 Il s'agit de «améliorée», de sorte "CSI" faire un peu mal. 30 00:01:51,690 --> 00:01:55,190 Il ya un autre clip, si l'on peut prendre à "CSI" juste un peu plus longtemps. 31 00:01:55,190 --> 00:01:58,500 Celui-ci est une expression qui se prononce désormais si vous voulez 32 00:01:58,500 --> 00:02:10,280 une bonne formation technique avec vos amis quand, vraiment, vous dites absolument rien. 33 00:02:10,280 --> 00:02:12,970 >> [Homme] Pendant des semaines, j'ai étudié les meurtres de tueur Cabby 34 00:02:12,970 --> 00:02:15,360 avec une certaine fascination morbide. 35 00:02:15,360 --> 00:02:17,160 [Woman # 1] Il s'agit en temps réel. 36 00:02:17,160 --> 00:02:22,930 [Femme # 2] Je vais créer une interface graphique à l'aide de Visual Basic, voir si je peux suivre une adresse IP. 37 00:02:22,930 --> 00:02:29,570 >> [Malan] Donc audio out of sync mis à part, la création d'une interface graphique à l'aide de Visual Basic 38 00:02:29,570 --> 00:02:31,820 de suivre une adresse IP est un non-sens complet. 39 00:02:31,820 --> 00:02:33,840 Ces jours-ci vous n'utilisez pas Visual Basic, 40 00:02:33,840 --> 00:02:38,920 il n'y a pas besoin d'une interface graphique, et l'adresse IP est un terme technique précis. 41 00:02:38,920 --> 00:02:41,730 Alors gardez un œil sur ceux-ci, et un de mes favoris: 42 00:02:41,730 --> 00:02:45,070 Celui-ci est un peu plus obscure, car vous avez besoin de savoir une langue différente. 43 00:02:45,070 --> 00:02:47,860 Il s'agit d'un langage appelé Objective-C, ce qui est un sur-ensemble de C. 44 00:02:47,860 --> 00:02:51,960 Ce qui signifie qu'il est C ainsi que quelques fonctionnalités supplémentaires, dont la programmation orientée objet. 45 00:02:51,960 --> 00:02:55,070 Et c'est la langue que Apple a popularisé la programmation iOS. 46 00:02:55,070 --> 00:02:58,760 Et donc voici un extrait d'un spectacle tout à fait différent, de «Numbers», 47 00:02:58,760 --> 00:03:02,450 que si vous regardez de près sur votre TiVo et faire une pause au bon moment, 48 00:03:02,450 --> 00:03:07,700 vous verrez que ce qu'ils cherchent n'est pas tout à ce qui est décrit. 49 00:03:07,700 --> 00:03:11,170 Et laissez-moi essayer un autre connecteur audio ici et voir si nous ne pouvons pas 50 00:03:11,170 --> 00:03:13,780 conserver les données audio en synchronisation cette fois. 51 00:03:13,780 --> 00:03:20,530 Je vous donne "chiffres". 52 00:03:20,530 --> 00:03:23,240 >> [Man # 1] Il s'agit d'une adresse IPv4 32 bits. 53 00:03:23,240 --> 00:03:38,930 [Man # 2] IP, c'est l'Internet. Réseau privé >>. C'est un réseau privé d'Anita. 54 00:03:38,930 --> 00:03:43,810 [Malan] D'accord. Il s'agit d'Objective-C, et c'est pour une coloration programme pour enfants, 55 00:03:43,810 --> 00:03:51,140 comme vous pouvez peut-être déduire le nom de la variable y. 56 00:03:51,140 --> 00:03:54,410 Alors que, alors, était «chiffres». Donc, aujourd'hui et cette semaine, nous introduisons 57 00:03:54,410 --> 00:03:57,740 un peu du monde de la médecine légale et le contexte dans les problèmes par conséquent. 58 00:03:57,740 --> 00:04:00,590 Aujourd'hui sera une conférence abrégée parce qu'il ya un événement spécial ici 59 00:04:00,590 --> 00:04:05,530 par la suite, nous allons jeter un coup d'oeil, et taquiner les élèves et les parents d'aujourd'hui 60 00:04:05,530 --> 00:04:07,420 avec quelques-unes des choses qui sont sur la ligne d'horizon. 61 00:04:07,420 --> 00:04:12,240 Parmi ceux-ci, à partir de lundi, vous aurez quelques camarades plus. 62 00:04:12,240 --> 00:04:16,050 EdX, Harvard et MIT nouvelle initiative en ligne des didacticiels libres 63 00:04:16,050 --> 00:04:19,120 en plus, lance sur le campus de Harvard, lundi. 64 00:04:19,120 --> 00:04:21,490 Ce qui veut dire lundi prochain, vous aurez - au dernier décompte, 65 00:04:21,490 --> 00:04:26,210 86.000 camarades de classe supplémentaires seront à la suite avec des conférences CS50 l' 66 00:04:26,210 --> 00:04:29,170 et les articles et soluces et ensembles de problèmes. 67 00:04:29,170 --> 00:04:32,350 Et dans le cadre de la présente, vous deviendrez membres de la première promotion de 68 00:04:32,350 --> 00:04:35,090 CS50 et maintenant CS50x. 69 00:04:35,090 --> 00:04:39,310 >> Dans le cadre de ce fait, maintenant, se rendre compte que il y aura quelques bons côtés aussi. 70 00:04:39,310 --> 00:04:43,790 Pour se préparer à cela, car le grand nombre d'étudiants, 71 00:04:43,790 --> 00:04:47,180 il suffit de dire que même si nous avons 108 FO et AR, 72 00:04:47,180 --> 00:04:50,790 pas tout à fait le meilleur ratio élèves / maître une fois nous avons atteint 80.000 étudiants d'autres. 73 00:04:50,790 --> 00:04:52,850 Donc, nous n'allons pas être nivellement problème tellement définit manuellement. 74 00:04:52,850 --> 00:04:55,920 Donc, présenté cette semaine dans le problème posé sera CS50 Check, 75 00:04:55,920 --> 00:04:58,450 qui va être un utilitaire de ligne de commande à l'intérieur de l'appareil 76 00:04:58,450 --> 00:05:01,200 que vous obtiendrez une fois que vous le mettre à jour plus tard ce week-end, 77 00:05:01,200 --> 00:05:03,200 et vous serez en mesure d'exécuter une commande, vérifiez 50, 78 00:05:03,200 --> 00:05:06,500 sur votre propre pset, et vous obtiendrez une rétroaction quant à savoir si votre programme est 79 00:05:06,500 --> 00:05:11,160 correct ou incorrect selon les spécifications de conception différentes que nous avons fournis. 80 00:05:11,160 --> 00:05:13,580 Donc plus à ce sujet et la spécification problème posé et 81 00:05:13,580 --> 00:05:17,240 les camarades de classe CS50x allons utiliser ceci aussi bien. 82 00:05:17,240 --> 00:05:19,230 >> Donc 4 problème posé est tout au sujet de la médecine légale. 83 00:05:19,230 --> 00:05:21,940 Et ce morceau a été inspiré par des choses de la vie réelle, 84 00:05:21,940 --> 00:05:24,620 de sorte que lorsque j'étais à l'université, j'ai fait un stage pendant un certain temps avec 85 00:05:24,620 --> 00:05:28,650 Bureau du comté de Middlesex District Attorney fait un travail médico-légal 86 00:05:28,650 --> 00:05:31,650 avec leur enquêteur judiciaire plomb, et ce que cela équivalait à 87 00:05:31,650 --> 00:05:35,260 est, je pense que je l'ai mentionné passé quelques semaine, est la police de l'État de masse ou d'autres 88 00:05:35,260 --> 00:05:39,000 viendrait, ils abandonnaient le projet des choses comme les disques durs et les CD et les disquettes 89 00:05:39,000 --> 00:05:42,340 et autres, et alors l'objectif du bureau de médecine légale était de déterminer si 90 00:05:42,340 --> 00:05:44,600 il était ou n'était pas une preuve d'une certaine sorte. 91 00:05:44,600 --> 00:05:48,010 Ce fut l'Unité des enquêtes spéciales, de sorte qu'il était criminalité en col blanc, 92 00:05:48,010 --> 00:05:52,350 il était en quelque sorte plus troublant de crimes, 93 00:05:52,350 --> 00:05:55,990 tout ce qui concerne certains types de médias numériques; s'avère que pas beaucoup de gens 94 00:05:55,990 --> 00:05:59,370 écrire un e-mail disant: «Je l'ai fait." 95 00:05:59,370 --> 00:06:03,290 Ainsi, bien souvent, ces recherches médico-légales ne se sont pas tout ce que beaucoup de fruit, 96 00:06:03,290 --> 00:06:05,850 mais parfois les gens écriraient ces courriels. 97 00:06:05,850 --> 00:06:08,490 Alors parfois, les efforts ont été récompensés. 98 00:06:08,490 --> 00:06:14,420 >> Mais pour mener à ce pset médico-légale, nous allons introduire dans pset 4 a peu de graphiques. 99 00:06:14,420 --> 00:06:18,260 Alors vous avez probablement prendre ces choses pour acquis, JPEG, GIF et similaires, de nos jours, 100 00:06:18,260 --> 00:06:21,640 mais si vous pensez vraiment cela, une image, un peu comme le visage de Rob, 101 00:06:21,640 --> 00:06:24,430 peut être modélisée comme une séquence de points ou pixels. 102 00:06:24,430 --> 00:06:26,680 Maintenant, dans le cas du visage de Rob, il ya toutes sortes de couleurs, 103 00:06:26,680 --> 00:06:29,940 et nous avons commencé à voir les points individuels, otherwide appelés pixels, 104 00:06:29,940 --> 00:06:31,610 lorsque nous avons commencé à effectuer un zoom avant 105 00:06:31,610 --> 00:06:35,590 Mais si nous simplifions le monde un peu, et je dis juste que ce n'est ici Rob 106 00:06:35,590 --> 00:06:40,560 en noir et blanc, eh bien, pour représenter le noir et blanc, nous pouvons simplement utiliser binaire. 107 00:06:40,560 --> 00:06:44,960 Et si nous allons utiliser binaire, 1 ou 0, on peut exprimer cette même image 108 00:06:44,960 --> 00:06:51,970 du visage souriant de Rob avec ce modèle de bits: 11000011 représente 109 00:06:51,970 --> 00:06:55,160 blanc, blanc, noir, noir, noir, noir, blanc, blanc. 110 00:06:55,160 --> 00:06:59,290 Et donc ce n'est pas un saut énorme, alors, commencer à parler de photographies en couleurs. 111 00:06:59,290 --> 00:07:01,920 Les choses que vous voyez sur Facebook ou prendre avec un appareil photo numérique, 112 00:07:01,920 --> 00:07:04,730 mais, certainement, quand il s'agit de couleurs, vous avez besoin plus de bits. 113 00:07:04,730 --> 00:07:08,470 Et très répandue dans le monde de la photographie est de ne pas utiliser 1-bit couleur, 114 00:07:08,470 --> 00:07:12,730 que cela suggère, mais couleur 24-bit, où vous obtenez en fait des millions de couleurs. 115 00:07:12,730 --> 00:07:15,430 Alors que dans le cas où nous avons zoomé sur les yeux de Rob, 116 00:07:15,430 --> 00:07:19,270 qui a été un certain nombre de millions de possibilités différentes couleurs. 117 00:07:19,270 --> 00:07:22,260 >> Donc, nous allons présenter cette série en 4 problème ainsi que dans la procédure pas à pas, 118 00:07:22,260 --> 00:07:27,050 qui aura lieu aujourd'hui à 3:30 au lieu de 2:30 l'habitude en raison de conférence de vendredi ici. 119 00:07:27,050 --> 00:07:29,930 Mais la vidéo sera en ligne, comme d'habitude, demain. 120 00:07:29,930 --> 00:07:31,880 Nous allons également vous présenter un autre format de fichier. 121 00:07:31,880 --> 00:07:34,150 Donc, ce sont délibérément destinés à paraître intimidant au premier abord, 122 00:07:34,150 --> 00:07:38,980 mais ce n'est que de la documentation pour une struct C. 123 00:07:38,980 --> 00:07:42,280 Il s'avère que Microsoft il ya des années, a contribué à populariser ce format, 124 00:07:42,280 --> 00:07:46,630 appelé le format de fichier bitmap, BMP, et ce fut un super-simple, 125 00:07:46,630 --> 00:07:50,390 coloré format de fichier graphique qui a été utilisé pendant un certain temps 126 00:07:50,390 --> 00:07:53,640 et parfois encore des fonds d'écran sur les ordinateurs de bureau. 127 00:07:53,640 --> 00:07:57,410 Si vous pensez revenir à Windows XP et les collines et le ciel bleu, 128 00:07:57,410 --> 00:08:00,660 qui était généralement un fichier BMP, ou une image bitmap et les bitmaps 129 00:08:00,660 --> 00:08:03,340 sont un plaisir pour nous parce qu'ils ont un peu plus de complexité. 130 00:08:03,340 --> 00:08:05,640 Ce n'est pas tout à fait aussi simple que cette grille de 0 et de 1; 131 00:08:05,640 --> 00:08:10,680 au contraire, vous avez des choses comme un en-tête au début d'un fichier. 132 00:08:10,680 --> 00:08:15,520 Donc, en d'autres termes, à l'intérieur d'un fichier. Bmp tout un tas de 0 et de 1, 133 00:08:15,520 --> 00:08:18,070 mais il ya une certaine supplémentaire 0 et de 1 là-dedans. 134 00:08:18,070 --> 00:08:21,450 Et il s'avère que ce que nous avons probablement pris pour acquis depuis des années, 135 00:08:21,450 --> 00:08:27,040 formats de fichiers tels que. doc ou. xls ou. mp3 ou. mp4, 136 00:08:27,040 --> 00:08:29,910 quels que soient les formats de fichiers que vous êtes familier avec. 137 00:08:29,910 --> 00:08:31,900 Eh bien, qu'est-ce que c'est bien l'intention d'être un format de fichier? 138 00:08:31,900 --> 00:08:35,740 Parce qu'à la fin de la journée, tous ces fichiers que nous utilisons ont juste des 0 et des 1 139 00:08:35,740 --> 00:08:39,950 et peut-être ceux des 0 et des 1 représente a, b, c, à travers ASCII ou analogue, 140 00:08:39,950 --> 00:08:42,030 mais vers la fin de la journée, c'est juste des 0 et des 1. 141 00:08:42,030 --> 00:08:45,300 >> Alors seulement occasionnellement les humains décident d'inventer un nouveau format de fichier 142 00:08:45,300 --> 00:08:49,420 où ils normaliser ce schémas de bits réellement dire. 143 00:08:49,420 --> 00:08:52,790 Et dans ce cas là, les gens qui ont conçu le format de fichier bitmap 144 00:08:52,790 --> 00:08:58,260 dit que l'octet première fois dans un fichier bitmap, comme indiqué par l'offset 0, là-bas, 145 00:08:58,260 --> 00:09:02,320 il va y avoir une certaine nommés de façon énigmatique bfType variable appelée, 146 00:09:02,320 --> 00:09:06,510 ce qui est juste pour le type de fichier bitmap, ce type de fichier bitmap c'est. 147 00:09:06,510 --> 00:09:10,780 Vous pouvez déduire, peut-être, à partir de la deuxième rangée qui compensent 2, numéro 2 octets, 148 00:09:10,780 --> 00:09:15,980 présente un motif de 0 et de 1 qui représente quoi? 149 00:09:15,980 --> 00:09:18,320 La taille de quelque chose, et il va à partir de là. 150 00:09:18,320 --> 00:09:20,660 Donc, en 4 set problème, vous serez parcouru certaines de ces choses. 151 00:09:20,660 --> 00:09:24,480 >> Nous ne finiront pas se soucier de chacun d'eux, mais remarquez qu'il commence à devenir intéressant 152 00:09:24,480 --> 00:09:30,780 autour de la ligne ou de l'octet 54, rgbtBlue, vert et rouge. 153 00:09:30,780 --> 00:09:35,280 Si vous avez déjà entendu l'acronyme RVB, rouge vert bleu, il s'agit d'une référence à cela. 154 00:09:35,280 --> 00:09:37,840 Parce qu'il s'avère que vous pouvez peindre toutes les couleurs de l'arc en ciel 155 00:09:37,840 --> 00:09:41,580 avec une combinaison de rouge et de bleu et de vert. 156 00:09:41,580 --> 00:09:46,560 Et, en effet, les parents dans la chambre souvenez peut-être parmi les premiers projecteurs. 157 00:09:46,560 --> 00:09:49,360 Ces jours-ci, vous venez de voir 1 lumière sortant d'une lentille. 158 00:09:49,360 --> 00:09:52,870 Mais de retour dans la journée, vous avez eu la lentille rouge, le verre bleu, et la lentille verte 159 00:09:52,870 --> 00:09:56,620 et ensemble, ils visent à l'écran et formé une image colorée. 160 00:09:56,620 --> 00:09:59,590 Et bien souvent, les collèges et les lycées aurait ces lentilles 161 00:09:59,590 --> 00:10:02,680 toujours aussi peu de guingois, si vous étiez en quelque sorte à voir des images doubles ou triples, 162 00:10:02,680 --> 00:10:07,500 mais c'était l'idée. Vous avez eu une lumière rouge et verte et bleue de peindre un tableau. 163 00:10:07,500 --> 00:10:09,570 Et ce même principe est utilisé dans les ordinateurs. 164 00:10:09,570 --> 00:10:12,000 >> Ainsi, parmi les défis, alors, pour vous en problème série 4 165 00:10:12,000 --> 00:10:16,080 vont être quelques petites choses: l'une est pour redimensionner une image. 166 00:10:16,080 --> 00:10:18,050 À prendre dans un motif de 0 et de 1, 167 00:10:18,050 --> 00:10:22,840 déterminer quels morceaux de 0 et de 1 représentent ce que dans une structure de ce type, 168 00:10:22,840 --> 00:10:26,800 et ensuite trouver comment reproduire les pixels: les rouges, les bleus, les verts 169 00:10:26,800 --> 00:10:32,460 à l'intérieur de sorte que quand une image ressemble à ceci d'abord, pourrait ressembler à ceci plutôt que par la suite. 170 00:10:32,460 --> 00:10:35,590 Parmi les autres défis, aussi, va être que vous serez remis 171 00:10:35,590 --> 00:10:38,900 une image médico-légale d'un fichier réel à partir d'un appareil photo numérique 172 00:10:38,900 --> 00:10:42,410 et sur cette caméra, il était une fois, étaient tout un tas de photos. 173 00:10:42,410 --> 00:10:47,030 Le problème, c'est que nous avons accidentellement effacées ou que l'image avait endommagé en quelque sorte. 174 00:10:47,030 --> 00:10:51,040 De mauvaises choses arrivent avec des caméras numériques, et ainsi nous nous sommes rapidement copié tous les 0 et les 1 175 00:10:51,040 --> 00:10:55,410 hors de cette carte pour vous, tous sauvés en 1 gros fichier, et ensuite nous allons les remettre à vous 176 00:10:55,410 --> 00:11:00,000 dans le problème mis en 4 pour que vous pouvez écrire un programme en C qui à récupérer 177 00:11:00,000 --> 00:11:02,660 l'ensemble de ces fichiers JPEG, idéalement. 178 00:11:02,660 --> 00:11:06,280 Et il s'avère que les fichiers JPEG, même si elles sont en quelque sorte un format de fichier complexe, 179 00:11:06,280 --> 00:11:09,580 ils sont beaucoup plus complexes que ce visage souriant ici. 180 00:11:09,580 --> 00:11:14,320 Il s'avère que tous les JPEG commence par les mêmes schémas de 0 et de 1. 181 00:11:14,320 --> 00:11:18,820 Donc, en utilisant une boucle while ou une boucle for ou similaire, 182 00:11:18,820 --> 00:11:22,350 vous pouvez parcourir tous les 0 et de 1 dans cette image médico-légale 183 00:11:22,350 --> 00:11:26,670 et chaque fois que vous voyez le modèle spécial qui est défini dans la spécification du problème posé, le 184 00:11:26,670 --> 00:11:29,770 vous pouvez supposer, 'Oh, c'est ici, avec une probabilité très élevée, 185 00:11:29,770 --> 00:11:33,520 le début d'un JPEG, «et dès que vous trouvez le même modèle, 186 00:11:33,520 --> 00:11:36,050 certain nombre d'octets ou kilo-octets ou méga-octets plus tard, 187 00:11:36,050 --> 00:11:40,550 vous pouvez supposer, «Ooh! En voici un second JPEG, la photo que j'ai prise après le premier. 188 00:11:40,550 --> 00:11:44,720 Permettez-moi de cesser de lire ce fichier d'abord, commencer à écrire cette nouvelle. " 189 00:11:44,720 --> 00:11:49,980 Et la sortie de votre programme pour pset 4 va être jusqu'à 50 images JPEG. 190 00:11:49,980 --> 00:11:52,400 Et si ce n'est pas 50 fichiers JPEG, vous avez un peu d'une boucle. 191 00:11:52,400 --> 00:11:55,580 Si vous avez un nombre infini de fichiers JPEG, vous avez une boucle infinie. 192 00:11:55,580 --> 00:11:58,280 Alors que, lui aussi, être tout à fait une affaire commune. 193 00:11:58,280 --> 00:12:00,280 C'est ce qui est à l'horizon. 194 00:12:00,280 --> 00:12:03,740 >> Quiz 0, derrière nous. Réaliser, par mon e-mail, qui, invariablement, il ya des gens 195 00:12:03,740 --> 00:12:06,820 qui sont à la fois heureux, en quelque sorte neutre, et triste autour de quiz 0 fois. 196 00:12:06,820 --> 00:12:10,160 Et s'il vous plaît ne me tendre la main, les FO tête, Zamyla, votre propre TF 197 00:12:10,160 --> 00:12:14,120 ou l'une des autorités de certification que vous savez si vous souhaitez discuter de la façon dont cela s'est passé. 198 00:12:14,120 --> 00:12:16,460 >> Donc, pour impressionner les parents ici dans la salle, 199 00:12:16,460 --> 00:12:23,990 quelle est la bibliothèque CS50? Good job. 200 00:12:23,990 --> 00:12:32,280 Quelle est la bibliothèque CS50? Ouais? [Les réponses des élèves, inintelligible] 201 00:12:32,280 --> 00:12:35,730 >> Très bien. Donc, c'est un ensemble pré-écrits de code que nous, le personnel, a écrit, 202 00:12:35,730 --> 00:12:38,460 nous vous fournissons, de fournir des fonctionnalités communes. 203 00:12:38,460 --> 00:12:42,290 Des trucs comme me procurer un string; m'obtenir un int, toutes les fonctions qui sont énumérés ici. 204 00:12:42,290 --> 00:12:45,260 À partir de maintenant, nous commençons à vraiment prendre ces roues d'entraînement hors tension. 205 00:12:45,260 --> 00:12:48,230 Donc, nous allons commencer à enlever une "chaîne" de vous, 206 00:12:48,230 --> 00:12:52,790 qui, rappel, c'était juste un synonyme de ce type de données réel? char *. 207 00:12:52,790 --> 00:12:57,020 Donc, pour les parents, qui était sans doute - c'est bon, si char *, nous allons commencer à voir 208 00:12:57,020 --> 00:13:00,810 sur l'écran d'autant plus que nous retirons "chaîne" de notre vocabulaire, 209 00:13:00,810 --> 00:13:02,760 au moins quand il s'agit de réellement écrire de code. 210 00:13:02,760 --> 00:13:06,240 De même, nous allons cesser d'utiliser certaines de ces fonctions autant, 211 00:13:06,240 --> 00:13:08,390 parce que nos programmes vont devenir plus sophistiqué 212 00:13:08,390 --> 00:13:11,370 plutôt que de simplement écrire des programmes qui sont assis là avec un clignotement rapide, 213 00:13:11,370 --> 00:13:13,580 d'attente pour l'utilisateur de taper quelque chose po 214 00:13:13,580 --> 00:13:15,220 Vous aurez vos entrées d'ailleurs. 215 00:13:15,220 --> 00:13:18,720 Par exemple, vous les obtenir à partir d'une série de bits sur le disque dur local. 216 00:13:18,720 --> 00:13:23,340 Vous, au lieu de les obtenir à l'avenir à partir d'une connexion réseau, un certain site Web, quelque part. 217 00:13:23,340 --> 00:13:27,460 Donc, nous allons décoller cette couche pour la première fois, et tirer vers le haut l'appareil CS50 218 00:13:27,460 --> 00:13:32,300 et ce fichier appelé CS50.h, que vous avez été forte, y compris pendant des semaines. 219 00:13:32,300 --> 00:13:34,380 >> Mais nous allons vraiment voir ce qu'il ya dedans de cela. 220 00:13:34,380 --> 00:13:38,250 Ainsi, le début du fichier en bleu est juste un tas de commentaires, 221 00:13:38,250 --> 00:13:41,340 informations sur la garantie et la licence. C'est en quelque sorte un paradigme commun 222 00:13:41,340 --> 00:13:44,600 dans le logiciel, car un grand nombre de logiciels de nos jours est ce qu'on appelle «open source», 223 00:13:44,600 --> 00:13:46,940 ce qui signifie que quelqu'un a écrit le code 224 00:13:46,940 --> 00:13:50,060 et rendu disponible gratuitement, et pas seulement à courir et à utiliser, 225 00:13:50,060 --> 00:13:53,660 mais en fait lire et modifier et l'intégrer dans votre propre travail. 226 00:13:53,660 --> 00:13:55,790 C'est donc ce que vous avez utilisé, le logiciel open source, 227 00:13:55,790 --> 00:13:58,030 quoique sous une forme très faible. 228 00:13:58,030 --> 00:14:01,860 Si je défiler vers le bas au-delà des commentaires, cependant, nous allons commencer à voir des choses plus familières. 229 00:14:01,860 --> 00:14:08,090 Donc remarquerez en haut ici, que le fichier CS50.h comprend tout un tas de fichiers d'en-tête. 230 00:14:08,090 --> 00:14:11,160 Maintenant, la plupart d'entre eux nous n'avons pas vu avant, mais on est 231 00:14:11,160 --> 00:14:15,640 familier, laquelle de ces avons-nous vu, quoique brièvement, à ce jour? 232 00:14:15,640 --> 00:14:18,720 Ouais, bibliothèques standard. Stdlib.h a malloc, 233 00:14:18,720 --> 00:14:21,590 donc une fois que nous avons commencé à parler de l'allocation dynamique de mémoire, 234 00:14:21,590 --> 00:14:24,960 que nous y reviendrons la semaine prochaine aussi, on a commencé à inclure ce fichier. 235 00:14:24,960 --> 00:14:29,660 Il s'avère que bool, vrai et faux n'existent pas en C, en soi, 236 00:14:29,660 --> 00:14:32,460 sauf si vous incluez ce fichier ici. 237 00:14:32,460 --> 00:14:35,770 Donc, nous avons, pendant des semaines, y compris la norme bool.h été 238 00:14:35,770 --> 00:14:39,020 de sorte que vous pouvez utiliser la notion de. bool, vrai ou faux 239 00:14:39,020 --> 00:14:41,830 Sans cela, vous auriez à trier de faux et d'utiliser un int 240 00:14:41,830 --> 00:14:45,920 et juste arbitrairement supposer que 0 est faux et 1 est vrai. 241 00:14:45,920 --> 00:14:49,980 >> Maintenant, si nous défiler vers le bas encore, voici notre définition d'une chaîne. 242 00:14:49,980 --> 00:14:54,820 Il s'avère, comme nous l'avons déjà dit, que lorsque ce * n'est pas vraiment d'importance. 243 00:14:54,820 --> 00:14:56,750 Vous pouvez même avoir l'espace tout autour. 244 00:14:56,750 --> 00:15:01,550 Nous, de ce semestre, ont fait la promotion de ce que pour préciser que l'* a à voir avec le type. 245 00:15:01,550 --> 00:15:05,370 Mais se rendre compte, de même que commun, si ce n'est un peu plus courante, consiste à le mettre là 246 00:15:05,370 --> 00:15:07,480 mais fonctionnellement c'est la même chose. 247 00:15:07,480 --> 00:15:11,070 Mais maintenant, si nous lisons un niveau plus bas, nous allons jeter un coup d'oeil à dire, getInt, 248 00:15:11,070 --> 00:15:15,350 parce que nous avons utilisé, peut-être, avant toute autre chose de ce semestre. 249 00:15:15,350 --> 00:15:19,620 Et voici getInt. C'est quoi? 250 00:15:19,620 --> 00:15:24,650 Il s'agit du prototype. Trop souvent, nous avons mis prototypes au sommet de notre. Fichiers c, 251 00:15:24,650 --> 00:15:28,190 mais vous pouvez aussi mettre des prototypes dans les fichiers d'en-tête, les fichiers. h, 252 00:15:28,190 --> 00:15:32,110 comme celui-là, de sorte que lorsque vous écrivez des fonctions 253 00:15:32,110 --> 00:15:36,790 que vous voulez que les autres soient en mesure d'utiliser, ce qui est exactement le cas avec la bibliothèque CS50, 254 00:15:36,790 --> 00:15:40,900 non seulement vous mettre en œuvre vos fonctions dans quelque chose comme CS50.c, 255 00:15:40,900 --> 00:15:46,720 vous pouvez également mettre les prototypes pas au sommet de ce fichier, mais au sommet d'un fichier d'en-tête, 256 00:15:46,720 --> 00:15:50,810 ensuite ce fichier d'en-tête est ce que les amis et collègues comprennent, 257 00:15:50,810 --> 00:15:52,800 avec forte inclure dans leur propre code. 258 00:15:52,800 --> 00:15:55,440 Donc tout ce temps que vous avez été, y compris l'ensemble de ces prototypes 259 00:15:55,440 --> 00:15:59,870 efficacement en haut de votre fichier, mais par le biais de cette forte inclure un mécanisme 260 00:15:59,870 --> 00:16:03,320 que, essentiellement, des copies et des pâtes de ce fichier dans votre propre. 261 00:16:03,320 --> 00:16:06,400 Maintenant, voici une documentation assez détaillée. 262 00:16:06,400 --> 00:16:08,880 >> Nous avons à peu près acquis que getInt obtient un int, 263 00:16:08,880 --> 00:16:10,740 mais il s'avère qu'il ya quelques cas de coin, pas vrai? 264 00:16:10,740 --> 00:16:14,320 Que faire si l'utilisateur tape un nombre qui est beaucoup trop grand? 265 00:16:14,320 --> 00:16:17,350 Un trillion, qui ne peut pas s'adapter à l'intérieur d'un int? 266 00:16:17,350 --> 00:16:21,180 Quel est le comportement attendu? Eh bien, dans l'idéal, il est prévisible. 267 00:16:21,180 --> 00:16:23,460 Donc dans ce cas, si vous avez réellement lu les petits caractères, 268 00:16:23,460 --> 00:16:27,850 vous verrez que si la ligne ne peut pas être lu, ce INT_MAX rendements. 269 00:16:27,850 --> 00:16:30,800 Nous n'avons jamais parlé de cela, mais en fonction de sa capitalisation, 270 00:16:30,800 --> 00:16:33,030 qu'est ce que c'est, sans doute? 271 00:16:33,030 --> 00:16:36,610 C'est une constante, donc c'est une constante spéciale qui est probablement déclarée 272 00:16:36,610 --> 00:16:39,460 dans un de ces fichiers d'en-tête qui est plus haut dans le fichier, 273 00:16:39,460 --> 00:16:43,400 et INT_MAX est probablement quelque chose comme, en gros, 2 milliards. 274 00:16:43,400 --> 00:16:48,160 L'idée étant que, parce que nous avons besoin d'une certaine manière signifier que quelque chose s'est mal passé, 275 00:16:48,160 --> 00:16:51,090 nous, oui, avez 4 milliards de numéros à notre disposition, 276 00:16:51,090 --> 00:16:53,980 négative 2 milliards de dollars à 2 milliards de dollars, donner ou prendre. 277 00:16:53,980 --> 00:16:58,030 Eh bien, ce qui est commun dans la programmation est que vous volez juste un de ces numéros. 278 00:16:58,030 --> 00:17:02,250 Peut-être que 0, peut-être 2 milliards de dollars, peut-être négatif 2 milliards d'euros. 279 00:17:02,250 --> 00:17:06,720 Alors que vous passez un de vos valeurs possibles de sorte que vous pouvez vous engager dans le monde 280 00:17:06,720 --> 00:17:10,089 que si quelque chose va mal, je vais retourner cette valeur super-grand. 281 00:17:10,089 --> 00:17:13,329 Mais vous ne voulez pas que l'utilisateur tape quelque chose comme cryptique "2, 3, 4 ..." 282 00:17:13,329 --> 00:17:17,079 de très gros chiffre, où vous généraliser plutôt comme une constante. 283 00:17:17,079 --> 00:17:19,380 Alors, vraiment, si tu étais anal cours des dernières semaines, 284 00:17:19,380 --> 00:17:23,800 chaque fois que vous appelez getInt, vous auriez dû vérifier si une condition. 285 00:17:23,800 --> 00:17:27,109 Fait le type d'utilisateur dans INT_MAX, ou plus précisément, 286 00:17:27,109 --> 00:17:29,900 fait INT_MAX retour getInt? Parce que si c'était le cas, 287 00:17:29,900 --> 00:17:35,140 qui signifie en fait qu'ils n'ont pas le taper, quelque chose n'allait pas dans ce cas. 288 00:17:35,140 --> 00:17:38,970 Donc, c'est ce qui est généralement connu comme une «sentinelle» de valeur, ce qui signifie tout simplement extraordinaire. 289 00:17:38,970 --> 00:17:41,020 >> Eh bien, nous allons maintenant tourner dans les fichiers. C. 290 00:17:41,020 --> 00:17:44,500 Le fichier C a existé dans l'appareil pendant un certain temps, 291 00:17:44,500 --> 00:17:47,540 et, en fait, l'appareil est qu'il précompilé pour vous 292 00:17:47,540 --> 00:17:49,720 dans cette chose que nous avons appelé «code objet», 293 00:17:49,720 --> 00:17:52,940 mais il n'a pas d'importance pour vous où il est parce que le système le sait, 294 00:17:52,940 --> 00:17:54,780 dans ce cas, où il est, l 'appareil. 295 00:17:54,780 --> 00:18:00,620 Mais nous allons défiler vers le bas maintenant getInt, et de voir comment getInt a travaillé tout ce temps. 296 00:18:00,620 --> 00:18:02,380 Nous avons donc ici des commentaires similaires d'avant. 297 00:18:02,380 --> 00:18:04,930 Permettez-moi de faire un zoom sur la seule portion de code, 298 00:18:04,930 --> 00:18:07,410 et ce que nous avons pour getInt est la suivante. 299 00:18:07,410 --> 00:18:12,770 Il ne prend pas d'entrée et retourne un int, while (true), nous avons donc une boucle infinie délibérée 300 00:18:12,770 --> 00:18:16,560 mais, sans doute, nous allons sortir de ce en quelque sorte, ou de retourner au sein de cette. 301 00:18:16,560 --> 00:18:19,890 Donc, nous allons voir comment cela fonctionne. Eh bien, nous semblent utiliser GetString 302 00:18:19,890 --> 00:18:22,550 dans cette première ligne à l'intérieur de la boucle, 166. 303 00:18:22,550 --> 00:18:25,320 C'est maintenant une pratique bien parce que les circonstances dans lesquelles 304 00:18:25,320 --> 00:18:30,820 GetString pourrait retourner ce mot-clé spécial, NULL? 305 00:18:30,820 --> 00:18:38,460 Si quelque chose va mal. Qu'est-ce qui pourrait mal tourner lorsque vous appelez quelque chose comme GetString? 306 00:18:38,460 --> 00:18:42,550 Ouais? [Réponse de l'étudiant, inintelligible] >> Oui. Alors peut-être malloc échoue. 307 00:18:42,550 --> 00:18:45,310 Quelque part sous le capot GetString appelle malloc, 308 00:18:45,310 --> 00:18:48,210 qui alloue de la mémoire, ce qui permet au magasin d'informatique 309 00:18:48,210 --> 00:18:50,950 tous les caractères que l'utilisateur tape sur le clavier. 310 00:18:50,950 --> 00:18:53,270 Et si l'utilisateur avait beaucoup de temps libre 311 00:18:53,270 --> 00:18:56,470 et tapé plus, par exemple, de 2 milliards de caractères. 312 00:18:56,470 --> 00:18:59,600 Plus de caractères que l'ordinateur a même RAM. 313 00:18:59,600 --> 00:19:02,350 Eh bien, GetString doit être en mesure d'indiquer que pour vous, 314 00:19:02,350 --> 00:19:05,650 même si c'est un super, super-coin le cas rare. 315 00:19:05,650 --> 00:19:08,490 Il doit en quelque sorte être capable de gérer cela, et ainsi de GetString, 316 00:19:08,490 --> 00:19:11,850 si nous revenir en arrière et lire sa documentation, ne, en effet, renvoie NULL. 317 00:19:11,850 --> 00:19:16,150 Maintenant, si GetString échoue en renvoyant NULL, getInt est voué à l'échec 318 00:19:16,150 --> 00:19:19,370 en retournant INT_MAX, comme une sentinelle. 319 00:19:19,370 --> 00:19:22,650 Ce ne sont que des conventions humaines. La seule façon vous savez que c'est le cas 320 00:19:22,650 --> 00:19:24,840 il suffit de lire la documentation. 321 00:19:24,840 --> 00:19:28,200 Donc, nous allons défiler vers le bas à l'endroit où l'int est en fait GotInt. 322 00:19:28,200 --> 00:19:34,220 >> Donc, si je défiler vers le bas un peu plus loin, dans la ligne 170, nous avons un commentaire ci-dessus de ces lignes. 323 00:19:34,220 --> 00:19:38,470 Donc, nous déclarons, en 172, un int n et c char, et puis cette nouvelle fonction 324 00:19:38,470 --> 00:19:41,870 que certains d'entre vous ont trébuché à travers avant, mais sscanf. 325 00:19:41,870 --> 00:19:44,190 Elle représente une chaîne d'analyse f. 326 00:19:44,190 --> 00:19:48,580 En d'autres termes, donnez-moi une corde et je vais le rechercher des éléments d'information d'intérêt. 327 00:19:48,580 --> 00:19:53,820 Alors qu'est-ce que ça veut dire? Eh bien, supposons que je tape, littéralement, 1 2 3 sur le clavier, 328 00:19:53,820 --> 00:19:59,730 puis appuyez sur Entrée. Quel est le type de données de 1 2 3 lorsqu'ils sont retournés par GetString? 329 00:19:59,730 --> 00:20:05,010 C'est évidemment une chaîne, pas vrai? J'ai une chaîne, donc 1 2 3 est vraiment «1 2 3» 330 00:20:05,010 --> 00:20:07,260 avec le 0 \ à la fin de celui-ci. Ce n'est pas un int. 331 00:20:07,260 --> 00:20:10,420 Ce n'est pas un nombre. Il ressemble à un numéro, mais il ne s'agit pas en réalité. 332 00:20:10,420 --> 00:20:14,680 Alors qu'est-ce getInt avez à faire? Il doit analyser cette chaîne de gauche à droite, 333 00:20:14,680 --> 00:20:19,010 1 2 3 \ 0, et en quelque sorte de le convertir en un entier réel. 334 00:20:19,010 --> 00:20:21,010 Maintenant, vous pourriez trouver une façon de le faire. 335 00:20:21,010 --> 00:20:24,240 Si vous repensez à pset 2, vous sans doute été un peu à l'aise 336 00:20:24,240 --> 00:20:26,810 avec César ou vigenere de sorte que vous pouvez parcourir une chaîne, 337 00:20:26,810 --> 00:20:29,800 vous pouvez convertir les caractères à ints avec médiator. C'est beaucoup de travail. 338 00:20:29,800 --> 00:20:32,800 Pourquoi ne pas appeler une fonction comme sscanf qui fait cela pour vous? 339 00:20:32,800 --> 00:20:37,520 Donc sscanf attend un argument, dans ce cas appelé la ligne, qui est une chaîne. 340 00:20:37,520 --> 00:20:41,310 Vous pouvez ensuite spécifier, entre guillemets, très similaire à printf, 341 00:20:41,310 --> 00:20:44,960 qu'est-ce que vous vous attendez à voir dans cette chaîne? 342 00:20:44,960 --> 00:20:52,980 Ce que je dis ici est, je m'attends à voir un nombre décimal et peut-être un caractère. 343 00:20:52,980 --> 00:20:54,990 Et nous allons voir pourquoi c'est le cas dans un instant. 344 00:20:54,990 --> 00:20:58,440 Il s'avère que cette notation est désormais penser à des choses 345 00:20:58,440 --> 00:21:00,840 nous avons commencé à parler un peu plus d'une semaine. 346 00:21:00,840 --> 00:21:05,430 >> Quel est & n et & c fait pour nous ici? [Les réponses des élèves, inintelligible] 347 00:21:05,430 --> 00:21:07,610 Ouais >>. Il me donne l'adresse de n et l'adresse de c. 348 00:21:07,610 --> 00:21:10,440 Maintenant, pourquoi est-ce important? Eh bien, vous savez que les fonctions en C 349 00:21:10,440 --> 00:21:13,440 vous pouvez toujours retourner une valeur ou pas de valeur du tout. 350 00:21:13,440 --> 00:21:16,630 Vous pouvez retourner un int, une chaîne, un flotteur, un char, peu importe. 351 00:21:16,630 --> 00:21:21,150 Ou vous pouvez retourner vide, mais vous ne pouvez retourner 1 chose maximum. 352 00:21:21,150 --> 00:21:26,100 Mais ici, nous voulons sscanf pour moi de revenir peut-être un int, un nombre décimal, 353 00:21:26,100 --> 00:21:29,240 et aussi un. char, et je vais vous expliquer pourquoi le char dans un moment 354 00:21:29,240 --> 00:21:34,250 Donc, vous voulez effectivement f pour revenir 2 choses, c'est juste pas possible en C. 355 00:21:34,250 --> 00:21:38,460 Ainsi, vous pouvez contourner ce passage dans 2 adresses, 356 00:21:38,460 --> 00:21:43,710 parce que dès que vous remettez une fonction 2 adresses, ce qui peut cette fonction en faire? 357 00:21:43,710 --> 00:21:49,880 Il peut écrire à ces adresses. Vous pouvez utiliser l'opération * et «y aller» à chacune de ces adresses. 358 00:21:49,880 --> 00:21:54,320 C'est en quelque sorte ce mécanisme porte dérobée, mais très commun pour changer les valeurs des variables 359 00:21:54,320 --> 00:21:58,020 dans plus d'1 place, dans ce cas 2. 360 00:21:58,020 --> 00:22:04,590 Maintenant, remarquez je vérifie pour == à1, puis de revenir si ça n, en fait, la valeur true. 361 00:22:04,590 --> 00:22:09,340 Alors qu'est-ce qui se passe? Eh bien, techniquement, tout ce que nous voulons vraiment arriver dans getInt est la suivante. 362 00:22:09,340 --> 00:22:12,340 Nous voulons analyser, pour ainsi dire, nous voulons lire la chaîne 363 00:22:12,340 --> 00:22:16,210 «1 2 3» et s'il semble qu'il y ait un numéro, 364 00:22:16,210 --> 00:22:21,360 ce que nous disons sscanf à faire est de mettre ce nombre, 1 2 3, de cette variable n pour moi. 365 00:22:21,360 --> 00:22:26,060 Pourquoi, alors, ai-je eu ce ainsi? 366 00:22:26,060 --> 00:22:33,750 Quel est le rôle de dire aussi, sscanf, vous pouvez également obtenir un personnage ici. 367 00:22:33,750 --> 00:22:36,890 [Parlant des étudiants, inintelligible] >> Non - un point décimal pourrait fonctionner. 368 00:22:36,890 --> 00:22:40,650 Tenons qui réfléchit un instant. Quoi d'autre? 369 00:22:40,650 --> 00:22:42,570 [Étudiant, inintelligible] >> Alors, bonne pensée, il pourrait être le caractère NULL. 370 00:22:42,570 --> 00:22:44,970 Il s'agit en fait pas, dans ce cas. Ouais? [Étudiant, inintelligible] 371 00:22:44,970 --> 00:22:47,100 >> >> ASCII. Ou bien, permettez-moi de généraliser encore plus loin. 372 00:22:47,100 --> 00:22:49,670 Le c%, il est juste pour vérification des erreurs. 373 00:22:49,670 --> 00:22:52,510 Nous ne voulons pas qu'il y ait de caractère après le nombre, 374 00:22:52,510 --> 00:22:54,980 mais ce que cela me permet de faire est la suivante: 375 00:22:54,980 --> 00:23:01,270 Il s'avère que sscanf, en plus de stocker des valeurs dans N et C, dans cet exemple ici, 376 00:23:01,270 --> 00:23:08,170 ce qu'il ne retourne aussi est-il le nombre de variables mettre les valeurs po 377 00:23:08,170 --> 00:23:13,330 Donc, si vous tapez uniquement 1 2 3, seul le% d va correspondre 378 00:23:13,330 --> 00:23:18,830 et que n est stockée avec une valeur comme 1 2 3 et rien ne se mettre en c; 379 00:23:18,830 --> 00:23:20,870 c reste une valeur ordures, pour ainsi dire. 380 00:23:20,870 --> 00:23:23,550 Garbage parce qu'il n'a jamais été initialisé comme une certaine valeur. 381 00:23:23,550 --> 00:23:29,390 Donc, dans ce cas, sscanf renvoie 1, parce que je peuplé l'un de ces pointeurs, 382 00:23:29,390 --> 00:23:33,650 dans ce cas, tant mieux. J'ai un int, donc je libérer la ligne pour libérer de la mémoire 383 00:23:33,650 --> 00:23:37,150 que GetString effectivement alloués, et puis je retourne n. 384 00:23:37,150 --> 00:23:42,210 Sinon, si vous jamais demandé où que retry déclaration vient, vient d'ici. 385 00:23:42,210 --> 00:23:45,770 Si, en revanche, je tape sur 1 2 3 foo, 386 00:23:45,770 --> 00:23:48,640 quelques-unes séquence aléatoire de texte, sscanf va le voir, 387 00:23:48,640 --> 00:23:51,500 ooh, le nombre, ooh, le nombre, ooh, le nombre, ooh - f. 388 00:23:51,500 --> 00:23:54,190 Et il va mettre le 1 2 3 n. 389 00:23:54,190 --> 00:23:59,970 Ça va mettre le f en c, puis revenir 2. 390 00:23:59,970 --> 00:24:02,980 Nous avons donc, simplement en utilisant la définition de base du comportement de scanf, 391 00:24:02,980 --> 00:24:06,170 d'une manière très simple - et bien, complexe à première vue, mais à la fin de la journée, 392 00:24:06,170 --> 00:24:11,460 mécanisme assez simple de dire, y at-il un int, et si oui, est-ce la seule chose que j'ai trouvé? 393 00:24:11,460 --> 00:24:14,950 Et l'espace blanc ici est délibérée. Si vous lisez la documentation de sscanf, 394 00:24:14,950 --> 00:24:18,690 il vous dit que si vous incluez un morceau d'espace blanc au début ou à la fin, 395 00:24:18,690 --> 00:24:24,990 sscanf trop permettra à l'utilisateur, pour une raison quelconque, la barre d'espace pour frapper 1 2 3, et qui sera légitime. 396 00:24:24,990 --> 00:24:28,310 Il ne sera pas crier à l'utilisateur juste parce que ils ont frappé la barre d'espace au début ou à la fin, 397 00:24:28,310 --> 00:24:32,160 qui est juste un peu plus convivial. 398 00:24:32,160 --> 00:24:34,160 >> Toutes les questions, puis, sur GetInts? Ouais? 399 00:24:34,160 --> 00:24:36,820 [Question étudiants, inintelligible] 400 00:24:36,820 --> 00:24:40,740 >> Bonne question. Que faire si vous venez de taper dans un char, comme f et appuyez sur Entrée 401 00:24:40,740 --> 00:24:47,830 sans jamais taper 1 2 3; que pensez-vous du comportement de cette ligne de code serait alors? 402 00:24:47,830 --> 00:24:50,500 Donc sscanf peut couvrir que trop, car dans ce cas, 403 00:24:50,500 --> 00:24:56,280 ça ne va pas à remplir n ou c, il va plutôt retourner 0. 404 00:24:56,280 --> 00:25:01,540 Dans ce cas, je suis aussi attraper ce scénario, parce que la valeur attendue je veux, c'est 1. 405 00:25:01,540 --> 00:25:07,310 Je veux seulement 1, et seulement 1 chose à pourvoir. Bonne question. Autres? 406 00:25:07,310 --> 00:25:09,610 >> D'accord, donc il ne faut pas passer par toutes les fonctions ici, 407 00:25:09,610 --> 00:25:11,820 mais celui qui semble être, peut-être, de la participation résiduelle 408 00:25:11,820 --> 00:25:14,530 est GetString, car il s'avère que GetFloat, getInt, 409 00:25:14,530 --> 00:25:19,490 GetDouble, GetLongLong tout botté de dégagement de beaucoup de leurs fonctionnalités à GetString. 410 00:25:19,490 --> 00:25:22,860 Donc, nous allons jeter un oeil à la façon dont il est mis en œuvre ici. 411 00:25:22,860 --> 00:25:27,040 Celui-ci semble un peu complexe, mais il utilise les mêmes principes 412 00:25:27,040 --> 00:25:29,680 que nous avons commencé à parler la semaine dernière. Donc, en GetString, 413 00:25:29,680 --> 00:25:32,670 qui ne prend aucun argument que le vide par ici, 414 00:25:32,670 --> 00:25:37,110 et il retourne une chaîne, donc je déclare une chaîne appelée tampon. 415 00:25:37,110 --> 00:25:39,670 Je ne sais pas vraiment ce qui va être utilisé pour l'instant, mais nous allons voir. 416 00:25:39,670 --> 00:25:42,950 On dirait que la capacité est, par défaut, 0; pas trop où ça va finir. 417 00:25:42,950 --> 00:25:44,920 Vous ne savez pas ce que n va être utilisé pour l'instant. 418 00:25:44,920 --> 00:25:47,860 Mais maintenant, ça devient un peu plus intéressant, donc dans la ligne 243, 419 00:25:47,860 --> 00:25:51,760 nous déclarons un entier c, c'est en quelque sorte d'un détail stupide. 420 00:25:51,760 --> 00:25:58,080 Un char est de 8 bits et 8 bits peut stocker combien de valeurs différentes? 421 00:25:58,080 --> 00:26:03,310 256. Le problème, c'est que si vous voulez avoir 256 différents caractères ASCII, 422 00:26:03,310 --> 00:26:06,210 laquelle il ya, si vous repensez, et ce n'est pas quelque chose à mémoriser. 423 00:26:06,210 --> 00:26:09,100 Mais si vous repensez à ce que grand tableau ASCII nous avions semaines, 424 00:26:09,100 --> 00:26:13,780 il y avait, dans ce cas, 128 ou 256 caractères ASCII. 425 00:26:13,780 --> 00:26:16,220 Nous avons utilisé tous les modèles de 0 et de 1 vers le haut. 426 00:26:16,220 --> 00:26:19,410 C'est un problème si vous voulez être en mesure de détecter une erreur. 427 00:26:19,410 --> 00:26:23,290 Parce que si vous utilisez déjà 256 valeurs pour vos personnages, 428 00:26:23,290 --> 00:26:26,390 vous n'avez pas vraiment planifier à l'avance, parce que maintenant vous n'avez aucun moyen de dire, 429 00:26:26,390 --> 00:26:29,750 "Ce n'est pas un caractère légitime, ce qui est certain message erroné." 430 00:26:29,750 --> 00:26:32,430 Alors que le monde est fait, ils utilisent la valeur plus grand côté, 431 00:26:32,430 --> 00:26:35,790 quelque chose comme un int sorte que vous avez un certain nombre fou de bits, 432 00:26:35,790 --> 00:26:39,610 32 pour 4 milliards valeurs possibles, de sorte que vous pouvez simplement finir par utiliser, 433 00:26:39,610 --> 00:26:44,800 essentiellement, 257 d'entre eux, dont 1 a une signification particulière comme étant une erreur. 434 00:26:44,800 --> 00:26:49,190 >> Donc, nous allons voir comment cela fonctionne. Dans la ligne 246, j'ai cette grande boucle while 435 00:26:49,190 --> 00:26:54,530 qui appelle fgetc; fichier f sens, getc, puis stdin. 436 00:26:54,530 --> 00:26:59,030 Il s'avère que ce n'est que le moyen le plus précis de dire «lire des données depuis le clavier." 437 00:26:59,030 --> 00:27:02,730 Clavier standard moyen d'entrée, de sortie standard signifie écran, 438 00:27:02,730 --> 00:27:06,920 et l'erreur standard, que nous allons voir dans pset 4, signifie que l'écran, 439 00:27:06,920 --> 00:27:09,670 mais une partie spéciale de l'écran de sorte qu'il n'est pas confondu 440 00:27:09,670 --> 00:27:13,760 avec sortie réelle que vous avez l'intention d'imprimer, mais plus sur cela dans l'avenir. 441 00:27:13,760 --> 00:27:19,430 Donc, fgetc signifie simplement lire un caractère sur le clavier, et de le stocker où? 442 00:27:19,430 --> 00:27:24,000 Conservez-le dans c, et vérifiez ensuite, je suis juste en utilisant des conjonctions booléennes ici, 443 00:27:24,000 --> 00:27:28,430 vérifier qu'il n'est pas égal à \ n, de sorte que l'utilisateur a appuyez sur Entrée. 444 00:27:28,430 --> 00:27:31,510 Nous voulons mettre fin à ce moment-là, à la fin de la boucle, et nous voulons aussi vérifier 445 00:27:31,510 --> 00:27:36,170 pour la constante spéciale, EOF, si vous savez ou suppose - ce que ça représente? 446 00:27:36,170 --> 00:27:39,860 Fin du dossier. Donc, c'est un peu absurde, parce que si je tape au clavier, 447 00:27:39,860 --> 00:27:41,900 il n'y a vraiment pas de fichier impliqué dans cela, 448 00:27:41,900 --> 00:27:44,330 mais ceci est juste une sorte de terme générique utilisé pour désigner 449 00:27:44,330 --> 00:27:50,320 rien d'autre que vient doigts de l'humain. EOF. Fin du dossier. 450 00:27:50,320 --> 00:27:52,600 Soit dit en passant, si vous avez déjà touché contrôle d à votre clavier, 451 00:27:52,600 --> 00:27:54,680 pas que vous auriez encore, vous avez frappé contrôle c. 452 00:27:54,680 --> 00:27:57,920 Mais le contrôle d envoie cette spéciale EOF constante appelée. 453 00:27:57,920 --> 00:28:03,100 >> Alors maintenant, nous avons juste une allocation dynamique de mémoire. 454 00:28:03,100 --> 00:28:06,460 Donc, si n + 1> Capacité, maintenant je vais vous expliquer n. 455 00:28:06,460 --> 00:28:09,380 n est juste combien d'octets sont actuellement dans la mémoire tampon, 456 00:28:09,380 --> 00:28:11,970 la chaîne que vous êtes en train de construire à partir de l'utilisateur. 457 00:28:11,970 --> 00:28:16,240 Si vous avez plus de caractères dans votre tampon que vous avez la capacité de la mémoire tampon, 458 00:28:16,240 --> 00:28:20,760 intuitivement, ce que nous devons faire alors est d'allouer plus de capacité. 459 00:28:20,760 --> 00:28:24,490 Je vais survoler une partie du calcul ici 460 00:28:24,490 --> 00:28:26,900 et se concentrer uniquement sur cette fonction ici. 461 00:28:26,900 --> 00:28:29,170 Vous savez ce que malloc, ou du moins connaissent généralement. 462 00:28:29,170 --> 00:28:32,380 Essayez de deviner ce que realloc fait. [Réponse de l'étudiant, inintelligible] 463 00:28:32,380 --> 00:28:35,690 Ouais >>. Et ce n'est pas tout à fait l'ajout de mémoire, il réaffecte la mémoire comme suit: 464 00:28:35,690 --> 00:28:40,530 S'il ya encore de la place à la fin de la chaîne pour vous donner plus de cette mémoire 465 00:28:40,530 --> 00:28:43,370 que celui qu'il accorde à l'origine toi, alors que tu auras le mémoire supplémentaire. 466 00:28:43,370 --> 00:28:46,640 Ainsi, vous pouvez simplement mettre les caractères cordes dos à dos à dos à dos. 467 00:28:46,640 --> 00:28:49,290 Mais si ce n'est pas le cas, parce que vous avez attendu trop longtemps 468 00:28:49,290 --> 00:28:51,700 et quelque chose au hasard a fait flac dans la mémoire, mais il est extra 469 00:28:51,700 --> 00:28:56,480 mémoire ici-bas, ce n'est pas grave. Realloc va faire tout le levage lourd pour vous, 470 00:28:56,480 --> 00:28:58,810 déplacer la chaîne que vous avez lu dans ce loin d'ici, 471 00:28:58,810 --> 00:29:02,550 le mettre là-bas, et puis vous donner un peu plus de la piste à ce moment-là. 472 00:29:02,550 --> 00:29:05,610 Donc, avec un geste de la main, laissez-moi vous dire que ce qui fait GetString 473 00:29:05,610 --> 00:29:09,540 est ça commence avec un petit tampon, peut-être 1 seul caractère, 474 00:29:09,540 --> 00:29:12,300 et si l'utilisateur tape 2 caractères, GetString finit 475 00:29:12,300 --> 00:29:15,210 appeler realloc et dit: «Oh, 1 caractère n'était pas suffisant. 476 00:29:15,210 --> 00:29:18,480 Donnez-moi 2 caractères. Alors si vous lisez à travers la logique de la boucle, 477 00:29:18,480 --> 00:29:21,070 il va dire: «Oh, l'utilisateur a tapé 3 caractères. 478 00:29:21,070 --> 00:29:25,690 Donne-moi maintenant pas 2, mais 4 caractères, puis me redonnera 8, alors donnez-moi 16 et 32. 479 00:29:25,690 --> 00:29:28,180 Le fait que je suis doublement de la capacité à chaque fois 480 00:29:28,180 --> 00:29:30,320 signifie que la mémoire tampon ne va pas croître lentement. 481 00:29:30,320 --> 00:29:35,870 Il va grandir super rapide, et ce qui pourrait être l'avantage de cela? 482 00:29:35,870 --> 00:29:38,540 Pourquoi suis-je doubler la taille de la mémoire tampon, même si l'utilisateur 483 00:29:38,540 --> 00:29:41,450 pourriez juste besoin de 1 caractère supplémentaire à partir du clavier? 484 00:29:41,450 --> 00:29:44,830 [Réponse de l'étudiant, inintelligible]. >> Qu'est-ce que c'est? 485 00:29:44,830 --> 00:29:46,750 Exactement. Vous n'avez pas à le cultiver aussi souvent. 486 00:29:46,750 --> 00:29:48,870 Et c'est juste une sorte de - vous avez la couverture de vos paris ici. 487 00:29:48,870 --> 00:29:54,150 L'idée étant que vous ne voulez pas appeler realloc beaucoup, car elle tend à être lente. 488 00:29:54,150 --> 00:29:56,840 Chaque fois que vous demandez au système d'exploitation pour la mémoire, comme vous le verrez bientôt 489 00:29:56,840 --> 00:30:00,620 dans un ensemble de problèmes futurs, il a tendance à prendre un certain temps. 490 00:30:00,620 --> 00:30:04,980 Réduisant ainsi au maximum ce laps de temps, même si vous perdez un peu d'espace, tend à être une bonne chose. 491 00:30:04,980 --> 00:30:07,250 >> Mais si nous lisons la dernière partie de GetString ici, 492 00:30:07,250 --> 00:30:10,880 et encore une fois, de comprendre chaque ligne ici n'est pas si important aujourd'hui. 493 00:30:10,880 --> 00:30:14,830 Mais remarquez qu'il appelle finalement malloc nouveau, et il alloue 494 00:30:14,830 --> 00:30:16,980 exactement autant d'octets dont il a besoin pour la chaîne 495 00:30:16,980 --> 00:30:21,620 puis jette loin en appelant gratuitement, le tampon trop grande, 496 00:30:21,620 --> 00:30:23,510 si elle s'est en effet doublé de trop nombreuses fois. 497 00:30:23,510 --> 00:30:25,970 En bref, c'est comme ça que GetString a travaillé tout ce temps. 498 00:30:25,970 --> 00:30:30,100 Tout ce qu'il fait est lu un caractère à la fois, encore et encore et encore 499 00:30:30,100 --> 00:30:37,930 et chaque fois qu'il a besoin de la mémoire supplémentaire, il demande au système d'exploitation pour en appelant realloc. 500 00:30:37,930 --> 00:30:41,660 Des questions? Très bien. 501 00:30:41,660 --> 00:30:45,220 >> Une attaque. Maintenant que nous comprenons pointeurs, ou du moins 502 00:30:45,220 --> 00:30:47,560 sont de plus en plus familiers avec les pointeurs, 503 00:30:47,560 --> 00:30:50,020 nous allons examiner la façon dont le monde entier commence à s'effondrer 504 00:30:50,020 --> 00:30:53,160 si vous n'avez pas tout à fait défendre contre les utilisateurs contradictoire, 505 00:30:53,160 --> 00:30:55,180 les gens qui essaient de s'introduire dans votre système. 506 00:30:55,180 --> 00:31:00,260 Les gens qui tentent de voler votre logiciel en contournant un code d'enregistrement 507 00:31:00,260 --> 00:31:02,150 qu'elles pourraient autrement avoir à taper po 508 00:31:02,150 --> 00:31:04,860 Jetez un oeil à cet exemple ici, qui est simplement le code C 509 00:31:04,860 --> 00:31:07,920 qui a une fonction principale à la partie inférieure, qui appelle une fonction foo, 510 00:31:07,920 --> 00:31:12,100 et ce qui est de la transmettre à toto? [Étudiants] Un seul argument. 511 00:31:12,100 --> 00:31:15,660 L'argument >> unique. Donc, argv [1], ce qui signifie que le premier mot l'utilisateur a tapé 512 00:31:15,660 --> 00:31:19,150 à la ligne de commande après a.out ou quel que soit le programme est appelé. 513 00:31:19,150 --> 00:31:24,920 Ainsi, foo, en haut, en prend un char *, char *, mais c'est exactement ce? 514 00:31:24,920 --> 00:31:28,860 String. Il n'y a rien de nouveau ici, et cette chaîne est arbitrairement appelé bar. 515 00:31:28,860 --> 00:31:36,090 Dans cette ligne ici, char c [12], dans une sorte de semi-technique en anglais, ce qui est de cette ligne fait? 516 00:31:36,090 --> 00:31:40,640 Tableau de -? Caractères. Donnez-moi un tableau de 12 caractères. 517 00:31:40,640 --> 00:31:44,970 Alors nous pourrions appeler cela un tampon. Il est techniquement appelé c, mais un tampon dans la programmation 518 00:31:44,970 --> 00:31:47,890 signifie juste un tas d'espace que vous pouvez mettre quelques trucs po 519 00:31:47,890 --> 00:31:49,940 >> Puis enfin, memcpy, nous n'avons pas utilisé auparavant. 520 00:31:49,940 --> 00:31:52,380 Mais vous pouvez probablement le deviner ce qu'il fait. Il copie la mémoire. 521 00:31:52,380 --> 00:31:58,790 Que faut-il faire? Eh bien, il semble copie bar, son entrée, au c, 522 00:31:58,790 --> 00:32:03,420 mais seulement jusqu'à la longueur de la barre. 523 00:32:03,420 --> 00:32:07,440 Mais il ya un bug ici. 524 00:32:07,440 --> 00:32:14,500 Ok, donc, techniquement, nous devrions vraiment faire strlen (bar) x sizeof (char), c'est exact. 525 00:32:14,500 --> 00:32:17,920 Mais dans le pire des cas ici, supposons que C'est - oui, d'accord. 526 00:32:17,920 --> 00:32:23,760 Puis il ya 2 bugs. Donc, sizeof (char), tous les droits, nous allons faire cela un peu plus large. 527 00:32:23,760 --> 00:32:28,860 Alors maintenant, il ya encore un bug, qui est quoi? 528 00:32:28,860 --> 00:32:31,630 [Réponse de l'étudiant, inintelligible] Check >> pour quoi? Bon, on devrait vérifier 529 00:32:31,630 --> 00:32:35,010 la valeur NULL, car de mauvaises choses arrivent lorsque votre pointeur est NULL, 530 00:32:35,010 --> 00:32:38,490 Parce que vous pourriez finir par y aller, et vous ne devriez jamais aller à NULL 531 00:32:38,490 --> 00:32:40,890 en le déréférencement avec l'opérateur *. 532 00:32:40,890 --> 00:32:45,250 Donc, c'est une bonne chose, et quoi d'autre que nous faisons? Logiquement, il ya une faille ici aussi. 533 00:32:45,250 --> 00:32:47,650 [Réponse de l'étudiant, inintelligible] 534 00:32:47,650 --> 00:32:51,340 Alors >> vérifier si argc ≥ 2? 535 00:32:51,340 --> 00:32:54,130 Bon, il ya 3 bugs dans ce programme ici. 536 00:32:54,130 --> 00:33:00,080 Nous ne sommes pas vérifier si l'utilisateur a effectivement tapé dans quoi que ce soit dans argv [1], c'est bien. 537 00:33:00,080 --> 00:33:02,240 Alors, quel est le bug troisième? Ouais? 538 00:33:02,240 --> 00:33:04,420 [Réponse de l'étudiant, inintelligible] >> Bon. 539 00:33:04,420 --> 00:33:09,590 Donc, nous avons vérifié un scénario. Nous implicitement vérifiée ne pas copier plus de mémoire 540 00:33:09,590 --> 00:33:12,800 que ne dépasse pas la longueur de la barre. 541 00:33:12,800 --> 00:33:15,720 Donc, si la chaîne saisie par l'utilisateur est de 10 caractères dans le long terme, 542 00:33:15,720 --> 00:33:18,260 cela veut dire, 'Seulement copier 10 caractères. 543 00:33:18,260 --> 00:33:21,140 Et ce n'est pas grave, mais si l'utilisateur a tapé un mot à l'invite 544 00:33:21,140 --> 00:33:29,360 comme un mot de 20 caractères, ce qui est, en disant copie 20 caractères dans la barre en quoi? 545 00:33:29,360 --> 00:33:32,840 c, autrement connu comme notre buffer, ce qui signifie que vous venez d'écrire des données 546 00:33:32,840 --> 00:33:35,950 à 8 emplacements d'octets que vous ne possédez pas, 547 00:33:35,950 --> 00:33:38,320 et vous n'en possédez pas, dans le sens que vous n'avez jamais à leur allocation. 548 00:33:38,320 --> 00:33:41,190 Donc, c'est ce qui est généralement connu comme l'attaque de type buffer overflow, 549 00:33:41,190 --> 00:33:46,650 ou le dépassement de tampon attaque, et il l'attaque en ce sens que si l'utilisateur 550 00:33:46,650 --> 00:33:50,650 ou du programme qui appelle votre fonction est de faire de cette malveillance, 551 00:33:50,650 --> 00:33:53,780 ce qui se passe réellement suivante pourrait être tout à fait mauvais. 552 00:33:53,780 --> 00:33:55,690 >> Jetons un coup d'oeil à cette image ici. 553 00:33:55,690 --> 00:33:59,070 Cette image représente votre pile de la mémoire. 554 00:33:59,070 --> 00:34:01,050 Et de rappeler que chaque fois que vous appelez une fonction, 555 00:34:01,050 --> 00:34:04,520 vous obtenez ce petit cadre sur la pile, puis une autre, puis une autre, puis une autre. 556 00:34:04,520 --> 00:34:07,250 Et jusqu'à présent, nous avons juste une sorte de résumé ces loin des rectangles 557 00:34:07,250 --> 00:34:09,380 soit il ya sur la carte ou sur l'écran ici. 558 00:34:09,380 --> 00:34:12,219 Mais si l'on zoom sur l'un de ces rectangles, 559 00:34:12,219 --> 00:34:16,460 lorsque vous appelez une fonction foo, il s'avère qu'il ya plus dans la pile 560 00:34:16,460 --> 00:34:18,739 l'intérieur de ce cadre et ce rectangle 561 00:34:18,739 --> 00:34:23,370 que de x et y et a et b, comme nous n'avons parlé de swap. 562 00:34:23,370 --> 00:34:25,949 Il s'avère qu'il ya des détails de niveau inférieur, 563 00:34:25,949 --> 00:34:27,780 parmi eux l'adresse de retour. 564 00:34:27,780 --> 00:34:33,020 Ainsi, il s'avère quand principale appelle foo, principal doit informer foo 565 00:34:33,020 --> 00:34:36,760 ce qui est l'adresse principale en mémoire de l'ordinateur. 566 00:34:36,760 --> 00:34:40,659 Parce que sinon, dès que foo est faite d'exécution, comme c'est le cas ici, 567 00:34:40,659 --> 00:34:43,790 une fois que vous atteignez cette accolade fermante bouclés à la fin de foo, 568 00:34:43,790 --> 00:34:48,860 comment diable ne sais pas où foo contrôle du programme est censé aller? 569 00:34:48,860 --> 00:34:52,460 Il s'avère que la réponse à cette question se trouve dans le rectangle rouge ici. 570 00:34:52,460 --> 00:34:56,130 Cela représente un pointeur, et c'est à l'ordinateur pour stocker, de façon temporaire, 571 00:34:56,130 --> 00:35:00,250 sur la dite pile l'adresse de principal de telle sorte que dès que foo est faite d'exécution, 572 00:35:00,250 --> 00:35:04,110 l'ordinateur ne sait où et quelle ligne principale en revenir à. 573 00:35:04,110 --> 00:35:06,900 Pointeur à cadre enregistrée concerne de même à cela. 574 00:35:06,900 --> 00:35:09,620 Bar * Char ici représente quoi? 575 00:35:09,620 --> 00:35:14,740 Eh bien, maintenant ce segment bleu est ici foo cadre, quel est bar? 576 00:35:14,740 --> 00:35:18,300 Bon, alors bar est juste l'argument à la fonction foo. 577 00:35:18,300 --> 00:35:20,720 >> Alors maintenant, nous sommes de retour à l'image familière. 578 00:35:20,720 --> 00:35:22,960 Il ya plus de choses et plus de distractions à l'écran 579 00:35:22,960 --> 00:35:27,490 mais ce segment bleu clair est ce que nous avons été en s'appuyant sur le tableau noir pour quelque chose comme swap. 580 00:35:27,490 --> 00:35:31,890 C'est le cadre de foo et la seule chose en ce moment est le bar, 581 00:35:31,890 --> 00:35:34,630 qui est de ce paramètre. 582 00:35:34,630 --> 00:35:39,840 Mais ce qui doit se tenir dans la pile, en fonction de ce code ici? 583 00:35:39,840 --> 00:35:44,280 Char c [12]. Donc, nous devrions également voir 12 carrés de mémoire, 584 00:35:44,280 --> 00:35:46,260 attribué à une variable appelée c. 585 00:35:46,260 --> 00:35:48,340 Et en effet, ce que nous avons à l'écran. 586 00:35:48,340 --> 00:35:51,650 Le très haut il est c [0], puis l'auteur de ce schéma 587 00:35:51,650 --> 00:35:55,130 ne me dérangeait pas tirer toutes les cases, mais il ya en effet 12, il 588 00:35:55,130 --> 00:36:00,120 parce que si vous regardez en bas à droite, c [11], si l'on compte à partir de 0, ce sont les 12 octets de telles. 589 00:36:00,120 --> 00:36:06,190 Mais voici le problème: Dans quelle direction est de plus en plus c? 590 00:36:06,190 --> 00:36:10,390 Trier du haut vers le bas, à droite? Si elle commence par le haut et pousse vers le bas, 591 00:36:10,390 --> 00:36:13,480 ne ressemble pas à notre départ nous piste bien du tout ici. 592 00:36:13,480 --> 00:36:15,320 Nous avons sorte de nous-mêmes dans une impasse, 593 00:36:15,320 --> 00:36:20,210 et que c [11] est bien en place contre la barre, ce qui est tout contre pointeur de frame de pile, 594 00:36:20,210 --> 00:36:23,800 ce qui est tout contre l'adresse de retour, il n'y a pas de room plus. 595 00:36:23,800 --> 00:36:26,100 Alors, quelle est l'implication, donc, si vous bousiller, 596 00:36:26,100 --> 00:36:30,460 et vous essayez de lire 20 octets dans une mémoire tampon de 12 octets? 597 00:36:30,460 --> 00:36:33,460 Où sont ces 8 octets supplémentaires va aller? 598 00:36:33,460 --> 00:36:36,370 A l'intérieur tout le reste, dont une partie est super important. 599 00:36:36,370 --> 00:36:40,480 Et la chose la plus importante, peut-être, est la zone rouge là-bas, l'adresse de retour. 600 00:36:40,480 --> 00:36:44,720 Parce suppose que vous êtes soit accidentellement, soit contradictoirement 601 00:36:44,720 --> 00:36:48,040 écraser ces 4 octets, qui traitent pointeur, 602 00:36:48,040 --> 00:36:53,190 non seulement avec les ordures ménagères, mais avec un nombre qui se passe pour représenter une adresse réelle en mémoire? 603 00:36:53,190 --> 00:36:55,930 Quelle est la implicaiton, logiquement? 604 00:36:55,930 --> 00:36:59,080 [Les réponses des élèves, inintelligible] >> Exactement. Lorsque foo retourne 605 00:36:59,080 --> 00:37:03,560 et hits qui accolade, le programme va continuer de ne pas retourner au menu principal, 606 00:37:03,560 --> 00:37:08,320 il va revenir à n'importe quelle adresse dans cette case est rouge. 607 00:37:08,320 --> 00:37:11,560 >> Maintenant, dans le cas de l'enregistrement des logiciels contourner, 608 00:37:11,560 --> 00:37:14,400 quelle est l'adresse qui a été retourné à la fonction est 609 00:37:14,400 --> 00:37:18,820 qui obtient normalement appelé après que vous avez payé pour le logiciel et entré votre code d'enregistrement? 610 00:37:18,820 --> 00:37:23,160 Vous pouvez trier des truc dans l'ordinateur ne va pas ici, mais à la place, allant jusqu'à ici. 611 00:37:23,160 --> 00:37:27,950 Ou, si vous êtes vraiment intelligent, un adversaire peut effectivement taper dans le clavier, 612 00:37:27,950 --> 00:37:32,500 par exemple, pas un mot réel, et non pas 20 caractères, mais supposons qu'il ou elle 613 00:37:32,500 --> 00:37:36,200 dans certains types de caractères qui représentent le code? 614 00:37:36,200 --> 00:37:38,860 Et ça ne va pas être du code C, il va y avoir des caractères 615 00:37:38,860 --> 00:37:42,920 que représentent les codes machines binaires, 0 et de 1. 616 00:37:42,920 --> 00:37:46,740 Mais supposons qu'ils sont assez intelligents pour le faire, en quelque sorte coller dans l'invite GetString 617 00:37:46,740 --> 00:37:49,460 quelque chose qui est essentiellement du code compilé, 618 00:37:49,460 --> 00:37:56,900 et les 4 derniers octets écraser l'adresse de retour, et ce n'est que l'entrée Adresse faire? 619 00:37:56,900 --> 00:38:01,860 Le stocke dans ce rectangle rouge de l'adresse du premier octet de la mémoire tampon. 620 00:38:01,860 --> 00:38:04,270 Donc, il faut être très intelligent, et c'est beaucoup d'essais et d'erreurs 621 00:38:04,270 --> 00:38:08,500 pour de mauvaises personnes là-bas, mais si vous pouvez comprendre l'ampleur de ce tampon est, 622 00:38:08,500 --> 00:38:12,170 tels que les quelques octets dans l'entrée que vous fournissez au programme 623 00:38:12,170 --> 00:38:15,970 arrive d'être équivalent à l'adresse de début de la mémoire tampon, 624 00:38:15,970 --> 00:38:22,270 vous pouvez le faire. Si nous disons que, normalement, bonjour, et \ 0, c'est ce qui se retrouve dans la mémoire tampon. 625 00:38:22,270 --> 00:38:27,860 Mais si nous sommes plus intelligents, et nous combler ce tampon avec ce que nous allons appeler du code générique attaque, 626 00:38:27,860 --> 00:38:31,920 A, A, A, A: attaque, attaque, attaque, attaque, où c'est juste quelque chose qui fait quelque chose de mal. 627 00:38:31,920 --> 00:38:35,190 Eh bien, qu'est-ce qui se passe si vous êtes très intelligent, vous pourriez faire ceci: 628 00:38:35,190 --> 00:38:41,740 Dans la boîte rouge ici est une séquence de nombres: 80, CO, 35, 08. 629 00:38:41,740 --> 00:38:44,890 Notez que le nombre qui correspond à ce que qui se passe ici. 630 00:38:44,890 --> 00:38:47,280 C'est dans l'ordre inverse, mais plus sur cela une autre fois. 631 00:38:47,280 --> 00:38:51,430 Notez que cette adresse de retour a été délibérément modifié 632 00:38:51,430 --> 00:38:54,970 d'égaler l'adresse ici, et non pas l'adresse du principal. 633 00:38:54,970 --> 00:39:00,170 Donc, si le méchant est super intelligent, il ou elle va d'inclure dans ce code d'attaque 634 00:39:00,170 --> 00:39:02,890 quelque chose comme «Supprimer tous les fichiers de l'utilisateur. 635 00:39:02,890 --> 00:39:06,320 Ou «Copier les mots de passe» ou «Créer un compte d'utilisateur que je peux connecter à. 636 00:39:06,320 --> 00:39:10,130 Rien du tout, et c'est à la fois le danger et la puissance de C. 637 00:39:10,130 --> 00:39:12,900 Parce que vous avez accès à la mémoire par l'intermédiaire de pointeurs 638 00:39:12,900 --> 00:39:15,950 et vous pouvez donc écrire ce que vous voulez dans la mémoire d'un ordinateur. 639 00:39:15,950 --> 00:39:19,290 Vous pouvez faire un ordinateur de faire ce que vous voulez tout simplement en 640 00:39:19,290 --> 00:39:22,780 avoir sauter partout au sein de son propre espace mémoire. 641 00:39:22,780 --> 00:39:27,230 Et donc, à ce jour, tant de programmes et de sites Web tant qui sont compromises 642 00:39:27,230 --> 00:39:29,730 se résument à des gens qui profitent de cette. 643 00:39:29,730 --> 00:39:32,510 Et cela peut sembler comme une attaque super-sophistiqué, 644 00:39:32,510 --> 00:39:34,220 mais il ne commence pas toujours de cette façon. 645 00:39:34,220 --> 00:39:36,770 >> La réalité est que ce qui est généralement de mauvaises gens faire est, 646 00:39:36,770 --> 00:39:41,470 qu'il s'agisse d'un programme à une ligne de commande ou une application graphique ou un site web, 647 00:39:41,470 --> 00:39:43,290 est que vous venez de commencer à fournir des bêtises. 648 00:39:43,290 --> 00:39:46,940 Vous tapez un mot vraiment grand dans le champ de recherche et appuyez sur Entrée, 649 00:39:46,940 --> 00:39:49,030 et vous attendre pour voir si les accidents de site Web. 650 00:39:49,030 --> 00:39:53,270 Ou vous attendez de voir si le programme manifeste un certain message d'erreur. 651 00:39:53,270 --> 00:39:55,480 Parce que si vous avez de la chance, comme le méchant, 652 00:39:55,480 --> 00:39:59,610 et de vous fournir certaines entrées fou qui fait planter le programme, 653 00:39:59,610 --> 00:40:02,280 cela signifie que le programmeur ne s'attendait pas à votre mauvais comportement 654 00:40:02,280 --> 00:40:05,420 ce qui signifie que vous pouvez probablement, avec assez d'efforts, 655 00:40:05,420 --> 00:40:09,870 essai et d'erreur assez, trouver une façon de mener une attaque plus précise. 656 00:40:09,870 --> 00:40:15,900 Donc, comme partie intégrante de la sécurité n'est pas seulement d'éviter ces attaques tout à fait, mais les détecter 657 00:40:15,900 --> 00:40:20,250 et effectivement regarder les journaux et voir ce que les entrées fous des gens tapés dans votre site Web. 658 00:40:20,250 --> 00:40:26,040 Quels termes de recherche ont tapé les gens dans votre site web dans l'espoir de déborder une partie du tampon? 659 00:40:26,040 --> 00:40:28,900 Et cela se résume à des bases simples de ce qui est un tableau, 660 00:40:28,900 --> 00:40:32,510 et qu'est-ce que cela signifie d'allouer et d'utiliser la mémoire? 661 00:40:32,510 --> 00:40:34,920 Et lié à cela, aussi, est-ce. 662 00:40:34,920 --> 00:40:37,520 >> Donc, nous allons juste jeter un regard à l'intérieur d'un disque dur encore une fois. 663 00:40:37,520 --> 00:40:40,190 Donc, vous vous souvenez d'une semaine ou deux il ya que lorsque vous faites glisser des fichiers 664 00:40:40,190 --> 00:40:45,470 à votre corbeille ou corbeille, ce qui se passe? 665 00:40:45,470 --> 00:40:47,850 [Étudiants] Rien. Oui >>, absolument rien. Finalement, si vous êtes à court 666 00:40:47,850 --> 00:40:51,370 sur l'espace disque, Windows ou Mac OS commence à supprimer les fichiers pour vous. 667 00:40:51,370 --> 00:40:53,670 Mais si vous faites glisser quelque chose là-dedans, alors ce n'est pas du tout en sécurité. 668 00:40:53,670 --> 00:40:56,550 Tout membre de votre colocataire, ami ou famille a à faire est de double-cliquer sur, et le tour est joué. 669 00:40:56,550 --> 00:40:59,720 Il ya tous les fichiers sommaires que vous avez essayé de supprimer. 670 00:40:59,720 --> 00:41:02,840 Ainsi, la plupart d'entre nous savons au moins que vous avez à faire un clic droit ou clic contrôler 671 00:41:02,840 --> 00:41:05,320 et videz la corbeille, ou quelque chose comme ça. 672 00:41:05,320 --> 00:41:07,900 Mais même alors, ce n'est pas tout à fait faire l'affaire. 673 00:41:07,900 --> 00:41:11,340 Parce que ce qui arrive quand vous avez un fichier sur votre disque dur 674 00:41:11,340 --> 00:41:14,590 qui représente un certain document Word ou un JPEG? 675 00:41:14,590 --> 00:41:18,820 Et cela représente votre disque dur, et disons que ce ruban représente ici ce fichier, 676 00:41:18,820 --> 00:41:21,640 et il est composé de tout un tas de 0 et de 1. 677 00:41:21,640 --> 00:41:25,470 Qu'est-ce qui se passe quand vous avez non seulement faire glisser ce fichier vers la corbeille ou corbeille, 678 00:41:25,470 --> 00:41:30,390 mais aussi le vider? 679 00:41:30,390 --> 00:41:32,820 Trier de rien. Ce n'est pas rien maintenant. 680 00:41:32,820 --> 00:41:37,630 Maintenant, c'est juste rien, car un petit quelque chose qui se passe dans la forme de cette table. 681 00:41:37,630 --> 00:41:41,170 Il ya donc une sorte de base de données ou d'une table à l'intérieur de la mémoire d'un ordinateur 682 00:41:41,170 --> 00:41:44,470 qui a essentiellement la colonne 1 pour les noms de fichiers, 683 00:41:44,470 --> 00:41:50,550 et 1 colonne pour l'emplacement du fichier, où cela pourrait être l'emplacement 123, juste un nombre aléatoire. 684 00:41:50,550 --> 00:41:58,270 Donc, nous pourrions avoir quelque chose comme x.jpg, et l'emplacement 123. 685 00:41:58,270 --> 00:42:02,870 Et ce qui arrive ensuite, lorsque vous videz votre corbeille? 686 00:42:02,870 --> 00:42:06,720 Qui s'en va. Mais ce qui ne va pas de là se trouve le 0 et de 1. 687 00:42:06,720 --> 00:42:09,690 >> Alors qu'est-ce, alors, la connexion au pset 4? 688 00:42:09,690 --> 00:42:13,460 Eh bien, avec pset 4, juste parce que nous avons accidentellement effacé 689 00:42:13,460 --> 00:42:15,890 la carte compact flash qui avait toutes ces photos, 690 00:42:15,890 --> 00:42:18,710 ou tout simplement parce que la malchance est devenu corrompu, 691 00:42:18,710 --> 00:42:21,170 ne signifie pas que les 0 et 1 ne sont pas encore là. 692 00:42:21,170 --> 00:42:23,920 Peut-être quelques-uns d'entre eux sont perdus parce que quelque chose a été corrompu 693 00:42:23,920 --> 00:42:26,530 en ce sens que certains de 0 devient 1 et de 1 devient 0. 694 00:42:26,530 --> 00:42:30,460 De mauvaises choses peuvent arriver à cause de logiciels défectueux ou matériel défectueux. 695 00:42:30,460 --> 00:42:33,510 Mais beaucoup de ces bits, peut-être même 100% d'entre eux sont toujours là, 696 00:42:33,510 --> 00:42:38,330 c'est juste que l'ordinateur ou l'appareil photo ne sait pas où JPEG 1 a commencé 697 00:42:38,330 --> 00:42:41,660 et où JPEG 2 a commencé, mais si vous, le programmeur, 698 00:42:41,660 --> 00:42:45,800 savoir, avec un peu de bon sens, où les fichiers JPEG sont ou à quoi ils ressemblent, 699 00:42:45,800 --> 00:42:49,570 vous pouvez analyser les 0 et 1 et dire, 'Oh. JPEG. Ooh, JPEG. 700 00:42:49,570 --> 00:42:52,830 Vous pouvez écrire un programme avec essentiellement juste une boucle for ou while 701 00:42:52,830 --> 00:42:56,100 qui récupère tous et chacun de ces fichiers. 702 00:42:56,100 --> 00:42:59,360 Donc, la leçon est donc de commencer "en toute sécurité" effacer vos fichiers 703 00:42:59,360 --> 00:43:01,720 si vous voulez éviter ce tout à fait. Oui? 704 00:43:01,720 --> 00:43:06,940 [Question étudiants, inintelligible] 705 00:43:06,940 --> 00:43:11,150 Avez >> plus de mémoire que vous avez fait avant - 706 00:43:11,150 --> 00:43:14,790 Oh! Bonne question. Pourquoi, alors, après avoir vidé la corbeille, 707 00:43:14,790 --> 00:43:18,300 votre ordinateur, vous ne dites que vous avez plus d'espace libre que vous avez fait avant? 708 00:43:18,300 --> 00:43:22,450 En un mot, parce qu'il a menti. Plus techniquement, vous n'avez plus d'espace. 709 00:43:22,450 --> 00:43:26,720 Parce que maintenant, vous avez dit, vous pouvez mettre d'autres choses où ce fichier a déjà été, 710 00:43:26,720 --> 00:43:28,930 mais cela ne veut pas dire que les bits s'en vont, 711 00:43:28,930 --> 00:43:33,070 et cela ne signifie pas les bits sont changés tous les 0, par exemple, pour votre protection. 712 00:43:33,070 --> 00:43:37,520 En revanche, si vous en toute sécurité "" effacer des fichiers, ou de détruire physiquement l'appareil, 713 00:43:37,520 --> 00:43:40,810 c'est vraiment la seule façon, parfois, autour de cela. 714 00:43:40,810 --> 00:43:45,300 Alors pourquoi ne pas nous laisser sur cette note semi-effrayant, et nous vous verrai lundi. 715 00:43:45,300 --> 00:43:52,810 CS50.TV