1 00:00:00,000 --> 00:00:02,860 [Powered by Google Translate] [Week 5] 2 00:00:02,860 --> 00:00:04,860 [David J. Malan - Harvard University] 3 00:00:04,860 --> 00:00:07,260 [Dit is CS50. - CS50.TV] 4 00:00:07,260 --> 00:00:09,740 >> Dit is CS50, Week 5. 5 00:00:09,740 --> 00:00:12,900 Vandaag en deze week, introduceren we een beetje van de wereld van de forensische 6 00:00:12,900 --> 00:00:14,850 in de context van het probleem Set 4. 7 00:00:14,850 --> 00:00:18,480 Vandaag zal een verkorte lezing zijn omdat er een bijzondere gebeurtenis in hier achteraf. 8 00:00:18,480 --> 00:00:21,940 Dus nemen we een kijkje en plagen zowel leerlingen en ouders vandaag de dag 9 00:00:21,940 --> 00:00:24,600 met een aantal van de dingen die aan de horizon. 10 00:00:24,600 --> 00:00:29,050 >> Onder hen, vanaf maandag, heb je nog een paar klasgenoten. 11 00:00:29,050 --> 00:00:32,980 EDX, Harvard en nieuwe online-MIT initiatief voor OpenCourseWare en nog veel meer, 12 00:00:32,980 --> 00:00:36,730 lanceert op de campus van Harvard op maandag, wat betekent dat komende maandag 13 00:00:36,730 --> 00:00:40,930 je zult hebben met ingang van de laatste telling, 86.000 extra klasgenoten 14 00:00:40,930 --> 00:00:43,680 die zullen worden na samen met CS50's lezingen en secties 15 00:00:43,680 --> 00:00:45,890 en walkthroughs en probleem sets. 16 00:00:45,890 --> 00:00:51,870 En als onderdeel van dit, zult u lid worden van de inaugurele klasse van CS50 en nu CS50x. 17 00:00:51,870 --> 00:00:56,150 Als onderdeel van deze nu realiseren dat er zullen een aantal positieve kanten ook. 18 00:00:56,150 --> 00:01:00,620 Om klaar te zijn voor dit, voor de massale aantal studenten, 19 00:01:00,620 --> 00:01:03,820 volstaat het om te zeggen dat ook al hebben we 108 TFS en CA's, 20 00:01:03,820 --> 00:01:07,560 het is niet helemaal de beste leerling-leraar ratio zodra we raken 80.000 van de studenten. 21 00:01:07,560 --> 00:01:09,830 We gaan niet te sorteren zo veel probleem stelt handmatig, 22 00:01:09,830 --> 00:01:13,050 dus introduceerde deze week in het probleem set CS50 Controleer zijn, 23 00:01:13,050 --> 00:01:15,410 die zal een command-line utility binnen het apparaat 24 00:01:15,410 --> 00:01:17,880 dat krijg je als je eenmaal vervolgens bijwerken dit weekend. 25 00:01:17,880 --> 00:01:21,030 Je zult in staat zijn om een ​​opdracht, check50, op uw eigen PSET, 26 00:01:21,030 --> 00:01:24,770 en je krijgt meteen feedback over de vraag of uw programma juist of onjuist is 27 00:01:24,770 --> 00:01:27,980 volgens verschillende ontwerpspecificaties die we hebben. 28 00:01:27,980 --> 00:01:30,310 Meer in dat het probleem set specificaties. 29 00:01:30,310 --> 00:01:34,220 De CS50x klasgenoten zullen worden met behulp van deze ook. 30 00:01:34,220 --> 00:01:36,170 >> Probleem Set 4 is alles over forensisch onderzoek, 31 00:01:36,170 --> 00:01:38,630 en dit PSET was echt geïnspireerd door een aantal real-life stuff 32 00:01:38,630 --> 00:01:41,210 waarbij toen ik in graduate school ik geïnterneerd voor een tijdje 33 00:01:41,210 --> 00:01:45,270 met Middlesex County District Attorney's kantoor doet forensisch werk 34 00:01:45,270 --> 00:01:47,660 met hun voorsprong forensisch onderzoeker. 35 00:01:47,660 --> 00:01:50,280 Wat dit voor, bedroeg en ik denk dat ik al een paar weken voorbij, 36 00:01:50,280 --> 00:01:52,720 wordt de mis State Police en anderen komen, 37 00:01:52,720 --> 00:01:56,150 zouden ze drop off dingen zoals harde schijven en cd's en diskettes en dergelijke, 38 00:01:56,150 --> 00:01:58,770 en dan het doel van de forensische kantoor was om na te gaan 39 00:01:58,770 --> 00:02:01,470 of er sprake was of was geen bewijs van een soort. 40 00:02:01,470 --> 00:02:04,730 Dit was de Special Investigations Unit, dus het was witteboordencriminaliteit. 41 00:02:04,730 --> 00:02:10,949 Het was meer verontrustend soort misdaden, alles wat met een soort van digitale media. 42 00:02:10,949 --> 00:02:16,450 Het blijkt dat niet dat veel mensen een e-mail te zeggen schrijven, "ik het deed." 43 00:02:16,450 --> 00:02:20,490 Dus heel vaak hebben deze forensische zoekacties niet opdagen heel veel fruit, 44 00:02:20,490 --> 00:02:22,820 maar soms mensen zouden schrijven dergelijke e-mails. 45 00:02:22,820 --> 00:02:25,240 Dus soms werden de inspanningen beloond. 46 00:02:25,240 --> 00:02:31,210 >> Maar om te leiden tot dit forensisch PSET, zullen we introduceren in pset4 een beetje graphics. 47 00:02:31,210 --> 00:02:35,410 U waarschijnlijk deze dingen voor lief - JPEG, GIF, en dergelijke - deze dagen. 48 00:02:35,410 --> 00:02:38,320 Maar als je echt goed over nadenkt, een beeld, net als het gezicht van Rob, 49 00:02:38,320 --> 00:02:41,270 kan worden gemodelleerd als een reeks puntjes of pixels. 50 00:02:41,270 --> 00:02:43,380 Bij gezicht Rob, er allerlei kleuren, 51 00:02:43,380 --> 00:02:46,760 en begonnen we de afzonderlijke puntjes, ook wel pixels zien, 52 00:02:46,760 --> 00:02:48,610 als we eenmaal begonnen om in te zoomen 53 00:02:48,610 --> 00:02:54,660 Maar als we vereenvoudigen de wereld een beetje en gewoon zeggen dat dit hier is Rob in zwart-wit, 54 00:02:54,660 --> 00:02:57,490 in zwart-wit te vertegenwoordigen, kunnen we gewoon gebruik maken van binaire. 55 00:02:57,490 --> 00:03:01,660 En als we gaan binary, 1 of 0, kunnen spreken we dit hetzelfde beeld 56 00:03:01,660 --> 00:03:06,140 van lachende gezicht van Rob met dit patroon van bits. 57 00:03:06,140 --> 00:03:12,100 11000011 staat voor wit, wit, zwart, zwart, zwart, zwart, wit, wit. 58 00:03:12,100 --> 00:03:16,150 En dus het is niet een enorme sprong dan om te beginnen met praten over kleurrijke foto's, 59 00:03:16,150 --> 00:03:18,600 dingen die je zou zien op Facebook of neem met een digitale camera. 60 00:03:18,600 --> 00:03:21,410 Maar zeker als het gaat om kleuren, moet je meer bits. 61 00:03:21,410 --> 00:03:25,690 En heel gebruikelijk in de wereld van de foto's is het gebruik van niet 1-bits kleur, 62 00:03:25,690 --> 00:03:29,560 als dit al doet vermoeden, maar 24-bits kleuren, waar je eigenlijk miljoenen kleuren te krijgen. 63 00:03:29,560 --> 00:03:32,250 Zodat in het geval dat we ingezoomd oog Rob, 64 00:03:32,250 --> 00:03:36,370 dat was van een aantal miljoenen verschillende kleurrijke mogelijkheden. 65 00:03:36,370 --> 00:03:39,040 Dus we zullen introduceren deze in Probleem Set 4 als in de walkthrough, 66 00:03:39,040 --> 00:03:43,370 die zal vandaag om 3:30 in plaats van de gebruikelijke 02:30 door lezing van vrijdag hier. 67 00:03:43,370 --> 00:03:46,620 Maar video zal online zoals gewoonlijk morgen. 68 00:03:46,620 --> 00:03:48,820 >> We zullen ook kennis maken met een ander bestandsformaat. 69 00:03:48,820 --> 00:03:51,270 Dit is met opzet bedoeld om intimiderend op het eerste, 70 00:03:51,270 --> 00:03:55,670 maar dit is slechts enkele documentatie voor een C struct. 71 00:03:55,670 --> 00:03:58,940 Het blijkt dat Microsoft jaren geleden geholpen populariseren dit formaat 72 00:03:58,940 --> 00:04:05,150 riep de bitmap bestandsformaat, bmp, en dit was een super eenvoudige, kleurrijke grafische bestandsformaat 73 00:04:05,150 --> 00:04:10,150 die werd gebruikt voor heel wat tijd en soms nog voor behang op desktops. 74 00:04:10,150 --> 00:04:14,760 Als je terugdenkt aan Windows XP en de glooiende heuvels en de blauwe hemel, 75 00:04:14,760 --> 00:04:17,170 die typisch was een bmp of bitmapafbeelding. 76 00:04:17,170 --> 00:04:19,959 Bitmaps zijn leuk voor ons, omdat ze een beetje meer complexiteit. 77 00:04:19,959 --> 00:04:22,610 Het is niet zo simpel als dit raster van 0s en 1s. 78 00:04:22,610 --> 00:04:27,510 In plaats daarvan, heb je dingen zoals een header aan het begin van een bestand. 79 00:04:27,510 --> 00:04:31,990 Dus met andere woorden, de binnenkant van een. Bmp-bestand is een hele hoop van 0s en 1s, 80 00:04:31,990 --> 00:04:34,910 maar er is een aantal extra 0s en 1s in. 81 00:04:34,910 --> 00:04:38,220 En het blijkt dat wat we waarschijnlijk al vanzelfsprekend al jaren - 82 00:04:38,220 --> 00:04:45,170 bestandsformaten zoals. doc of. xls of. mp3,. mp4, ongeacht de bestandsformaten 83 00:04:45,170 --> 00:04:48,480 dat u bekend bent met - wat betekent het zelfs betekenen naar een bestandsformaat zijn, 84 00:04:48,480 --> 00:04:52,480 want aan het eind van de dag al deze bestanden gebruiken we zojuist 0s en 1s. 85 00:04:52,480 --> 00:04:56,810 En misschien die 0s en 1s vertegenwoordigen ABC door middel van ASCII of iets dergelijks, 86 00:04:56,810 --> 00:04:58,820 maar aan het eind van de dag, het is nog steeds gewoon 0s en 1s. 87 00:04:58,820 --> 00:05:02,100 Dus mensen gewoon af en toe besluiten om een ​​nieuw bestandsformaat uitvinden 88 00:05:02,100 --> 00:05:06,420 waar ze standaardiseren welke patronen van bits eigenlijk betekent. 89 00:05:06,420 --> 00:05:09,220 En in dit geval hier, de mensen die het ontwerp van de bitmapbestand 90 00:05:09,220 --> 00:05:15,620 zei dat bij de eerste byte in een bitmap-bestand als, aangegeven met offset 0 daar, 91 00:05:15,620 --> 00:05:18,940 er gaat wat cryptisch benoemde variabele genaamd bfType zijn, 92 00:05:18,940 --> 00:05:23,080 die net staat voor bitmap-bestand type, welk type bitmap-bestand is dit. 93 00:05:23,080 --> 00:05:27,700 U kunt misschien wel afleiden uit de tweede rij dat offset 2, byte nummer 2, 94 00:05:27,700 --> 00:05:33,740 heeft een patroon van 0s en 1s dat wat voorstelt? De grootte van iets. 95 00:05:33,740 --> 00:05:35,310 En het gaat van daaruit verder. 96 00:05:35,310 --> 00:05:37,410 Dus in Probleem Set 4, zult u worden gelopen door een aantal van deze dingen. 97 00:05:37,410 --> 00:05:39,520 We zullen niet eindigen zorgen te maken over hen allen. 98 00:05:39,520 --> 00:05:47,510 Maar let op het begint te interessanter rond byte 54: rgbtBlue, Groen en Rood. 99 00:05:47,510 --> 00:05:52,110 Als je ooit gehoord van de afkorting RGB - rood, groen, blauw - dit is een verwijzing naar die 100 00:05:52,110 --> 00:05:54,610 want het blijkt dat je kunt schilderen alle kleuren van de regenboog 101 00:05:54,610 --> 00:05:58,180 met een combinatie van rood en blauw en groen. 102 00:05:58,180 --> 00:06:03,320 En in feite zou de ouders in de kamer herinneren enkele van de eerste projectoren. 103 00:06:03,320 --> 00:06:05,890 Deze dagen, zie je gewoon een helder licht uit een lens, 104 00:06:05,890 --> 00:06:09,800 maar terug in de dag had je de rode lens, de blauwe lens, en de groene lens, 105 00:06:09,800 --> 00:06:13,380 en samen vormen ze gericht zijn op een scherm en vormden een kleurrijk beeld. 106 00:06:13,380 --> 00:06:16,270 En heel vaak, zou middelbare scholen en middelbare scholen hebben deze lenzen 107 00:06:16,270 --> 00:06:19,720 ooit zo iets scheef, dus je was soort van het zien van dubbele of driedubbele beelden. 108 00:06:19,720 --> 00:06:24,100 Maar dat was het idee. Je had rood en groen en blauw licht het schilderen van een beeld. 109 00:06:24,100 --> 00:06:26,590 En dat hetzelfde principe wordt gebruikt in computers. 110 00:06:26,590 --> 00:06:30,230 >> Dus een van de uitdagingen dan voor u in Probleem Set 4 gaan zijn een paar dingen. 111 00:06:30,230 --> 00:06:34,800 Een daarvan is om daadwerkelijk formaat van een beeld, om in een patroon van 0s en 1s, 112 00:06:34,800 --> 00:06:40,200 erachter te komen welke brokken van 0s en 1s vertegenwoordigen wat in een structuur als deze, 113 00:06:40,200 --> 00:06:43,630 en dan erachter te komen hoe de pixels te repliceren - de rode wijnen, de blues, de greens - 114 00:06:43,630 --> 00:06:46,660 binnen zodat wanneer een foto ziet er in eerste instantie als dit, 115 00:06:46,660 --> 00:06:49,210 het zou in plaats daarvan er zo uitzien na dat. 116 00:06:49,210 --> 00:06:53,640 Onder de andere uitdagingen te gaat worden dat je een forensisch beeld worden overhandigd 117 00:06:53,640 --> 00:06:56,030 een effectief bestand van een digitale camera. 118 00:06:56,030 --> 00:06:58,960 En op die camera, Once upon a time, waren een hele hoop foto's. 119 00:06:58,960 --> 00:07:03,760 Het probleem is dat we per ongeluk gewist of had het beeld een of andere manier beschadigd. 120 00:07:03,760 --> 00:07:05,750 Slechte dingen gebeuren met digitale camera's. 121 00:07:05,750 --> 00:07:09,150 En dus hebben we snel gekopieerd alle 0s en 1s af van die kaart voor u, 122 00:07:09,150 --> 00:07:13,610 redde hen allemaal in een groot bestand, en dan zullen we ze overhandigen aan u in Probleem Set 4 123 00:07:13,610 --> 00:07:19,320 zodat u een programma in C waarmee al die JPEG-bestanden te herstellen ideaal schrijven,. 124 00:07:19,320 --> 00:07:23,330 En het blijkt dat JPEG's, ook al zijn ze een beetje zijn van een complex bestandsformaat - 125 00:07:23,330 --> 00:07:26,360 ze zijn veel complexer dan dit lachend gezicht hier - 126 00:07:26,360 --> 00:07:31,160 het blijkt dat elke JPEG begint met dezelfde patronen van 0s en 1s. 127 00:07:31,160 --> 00:07:35,630 Dus met behulp van, uiteindelijk, een while-lus of een for-lus of iets dergelijks, 128 00:07:35,630 --> 00:07:38,880 u kunt itereren over alle 0s en 1s in deze forensische beeld, 129 00:07:38,880 --> 00:07:43,150 en elke keer zie je de speciale patroon dat is gedefinieerd in het probleem set specificatie, 130 00:07:43,150 --> 00:07:47,880 u hier veronderstellen is, met zeer hoge waarschijnlijkheid het begin van een JPEG. 131 00:07:47,880 --> 00:07:51,230 En zodra je hetzelfde patroon een bepaald aantal bytes 132 00:07:51,230 --> 00:07:55,430 of kilobytes of megabytes later, dan kunt u hier aannemen is een tweede JPEG, 133 00:07:55,430 --> 00:07:57,380 de foto die ik nam na de eerste. 134 00:07:57,380 --> 00:08:01,370 Laat me stoppen met lezen, dat eerste bestand, start het schrijven van dit nieuwe, 135 00:08:01,370 --> 00:08:06,310 en de uitvoer van je programma voor pset4 gaat worden maar liefst 50 JPEG's. 136 00:08:06,310 --> 00:08:09,270 En als het niet 50 JPEG's, heb je een beetje een lus. 137 00:08:09,270 --> 00:08:12,490 Als u een oneindig aantal JPEG-bestanden, heb je een oneindige lus. 138 00:08:12,490 --> 00:08:14,910 Dus dat zal ook een veel voorkomend geval te zijn. 139 00:08:14,910 --> 00:08:16,600 Dus dat is wat er aan de horizon. 140 00:08:16,600 --> 00:08:21,310 >> Quiz 0 achter ons, beseffen per mijn e dat altijd zijn er mensen die zijn allebei blij, 141 00:08:21,310 --> 00:08:23,640 soort van neutrale, en verdrietig rond quiz 0 tijd. 142 00:08:23,640 --> 00:08:26,800 En dan kunt u uit te reiken naar mij, het hoofd TF Zamyla, uw eigen TF, 143 00:08:26,800 --> 00:08:31,180 of een van de CA's waarvan je weet als je zou willen om te bespreken hoe het ging. 144 00:08:31,180 --> 00:08:35,539 >> Dus om hier indruk maken op de ouders in de kamer, wat is de CS50 bibliotheek? 145 00:08:36,429 --> 00:08:40,390 [Gelach] Good job. 146 00:08:40,390 --> 00:08:48,340 Wat is de CS50 bibliotheek? Ja. >> [Student] Het is een vooraf geschreven verzameling code [onverstaanbaar] 147 00:08:48,340 --> 00:08:49,750 Oke, goed. 148 00:08:49,750 --> 00:08:53,240 Het is een vooraf geschreven verzameling code die we het personeel schreven, bieden wij u, 149 00:08:53,240 --> 00:08:55,030 dat voorziet in een aantal gemeenschappelijke functies, 150 00:08:55,030 --> 00:08:59,020 Dingen als je me een string, geef me een int - alle functies die hier worden vermeld. 151 00:08:59,020 --> 00:09:02,260 >> Vanaf nu beginnen we echt met deze zijwieltjes eraf. 152 00:09:02,260 --> 00:09:05,050 We gaan beginnen weg te nemen een string van u, 153 00:09:05,050 --> 00:09:08,870 die recall was gewoon een synoniem voor wat feitelijke gegevens type? >> [Meerdere studenten] Char *. 154 00:09:08,870 --> 00:09:12,730 Char *. Voor ouders, dat was waarschijnlijk [maakt suizend geluid]. Dat is goed. 155 00:09:12,730 --> 00:09:17,550 Char * beginnen we te zien op het scherm des te meer als we regel te verwijderen uit onze woordenschat, 156 00:09:17,550 --> 00:09:19,730 in ieder geval als het gaat om daadwerkelijk schrijven van code. 157 00:09:19,730 --> 00:09:22,840 Ook zullen we stoppen met het gebruik van sommige van deze functies zo veel 158 00:09:22,840 --> 00:09:25,280 omdat onze programma's gaat krijgen meer verfijnd. 159 00:09:25,280 --> 00:09:28,480 In plaats van alleen programma's schrijven die daar te zitten met een prompt knippert, 160 00:09:28,480 --> 00:09:31,870 wachten op de gebruiker om iets te typen, krijg je je input van elders. 161 00:09:31,870 --> 00:09:35,490 Zo krijg je ze uit een reeks van bits op de lokale vaste schijf. 162 00:09:35,490 --> 00:09:38,580 Je zult in plaats daarvan krijgen ze in de toekomst van een netwerkverbinding, 163 00:09:38,580 --> 00:09:40,230 sommige website ergens. 164 00:09:40,230 --> 00:09:44,110 >> Dus laten we schil terug deze laag voor de eerste keer en trek de CS50 Appliance 165 00:09:44,110 --> 00:09:49,010 en dit bestand genaamd cs50.h, die je hebt # ook voor weken, 166 00:09:49,010 --> 00:09:51,140 maar laten we echt zien wat er in deze. 167 00:09:51,140 --> 00:09:54,430 De top van het bestand in het blauw is gewoon een hele hoop reacties: 168 00:09:54,430 --> 00:09:57,050 informatie over de garantie en licenties. 169 00:09:57,050 --> 00:09:59,050 Dit is een soort van een gemeenschappelijk paradigma in software 170 00:09:59,050 --> 00:10:01,580 omdat veel software deze dagen is wat open source genoemd, 171 00:10:01,580 --> 00:10:05,220 Dit betekent dat iemand de code geschreven en maakte het vrij beschikbaar 172 00:10:05,220 --> 00:10:10,470 niet alleen te lopen en te gebruiken, maar om daadwerkelijk te lezen en te veranderen en te integreren in je eigen werk. 173 00:10:10,470 --> 00:10:14,660 Dus dat is wat je hebt gebruikt, open source software, zij het in een zeer kleine vorm. 174 00:10:14,660 --> 00:10:18,560 Als ik scroll naar beneden langs de opmerkingen, hoewel, beginnen we wat meer bekende dingen te zien. 175 00:10:18,560 --> 00:10:25,010 Kennisgeving aan de top hier dat de cs50.h bestand een hele hoop van header-bestanden bevat. 176 00:10:25,010 --> 00:10:28,560 De meeste van deze hebben we niet eerder gezien, maar men bekend is. 177 00:10:28,560 --> 00:10:32,270 Welke van deze hebben we gezien, zij het kort, tot nu toe? >> [Student] Standaard bibliotheek. 178 00:10:32,270 --> 00:10:35,810 Ja, standaard bibliotheek. stdlib.h heeft malloc. 179 00:10:35,810 --> 00:10:38,320 Zodra we begonnen te praten over dynamisch geheugen toewijzing, 180 00:10:38,320 --> 00:10:41,650 die we zullen terugkomen om volgende week ook, we begonnen met inbegrip van dat bestand. 181 00:10:41,650 --> 00:10:46,640 Het blijkt dat bool en waar en onwaar niet werkelijk bestaan ​​in C per se 182 00:10:46,640 --> 00:10:49,440 tenzij u onder meer dit bestand hier. 183 00:10:49,440 --> 00:10:52,710 We hebben wekenlang zijn inclusief stdbool.h 184 00:10:52,710 --> 00:10:55,620 zodat u kunt gebruik maken van de notie van een bool, waar of onwaar. 185 00:10:55,620 --> 00:10:58,620 Zonder deze, zou je moeten sorteren van faken en een int gebruiken 186 00:10:58,620 --> 00:11:02,610 en gewoon willekeurig aannemen dat 0 false is en 1 is waar. 187 00:11:02,610 --> 00:11:07,150 Als we naar beneden scrollen verder, hier is onze definitie van een string. 188 00:11:07,150 --> 00:11:11,390 Het blijkt, zoals we al eerder heb gezegd, dat waar deze ster is niet echt belangrijk. 189 00:11:11,390 --> 00:11:13,720 U kunt zelfs ruimte rondom. 190 00:11:13,720 --> 00:11:16,740 We dit semester zijn het bevorderen van het als dit om duidelijk te maken 191 00:11:16,740 --> 00:11:18,620 de ster heeft te maken met het type, 192 00:11:18,620 --> 00:11:21,700 maar realiseer net zo gewoon, zo niet een beetje meer gemeenschappelijke, 193 00:11:21,700 --> 00:11:24,430 is om daar te zetten, maar functioneel is het hetzelfde. 194 00:11:24,430 --> 00:11:27,720 Maar nu, als we lezen verder omlaag, laten we eens een kijkje op GetInt 195 00:11:27,720 --> 00:11:32,190 omdat we dat misschien eerst voordat er iets anders dit semester. 196 00:11:32,190 --> 00:11:37,440 Hier is GetInt. Dit is wat? >> [Student] Een prototype. >> Dit is slechts een prototype. 197 00:11:37,440 --> 00:11:41,410 Vaak hebben we prototypes op de toppen van onze. C-bestanden, 198 00:11:41,410 --> 00:11:46,690 maar u kunt er ook prototypes in header-bestanden,. h-bestanden, zoals deze hier 199 00:11:46,690 --> 00:11:50,840 zodat wanneer u een aantal functies schrijven die u wilt dat andere mensen om te kunnen gebruiken, 200 00:11:50,840 --> 00:11:53,550 hetgeen precies het geval met de CS50 bibliotheek 201 00:11:53,550 --> 00:11:57,040 u niet alleen het implementeren van uw functies in iets als cs50.c, 202 00:11:57,040 --> 00:12:02,790 ook de prototypes maken niet bovenaan dat bestand maar bovenaan een header bestand. 203 00:12:02,790 --> 00:12:07,170 Dan is dat header-bestand is wat vrienden en collega's onder meer 204 00:12:07,170 --> 00:12:09,760 met # include in hun eigen code. 205 00:12:09,760 --> 00:12:12,210 Dus al die tijd, heb je al met inbegrip van alle van deze prototypes, 206 00:12:12,210 --> 00:12:16,580 effectief aan de bovenkant van uw bestand, maar door middel van deze # include mechanisme, 207 00:12:16,580 --> 00:12:20,070 die in wezen kopieert en plakt dit bestand in uw eigen. 208 00:12:20,070 --> 00:12:23,070 Hier is een aantal tamelijk gedetailleerde documentatie. 209 00:12:23,070 --> 00:12:25,640 We hebben vrij veel vanzelfsprekend dat GetInt een int krijgt, 210 00:12:25,640 --> 00:12:27,640 maar het blijkt dat er een aantal randgevallen. 211 00:12:27,640 --> 00:12:31,810 Wat als de gebruiker een nummer dat is veel te groot, een triljoen, 212 00:12:31,810 --> 00:12:35,490 dat kan gewoon niet passen binnen van een int? Wat is het verwachte gedrag? 213 00:12:35,490 --> 00:12:38,020 Idealiter is voorspelbaar. 214 00:12:38,020 --> 00:12:40,280 Dus in dit geval, als u daadwerkelijk de kleine lettertjes gelezen, 215 00:12:40,280 --> 00:12:44,500 je zult echt zien dat als de lijn niet kan worden gelezen, dit rendement INT_MAX. 216 00:12:44,500 --> 00:12:48,320 We hebben nog nooit over gehad, maar op basis van de kapitalisatie, wat is het waarschijnlijk? 217 00:12:48,320 --> 00:12:50,640 [Student] Een constante. >> Het is een constante. 218 00:12:50,640 --> 00:12:54,770 Het is een aantal speciale constante die waarschijnlijk is verklaard in een van die header files 219 00:12:54,770 --> 00:13:00,090 dat is hoger in het bestand en INT_MAX is waarschijnlijk iets als ongeveer 2 miljard, 220 00:13:00,090 --> 00:13:04,990 het idee is dat omdat we moeten een of andere manier aan te geven dat er iets mis ging, 221 00:13:04,990 --> 00:13:10,700 wij, ja, hebben 4 miljard nummers tot onze beschikking: -2 miljard tot 2 miljard, geven of te nemen. 222 00:13:10,700 --> 00:13:14,710 Nou, wat gebruikelijk is in de programmering is dat je steelt slechts een van die nummers, 223 00:13:14,710 --> 00:13:18,920 maybe 0, misschien 2 miljard, misschien -2 miljard, 224 00:13:18,920 --> 00:13:23,280 dus je besteedt een van uw mogelijke waarden, zodat u kunt inzetten voor de wereld 225 00:13:23,280 --> 00:13:26,820 dat als er iets mis gaat, zal ik terug deze super grote waarde. 226 00:13:26,820 --> 00:13:31,030 Maar u niet wilt dat de gebruiker typt iets cryptisch als 234 ..., echt een groot aantal. 227 00:13:31,030 --> 00:13:34,060 U in plaats daarvan generaliseren het als een constante. 228 00:13:34,060 --> 00:13:38,060 Dus echt, als je dat anale de afgelopen weken, elke keer dat je de naam GetInt, 229 00:13:38,060 --> 00:13:42,900 je had moeten controleren met een als voorwaarde heeft de gebruiker typt INT_MAX, 230 00:13:42,900 --> 00:13:46,590 of, meer in het bijzonder, deed GetInt terugkeer INT_MAX, want als het deed, 231 00:13:46,590 --> 00:13:51,830 dat betekent eigenlijk dat ze niet typen. Er ging iets mis in dit geval. 232 00:13:51,830 --> 00:13:56,080 Dus dit is wat algemeen bekend staat als een schildwacht waarde, wat gewoon betekent bijzonder. 233 00:13:56,080 --> 00:13:58,120 >> Laten we nu eens om te zetten in de. C bestand. 234 00:13:58,120 --> 00:14:01,340 De C-bestand bestaat in het toestel voor bepaalde tijd. 235 00:14:01,340 --> 00:14:06,840 En in feite, het apparaat heeft het pre-gecompileerd op u in dat ding noemden we objectcode, 236 00:14:06,840 --> 00:14:09,540 maar het werkt gewoon niet relevant zijn voor u waar het is omdat het systeem weet 237 00:14:09,540 --> 00:14:11,730 in dit geval is: het apparaat. 238 00:14:11,730 --> 00:14:17,400 Laten we naar beneden scrollen nu GetInt en hoe GetInt werkt al zien al die tijd. 239 00:14:17,400 --> 00:14:19,460 Hier hebben we soortgelijke opmerkingen van tevoren. 240 00:14:19,460 --> 00:14:21,660 Laat me in te zoomen op alleen de code gedeelte. 241 00:14:21,660 --> 00:14:23,900 En wat we hebben voor GetInt is het volgende. 242 00:14:23,900 --> 00:14:25,700 Verder wordt geen input. 243 00:14:25,700 --> 00:14:29,510 Het geeft een int, while (true), dus we hebben een bewuste oneindige lus, 244 00:14:29,510 --> 00:14:33,180 maar vermoedelijk zullen we uit een of andere manier te breken van deze of retourneren binnen dit. 245 00:14:33,180 --> 00:14:34,870 >> Laten we eens kijken hoe dit werkt. 246 00:14:34,870 --> 00:14:39,240 We lijken te zijn met GetString in deze eerste regel in de lus, 166. 247 00:14:39,240 --> 00:14:43,780 Dit is nu een goede praktijk, omdat onder welke omstandigheden konden terugkeren GetString 248 00:14:43,780 --> 00:14:47,660 een speciaal sleutelwoord NULL? >> [Student] Als er iets mis gaat. 249 00:14:47,660 --> 00:14:51,630 Als er iets mis gaat. En wat is er mis kan gaan als je belt iets als GetString? 250 00:14:54,960 --> 00:14:57,640 Ja. >> [Student] malloc niet te geven de ints. 251 00:14:57,640 --> 00:14:59,150 Ja. Misschien malloc mislukt. 252 00:14:59,150 --> 00:15:03,190 Ergens onder de kap, is GetString roept malloc, welk geheugen toewijst, 253 00:15:03,190 --> 00:15:06,020 waarmee de computer op te slaan alle tekens 254 00:15:06,020 --> 00:15:07,750 dat de gebruiker typt in het toetsenbord. 255 00:15:07,750 --> 00:15:11,590 En stel dat de gebruiker had een heleboel vrije tijd en meer getypt, bijvoorbeeld, 256 00:15:11,590 --> 00:15:16,160 dan 2 miljard tekens in, meer tekens dan de computer heeft zelfs RAM. 257 00:15:16,160 --> 00:15:19,250 GetString moet in staat zijn om dat voor u. 258 00:15:19,250 --> 00:15:22,560 Zelfs als dit is een super, super ongewoon hoek geval is, 259 00:15:22,560 --> 00:15:24,340 het moet een of andere manier kan dit aan, 260 00:15:24,340 --> 00:15:28,750 en zo GetString, als we gingen terug en lees de documentatie, in feite terug NULL. 261 00:15:28,750 --> 00:15:34,460 Dus nu als GetString niet door terug te keren NULL, wordt GetInt ploft door terug te keren INT_MAX 262 00:15:34,460 --> 00:15:37,690 net als een schildwacht. Dit zijn slechts menselijke conventies. 263 00:15:37,690 --> 00:15:41,450 De enige manier waarop je zou weten dat dit het geval is door het lezen van de documentatie. 264 00:15:41,450 --> 00:15:45,040 >> Laten we naar beneden scrollen naar de plaats waar de int daadwerkelijk gekregen. 265 00:15:45,040 --> 00:15:51,160 Als ik scroll naar beneden een beetje verder, in de lijn 170, we hebben een commentaar boven deze lijnen. 266 00:15:51,160 --> 00:15:55,100 Wij verklaren in 172 een int, n, en een char, c, en vervolgens deze nieuwe functie, 267 00:15:55,100 --> 00:15:58,930 die sommige van jullie hebben struikelde over voor, sscanf. 268 00:15:58,930 --> 00:16:00,870 Dit staat voor snaar scanf. 269 00:16:00,870 --> 00:16:05,700 Met andere woorden, geef me een string en ik zal het scannen op stukjes informatie van belang. 270 00:16:05,700 --> 00:16:07,360 Wat betekent dat? 271 00:16:07,360 --> 00:16:11,800 Stel dat ik typ in, letterlijk, 123 op het toetsenbord en vervolgens drukt u op Enter. 272 00:16:11,800 --> 00:16:16,470 Wat is het gegevenstype van 123 bij geretourneerd door GetString? >> [Student] String. 273 00:16:16,470 --> 00:16:18,380 Het is natuurlijk een string, toch? Ik heb een string. 274 00:16:18,380 --> 00:16:23,220 Dus 123 is echt, quote-unquote, 123 met de \ 0 op het einde van het. 275 00:16:23,220 --> 00:16:27,110 Dat is geen int. Dat is niet een nummer. Het lijkt erop dat een aantal, maar het is niet echt. 276 00:16:27,110 --> 00:16:29,080 Dus wat doet GetInt hoeft te doen? 277 00:16:29,080 --> 00:16:35,750 Het moet die string van links naar rechts te scannen - 123 \ 0 - en een of andere manier om te zetten in een echte integer. 278 00:16:35,750 --> 00:16:37,850 Je zou kunnen uitzoeken hoe dit te doen. 279 00:16:37,850 --> 00:16:41,450 Als je terugdenkt aan pset2, u waarschijnlijk kreeg een beetje comfortabel met Caesar 280 00:16:41,450 --> 00:16:44,820 of Vigenere dus je kunt itereren over een string, dan kunt u tekens naar ints. 281 00:16:44,820 --> 00:16:46,710 Maar ach, het is een hele hoop werk. 282 00:16:46,710 --> 00:16:49,860 Waarom niet bellen een functie als sscanf dat voor je doet? 283 00:16:49,860 --> 00:16:54,230 Dus sscanf verwacht een argument - in dit geval de naam lijn, dat is een string. 284 00:16:54,230 --> 00:17:01,840 Vervolgens geeft u in offertes, zeer vergelijkbaar met printf, wat je verwacht te zien in deze string. 285 00:17:01,840 --> 00:17:09,000 En wat ik hier zeg is verwacht ik een decimaal getal en misschien een teken te zien. 286 00:17:09,000 --> 00:17:12,000 En we zullen zien waarom dit het geval is in slechts een moment. 287 00:17:12,000 --> 00:17:15,869 En het blijkt dat deze notatie nu doet denken aan spullen die we begonnen te praten over 288 00:17:15,869 --> 00:17:17,619 iets meer dan een week geleden. 289 00:17:17,619 --> 00:17:21,740 Wat is & n en & c doen voor ons hier? >> [Student] Adres van n en het adres van c. 290 00:17:21,740 --> 00:17:25,400 Ja. Het geeft me het adres van n en het adres van c. Waarom is dat belangrijk? 291 00:17:25,400 --> 00:17:30,220 U weet dat met functies in C, kunt u altijd een waarde of geen waarde terug te keren. 292 00:17:30,220 --> 00:17:34,530 U kunt terugkeren een int, een string, een vlotter, een char, wat dan ook, of u kunt ledig terugkeren, 293 00:17:34,530 --> 00:17:38,030 maar je kunt alleen maximaal terug te keren een ding. 294 00:17:38,030 --> 00:17:42,760 Maar hier willen we sscanf om misschien terug te keren me een int, een decimaal getal, 295 00:17:42,760 --> 00:17:46,220 en ook een char, en ik zal de reden waarom de char uit te leggen in een moment. 296 00:17:46,220 --> 00:17:51,460 U effectief wilt sscanf twee dingen terug te keren, maar dat is gewoon niet mogelijk in C. 297 00:17:51,460 --> 00:17:55,200 U kunt rond die werken door het passeren van twee adressen 298 00:17:55,200 --> 00:17:57,370 want zodra je met de hand een functie twee adressen, 299 00:17:57,370 --> 00:18:00,470 wat kan die functie doen met hen? >> [Student] Schrijf naar deze adressen. 300 00:18:00,470 --> 00:18:02,010 Het kan schrijven die adressen. 301 00:18:02,010 --> 00:18:05,770 U kunt gebruik maken van de ster werking en gaan er, voor elk van deze adressen. 302 00:18:05,770 --> 00:18:11,260 Het is een soort van deze back-deurmechanisme, maar zeer vaak voor het wijzigen van de waarden van variabelen 303 00:18:11,260 --> 00:18:14,870 meer dan een plaats - in dit geval twee. 304 00:18:14,870 --> 00:18:21,340 Let nu op Ik controleer voor == 1 en vervolgens terug te keren n als dat in feite de waarde true. 305 00:18:21,340 --> 00:18:26,170 Dus wat is er aan de hand? Technisch, alles wat we echt willen dat er gebeurt in GetInt is dit. 306 00:18:26,170 --> 00:18:30,740 We willen ontleden, om zo te zeggen, willen we de string te lezen - quote-unquote 123 - 307 00:18:30,740 --> 00:18:34,560 en als het lijkt alsof er een aantal daar, wat we sscanf vertellen te doen 308 00:18:34,560 --> 00:18:38,190 wordt gesteld dat aantal - 123 - in deze variabele n voor mij. 309 00:18:38,190 --> 00:18:42,090 Dus waarom dan had ik eigenlijk dit ook? 310 00:18:42,090 --> 00:18:48,220 Wat is de rol van sscanf zeggen dat je misschien ook een teken hier? 311 00:18:48,220 --> 00:18:53,470 [Onverstaanbaar student reactie] >> Een decimale punt echt zou kunnen werken. 312 00:18:53,470 --> 00:18:56,330 Laten we stellen dat dacht even na. En verder? 313 00:18:56,330 --> 00:18:59,270 [Student] Het zou kunnen zijn NULL. >> Goede gedachte. Het zou het nul karakter. 314 00:18:59,270 --> 00:19:01,660 Het is eigenlijk niet in dit geval. Ja. >> [Student] ASCII. 315 00:19:01,660 --> 00:19:04,340 ASCII. Of laat me generaliseren nog verder. 316 00:19:04,340 --> 00:19:06,640 De% c is er alleen voor foutcontrole. 317 00:19:06,640 --> 00:19:09,300 We hebben geen er een teken wilt na het nummer, 318 00:19:09,300 --> 00:19:11,870 maar wat dit stelt me ​​in staat om te doen is het volgende. 319 00:19:11,870 --> 00:19:18,210 Het blijkt dat sscanf naast het opslaan van waarden in n en c in dit voorbeeld, 320 00:19:18,210 --> 00:19:24,890 wat het ook doet is het geeft het aantal variabelen zet het waarden binnen 321 00:19:24,890 --> 00:19:30,260 Dus als je alleen typt in 123, dan wordt alleen de% d gaat aan te passen, 322 00:19:30,260 --> 00:19:33,880 en alleen n wordt opgeslagen met een waarde zoals 123, 323 00:19:33,880 --> 00:19:35,640 en niets wordt gezet in c. 324 00:19:35,640 --> 00:19:37,620 C blijft een vuilnis waarde, om zo te zeggen - 325 00:19:37,620 --> 00:19:40,730 vuilnis omdat het nooit geïnitialiseerd op een bepaalde waarde. 326 00:19:40,730 --> 00:19:45,520 Dus in dat geval, sscanf retourneert 1 omdat ik bevolkt 1 van die pointers, 327 00:19:45,520 --> 00:19:50,190 in welk geval geweldig, ik heb een int, dus ik gratis de lijn vrij te maken het geheugen 328 00:19:50,190 --> 00:19:54,000 dat GetString daadwerkelijk toegewezen, en dan keer ik terug n, 329 00:19:54,000 --> 00:19:58,500 anders als je je ooit afgevraagd waar dat Retry verklaring vandaan komt, het komt van hier. 330 00:19:58,500 --> 00:20:04,390 Dus als, daarentegen, ik typ in 123foo - slechts enkele willekeurige volgorde van de tekst - 331 00:20:04,390 --> 00:20:08,490 sscanf gaat, aantal, getal, f te zien, 332 00:20:08,490 --> 00:20:16,410 en het gaat om de 123 in n zet, het gaat om de f in c zet dan en 2 terug te keren. 333 00:20:16,410 --> 00:20:20,640 We hebben dus, alleen met behulp van de basisdefinitie van het gedrag sscanf's, een zeer eenvoudige manier - 334 00:20:20,640 --> 00:20:23,900 goed complex op het eerste gezicht maar aan het eind van de dag vrij eenvoudige mechanisme - 335 00:20:23,900 --> 00:20:28,320 van te zeggen is er een int en zo ja, is dat het enige wat ik heb gevonden? 336 00:20:28,320 --> 00:20:29,860 En de witruimte is hier opzettelijk. 337 00:20:29,860 --> 00:20:34,000 Als je leest de documentatie voor sscanf, het vertelt je dat als je een stuk witruimte bevatten 338 00:20:34,000 --> 00:20:38,810 aan het begin of het einde, sscanf ook kan de gebruiker, om welke reden dan ook, 339 00:20:38,810 --> 00:20:41,860 naar spatiebalk 123 geraakt en dat zal legitiem zijn. 340 00:20:41,860 --> 00:20:44,150 U zult niet schreeuwen tegen de gebruiker alleen maar omdat ze op de spatiebalk 341 00:20:44,150 --> 00:20:48,640 aan het begin of het einde, dat is gewoon een beetje meer gebruikersvriendelijk. 342 00:20:48,640 --> 00:20:52,300 >> Hebt u vragen dan op GetInt? Ja. >> [Student] Wat als je gewoon in een char? 343 00:20:52,300 --> 00:20:54,030 Goede vraag. 344 00:20:54,030 --> 00:20:59,890 Wat als je zojuist hebt getypt in een char als f en druk op Enter zonder ooit te typen 123? 345 00:20:59,890 --> 00:21:02,420 Wat denk je dat het gedrag van deze regel code zou dan kunnen zijn? 346 00:21:02,420 --> 00:21:04,730 [Onverstaanbaar student reactie] 347 00:21:04,730 --> 00:21:08,790 Ja, dus sscanf kan dat ook te dekken, omdat in dat geval, het is niet van plan om n of c te vullen. 348 00:21:08,790 --> 00:21:15,310 Het zal in plaats daarvan 0 terug, in welk geval ik ook het vangen van dat scenario 349 00:21:15,310 --> 00:21:18,750 omdat de verwachte waarde ik wil: 1. 350 00:21:18,750 --> 00:21:22,000 Ik wil alleen een en slechts een ding in te vullen. Goede vraag. 351 00:21:22,000 --> 00:21:24,290 >> Anderen? Oke. 352 00:21:24,290 --> 00:21:26,250 >> Laten we niet gaan door alle van de functies in hier, 353 00:21:26,250 --> 00:21:29,500 maar degene die lijkt te misschien van resterend belang is GetString 354 00:21:29,500 --> 00:21:32,790 want het blijkt dat GetDouble GetFloat, GetInt,, GetLongLong 355 00:21:32,790 --> 00:21:36,260 alle punter veel van hun functionaliteit GetString. 356 00:21:36,260 --> 00:21:39,750 Dus laten we eens een kijkje op hoe hij is hier te vinden. 357 00:21:39,750 --> 00:21:43,630 Deze ziet er een beetje ingewikkeld, maar het maakt gebruik van dezelfde fundamenten 358 00:21:43,630 --> 00:21:45,670 dat we begonnen te praten over vorige week. 359 00:21:45,670 --> 00:21:49,490 In GetString, die neemt geen argument volgens de leegte hier 360 00:21:49,490 --> 00:21:53,730 en het geeft een string, ik blijkbaar ben verklaren een string genaamd buffer. 361 00:21:53,730 --> 00:21:56,270 Ik weet niet echt wat dat gaat worden gebruikt voor nog niet, maar we zullen zien. 362 00:21:56,270 --> 00:21:58,390 Het lijkt erop dat de capaciteit is standaard 0. 363 00:21:58,390 --> 00:22:01,350 Niet helemaal zeker waar dit naartoe gaat, niet zeker wat n zal worden gebruikt voor het nog niet, 364 00:22:01,350 --> 00:22:03,590 maar nu is het krijgen van een beetje meer interessant. 365 00:22:03,590 --> 00:22:06,520 In lijn 243, verklaren we een int, c. 366 00:22:06,520 --> 00:22:08,800 Dit is een soort van een domme detail. 367 00:22:08,800 --> 00:22:15,820 Een char is 8 bits, en 8 bits kan opslaan hoeveel verschillende waarden? >> [Student] 256. >> 256. 368 00:22:15,820 --> 00:22:20,730 Het probleem is als je wilt 256 verschillende ASCII-tekens, waarvan er hebben 369 00:22:20,730 --> 00:22:23,340 als je denkt terug - en dat is niet iets om te onthouden. 370 00:22:23,340 --> 00:22:25,710 Maar als je terugdenkt aan die grote ASCII grafiek hadden we weken geleden, 371 00:22:25,710 --> 00:22:30,600 er in dat geval 128 of 256 ASCII karakters. 372 00:22:30,600 --> 00:22:32,940 We gebruikten alle patronen van 0s en 1s-up. 373 00:22:32,940 --> 00:22:36,210 Dat is een probleem als je wilt in staat zijn om een ​​fout te detecteren 374 00:22:36,210 --> 00:22:40,190 want als je al met 256 waarden voor je personages, 375 00:22:40,190 --> 00:22:43,050 je niet echt vooruit te plannen, want nu heb je geen manier om te zeggen, 376 00:22:43,050 --> 00:22:46,270 dit is geen legit karakter is dit een foutieve bericht. 377 00:22:46,270 --> 00:22:50,270 Dus wat de wereld doet, is dat ze gebruik maken van de volgende grootste waarde, iets als een int, 378 00:22:50,270 --> 00:22:54,720 zodat u een gekke aantal bits, 32, voor 4 miljard mogelijke waarden 379 00:22:54,720 --> 00:22:58,860 zodat u kunt gewoon uiteindelijk met behulp van in wezen 257 van hen, 380 00:22:58,860 --> 00:23:01,720 1 waarvan een speciale betekenis heeft als een fout. 381 00:23:01,720 --> 00:23:03,120 >> Dus laten we eens kijken hoe dit werkt. 382 00:23:03,120 --> 00:23:07,760 In lijn 246, ik heb deze grote while lus die belt fgetc, 383 00:23:07,760 --> 00:23:11,090 f betekenis bestand, dus getc, en dan stdin. 384 00:23:11,090 --> 00:23:15,520 Het blijkt dat dit nog maar het nauwkeuriger manier om te zeggen lezen input van het toetsenbord. 385 00:23:15,520 --> 00:23:19,300 Standaard invoermiddelen toetsenbord, standaard uitvoer betekent scherm, 386 00:23:19,300 --> 00:23:23,310 en standaard fout, die we zullen zien in pset4, betekent dat het scherm 387 00:23:23,310 --> 00:23:27,490 maar een speciaal deel van het scherm, zodat het niet samengevoegd met de werkelijke productie 388 00:23:27,490 --> 00:23:30,750 dat je bedoeld om af te drukken. Maar meer daarover in de toekomst. 389 00:23:30,750 --> 00:23:34,440 Dus fgetc betekent gewoon las een teken van het toetsenbord en op te slaan waar? 390 00:23:34,440 --> 00:23:37,350 Bewaar het in c. 391 00:23:37,350 --> 00:23:41,360 En dan check - dus ik ben gewoon met behulp van enkele Booleaanse voegwoorden hier - 392 00:23:41,360 --> 00:23:46,000 controleren of het niet gelijk doet - \ n, dus de gebruiker heeft druk op Enter, willen we op dat punt, 393 00:23:46,000 --> 00:23:49,850 het einde van de lus - en wij ook willen controleren voor de speciale constante EOF, 394 00:23:49,850 --> 00:23:53,610 die, als u weet of raden, wat doet het voor? >> [Student] End of file. >> End of file. 395 00:23:53,610 --> 00:23:56,560 Dit is een beetje onzinnig, want als ik het typen op het toetsenbord, 396 00:23:56,560 --> 00:23:58,870 er is echt geen bestand bij deze, 397 00:23:58,870 --> 00:24:01,150 maar dit is gewoon soort van de generieke term die wordt gebruikt in de betekenis 398 00:24:01,150 --> 00:24:04,220 dat er niets anders is afkomstig van de vingers van de mens. 399 00:24:04,220 --> 00:24:06,460 EOF - einde van het bestand. 400 00:24:06,460 --> 00:24:09,920 Even terzijde, als je ooit geraakt Control D op je toetsenbord, niet dat je zou nog - 401 00:24:09,920 --> 00:24:15,230 je hebt geraakt Control-C - Control D stuurt deze speciale constante genoemd EOF. 402 00:24:15,230 --> 00:24:19,850 Dus nu hebben we gewoon wat dynamisch geheugen toewijzing. 403 00:24:19,850 --> 00:24:23,440 >> Als (n + 1> capaciteit). Nu zal ik uitleggen n. 404 00:24:23,440 --> 00:24:26,100 N is alleen hoeveel bytes zijn op dit moment in de buffer, 405 00:24:26,100 --> 00:24:28,620 de string dat u momenteel opbouwen van de gebruiker. 406 00:24:28,620 --> 00:24:33,450 Als u meer tekens in je buffer dan je capaciteit in de buffer te hebben, 407 00:24:33,450 --> 00:24:37,410 intuïtief wat we moeten doen is dan toe te wijzen meer capaciteit. 408 00:24:37,410 --> 00:24:43,330 Dus ik ga scheren over een aantal van de rekenkundige hier en hier alleen richten op deze functie. 409 00:24:43,330 --> 00:24:46,070 Weet je wat malloc is of op zijn minst het algemeen bekend. 410 00:24:46,070 --> 00:24:48,970 Raad eens wat realloc doet. >> [Student] Voegt geheugen. 411 00:24:48,970 --> 00:24:52,920 Het is niet helemaal het toevoegen van geheugen. Het geheugen bijstuurt als volgt. 412 00:24:52,920 --> 00:24:57,220 Als er nog ruimte aan het einde van de string, zodat u meer van dat geheugen 413 00:24:57,220 --> 00:25:00,000 dan het oorspronkelijk geeft je, dan krijg je dat er extra geheugen. 414 00:25:00,000 --> 00:25:03,460 Je kunt dus gewoon blijven de string personages rug aan rug aan rug aan rug. 415 00:25:03,460 --> 00:25:05,830 Maar als dat niet het geval is, omdat je te lang gewacht 416 00:25:05,830 --> 00:25:07,940 en iets willekeurig werd plofte in het geheugen zijn 417 00:25:07,940 --> 00:25:10,290 maar er is extra geheugen hier beneden, dat is oke. 418 00:25:10,290 --> 00:25:13,100 Realloc gaat al het zware werk voor u doen, 419 00:25:13,100 --> 00:25:16,750 verplaatst u de tekenreeks die u hebt gelezen in zo ver van hier, het naar beneden neergezet, 420 00:25:16,750 --> 00:25:19,460 en dan geeft je wat meer start-en landingsbaan op dat punt. 421 00:25:19,460 --> 00:25:22,550 >> Dus met een golf van de hand, wil ik zeggen dat wat GetString doet 422 00:25:22,550 --> 00:25:26,330 wordt het begint met een kleine buffer, misschien een enkel karakter, 423 00:25:26,330 --> 00:25:30,820 en als de gebruiker typt in twee personages, GetString eindigt bellen realloc en zegt 424 00:25:30,820 --> 00:25:33,150 een teken was niet genoeg, geef me twee tekens. 425 00:25:33,150 --> 00:25:35,950 Als je dan lezen via de logica van de lus, het gaat om te zeggen 426 00:25:35,950 --> 00:25:39,600 de gebruiker heeft ingevoerd in 3 letters, geef mij nu niet 2 maar 4 letters, 427 00:25:39,600 --> 00:25:42,320 geef me dan 8, dan geef me 16 en 32. 428 00:25:42,320 --> 00:25:45,000 Het feit dat ik een verdubbeling van de capaciteit telkens 429 00:25:45,000 --> 00:25:48,570 betekent dat de buffer niet zal langzaam groeien, gaat het om super snel te groeien. 430 00:25:48,570 --> 00:25:51,380 En wat zou het voordeel van dat zijn? 431 00:25:51,380 --> 00:25:54,600 Waarom ben ik een verdubbeling van de grootte van de buffer 432 00:25:54,600 --> 00:25:58,020 ook al is de gebruiker misschien gewoon behoefte aan een extra teken van het toetsenbord? 433 00:25:58,020 --> 00:26:01,750 [Onverstaanbaar student reactie] >> Wat is dat? >> [Student] Je hoeft het niet te laten groeien zo vaak. 434 00:26:01,750 --> 00:26:03,300 Precies. Je hoeft het niet te laten groeien zo vaak. 435 00:26:03,300 --> 00:26:05,510 En dit is gewoon een soort van je afdekken van uw weddenschappen hier, 436 00:26:05,510 --> 00:26:10,850 het idee is dat je niet wilt realloc veel noemen, omdat het de neiging om traag. 437 00:26:10,850 --> 00:26:12,910 Elke keer dat je het vraagt ​​het besturingssysteem voor het geheugen, 438 00:26:12,910 --> 00:26:16,990 zoals u zult al snel zien in een toekomstig probleem set, het de neiging om enige tijd duren. 439 00:26:16,990 --> 00:26:20,010 Dus het minimaliseren van dat bedrag van de tijd, zelfs als je wat ruimte te verspillen, 440 00:26:20,010 --> 00:26:21,900 heeft de neiging om een ​​goede zaak. 441 00:26:21,900 --> 00:26:24,060 >> Maar als we lezen het laatste deel van getString hier - 442 00:26:24,060 --> 00:26:27,950 en opnieuw begrijpen van elke regel is hier niet zo belangrijk vandaag de dag - 443 00:26:27,950 --> 00:26:30,530 merken dat het uiteindelijk dringt er nogmaals malloc 444 00:26:30,530 --> 00:26:33,880 en het wijst precies zoveel bytes als het nodig heeft voor de string 445 00:26:33,880 --> 00:26:38,060 en dan gooit door te bellen naar het gratis te grote buffer 446 00:26:38,060 --> 00:26:40,080 als het inderdaad werd verdubbeld te vaak. 447 00:26:40,080 --> 00:26:42,730 Dus in het kort, dat is hoe GetString is al die tijd te werken. 448 00:26:42,730 --> 00:26:47,060 Alles wat het doet is lezen een karakter per keer opnieuw en opnieuw en opnieuw, 449 00:26:47,060 --> 00:26:50,750 en elke keer dat het heeft wat extra geheugen, vraagt ​​het besturingssysteem voor het 450 00:26:50,750 --> 00:26:53,670 door te bellen realloc. 451 00:26:53,670 --> 00:26:57,890 >> Nog vragen? Oke. 452 00:26:57,890 --> 00:26:59,270 >> Een aanval. 453 00:26:59,270 --> 00:27:04,060 Nu we begrijpen pointers of op zijn minst zijn steeds beter bekend met pointers, 454 00:27:04,060 --> 00:27:06,700 laten we eens kijken hoe de hele wereld begint in te storten 455 00:27:06,700 --> 00:27:10,030 als je het niet helemaal te verdedigen tegen vijandige gebruikers, 456 00:27:10,030 --> 00:27:11,850 mensen die proberen te hacken in uw systeem, 457 00:27:11,850 --> 00:27:16,890 mensen die proberen om uw software te stelen door het omzeilen sommige registratiecode 458 00:27:16,890 --> 00:27:19,090 dat ze anders moeten typen inch 459 00:27:19,090 --> 00:27:22,990 >> Neem hier een kijkje naar dit voorbeeld, dat is gewoon C-code die een functie hoofd op de bodem heeft 460 00:27:22,990 --> 00:27:26,380 dat noemt een functie foo. En wat is het doorgeven aan foo? 461 00:27:26,380 --> 00:27:29,680 [Student] Een enkel argument. >> [Malan] Een enkel argument. 462 00:27:29,680 --> 00:27:33,450 Dus argv [1], wat betekent dat het eerste woord dat de gebruiker heeft ingevoerd op de opdrachtregel 463 00:27:33,450 --> 00:27:36,360 na a.out of wat dan ook het programma wordt aangeroepen. 464 00:27:36,360 --> 00:27:41,680 Dus foo aan de top neemt in een char *. Maar char * is precies wat? >> [Student] Een tekenreeks. 465 00:27:41,680 --> 00:27:43,350 [Malan] Een tekenreeks, dus er is hier niets nieuws. 466 00:27:43,350 --> 00:27:45,420 Die string is willekeurig wordt genoemd bar. 467 00:27:45,420 --> 00:27:51,430 In deze lijn hier, char c [12]; in een soort van semi-technisch Engels, is wat deze lijn aan het doen? 468 00:27:51,430 --> 00:27:55,220 [Student] Een array van - >> Array van? >> [Student] Karakters. >> Tekens. 469 00:27:55,220 --> 00:27:58,870 Geef me een array van 12 tekens. Dus we zouden kunnen noemen dit een buffer. 470 00:27:58,870 --> 00:28:02,920 Het is technisch heet c, maar een buffer in de programmering betekent gewoon een stelletje van de ruimte 471 00:28:02,920 --> 00:28:04,800 die je kunt zetten wat spullen binnen 472 00:28:04,800 --> 00:28:07,940 Dan tot slot, memcpy we hebben niet eerder gebruikt, maar je kunt waarschijnlijk wel raden wat het doet. 473 00:28:07,940 --> 00:28:10,480 Het kopieert het geheugen. Wat doet het? 474 00:28:10,480 --> 00:28:19,270 Blijkbaar kopieert bar, de input, in c maar slechts tot de lengte van de bar. 475 00:28:19,270 --> 00:28:24,930 Maar er is een bug hier. >> [Student] Je moet de sizeof karakter. >> Oke. 476 00:28:24,930 --> 00:28:30,860 Technisch gezien moeten we echt doen strlen (bar) * sizeof (char)). Dat klopt. 477 00:28:30,860 --> 00:28:33,930 Maar in het ergste geval hier, laten we aannemen dat Dat is - 478 00:28:33,930 --> 00:28:35,950 Oke. Dan is er twee bugs. 479 00:28:35,950 --> 00:28:39,160 Dus sizeof (char)); 480 00:28:39,160 --> 00:28:41,290 Laten we dit een beetje breder. 481 00:28:41,290 --> 00:28:44,910 Dus nu is er nog een bug, dat is wat? >> [Onverstaanbaar student reactie] 482 00:28:44,910 --> 00:28:46,990 Controleer voor wat? >> [Student] Controleer op NULL. 483 00:28:46,990 --> 00:28:50,270 We moeten in het algemeen worden het controleren op NULL omdat er slechte dingen gebeuren 484 00:28:50,270 --> 00:28:53,200 wanneer u de muisaanwijzer NULL is, omdat je zou kunnen eindigen er heen te gaan, 485 00:28:53,200 --> 00:28:57,630 en je moet niet altijd te gaan om NULL op dereferentie met de ster operator. 486 00:28:57,630 --> 00:29:01,050 Dus dat is goed. En wat kunnen we anders doen? Logisch, er is een fout hier ook. 487 00:29:01,050 --> 00:29:04,450 [Student] Controleer of argc is> = tot 2. 488 00:29:04,450 --> 00:29:10,550 Dus controleer of argc is> = 2. Oke, dus er is hier drie bugs in dit programma. 489 00:29:10,550 --> 00:29:16,630 We zijn nu te controleren of de gebruiker daadwerkelijk getypt in iets in argv [1]. Goed. 490 00:29:16,630 --> 00:29:20,950 Dus wat is de derde bug? Ja. >> [Student] C is misschien niet groot genoeg. 491 00:29:20,950 --> 00:29:23,320 Goed. We controleerden een scenario. 492 00:29:23,320 --> 00:29:29,520 We impliciet gecontroleerd niet meer geheugen dan zou de lengte van bar hoger zijn dan kopiëren. 493 00:29:29,520 --> 00:29:32,510 Dus als de string de gebruiker heeft ingevoerd in is 10 tekens lang, 494 00:29:32,510 --> 00:29:36,020 Dit zegt alleen kopiëren 10 tekens. En dat is oke. 495 00:29:36,020 --> 00:29:39,940 Maar wat als de gebruiker heeft ingevoerd in een woord de prompt als een 20-karakter woord? 496 00:29:39,940 --> 00:29:44,900 Dit zegt kopie 20 tekens van bar naar wat? 497 00:29:44,900 --> 00:29:49,750 C, ook wel bekend als onze buffer, wat betekent dat je alleen gegevens geschreven 498 00:29:49,750 --> 00:29:52,540 tot 8 byte locaties die u niet bezit, 499 00:29:52,540 --> 00:29:54,870 en u niet de eigenaar hen in de zin dat je ze nooit toegewezen. 500 00:29:54,870 --> 00:30:00,370 Dus dit is wat algemeen bekend staat als de buffer overflow aanval of bufferoverloop aanval. 501 00:30:00,370 --> 00:30:05,580 En het is een aanval in de zin dat als de gebruiker of het programma dat er belt uw functie 502 00:30:05,580 --> 00:30:10,490 doet dit kwaadwillig, wat er werkelijk gaat gebeuren zou eigenlijk heel slecht. 503 00:30:10,490 --> 00:30:12,450 >> Dus laten we hier een kijkje nemen op deze foto. 504 00:30:12,450 --> 00:30:16,060 Deze foto vertegenwoordigt uw stapel van het geheugen. 505 00:30:16,060 --> 00:30:19,580 Vergeet niet dat elke keer als je belt een functie die u dit kleine frame op de stack te krijgen 506 00:30:19,580 --> 00:30:21,520 en dan nog een en toen nog een en nog een. 507 00:30:21,520 --> 00:30:24,300 En tot nu toe, we hebben gewoon een soort van geabstraheerd deze als rechthoeken 508 00:30:24,300 --> 00:30:26,290 hetzij op het bord of op het scherm hier. 509 00:30:26,290 --> 00:30:30,580 Maar als we inzoomen op een van die rechthoeken, wanneer u een functie foo oproepen, 510 00:30:30,580 --> 00:30:35,880 blijkt dat er meer op de stapel binnenkant van dat frame in die rechthoek 511 00:30:35,880 --> 00:30:40,060 dan alleen x en y en a en b, zoals we hebben het over swap. 512 00:30:40,060 --> 00:30:44,410 Het blijkt dat er een aantal op een lager niveau details, waaronder adresstickers. 513 00:30:44,410 --> 00:30:49,550 Zo blijkt bij het belangrijkste noemt foo, de belangrijkste te informeren foo 514 00:30:49,550 --> 00:30:53,520 wat de belangrijkste zijn adres in het geheugen van de computer 515 00:30:53,520 --> 00:30:57,770 omdat anders, zodra foo gedaan uitgevoerd, zoals in casu, 516 00:30:57,770 --> 00:31:00,830 als je eenmaal dit gesloten accolade aan het einde van foo, 517 00:31:00,830 --> 00:31:05,310 hoe de heck is foo weet waar de controle van het programma wordt verondersteld om te gaan? 518 00:31:05,310 --> 00:31:08,970 Het blijkt dat het antwoord op die vraag is in deze rode rechthoek hier. 519 00:31:08,970 --> 00:31:12,670 Dit is een pointer, en het is aan de computer om tijdelijk 520 00:31:12,670 --> 00:31:17,030 de zogenaamde stack het adres van algemeen omdat zodra foo gebeurt uitgevoerd, 521 00:31:17,030 --> 00:31:21,120 de computer weet waar en wat lijn in de belangrijkste om terug te gaan naar. 522 00:31:21,120 --> 00:31:23,940 Opgeslagen Frame aanwijzer heeft betrekking op dezelfde wijze als deze. 523 00:31:23,940 --> 00:31:26,310 Char * bar hier staat voor wat? 524 00:31:26,310 --> 00:31:31,350 Nu deze blauwe segment is hier foo het frame. Wat is bar? 525 00:31:31,570 --> 00:31:35,010 Bar is gewoon het argument om de foo functie. 526 00:31:35,010 --> 00:31:37,500 Dus nu zijn we terug bij soort van het vertrouwde beeld. 527 00:31:37,500 --> 00:31:39,850 Er is meer spullen en meer afleiding op het scherm, 528 00:31:39,850 --> 00:31:43,380 maar dit licht blauwe segment is precies wat we hebben al getekend op het bord 529 00:31:43,380 --> 00:31:45,790 voor iets als swap. Dat is het frame voor foo. 530 00:31:45,790 --> 00:31:51,490 En het enige wat in het nu is bar, dat is deze parameter. 531 00:31:51,490 --> 00:31:55,220 Maar wat moet in de stapel volgens deze code hier? 532 00:31:55,220 --> 00:31:57,760 [Student] char c [12]. >> [Malan] char c [12]. 533 00:31:57,760 --> 00:32:02,810 Ook dient er 12 vierkanten van het geheugen toegewezen aan een variabele genaamd c, 534 00:32:02,810 --> 00:32:04,970 En Wij hebben dat op het scherm. 535 00:32:04,970 --> 00:32:08,480 De top is er c [0] en de auteur van dit schema 536 00:32:08,480 --> 00:32:11,850 nam niet de moeite het tekenen van alle van de pleinen, maar er zijn zelfs 12 er 537 00:32:11,850 --> 00:32:16,590 want als je kijkt naar de onderkant rechts, c [11] als u tellen van 0 is de 12e dergelijke byte. 538 00:32:16,590 --> 00:32:18,400 Maar hier is het probleem. 539 00:32:18,400 --> 00:32:22,390 In welke richting wordt c groeit? 540 00:32:22,390 --> 00:32:27,080 Soort top-down als het begint aan de top en groeit naar de bodem. 541 00:32:27,080 --> 00:32:30,110 Het maakt niet uit als we vertrokken ons veel start-en landingsbaan hier helemaal. 542 00:32:30,110 --> 00:32:32,090 We hebben soort van geschilderd onszelf in een hoek, 543 00:32:32,090 --> 00:32:36,940 en dat c [11] is goed tegen bar, die recht omhoog tegen Opgeslagen Frame wijzer, 544 00:32:36,940 --> 00:32:39,960 wat recht is tegen adresstickers. Er is geen plaats meer. 545 00:32:39,960 --> 00:32:42,810 Dus wat is de implicatie dan als je verpesten 546 00:32:42,810 --> 00:32:46,500 en je probeert te lezen 20 bytes in een 12-byte buffer? 547 00:32:46,500 --> 00:32:50,060 Waar zijn die 8 extra bytes ga? >> [Student] Inside - 548 00:32:50,060 --> 00:32:53,200 In alles, waarvan sommige super belangrijk. 549 00:32:53,200 --> 00:32:57,260 En het allerbelangrijkste, potentieel, is de rode doos daar, adresstickers, 550 00:32:57,260 --> 00:33:03,560 want stel dat je per ongeluk of adversarially die 4 bytes te overschrijven, 551 00:33:03,560 --> 00:33:07,260 dat pointer adres, niet alleen met afval, maar met een aantal 552 00:33:07,260 --> 00:33:09,810 dat gebeurt met een werkelijke adres te vertegenwoordigen in het geheugen. 553 00:33:09,810 --> 00:33:13,880 Wat is de implicatie, logisch? >> [Student] Functie gaat om terug te keren naar een andere plaats. 554 00:33:13,880 --> 00:33:15,250 Precies. 555 00:33:15,250 --> 00:33:19,170 Wanneer foo rendement en hits die accolade, wordt het programma gaat verder 556 00:33:19,170 --> 00:33:25,060 niet terug te keren naar de belangrijkste, het gaat om terug te keren naar wat adres is in die rode doos. 557 00:33:25,060 --> 00:33:28,600 >> In het geval van te omzeilen software registratie, 558 00:33:28,600 --> 00:33:32,260 wat als het adres dat wordt teruggestuurd naar de functie die normaal wordt aangeroepen 559 00:33:32,260 --> 00:33:35,690 nadat je hebt betaald voor de software en ingevoerd uw registratie code? 560 00:33:35,690 --> 00:33:39,870 U kunt sorteren van truc de computer in de niet te gaan hier, maar in plaats daarvan te gaan hier. 561 00:33:39,870 --> 00:33:45,100 Of als je echt slim, kan een tegenstander daadwerkelijk in te typen op het toetsenbord, bijvoorbeeld, 562 00:33:45,100 --> 00:33:50,690 niet een echte woord, niet 20 tekens, maar stel dat hij of zij daadwerkelijk types in 563 00:33:50,690 --> 00:33:52,770 een aantal tekens die code vertegenwoordigen. 564 00:33:52,770 --> 00:33:55,320 En het niet gaat om C-code te zijn, het is eigenlijk aan de hand te zijn de tekens 565 00:33:55,320 --> 00:33:59,290 dat vertegenwoordigen uitvoerbare machinecode, 0s en 1s. 566 00:33:59,290 --> 00:34:01,290 Maar stel dat ze slim genoeg om dat te doen, 567 00:34:01,290 --> 00:34:06,500 een of andere manier plakken in de GetString prompt iets dat in wezen gecompileerde code, 568 00:34:06,500 --> 00:34:09,980 en de laatste 4 bytes te overschrijven die retouradres. 569 00:34:09,980 --> 00:34:13,360 En welk adres doet die ingang te doen? 570 00:34:13,360 --> 00:34:18,630 Het slaat eigenlijk in deze rode rechthoek het adres van de eerste byte van de buffer. 571 00:34:18,630 --> 00:34:23,070 Dus je moet echt slim, en dit is een veel trial and error voor slechte mensen die er zijn, 572 00:34:23,070 --> 00:34:25,639 maar als je kunt achterhalen hoe groot deze buffer is 573 00:34:25,639 --> 00:34:28,820 zodanig dat de laatste paar bytes in de input die u verstrekt aan het programma 574 00:34:28,820 --> 00:34:33,540 toevallig gelijk zijn aan het adres van de start van uw buffer, kunt u dit doen. 575 00:34:33,540 --> 00:34:39,320 Als we zeggen normaal gedag en \ 0, dat is wat uiteindelijk in de buffer. 576 00:34:39,320 --> 00:34:44,420 Maar als we slimmer en vullen we die buffer met wat we generiek noemen aanval code - 577 00:34:44,420 --> 00:34:48,860 AAA, aanval, aanval, aanval - waar dit is gewoon iets dat er iets ergs doet, 578 00:34:48,860 --> 00:34:51,820 wat gebeurt er als je echt slim, zou je dit doen. 579 00:34:51,820 --> 00:34:58,610 In het rode vak hier is een reeks getallen - 80, C0, 35, 08. 580 00:34:58,610 --> 00:35:01,610 Merk op dat het aantal dat is hier past. 581 00:35:01,610 --> 00:35:04,430 Het is in omgekeerde volgorde, maar daarover een andere keer. 582 00:35:04,430 --> 00:35:08,140 Merk op dat deze terugkeer-adres opzettelijk is gewijzigd 583 00:35:08,140 --> 00:35:12,020 naar het adres hier gelijk op, niet het adres van de belangrijkste. 584 00:35:12,020 --> 00:35:17,500 Dus als de bad guy is super slim, wordt hij of zij gaat nemen in die aanval code 585 00:35:17,500 --> 00:35:20,930 iets als u alle bestanden van de gebruiker of kopieer de wachtwoorden 586 00:35:20,930 --> 00:35:24,680 of maak een gebruikersaccount die ik dan kan inloggen op - helemaal niets. 587 00:35:24,680 --> 00:35:26,950 >> En dit is zowel het gevaar en de kracht van C. 588 00:35:26,950 --> 00:35:29,840 Omdat u toegang heeft tot het geheugen via de pointers 589 00:35:29,840 --> 00:35:32,520 en je kunt alles wat je wilt ook schrijven in het geheugen van een computer, 590 00:35:32,520 --> 00:35:35,080 kunt u een computer doen wat je wilt 591 00:35:35,080 --> 00:35:39,550 gewoon door te hebben het rond te springen binnen zijn eigen geheugenruimte. 592 00:35:39,550 --> 00:35:44,650 En dus tot op de dag zo veel programma's en zo veel websites die in het gedrang 593 00:35:44,650 --> 00:35:46,200 neer op mensen gebruik maken van deze. 594 00:35:46,200 --> 00:35:50,760 En dit lijkt misschien een super geavanceerde aanval, maar het hoeft niet altijd te beginnen op die manier. 595 00:35:50,760 --> 00:35:53,560 De realiteit is dat wat slechte mensen zullen doorgaans doen is, 596 00:35:53,560 --> 00:35:58,200 of het nu een programma op een opdrachtregel of een GUI programma of een website, 597 00:35:58,200 --> 00:35:59,940 je gewoon beginnen met het verstrekken onzin. 598 00:35:59,940 --> 00:36:03,980 U typt in een echt groot woord in het zoekveld en druk op Enter, 599 00:36:03,980 --> 00:36:05,780 en je wacht om te zien of de website crasht 600 00:36:05,780 --> 00:36:09,990 of je wacht om te zien of het programma manifesteert een foutmelding 601 00:36:09,990 --> 00:36:14,330 want als je geluk hebt als de bad guy en u te voorzien wat gekke ingang 602 00:36:14,330 --> 00:36:18,980 dat crasht het programma, dat betekent dat de programmeur niet anticiperen op uw slecht gedrag, 603 00:36:18,980 --> 00:36:23,630 wat betekent dat u kunt waarschijnlijk met voldoende inspanning, genoeg vallen en opstaan, 604 00:36:23,630 --> 00:36:26,650 erachter te komen hoe een nauwkeuriger aanval voeren. 605 00:36:26,650 --> 00:36:31,410 Dus net zo goed een onderdeel van de veiligheid is niet alleen het vermijden van deze aanvallen helemaal 606 00:36:31,410 --> 00:36:34,100 maar ze op te sporen en eigenlijk op zoek naar logs 607 00:36:34,100 --> 00:36:36,780 en zien wat gekke inputs mensen getypt in uw website, 608 00:36:36,780 --> 00:36:38,960 welke zoektermen zijn getypt mensen in uw website 609 00:36:38,960 --> 00:36:42,870 in de hoop van overvolle of andere buffer. 610 00:36:42,870 --> 00:36:45,500 En dit komt allemaal neer op de eenvoudige basisprincipes van wat een reeks 611 00:36:45,500 --> 00:36:49,080 en wat betekent het om toe te wijzen en te gebruiken geheugen. 612 00:36:49,080 --> 00:36:51,710 >> Met betrekking tot die toen ook is dit. 613 00:36:51,710 --> 00:36:54,280 Laten we gewoon binnen blik van een harde schijf nog maar eens. 614 00:36:54,280 --> 00:36:58,440 Herinnert u zich van een week of twee geleden dat wanneer je bestanden slepen naar de prullenbak of prullenmand, 615 00:36:58,440 --> 00:37:03,710 wat gebeurt er? >> [Student] Niets. >> Absoluut niets, toch? 616 00:37:03,710 --> 00:37:05,740 Uiteindelijk als je weinig schijfruimte, 617 00:37:05,740 --> 00:37:08,190 Windows of Mac OS zal het verwijderen van bestanden voor u. 618 00:37:08,190 --> 00:37:10,390 Maar als je iets sleept daar, dat is niet helemaal veilig. 619 00:37:10,390 --> 00:37:13,800 Al uw huisgenoot of een vriend of familielid hoeft te doen is dubbel klikken en, voila, 620 00:37:13,800 --> 00:37:16,310 er is alle schetsmatig bestanden die u probeerde te verwijderen. 621 00:37:16,310 --> 00:37:19,590 De meesten van ons in ieder geval weten dat je naar rechts te klikken of klik op 622 00:37:19,590 --> 00:37:22,310 en leeg de prullenbak of iets dergelijks. 623 00:37:22,310 --> 00:37:25,000 Maar zelfs dan is dat niet helemaal doen de truc 624 00:37:25,000 --> 00:37:28,010 want wat er gebeurt als u een bestand op uw harde schijf 625 00:37:28,010 --> 00:37:32,770 dat vertegenwoordigt ongeveer Word-document of een JPEG, en dit vertegenwoordigt uw harde schijf, 626 00:37:32,770 --> 00:37:35,350 en laten we zeggen dat dit stukje hier is dat bestand, 627 00:37:35,350 --> 00:37:38,390 en het is samengesteld uit een hele hoop van 0s en 1s. 628 00:37:38,390 --> 00:37:42,470 Wat gebeurt er als je niet alleen dat bestand slepen naar de prullenbak of prullenbak 629 00:37:42,470 --> 00:37:48,020 maar ook deze legen? Soort van niets. 630 00:37:48,020 --> 00:37:49,640 Het is niet helemaal niets nu. 631 00:37:49,640 --> 00:37:54,290 Nu is het gewoon niets, want een beetje iets gebeurt in de vorm van deze tabel. 632 00:37:54,290 --> 00:37:58,370 Dus er is een soort van database of tabel binnenkant van een computer het geheugen 633 00:37:58,370 --> 00:38:03,850 dat heeft in wezen een kolom voor bestanden de namen en een kolom voor bestanden 'locatie, 634 00:38:03,850 --> 00:38:07,720 wanneer die kan plaats 123, maar een willekeurig getal te zijn. 635 00:38:07,720 --> 00:38:14,560 Dus we zouden kunnen hebben iets als x.jpeg en locatie 123. 636 00:38:14,560 --> 00:38:18,800 Wat gebeurt er dan als je daadwerkelijk leeg je prullenbak? 637 00:38:18,800 --> 00:38:20,330 Dat weg gaat. 638 00:38:20,330 --> 00:38:23,610 Maar wat gaat niet weg is de 0s en 1s. 639 00:38:23,610 --> 00:38:26,270 >> Dus wat is dan de verbinding met pset4? 640 00:38:26,270 --> 00:38:31,240 Nou, met pset4, alleen maar omdat we per ongeluk worden gewist van de compact flash kaart 641 00:38:31,240 --> 00:38:35,750 dat had al deze foto's of gewoon omdat het door pech beschadigd raakte 642 00:38:35,750 --> 00:38:38,000 betekent niet dat de 0s en 1s niet zijn er nog steeds. 643 00:38:38,000 --> 00:38:40,410 Misschien een paar van hen verloren gaan omdat er iets heb beschadigd 644 00:38:40,410 --> 00:38:43,320 in de zin dat sommige 0s 1s werd en 1s werd 0s. 645 00:38:43,320 --> 00:38:47,240 Slechte dingen kunnen gebeuren als gevolg van buggy software of defecte hardware. 646 00:38:47,240 --> 00:38:50,370 Maar veel van die stukjes, misschien zelfs 100% van hen, zijn er nog steeds. 647 00:38:50,370 --> 00:38:55,050 Het is gewoon dat de computer of de camera niet weet waar JPEG1 begonnen 648 00:38:55,050 --> 00:38:56,910 en waar JPEG2 begonnen. 649 00:38:56,910 --> 00:39:01,070 Maar als je, de programmeur, weet met een beetje savvy waar die JPEG-bestanden zijn 650 00:39:01,070 --> 00:39:06,010 of hoe ze eruit zien, zodat u kunt analyseren 0s en 1s en zeggen JPEG, JPEG, 651 00:39:06,010 --> 00:39:09,440 je kunt schrijven een programma met voornamelijk alleen een voor-of while loop 652 00:39:09,440 --> 00:39:12,820 dat herstelt elk van die bestanden in. 653 00:39:12,820 --> 00:39:16,030 De les is dan om te beginnen met veilig wissen van uw bestanden 654 00:39:16,030 --> 00:39:18,340 Als u wilt helemaal te vermijden dit. Ja. 655 00:39:18,340 --> 00:39:21,010 >> [Student] Hoe komt het dat het zegt over uw computer 656 00:39:21,010 --> 00:39:23,550 dat je meer geheugen dan je voorheen deed? 657 00:39:23,550 --> 00:39:27,820 Heeft u meer geheugen dan je voorheen deed - >> [student] Meer beschikbare geheugen. 658 00:39:27,820 --> 00:39:29,630 Oh. Goede vraag. 659 00:39:29,630 --> 00:39:32,360 Dus waarom dan na het legen van de prullenbak heeft uw computer vertellen 660 00:39:32,360 --> 00:39:34,910 dat u meer vrije ruimte dan je voorheen deed? 661 00:39:34,910 --> 00:39:36,770 In een notendop, omdat hij of zij ligt. 662 00:39:36,770 --> 00:39:40,740 Meer technisch, heb je meer ruimte omdat je nu hebt gezegd 663 00:39:40,740 --> 00:39:43,680 kun je andere dingen waar het filesysteem ooit was. 664 00:39:43,680 --> 00:39:45,450 Maar dat betekent niet dat de bits gaan weg, 665 00:39:45,450 --> 00:39:48,590 en dat betekent niet dat de bits worden aangepast om alle 0s bijvoorbeeld 666 00:39:48,590 --> 00:39:50,150 voor uw bescherming. 667 00:39:50,150 --> 00:39:54,640 Dus daarentegen, als je veilig bestanden wissen of fysiek te vernietigen het apparaat, 668 00:39:54,640 --> 00:39:57,300 dat is echt de enige manier soms rond dat. 669 00:39:57,300 --> 00:40:02,020 >> Dus waarom niet laten we op die semi-eng noot, en we zullen u op maandag. 670 00:40:02,020 --> 00:40:07,000 [Applaus] 671 00:40:07,780 --> 00:40:10,000 >> [CS50.TV]