[Powered by Google Translate] [SEMAINE 5]
[David J. Malan, Université de Harvard]
[C'est CS50.] [CS50.TV]
[Femme] Il ment; sur quoi, je ne sais pas.
[Homme] Alors, que savons-nous?
[Femme] C'est à 9:15, Ray Santoya était à l'ATM.
[Homme] Donc la question est, que faisait-il à 9:16?
[Femme] Shooting the mm 9 à quelque chose.
Peut-être qu'il a vu le tireur d'élite.
[Homme] Ou il travaillait avec lui.
[Femme] Attendez. Retour celui-ci.
[Homme] Que voyez-vous?
[♫ ♫ musique de suspense]
[Femme] Apportez son visage vers le haut. Plein écran.
[Homme] Ses lunettes. >> Il ya une réflexion.
[♫ ♫ musique de suspense]
[Homme] C'est l'équipe de baseball de Nuevita. C'est leur logo.
[Femme] Et il parle à celui qui est revêtu de ce manteau.
>> [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.
Donc, chaque fois que vous regardez un spectacle comme celui-là,
et les flics disent «Pouvez-vous nettoyer?" ou "Améliorer"
il n'y a pas d'améliorer dans le monde réel.
En fait, ce que vous avez vraiment un petit quelque chose comme ça.
J'ai tiré vers le haut l'une des photos du personnel de la page.
Il s'agit d'un programme appelé Photoshop. C'est 1 de 2 Bowdens,
1 de 3 Bowdens en fait, aujourd'hui, parce que nous avons Mme Bowden ici aussi, avec Rob et Paul.
Mais voici Rob à l'écran, et si l'on zoom sur cette lueur qu'il a toujours eu dans ses yeux,
ce que vous voyez est ce que vous voyez est ce que vous obtenez.
Il s'agit de «améliorée», de sorte "CSI" faire un peu mal.
Il ya un autre clip, si l'on peut prendre à "CSI" juste un peu plus longtemps.
Celui-ci est une expression qui se prononce désormais si vous voulez
une bonne formation technique avec vos amis quand, vraiment, vous dites absolument rien.
>> [Homme] Pendant des semaines, j'ai étudié les meurtres de tueur Cabby
avec une certaine fascination morbide.
[Woman # 1] Il s'agit en temps réel.
[Femme # 2] Je vais créer une interface graphique à l'aide de Visual Basic, voir si je peux suivre une adresse IP.
>> [Malan] Donc audio out of sync mis à part, la création d'une interface graphique à l'aide de Visual Basic
de suivre une adresse IP est un non-sens complet.
Ces jours-ci vous n'utilisez pas Visual Basic,
il n'y a pas besoin d'une interface graphique, et l'adresse IP est un terme technique précis.
Alors gardez un œil sur ceux-ci, et un de mes favoris:
Celui-ci est un peu plus obscure, car vous avez besoin de savoir une langue différente.
Il s'agit d'un langage appelé Objective-C, ce qui est un sur-ensemble de C.
Ce qui signifie qu'il est C ainsi que quelques fonctionnalités supplémentaires, dont la programmation orientée objet.
Et c'est la langue que Apple a popularisé la programmation iOS.
Et donc voici un extrait d'un spectacle tout à fait différent, de «Numbers»,
que si vous regardez de près sur votre TiVo et faire une pause au bon moment,
vous verrez que ce qu'ils cherchent n'est pas tout à ce qui est décrit.
Et laissez-moi essayer un autre connecteur audio ici et voir si nous ne pouvons pas
conserver les données audio en synchronisation cette fois.
Je vous donne "chiffres".
>> [Man # 1] Il s'agit d'une adresse IPv4 32 bits.
[Man # 2] IP, c'est l'Internet. Réseau privé >>. C'est un réseau privé d'Anita.
[Malan] D'accord. Il s'agit d'Objective-C, et c'est pour une coloration programme pour enfants,
comme vous pouvez peut-être déduire le nom de la variable y.
Alors que, alors, était «chiffres». Donc, aujourd'hui et cette semaine, nous introduisons
un peu du monde de la médecine légale et le contexte dans les problèmes par conséquent.
Aujourd'hui sera une conférence abrégée parce qu'il ya un événement spécial ici
par la suite, nous allons jeter un coup d'oeil, et taquiner les élèves et les parents d'aujourd'hui
avec quelques-unes des choses qui sont sur la ligne d'horizon.
Parmi ceux-ci, à partir de lundi, vous aurez quelques camarades plus.
EdX, Harvard et MIT nouvelle initiative en ligne des didacticiels libres
en plus, lance sur le campus de Harvard, lundi.
Ce qui veut dire lundi prochain, vous aurez - au dernier décompte,
86.000 camarades de classe supplémentaires seront à la suite avec des conférences CS50 l'
et les articles et soluces et ensembles de problèmes.
Et dans le cadre de la présente, vous deviendrez membres de la première promotion de
CS50 et maintenant CS50x.
>> Dans le cadre de ce fait, maintenant, se rendre compte que il y aura quelques bons côtés aussi.
Pour se préparer à cela, car le grand nombre d'étudiants,
il suffit de dire que même si nous avons 108 FO et AR,
pas tout à fait le meilleur ratio élèves / maître une fois nous avons atteint 80.000 étudiants d'autres.
Donc, nous n'allons pas être nivellement problème tellement définit manuellement.
Donc, présenté cette semaine dans le problème posé sera CS50 Check,
qui va être un utilitaire de ligne de commande à l'intérieur de l'appareil
que vous obtiendrez une fois que vous le mettre à jour plus tard ce week-end,
et vous serez en mesure d'exécuter une commande, vérifiez 50,
sur votre propre pset, et vous obtiendrez une rétroaction quant à savoir si votre programme est
correct ou incorrect selon les spécifications de conception différentes que nous avons fournis.
Donc plus à ce sujet et la spécification problème posé et
les camarades de classe CS50x allons utiliser ceci aussi bien.
>> Donc 4 problème posé est tout au sujet de la médecine légale.
Et ce morceau a été inspiré par des choses de la vie réelle,
de sorte que lorsque j'étais à l'université, j'ai fait un stage pendant un certain temps avec
Bureau du comté de Middlesex District Attorney fait un travail médico-légal
avec leur enquêteur judiciaire plomb, et ce que cela équivalait à
est, je pense que je l'ai mentionné passé quelques semaine, est la police de l'État de masse ou d'autres
viendrait, ils abandonnaient le projet des choses comme les disques durs et les CD et les disquettes
et autres, et alors l'objectif du bureau de médecine légale était de déterminer si
il était ou n'était pas une preuve d'une certaine sorte.
Ce fut l'Unité des enquêtes spéciales, de sorte qu'il était criminalité en col blanc,
il était en quelque sorte plus troublant de crimes,
tout ce qui concerne certains types de médias numériques; s'avère que pas beaucoup de gens
écrire un e-mail disant: «Je l'ai fait."
Ainsi, bien souvent, ces recherches médico-légales ne se sont pas tout ce que beaucoup de fruit,
mais parfois les gens écriraient ces courriels.
Alors parfois, les efforts ont été récompensés.
>> Mais pour mener à ce pset médico-légale, nous allons introduire dans pset 4 a peu de graphiques.
Alors vous avez probablement prendre ces choses pour acquis, JPEG, GIF et similaires, de nos jours,
mais si vous pensez vraiment cela, une image, un peu comme le visage de Rob,
peut être modélisée comme une séquence de points ou pixels.
Maintenant, dans le cas du visage de Rob, il ya toutes sortes de couleurs,
et nous avons commencé à voir les points individuels, otherwide appelés pixels,
lorsque nous avons commencé à effectuer un zoom avant
Mais si nous simplifions le monde un peu, et je dis juste que ce n'est ici Rob
en noir et blanc, eh bien, pour représenter le noir et blanc, nous pouvons simplement utiliser binaire.
Et si nous allons utiliser binaire, 1 ou 0, on peut exprimer cette même image
du visage souriant de Rob avec ce modèle de bits: 11000011 représente
blanc, blanc, noir, noir, noir, noir, blanc, blanc.
Et donc ce n'est pas un saut énorme, alors, commencer à parler de photographies en couleurs.
Les choses que vous voyez sur Facebook ou prendre avec un appareil photo numérique,
mais, certainement, quand il s'agit de couleurs, vous avez besoin plus de bits.
Et très répandue dans le monde de la photographie est de ne pas utiliser 1-bit couleur,
que cela suggère, mais couleur 24-bit, où vous obtenez en fait des millions de couleurs.
Alors que dans le cas où nous avons zoomé sur les yeux de Rob,
qui a été un certain nombre de millions de possibilités différentes couleurs.
>> Donc, nous allons présenter cette série en 4 problème ainsi que dans la procédure pas à pas,
qui aura lieu aujourd'hui à 3:30 au lieu de 2:30 l'habitude en raison de conférence de vendredi ici.
Mais la vidéo sera en ligne, comme d'habitude, demain.
Nous allons également vous présenter un autre format de fichier.
Donc, ce sont délibérément destinés à paraître intimidant au premier abord,
mais ce n'est que de la documentation pour une struct C.
Il s'avère que Microsoft il ya des années, a contribué à populariser ce format,
appelé le format de fichier bitmap, BMP, et ce fut un super-simple,
coloré format de fichier graphique qui a été utilisé pendant un certain temps
et parfois encore des fonds d'écran sur les ordinateurs de bureau.
Si vous pensez revenir à Windows XP et les collines et le ciel bleu,
qui était généralement un fichier BMP, ou une image bitmap et les bitmaps
sont un plaisir pour nous parce qu'ils ont un peu plus de complexité.
Ce n'est pas tout à fait aussi simple que cette grille de 0 et de 1;
au contraire, vous avez des choses comme un en-tête au début d'un fichier.
Donc, en d'autres termes, à l'intérieur d'un fichier. Bmp tout un tas de 0 et de 1,
mais il ya une certaine supplémentaire 0 et de 1 là-dedans.
Et il s'avère que ce que nous avons probablement pris pour acquis depuis des années,
formats de fichiers tels que. doc ou. xls ou. mp3 ou. mp4,
quels que soient les formats de fichiers que vous êtes familier avec.
Eh bien, qu'est-ce que c'est bien l'intention d'être un format de fichier?
Parce qu'à la fin de la journée, tous ces fichiers que nous utilisons ont juste des 0 et des 1
et peut-être ceux des 0 et des 1 représente a, b, c, à travers ASCII ou analogue,
mais vers la fin de la journée, c'est juste des 0 et des 1.
>> Alors seulement occasionnellement les humains décident d'inventer un nouveau format de fichier
où ils normaliser ce schémas de bits réellement dire.
Et dans ce cas là, les gens qui ont conçu le format de fichier bitmap
dit que l'octet première fois dans un fichier bitmap, comme indiqué par l'offset 0, là-bas,
il va y avoir une certaine nommés de façon énigmatique bfType variable appelée,
ce qui est juste pour le type de fichier bitmap, ce type de fichier bitmap c'est.
Vous pouvez déduire, peut-être, à partir de la deuxième rangée qui compensent 2, numéro 2 octets,
présente un motif de 0 et de 1 qui représente quoi?
La taille de quelque chose, et il va à partir de là.
Donc, en 4 set problème, vous serez parcouru certaines de ces choses.
>> Nous ne finiront pas se soucier de chacun d'eux, mais remarquez qu'il commence à devenir intéressant
autour de la ligne ou de l'octet 54, rgbtBlue, vert et rouge.
Si vous avez déjà entendu l'acronyme RVB, rouge vert bleu, il s'agit d'une référence à cela.
Parce qu'il s'avère que vous pouvez peindre toutes les couleurs de l'arc en ciel
avec une combinaison de rouge et de bleu et de vert.
Et, en effet, les parents dans la chambre souvenez peut-être parmi les premiers projecteurs.
Ces jours-ci, vous venez de voir 1 lumière sortant d'une lentille.
Mais de retour dans la journée, vous avez eu la lentille rouge, le verre bleu, et la lentille verte
et ensemble, ils visent à l'écran et formé une image colorée.
Et bien souvent, les collèges et les lycées aurait ces lentilles
toujours aussi peu de guingois, si vous étiez en quelque sorte à voir des images doubles ou triples,
mais c'était l'idée. Vous avez eu une lumière rouge et verte et bleue de peindre un tableau.
Et ce même principe est utilisé dans les ordinateurs.
>> Ainsi, parmi les défis, alors, pour vous en problème série 4
vont être quelques petites choses: l'une est pour redimensionner une image.
À prendre dans un motif de 0 et de 1,
déterminer quels morceaux de 0 et de 1 représentent ce que dans une structure de ce type,
et ensuite trouver comment reproduire les pixels: les rouges, les bleus, les verts
à l'intérieur de sorte que quand une image ressemble à ceci d'abord, pourrait ressembler à ceci plutôt que par la suite.
Parmi les autres défis, aussi, va être que vous serez remis
une image médico-légale d'un fichier réel à partir d'un appareil photo numérique
et sur cette caméra, il était une fois, étaient tout un tas de photos.
Le problème, c'est que nous avons accidentellement effacées ou que l'image avait endommagé en quelque sorte.
De mauvaises choses arrivent avec des caméras numériques, et ainsi nous nous sommes rapidement copié tous les 0 et les 1
hors de cette carte pour vous, tous sauvés en 1 gros fichier, et ensuite nous allons les remettre à vous
dans le problème mis en 4 pour que vous pouvez écrire un programme en C qui à récupérer
l'ensemble de ces fichiers JPEG, idéalement.
Et il s'avère que les fichiers JPEG, même si elles sont en quelque sorte un format de fichier complexe,
ils sont beaucoup plus complexes que ce visage souriant ici.
Il s'avère que tous les JPEG commence par les mêmes schémas de 0 et de 1.
Donc, en utilisant une boucle while ou une boucle for ou similaire,
vous pouvez parcourir tous les 0 et de 1 dans cette image médico-légale
et chaque fois que vous voyez le modèle spécial qui est défini dans la spécification du problème posé, le
vous pouvez supposer, 'Oh, c'est ici, avec une probabilité très élevée,
le début d'un JPEG, «et dès que vous trouvez le même modèle,
certain nombre d'octets ou kilo-octets ou méga-octets plus tard,
vous pouvez supposer, «Ooh! En voici un second JPEG, la photo que j'ai prise après le premier.
Permettez-moi de cesser de lire ce fichier d'abord, commencer à écrire cette nouvelle. "
Et la sortie de votre programme pour pset 4 va être jusqu'à 50 images JPEG.
Et si ce n'est pas 50 fichiers JPEG, vous avez un peu d'une boucle.
Si vous avez un nombre infini de fichiers JPEG, vous avez une boucle infinie.
Alors que, lui aussi, être tout à fait une affaire commune.
C'est ce qui est à l'horizon.
>> Quiz 0, derrière nous. Réaliser, par mon e-mail, qui, invariablement, il ya des gens
qui sont à la fois heureux, en quelque sorte neutre, et triste autour de quiz 0 fois.
Et s'il vous plaît ne me tendre la main, les FO tête, Zamyla, votre propre TF
ou l'une des autorités de certification que vous savez si vous souhaitez discuter de la façon dont cela s'est passé.
>> Donc, pour impressionner les parents ici dans la salle,
quelle est la bibliothèque CS50? Good job.
Quelle est la bibliothèque CS50? Ouais? [Les réponses des élèves, inintelligible]
>> Très bien. Donc, c'est un ensemble pré-écrits de code que nous, le personnel, a écrit,
nous vous fournissons, de fournir des fonctionnalités communes.
Des trucs comme me procurer un string; m'obtenir un int, toutes les fonctions qui sont énumérés ici.
À partir de maintenant, nous commençons à vraiment prendre ces roues d'entraînement hors tension.
Donc, nous allons commencer à enlever une "chaîne" de vous,
qui, rappel, c'était juste un synonyme de ce type de données réel? char *.
Donc, pour les parents, qui était sans doute - c'est bon, si char *, nous allons commencer à voir
sur l'écran d'autant plus que nous retirons "chaîne" de notre vocabulaire,
au moins quand il s'agit de réellement écrire de code.
De même, nous allons cesser d'utiliser certaines de ces fonctions autant,
parce que nos programmes vont devenir plus sophistiqué
plutôt que de simplement écrire des programmes qui sont assis là avec un clignotement rapide,
d'attente pour l'utilisateur de taper quelque chose po
Vous aurez vos entrées d'ailleurs.
Par exemple, vous les obtenir à partir d'une série de bits sur le disque dur local.
Vous, au lieu de les obtenir à l'avenir à partir d'une connexion réseau, un certain site Web, quelque part.
Donc, nous allons décoller cette couche pour la première fois, et tirer vers le haut l'appareil CS50
et ce fichier appelé CS50.h, que vous avez été forte, y compris pendant des semaines.
>> Mais nous allons vraiment voir ce qu'il ya dedans de cela.
Ainsi, le début du fichier en bleu est juste un tas de commentaires,
informations sur la garantie et la licence. C'est en quelque sorte un paradigme commun
dans le logiciel, car un grand nombre de logiciels de nos jours est ce qu'on appelle «open source»,
ce qui signifie que quelqu'un a écrit le code
et rendu disponible gratuitement, et pas seulement à courir et à utiliser,
mais en fait lire et modifier et l'intégrer dans votre propre travail.
C'est donc ce que vous avez utilisé, le logiciel open source,
quoique sous une forme très faible.
Si je défiler vers le bas au-delà des commentaires, cependant, nous allons commencer à voir des choses plus familières.
Donc remarquerez en haut ici, que le fichier CS50.h comprend tout un tas de fichiers d'en-tête.
Maintenant, la plupart d'entre eux nous n'avons pas vu avant, mais on est
familier, laquelle de ces avons-nous vu, quoique brièvement, à ce jour?
Ouais, bibliothèques standard. Stdlib.h a malloc,
donc une fois que nous avons commencé à parler de l'allocation dynamique de mémoire,
que nous y reviendrons la semaine prochaine aussi, on a commencé à inclure ce fichier.
Il s'avère que bool, vrai et faux n'existent pas en C, en soi,
sauf si vous incluez ce fichier ici.
Donc, nous avons, pendant des semaines, y compris la norme bool.h été
de sorte que vous pouvez utiliser la notion de. bool, vrai ou faux
Sans cela, vous auriez à trier de faux et d'utiliser un int
et juste arbitrairement supposer que 0 est faux et 1 est vrai.
>> Maintenant, si nous défiler vers le bas encore, voici notre définition d'une chaîne.
Il s'avère, comme nous l'avons déjà dit, que lorsque ce * n'est pas vraiment d'importance.
Vous pouvez même avoir l'espace tout autour.
Nous, de ce semestre, ont fait la promotion de ce que pour préciser que l'* a à voir avec le type.
Mais se rendre compte, de même que commun, si ce n'est un peu plus courante, consiste à le mettre là
mais fonctionnellement c'est la même chose.
Mais maintenant, si nous lisons un niveau plus bas, nous allons jeter un coup d'oeil à dire, getInt,
parce que nous avons utilisé, peut-être, avant toute autre chose de ce semestre.
Et voici getInt. C'est quoi?
Il s'agit du prototype. Trop souvent, nous avons mis prototypes au sommet de notre. Fichiers c,
mais vous pouvez aussi mettre des prototypes dans les fichiers d'en-tête, les fichiers. h,
comme celui-là, de sorte que lorsque vous écrivez des fonctions
que vous voulez que les autres soient en mesure d'utiliser, ce qui est exactement le cas avec la bibliothèque CS50,
non seulement vous mettre en œuvre vos fonctions dans quelque chose comme CS50.c,
vous pouvez également mettre les prototypes pas au sommet de ce fichier, mais au sommet d'un fichier d'en-tête,
ensuite ce fichier d'en-tête est ce que les amis et collègues comprennent,
avec forte inclure dans leur propre code.
Donc tout ce temps que vous avez été, y compris l'ensemble de ces prototypes
efficacement en haut de votre fichier, mais par le biais de cette forte inclure un mécanisme
que, essentiellement, des copies et des pâtes de ce fichier dans votre propre.
Maintenant, voici une documentation assez détaillée.
>> Nous avons à peu près acquis que getInt obtient un int,
mais il s'avère qu'il ya quelques cas de coin, pas vrai?
Que faire si l'utilisateur tape un nombre qui est beaucoup trop grand?
Un trillion, qui ne peut pas s'adapter à l'intérieur d'un int?
Quel est le comportement attendu? Eh bien, dans l'idéal, il est prévisible.
Donc dans ce cas, si vous avez réellement lu les petits caractères,
vous verrez que si la ligne ne peut pas être lu, ce INT_MAX rendements.
Nous n'avons jamais parlé de cela, mais en fonction de sa capitalisation,
qu'est ce que c'est, sans doute?
C'est une constante, donc c'est une constante spéciale qui est probablement déclarée
dans un de ces fichiers d'en-tête qui est plus haut dans le fichier,
et INT_MAX est probablement quelque chose comme, en gros, 2 milliards.
L'idée étant que, parce que nous avons besoin d'une certaine manière signifier que quelque chose s'est mal passé,
nous, oui, avez 4 milliards de numéros à notre disposition,
négative 2 milliards de dollars à 2 milliards de dollars, donner ou prendre.
Eh bien, ce qui est commun dans la programmation est que vous volez juste un de ces numéros.
Peut-être que 0, peut-être 2 milliards de dollars, peut-être négatif 2 milliards d'euros.
Alors que vous passez un de vos valeurs possibles de sorte que vous pouvez vous engager dans le monde
que si quelque chose va mal, je vais retourner cette valeur super-grand.
Mais vous ne voulez pas que l'utilisateur tape quelque chose comme cryptique "2, 3, 4 ..."
de très gros chiffre, où vous généraliser plutôt comme une constante.
Alors, vraiment, si tu étais anal cours des dernières semaines,
chaque fois que vous appelez getInt, vous auriez dû vérifier si une condition.
Fait le type d'utilisateur dans INT_MAX, ou plus précisément,
fait INT_MAX retour getInt? Parce que si c'était le cas,
qui signifie en fait qu'ils n'ont pas le taper, quelque chose n'allait pas dans ce cas.
Donc, c'est ce qui est généralement connu comme une «sentinelle» de valeur, ce qui signifie tout simplement extraordinaire.
>> Eh bien, nous allons maintenant tourner dans les fichiers. C.
Le fichier C a existé dans l'appareil pendant un certain temps,
et, en fait, l'appareil est qu'il précompilé pour vous
dans cette chose que nous avons appelé «code objet»,
mais il n'a pas d'importance pour vous où il est parce que le système le sait,
dans ce cas, où il est, l 'appareil.
Mais nous allons défiler vers le bas maintenant getInt, et de voir comment getInt a travaillé tout ce temps.
Nous avons donc ici des commentaires similaires d'avant.
Permettez-moi de faire un zoom sur la seule portion de code,
et ce que nous avons pour getInt est la suivante.
Il ne prend pas d'entrée et retourne un int, while (true), nous avons donc une boucle infinie délibérée
mais, sans doute, nous allons sortir de ce en quelque sorte, ou de retourner au sein de cette.
Donc, nous allons voir comment cela fonctionne. Eh bien, nous semblent utiliser GetString
dans cette première ligne à l'intérieur de la boucle, 166.
C'est maintenant une pratique bien parce que les circonstances dans lesquelles
GetString pourrait retourner ce mot-clé spécial, NULL?
Si quelque chose va mal. Qu'est-ce qui pourrait mal tourner lorsque vous appelez quelque chose comme GetString?
Ouais? [Réponse de l'étudiant, inintelligible] >> Oui. Alors peut-être malloc échoue.
Quelque part sous le capot GetString appelle malloc,
qui alloue de la mémoire, ce qui permet au magasin d'informatique
tous les caractères que l'utilisateur tape sur le clavier.
Et si l'utilisateur avait beaucoup de temps libre
et tapé plus, par exemple, de 2 milliards de caractères.
Plus de caractères que l'ordinateur a même RAM.
Eh bien, GetString doit être en mesure d'indiquer que pour vous,
même si c'est un super, super-coin le cas rare.
Il doit en quelque sorte être capable de gérer cela, et ainsi de GetString,
si nous revenir en arrière et lire sa documentation, ne, en effet, renvoie NULL.
Maintenant, si GetString échoue en renvoyant NULL, getInt est voué à l'échec
en retournant INT_MAX, comme une sentinelle.
Ce ne sont que des conventions humaines. La seule façon vous savez que c'est le cas
il suffit de lire la documentation.
Donc, nous allons défiler vers le bas à l'endroit où l'int est en fait GotInt.
>> 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.
Donc, nous déclarons, en 172, un int n et c char, et puis cette nouvelle fonction
que certains d'entre vous ont trébuché à travers avant, mais sscanf.
Elle représente une chaîne d'analyse f.
En d'autres termes, donnez-moi une corde et je vais le rechercher des éléments d'information d'intérêt.
Alors qu'est-ce que ça veut dire? Eh bien, supposons que je tape, littéralement, 1 2 3 sur le clavier,
puis appuyez sur Entrée. Quel est le type de données de 1 2 3 lorsqu'ils sont retournés par GetString?
C'est évidemment une chaîne, pas vrai? J'ai une chaîne, donc 1 2 3 est vraiment «1 2 3»
avec le 0 \ à la fin de celui-ci. 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é.
Alors qu'est-ce getInt avez à faire? Il doit analyser cette chaîne de gauche à droite,
1 2 3 \ 0, et en quelque sorte de le convertir en un entier réel.
Maintenant, vous pourriez trouver une façon de le faire.
Si vous repensez à pset 2, vous sans doute été un peu à l'aise
avec César ou vigenere de sorte que vous pouvez parcourir une chaîne,
vous pouvez convertir les caractères à ints avec médiator. C'est beaucoup de travail.
Pourquoi ne pas appeler une fonction comme sscanf qui fait cela pour vous?
Donc sscanf attend un argument, dans ce cas appelé la ligne, qui est une chaîne.
Vous pouvez ensuite spécifier, entre guillemets, très similaire à printf,
qu'est-ce que vous vous attendez à voir dans cette chaîne?
Ce que je dis ici est, je m'attends à voir un nombre décimal et peut-être un caractère.
Et nous allons voir pourquoi c'est le cas dans un instant.
Il s'avère que cette notation est désormais penser à des choses
nous avons commencé à parler un peu plus d'une semaine.
>> Quel est & n et & c fait pour nous ici? [Les réponses des élèves, inintelligible]
Ouais >>. Il me donne l'adresse de n et l'adresse de c.
Maintenant, pourquoi est-ce important? Eh bien, vous savez que les fonctions en C
vous pouvez toujours retourner une valeur ou pas de valeur du tout.
Vous pouvez retourner un int, une chaîne, un flotteur, un char, peu importe.
Ou vous pouvez retourner vide, mais vous ne pouvez retourner 1 chose maximum.
Mais ici, nous voulons sscanf pour moi de revenir peut-être un int, un nombre décimal,
et aussi un. char, et je vais vous expliquer pourquoi le char dans un moment
Donc, vous voulez effectivement f pour revenir 2 choses, c'est juste pas possible en C.
Ainsi, vous pouvez contourner ce passage dans 2 adresses,
parce que dès que vous remettez une fonction 2 adresses, ce qui peut cette fonction en faire?
Il peut écrire à ces adresses. Vous pouvez utiliser l'opération * et «y aller» à chacune de ces adresses.
C'est en quelque sorte ce mécanisme porte dérobée, mais très commun pour changer les valeurs des variables
dans plus d'1 place, dans ce cas 2.
Maintenant, remarquez je vérifie pour == à1, puis de revenir si ça n, en fait, la valeur true.
Alors qu'est-ce qui se passe? Eh bien, techniquement, tout ce que nous voulons vraiment arriver dans getInt est la suivante.
Nous voulons analyser, pour ainsi dire, nous voulons lire la chaîne
«1 2 3» et s'il semble qu'il y ait un numéro,
ce que nous disons sscanf à faire est de mettre ce nombre, 1 2 3, de cette variable n pour moi.
Pourquoi, alors, ai-je eu ce ainsi?
Quel est le rôle de dire aussi, sscanf, vous pouvez également obtenir un personnage ici.
[Parlant des étudiants, inintelligible] >> Non - un point décimal pourrait fonctionner.
Tenons qui réfléchit un instant. Quoi d'autre?
[Étudiant, inintelligible] >> Alors, bonne pensée, il pourrait être le caractère NULL.
Il s'agit en fait pas, dans ce cas. Ouais? [Étudiant, inintelligible]
>> >> ASCII. Ou bien, permettez-moi de généraliser encore plus loin.
Le c%, il est juste pour vérification des erreurs.
Nous ne voulons pas qu'il y ait de caractère après le nombre,
mais ce que cela me permet de faire est la suivante:
Il s'avère que sscanf, en plus de stocker des valeurs dans N et C, dans cet exemple ici,
ce qu'il ne retourne aussi est-il le nombre de variables mettre les valeurs po
Donc, si vous tapez uniquement 1 2 3, seul le% d va correspondre
et que n est stockée avec une valeur comme 1 2 3 et rien ne se mettre en c;
c reste une valeur ordures, pour ainsi dire.
Garbage parce qu'il n'a jamais été initialisé comme une certaine valeur.
Donc, dans ce cas, sscanf renvoie 1, parce que je peuplé l'un de ces pointeurs,
dans ce cas, tant mieux. J'ai un int, donc je libérer la ligne pour libérer de la mémoire
que GetString effectivement alloués, et puis je retourne n.
Sinon, si vous jamais demandé où que retry déclaration vient, vient d'ici.
Si, en revanche, je tape sur 1 2 3 foo,
quelques-unes séquence aléatoire de texte, sscanf va le voir,
ooh, le nombre, ooh, le nombre, ooh, le nombre, ooh - f.
Et il va mettre le 1 2 3 n.
Ça va mettre le f en c, puis revenir 2.
Nous avons donc, simplement en utilisant la définition de base du comportement de scanf,
d'une manière très simple - et bien, complexe à première vue, mais à la fin de la journée,
mécanisme assez simple de dire, y at-il un int, et si oui, est-ce la seule chose que j'ai trouvé?
Et l'espace blanc ici est délibérée. Si vous lisez la documentation de sscanf,
il vous dit que si vous incluez un morceau d'espace blanc au début ou à la fin,
sscanf trop permettra à l'utilisateur, pour une raison quelconque, la barre d'espace pour frapper 1 2 3, et qui sera légitime.
Il ne sera pas crier à l'utilisateur juste parce que ils ont frappé la barre d'espace au début ou à la fin,
qui est juste un peu plus convivial.
>> Toutes les questions, puis, sur GetInts? Ouais?
[Question étudiants, inintelligible]
>> Bonne question. Que faire si vous venez de taper dans un char, comme f et appuyez sur Entrée
sans jamais taper 1 2 3; que pensez-vous du comportement de cette ligne de code serait alors?
Donc sscanf peut couvrir que trop, car dans ce cas,
ça ne va pas à remplir n ou c, il va plutôt retourner 0.
Dans ce cas, je suis aussi attraper ce scénario, parce que la valeur attendue je veux, c'est 1.
Je veux seulement 1, et seulement 1 chose à pourvoir. Bonne question. Autres?
>> D'accord, donc il ne faut pas passer par toutes les fonctions ici,
mais celui qui semble être, peut-être, de la participation résiduelle
est GetString, car il s'avère que GetFloat, getInt,
GetDouble, GetLongLong tout botté de dégagement de beaucoup de leurs fonctionnalités à GetString.
Donc, nous allons jeter un oeil à la façon dont il est mis en œuvre ici.
Celui-ci semble un peu complexe, mais il utilise les mêmes principes
que nous avons commencé à parler la semaine dernière. Donc, en GetString,
qui ne prend aucun argument que le vide par ici,
et il retourne une chaîne, donc je déclare une chaîne appelée tampon.
Je ne sais pas vraiment ce qui va être utilisé pour l'instant, mais nous allons voir.
On dirait que la capacité est, par défaut, 0; pas trop où ça va finir.
Vous ne savez pas ce que n va être utilisé pour l'instant.
Mais maintenant, ça devient un peu plus intéressant, donc dans la ligne 243,
nous déclarons un entier c, c'est en quelque sorte d'un détail stupide.
Un char est de 8 bits et 8 bits peut stocker combien de valeurs différentes?
256. Le problème, c'est que si vous voulez avoir 256 différents caractères ASCII,
laquelle il ya, si vous repensez, et ce n'est pas quelque chose à mémoriser.
Mais si vous repensez à ce que grand tableau ASCII nous avions semaines,
il y avait, dans ce cas, 128 ou 256 caractères ASCII.
Nous avons utilisé tous les modèles de 0 et de 1 vers le haut.
C'est un problème si vous voulez être en mesure de détecter une erreur.
Parce que si vous utilisez déjà 256 valeurs pour vos personnages,
vous n'avez pas vraiment planifier à l'avance, parce que maintenant vous n'avez aucun moyen de dire,
"Ce n'est pas un caractère légitime, ce qui est certain message erroné."
Alors que le monde est fait, ils utilisent la valeur plus grand côté,
quelque chose comme un int sorte que vous avez un certain nombre fou de bits,
32 pour 4 milliards valeurs possibles, de sorte que vous pouvez simplement finir par utiliser,
essentiellement, 257 d'entre eux, dont 1 a une signification particulière comme étant une erreur.
>> Donc, nous allons voir comment cela fonctionne. Dans la ligne 246, j'ai cette grande boucle while
qui appelle fgetc; fichier f sens, getc, puis stdin.
Il s'avère que ce n'est que le moyen le plus précis de dire «lire des données depuis le clavier."
Clavier standard moyen d'entrée, de sortie standard signifie écran,
et l'erreur standard, que nous allons voir dans pset 4, signifie que l'écran,
mais une partie spéciale de l'écran de sorte qu'il n'est pas confondu
avec sortie réelle que vous avez l'intention d'imprimer, mais plus sur cela dans l'avenir.
Donc, fgetc signifie simplement lire un caractère sur le clavier, et de le stocker où?
Conservez-le dans c, et vérifiez ensuite, je suis juste en utilisant des conjonctions booléennes ici,
vérifier qu'il n'est pas égal à \ n, de sorte que l'utilisateur a appuyez sur Entrée.
Nous voulons mettre fin à ce moment-là, à la fin de la boucle, et nous voulons aussi vérifier
pour la constante spéciale, EOF, si vous savez ou suppose - ce que ça représente?
Fin du dossier. Donc, c'est un peu absurde, parce que si je tape au clavier,
il n'y a vraiment pas de fichier impliqué dans cela,
mais ceci est juste une sorte de terme générique utilisé pour désigner
rien d'autre que vient doigts de l'humain. EOF. Fin du dossier.
Soit dit en passant, si vous avez déjà touché contrôle d à votre clavier,
pas que vous auriez encore, vous avez frappé contrôle c.
Mais le contrôle d envoie cette spéciale EOF constante appelée.
>> Alors maintenant, nous avons juste une allocation dynamique de mémoire.
Donc, si n + 1> Capacité, maintenant je vais vous expliquer n.
n est juste combien d'octets sont actuellement dans la mémoire tampon,
la chaîne que vous êtes en train de construire à partir de l'utilisateur.
Si vous avez plus de caractères dans votre tampon que vous avez la capacité de la mémoire tampon,
intuitivement, ce que nous devons faire alors est d'allouer plus de capacité.
Je vais survoler une partie du calcul ici
et se concentrer uniquement sur cette fonction ici.
Vous savez ce que malloc, ou du moins connaissent généralement.
Essayez de deviner ce que realloc fait. [Réponse de l'étudiant, inintelligible]
Ouais >>. Et ce n'est pas tout à fait l'ajout de mémoire, il réaffecte la mémoire comme suit:
S'il ya encore de la place à la fin de la chaîne pour vous donner plus de cette mémoire
que celui qu'il accorde à l'origine toi, alors que tu auras le mémoire supplémentaire.
Ainsi, vous pouvez simplement mettre les caractères cordes dos à dos à dos à dos.
Mais si ce n'est pas le cas, parce que vous avez attendu trop longtemps
et quelque chose au hasard a fait flac dans la mémoire, mais il est extra
mémoire ici-bas, ce n'est pas grave. Realloc va faire tout le levage lourd pour vous,
déplacer la chaîne que vous avez lu dans ce loin d'ici,
le mettre là-bas, et puis vous donner un peu plus de la piste à ce moment-là.
Donc, avec un geste de la main, laissez-moi vous dire que ce qui fait GetString
est ça commence avec un petit tampon, peut-être 1 seul caractère,
et si l'utilisateur tape 2 caractères, GetString finit
appeler realloc et dit: «Oh, 1 caractère n'était pas suffisant.
Donnez-moi 2 caractères. Alors si vous lisez à travers la logique de la boucle,
il va dire: «Oh, l'utilisateur a tapé 3 caractères.
Donne-moi maintenant pas 2, mais 4 caractères, puis me redonnera 8, alors donnez-moi 16 et 32.
Le fait que je suis doublement de la capacité à chaque fois
signifie que la mémoire tampon ne va pas croître lentement.
Il va grandir super rapide, et ce qui pourrait être l'avantage de cela?
Pourquoi suis-je doubler la taille de la mémoire tampon, même si l'utilisateur
pourriez juste besoin de 1 caractère supplémentaire à partir du clavier?
[Réponse de l'étudiant, inintelligible]. >> Qu'est-ce que c'est?
Exactement. Vous n'avez pas à le cultiver aussi souvent.
Et c'est juste une sorte de - vous avez la couverture de vos paris ici.
L'idée étant que vous ne voulez pas appeler realloc beaucoup, car elle tend à être lente.
Chaque fois que vous demandez au système d'exploitation pour la mémoire, comme vous le verrez bientôt
dans un ensemble de problèmes futurs, il a tendance à prendre un certain temps.
Réduisant ainsi au maximum ce laps de temps, même si vous perdez un peu d'espace, tend à être une bonne chose.
>> Mais si nous lisons la dernière partie de GetString ici,
et encore une fois, de comprendre chaque ligne ici n'est pas si important aujourd'hui.
Mais remarquez qu'il appelle finalement malloc nouveau, et il alloue
exactement autant d'octets dont il a besoin pour la chaîne
puis jette loin en appelant gratuitement, le tampon trop grande,
si elle s'est en effet doublé de trop nombreuses fois.
En bref, c'est comme ça que GetString a travaillé tout ce temps.
Tout ce qu'il fait est lu un caractère à la fois, encore et encore et encore
et chaque fois qu'il a besoin de la mémoire supplémentaire, il demande au système d'exploitation pour en appelant realloc.
Des questions? Très bien.
>> Une attaque. Maintenant que nous comprenons pointeurs, ou du moins
sont de plus en plus familiers avec les pointeurs,
nous allons examiner la façon dont le monde entier commence à s'effondrer
si vous n'avez pas tout à fait défendre contre les utilisateurs contradictoire,
les gens qui essaient de s'introduire dans votre système.
Les gens qui tentent de voler votre logiciel en contournant un code d'enregistrement
qu'elles pourraient autrement avoir à taper po
Jetez un oeil à cet exemple ici, qui est simplement le code C
qui a une fonction principale à la partie inférieure, qui appelle une fonction foo,
et ce qui est de la transmettre à toto? [Étudiants] Un seul argument.
L'argument >> unique. Donc, argv [1], ce qui signifie que le premier mot l'utilisateur a tapé
à la ligne de commande après a.out ou quel que soit le programme est appelé.
Ainsi, foo, en haut, en prend un char *, char *, mais c'est exactement ce?
String. Il n'y a rien de nouveau ici, et cette chaîne est arbitrairement appelé bar.
Dans cette ligne ici, char c [12], dans une sorte de semi-technique en anglais, ce qui est de cette ligne fait?
Tableau de -? Caractères. Donnez-moi un tableau de 12 caractères.
Alors nous pourrions appeler cela un tampon. Il est techniquement appelé c, mais un tampon dans la programmation
signifie juste un tas d'espace que vous pouvez mettre quelques trucs po
>> Puis enfin, memcpy, nous n'avons pas utilisé auparavant.
Mais vous pouvez probablement le deviner ce qu'il fait. Il copie la mémoire.
Que faut-il faire? Eh bien, il semble copie bar, son entrée, au c,
mais seulement jusqu'à la longueur de la barre.
Mais il ya un bug ici.
Ok, donc, techniquement, nous devrions vraiment faire strlen (bar) x sizeof (char), c'est exact.
Mais dans le pire des cas ici, supposons que C'est - oui, d'accord.
Puis il ya 2 bugs. Donc, sizeof (char), tous les droits, nous allons faire cela un peu plus large.
Alors maintenant, il ya encore un bug, qui est quoi?
[Réponse de l'étudiant, inintelligible] Check >> pour quoi? Bon, on devrait vérifier
la valeur NULL, car de mauvaises choses arrivent lorsque votre pointeur est NULL,
Parce que vous pourriez finir par y aller, et vous ne devriez jamais aller à NULL
en le déréférencement avec l'opérateur *.
Donc, c'est une bonne chose, et quoi d'autre que nous faisons? Logiquement, il ya une faille ici aussi.
[Réponse de l'étudiant, inintelligible]
Alors >> vérifier si argc ≥ 2?
Bon, il ya 3 bugs dans ce programme ici.
Nous ne sommes pas vérifier si l'utilisateur a effectivement tapé dans quoi que ce soit dans argv [1], c'est bien.
Alors, quel est le bug troisième? Ouais?
[Réponse de l'étudiant, inintelligible] >> Bon.
Donc, nous avons vérifié un scénario. Nous implicitement vérifiée ne pas copier plus de mémoire
que ne dépasse pas la longueur de la barre.
Donc, si la chaîne saisie par l'utilisateur est de 10 caractères dans le long terme,
cela veut dire, 'Seulement copier 10 caractères.
Et ce n'est pas grave, mais si l'utilisateur a tapé un mot à l'invite
comme un mot de 20 caractères, ce qui est, en disant copie 20 caractères dans la barre en quoi?
c, autrement connu comme notre buffer, ce qui signifie que vous venez d'écrire des données
à 8 emplacements d'octets que vous ne possédez pas,
et vous n'en possédez pas, dans le sens que vous n'avez jamais à leur allocation.
Donc, c'est ce qui est généralement connu comme l'attaque de type buffer overflow,
ou le dépassement de tampon attaque, et il l'attaque en ce sens que si l'utilisateur
ou du programme qui appelle votre fonction est de faire de cette malveillance,
ce qui se passe réellement suivante pourrait être tout à fait mauvais.
>> Jetons un coup d'oeil à cette image ici.
Cette image représente votre pile de la mémoire.
Et de rappeler que chaque fois que vous appelez une fonction,
vous obtenez ce petit cadre sur la pile, puis une autre, puis une autre, puis une autre.
Et jusqu'à présent, nous avons juste une sorte de résumé ces loin des rectangles
soit il ya sur la carte ou sur l'écran ici.
Mais si l'on zoom sur l'un de ces rectangles,
lorsque vous appelez une fonction foo, il s'avère qu'il ya plus dans la pile
l'intérieur de ce cadre et ce rectangle
que de x et y et a et b, comme nous n'avons parlé de swap.
Il s'avère qu'il ya des détails de niveau inférieur,
parmi eux l'adresse de retour.
Ainsi, il s'avère quand principale appelle foo, principal doit informer foo
ce qui est l'adresse principale en mémoire de l'ordinateur.
Parce que sinon, dès que foo est faite d'exécution, comme c'est le cas ici,
une fois que vous atteignez cette accolade fermante bouclés à la fin de foo,
comment diable ne sais pas où foo contrôle du programme est censé aller?
Il s'avère que la réponse à cette question se trouve dans le rectangle rouge ici.
Cela représente un pointeur, et c'est à l'ordinateur pour stocker, de façon temporaire,
sur la dite pile l'adresse de principal de telle sorte que dès que foo est faite d'exécution,
l'ordinateur ne sait où et quelle ligne principale en revenir à.
Pointeur à cadre enregistrée concerne de même à cela.
Bar * Char ici représente quoi?
Eh bien, maintenant ce segment bleu est ici foo cadre, quel est bar?
Bon, alors bar est juste l'argument à la fonction foo.
>> Alors maintenant, nous sommes de retour à l'image familière.
Il ya plus de choses et plus de distractions à l'écran
mais ce segment bleu clair est ce que nous avons été en s'appuyant sur le tableau noir pour quelque chose comme swap.
C'est le cadre de foo et la seule chose en ce moment est le bar,
qui est de ce paramètre.
Mais ce qui doit se tenir dans la pile, en fonction de ce code ici?
Char c [12]. Donc, nous devrions également voir 12 carrés de mémoire,
attribué à une variable appelée c.
Et en effet, ce que nous avons à l'écran.
Le très haut il est c [0], puis l'auteur de ce schéma
ne me dérangeait pas tirer toutes les cases, mais il ya en effet 12, il
parce que si vous regardez en bas à droite, c [11], si l'on compte à partir de 0, ce sont les 12 octets de telles.
Mais voici le problème: Dans quelle direction est de plus en plus c?
Trier du haut vers le bas, à droite? Si elle commence par le haut et pousse vers le bas,
ne ressemble pas à notre départ nous piste bien du tout ici.
Nous avons sorte de nous-mêmes dans une impasse,
et que c [11] est bien en place contre la barre, ce qui est tout contre pointeur de frame de pile,
ce qui est tout contre l'adresse de retour, il n'y a pas de room plus.
Alors, quelle est l'implication, donc, si vous bousiller,
et vous essayez de lire 20 octets dans une mémoire tampon de 12 octets?
Où sont ces 8 octets supplémentaires va aller?
A l'intérieur tout le reste, dont une partie est super important.
Et la chose la plus importante, peut-être, est la zone rouge là-bas, l'adresse de retour.
Parce suppose que vous êtes soit accidentellement, soit contradictoirement
écraser ces 4 octets, qui traitent pointeur,
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?
Quelle est la implicaiton, logiquement?
[Les réponses des élèves, inintelligible] >> Exactement. Lorsque foo retourne
et hits qui accolade, le programme va continuer de ne pas retourner au menu principal,
il va revenir à n'importe quelle adresse dans cette case est rouge.
>> Maintenant, dans le cas de l'enregistrement des logiciels contourner,
quelle est l'adresse qui a été retourné à la fonction est
qui obtient normalement appelé après que vous avez payé pour le logiciel et entré votre code d'enregistrement?
Vous pouvez trier des truc dans l'ordinateur ne va pas ici, mais à la place, allant jusqu'à ici.
Ou, si vous êtes vraiment intelligent, un adversaire peut effectivement taper dans le clavier,
par exemple, pas un mot réel, et non pas 20 caractères, mais supposons qu'il ou elle
dans certains types de caractères qui représentent le code?
Et ça ne va pas être du code C, il va y avoir des caractères
que représentent les codes machines binaires, 0 et de 1.
Mais supposons qu'ils sont assez intelligents pour le faire, en quelque sorte coller dans l'invite GetString
quelque chose qui est essentiellement du code compilé,
et les 4 derniers octets écraser l'adresse de retour, et ce n'est que l'entrée Adresse faire?
Le stocke dans ce rectangle rouge de l'adresse du premier octet de la mémoire tampon.
Donc, il faut être très intelligent, et c'est beaucoup d'essais et d'erreurs
pour de mauvaises personnes là-bas, mais si vous pouvez comprendre l'ampleur de ce tampon est,
tels que les quelques octets dans l'entrée que vous fournissez au programme
arrive d'être équivalent à l'adresse de début de la mémoire tampon,
vous pouvez le faire. Si nous disons que, normalement, bonjour, et \ 0, c'est ce qui se retrouve dans la mémoire tampon.
Mais si nous sommes plus intelligents, et nous combler ce tampon avec ce que nous allons appeler du code générique attaque,
A, A, A, A: attaque, attaque, attaque, attaque, où c'est juste quelque chose qui fait quelque chose de mal.
Eh bien, qu'est-ce qui se passe si vous êtes très intelligent, vous pourriez faire ceci:
Dans la boîte rouge ici est une séquence de nombres: 80, CO, 35, 08.
Notez que le nombre qui correspond à ce que qui se passe ici.
C'est dans l'ordre inverse, mais plus sur cela une autre fois.
Notez que cette adresse de retour a été délibérément modifié
d'égaler l'adresse ici, et non pas l'adresse du principal.
Donc, si le méchant est super intelligent, il ou elle va d'inclure dans ce code d'attaque
quelque chose comme «Supprimer tous les fichiers de l'utilisateur.
Ou «Copier les mots de passe» ou «Créer un compte d'utilisateur que je peux connecter à.
Rien du tout, et c'est à la fois le danger et la puissance de C.
Parce que vous avez accès à la mémoire par l'intermédiaire de pointeurs
et vous pouvez donc écrire ce que vous voulez dans la mémoire d'un ordinateur.
Vous pouvez faire un ordinateur de faire ce que vous voulez tout simplement en
avoir sauter partout au sein de son propre espace mémoire.
Et donc, à ce jour, tant de programmes et de sites Web tant qui sont compromises
se résument à des gens qui profitent de cette.
Et cela peut sembler comme une attaque super-sophistiqué,
mais il ne commence pas toujours de cette façon.
>> La réalité est que ce qui est généralement de mauvaises gens faire est,
qu'il s'agisse d'un programme à une ligne de commande ou une application graphique ou un site web,
est que vous venez de commencer à fournir des bêtises.
Vous tapez un mot vraiment grand dans le champ de recherche et appuyez sur Entrée,
et vous attendre pour voir si les accidents de site Web.
Ou vous attendez de voir si le programme manifeste un certain message d'erreur.
Parce que si vous avez de la chance, comme le méchant,
et de vous fournir certaines entrées fou qui fait planter le programme,
cela signifie que le programmeur ne s'attendait pas à votre mauvais comportement
ce qui signifie que vous pouvez probablement, avec assez d'efforts,
essai et d'erreur assez, trouver une façon de mener une attaque plus précise.
Donc, comme partie intégrante de la sécurité n'est pas seulement d'éviter ces attaques tout à fait, mais les détecter
et effectivement regarder les journaux et voir ce que les entrées fous des gens tapés dans votre site Web.
Quels termes de recherche ont tapé les gens dans votre site web dans l'espoir de déborder une partie du tampon?
Et cela se résume à des bases simples de ce qui est un tableau,
et qu'est-ce que cela signifie d'allouer et d'utiliser la mémoire?
Et lié à cela, aussi, est-ce.
>> Donc, nous allons juste jeter un regard à l'intérieur d'un disque dur encore une fois.
Donc, vous vous souvenez d'une semaine ou deux il ya que lorsque vous faites glisser des fichiers
à votre corbeille ou corbeille, ce qui se passe?
[Étudiants] Rien. Oui >>, absolument rien. Finalement, si vous êtes à court
sur l'espace disque, Windows ou Mac OS commence à supprimer les fichiers pour vous.
Mais si vous faites glisser quelque chose là-dedans, alors ce n'est pas du tout en sécurité.
Tout membre de votre colocataire, ami ou famille a à faire est de double-cliquer sur, et le tour est joué.
Il ya tous les fichiers sommaires que vous avez essayé de supprimer.
Ainsi, la plupart d'entre nous savons au moins que vous avez à faire un clic droit ou clic contrôler
et videz la corbeille, ou quelque chose comme ça.
Mais même alors, ce n'est pas tout à fait faire l'affaire.
Parce que ce qui arrive quand vous avez un fichier sur votre disque dur
qui représente un certain document Word ou un JPEG?
Et cela représente votre disque dur, et disons que ce ruban représente ici ce fichier,
et il est composé de tout un tas de 0 et de 1.
Qu'est-ce qui se passe quand vous avez non seulement faire glisser ce fichier vers la corbeille ou corbeille,
mais aussi le vider?
Trier de rien. Ce n'est pas rien maintenant.
Maintenant, c'est juste rien, car un petit quelque chose qui se passe dans la forme de cette table.
Il ya donc une sorte de base de données ou d'une table à l'intérieur de la mémoire d'un ordinateur
qui a essentiellement la colonne 1 pour les noms de fichiers,
et 1 colonne pour l'emplacement du fichier, où cela pourrait être l'emplacement 123, juste un nombre aléatoire.
Donc, nous pourrions avoir quelque chose comme x.jpg, et l'emplacement 123.
Et ce qui arrive ensuite, lorsque vous videz votre corbeille?
Qui s'en va. Mais ce qui ne va pas de là se trouve le 0 et de 1.
>> Alors qu'est-ce, alors, la connexion au pset 4?
Eh bien, avec pset 4, juste parce que nous avons accidentellement effacé
la carte compact flash qui avait toutes ces photos,
ou tout simplement parce que la malchance est devenu corrompu,
ne signifie pas que les 0 et 1 ne sont pas encore là.
Peut-être quelques-uns d'entre eux sont perdus parce que quelque chose a été corrompu
en ce sens que certains de 0 devient 1 et de 1 devient 0.
De mauvaises choses peuvent arriver à cause de logiciels défectueux ou matériel défectueux.
Mais beaucoup de ces bits, peut-être même 100% d'entre eux sont toujours là,
c'est juste que l'ordinateur ou l'appareil photo ne sait pas où JPEG 1 a commencé
et où JPEG 2 a commencé, mais si vous, le programmeur,
savoir, avec un peu de bon sens, où les fichiers JPEG sont ou à quoi ils ressemblent,
vous pouvez analyser les 0 et 1 et dire, 'Oh. JPEG. Ooh, JPEG.
Vous pouvez écrire un programme avec essentiellement juste une boucle for ou while
qui récupère tous et chacun de ces fichiers.
Donc, la leçon est donc de commencer "en toute sécurité" effacer vos fichiers
si vous voulez éviter ce tout à fait. Oui?
[Question étudiants, inintelligible]
Avez >> plus de mémoire que vous avez fait avant -
Oh! Bonne question. Pourquoi, alors, après avoir vidé la corbeille,
votre ordinateur, vous ne dites que vous avez plus d'espace libre que vous avez fait avant?
En un mot, parce qu'il a menti. Plus techniquement, vous n'avez plus d'espace.
Parce que maintenant, vous avez dit, vous pouvez mettre d'autres choses où ce fichier a déjà été,
mais cela ne veut pas dire que les bits s'en vont,
et cela ne signifie pas les bits sont changés tous les 0, par exemple, pour votre protection.
En revanche, si vous en toute sécurité "" effacer des fichiers, ou de détruire physiquement l'appareil,
c'est vraiment la seule façon, parfois, autour de cela.
Alors pourquoi ne pas nous laisser sur cette note semi-effrayant, et nous vous verrai lundi.
CS50.TV