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