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