1 00:00:00,000 --> 00:00:02,760 [Powered by Google Translate] [VECKA 5] 2 00:00:02,760 --> 00:00:04,760 [David J. Malan, Harvard University] 3 00:00:04,760 --> 00:00:11,990 [Detta är CS50.] [CS50.TV] 4 00:00:11,990 --> 00:00:17,780 [Kvinna] Han ljuger, om vad, vet jag inte. 5 00:00:17,780 --> 00:00:20,300 [Man] Så vad vet vi? 6 00:00:20,300 --> 00:00:24,120 [Kvinna] Det vid 9:15, var Ray Santoya på ATM. 7 00:00:24,120 --> 00:00:27,420 [Man] Så frågan är, vad han gör på 9:16? 8 00:00:27,420 --> 00:00:29,980 [Kvinna] Inspelningen 9 mm på något. 9 00:00:29,980 --> 00:00:31,900 Kanske såg han krypskytt. 10 00:00:31,900 --> 00:00:34,000 [Man] Eller han jobbade med honom. 11 00:00:34,000 --> 00:00:36,330 [Kvinna] Vänta. Gå tillbaka en. 12 00:00:36,330 --> 00:00:38,330 [Man] Vad ser du? 13 00:00:38,330 --> 00:00:44,520 [♫ spännande musik ♫] 14 00:00:44,520 --> 00:00:48,320 [Kvinna] Ta hans ansikte upp. Helskärm. 15 00:00:48,320 --> 00:00:51,230 [Man] Hans glasögon. >> Det finns en reflektion. 16 00:00:51,230 --> 00:01:00,810 [♫ spännande musik ♫] 17 00:01:00,810 --> 00:01:03,580 [Man] Det är Nuevita baseball team. Det är deras logotyp. 18 00:01:03,580 --> 00:01:07,790 [Kvinna] Och han pratar med den som bär den jackan. 19 00:01:07,790 --> 00:01:13,730 >> [David Malan] Så detta är CS50 vecka 5, och idag har vi förstöra lite tv och film för dig. 20 00:01:13,730 --> 00:01:16,170 Så när du tittar på ett program som detta här, 21 00:01:16,170 --> 00:01:19,910 och polisen säger "Kan du städa upp det?" eller "Förbättra" 22 00:01:19,910 --> 00:01:21,900 det finns ingen öka i den verkliga världen. 23 00:01:21,900 --> 00:01:25,220 Faktum vad du verkligen får är en liten sak som denna. 24 00:01:25,220 --> 00:01:27,570 Jag har dragit upp en av de anställda bilder från sidan. 25 00:01:27,570 --> 00:01:30,980 Detta är ett program som heter Photoshop. Detta är 1 av 2 Bowdens, 26 00:01:30,980 --> 00:01:36,300 1 av 3 Bowdens faktiskt, idag, eftersom vi har Mrs Bowden här också, med Rob och Paul. 27 00:01:36,300 --> 00:01:41,950 Men här är Rob på skärmen, och om vi zoomar in på den glimt han alltid har haft i ögat, 28 00:01:41,950 --> 00:01:47,600 vad du faktiskt ser är att det du ser är vad du får. 29 00:01:47,600 --> 00:01:51,690 Detta är "bättre", så "CSI" har det lite fel. 30 00:01:51,690 --> 00:01:55,190 Det finns en annan klipp, om vi kan plocka på "CSI" bara lite längre. 31 00:01:55,190 --> 00:01:58,500 Detta är en trevlig fras att uttala hädanefter om du vill 32 00:01:58,500 --> 00:02:10,280 grundlig teknisk med dina vänner när egentligen, du säger absolut ingenting. 33 00:02:10,280 --> 00:02:12,970 >> [Man] I veckor har jag undersöker Cabby Killer morden 34 00:02:12,970 --> 00:02:15,360 med en viss morbid fascination. 35 00:02:15,360 --> 00:02:17,160 [Kvinna # 1] Detta är i realtid. 36 00:02:17,160 --> 00:02:22,930 [Kvinna # 2] Jag kommer att skapa ett grafiskt gränssnitt med hjälp av Visual Basic, se om jag kan spåra en IP-adress. 37 00:02:22,930 --> 00:02:29,570 >> [Malan] Så ljud ur synk åt sidan, skapa ett grafiskt gränssnitt med hjälp av Visual Basic 38 00:02:29,570 --> 00:02:31,820 att spåra en IP-adress är fullständigt nonsens. 39 00:02:31,820 --> 00:02:33,840 Dessa dagar du inte skulle använda Visual Basic, 40 00:02:33,840 --> 00:02:38,920 Det finns inget behov av ett GUI, och IP-adress var en tekniskt korrekt term. 41 00:02:38,920 --> 00:02:41,730 Så håll utkik efter dessa och en av mina favoriter: 42 00:02:41,730 --> 00:02:45,070 Den här är lite mer svårbegripliga, eftersom du behöver veta ett annat språk. 43 00:02:45,070 --> 00:02:47,860 Det finns ett språk som kallas Objective-C, som är ett superset av C. 44 00:02:47,860 --> 00:02:51,960 Vilket innebär att det är C plus några extra funktioner, bland dem objektorienterad programmering. 45 00:02:51,960 --> 00:02:55,070 Och detta är det språk som Apple har populariserat för iOS-programmering. 46 00:02:55,070 --> 00:02:58,760 Och så här är ett klipp från en annan show helt och hållet, från "Numbers" 47 00:02:58,760 --> 00:03:02,450 att om du faktiskt tittar noga på din TiVo och pausa vid rätt tidpunkt, 48 00:03:02,450 --> 00:03:07,700 ser du att det de tittar på är inte riktigt vad som beskrivs. 49 00:03:07,700 --> 00:03:11,170 Och låt mig prova ett annat ljudkontakt här och se om vi inte kan 50 00:03:11,170 --> 00:03:13,780 hålla ljudet i synk denna gång. 51 00:03:13,780 --> 00:03:20,530 Jag ger dig "Numbers". 52 00:03:20,530 --> 00:03:23,240 >> [Man # 1] Det är en 32-bitars IPv4-adress. 53 00:03:23,240 --> 00:03:38,930 [Man # 2] IP, det är Internet. >> Privat nätverk. Det är Anitas privata nätverk. 54 00:03:38,930 --> 00:03:43,810 [Malan] Okej. Detta är Objective-C, och det är för några barnens färg program 55 00:03:43,810 --> 00:03:51,140 som du kan kanske dra slutsatsen att namnet på variabeln där. 56 00:03:51,140 --> 00:03:54,410 Så att då var "Numbers". Så idag och den här veckan presenterar vi 57 00:03:54,410 --> 00:03:57,740 lite av världen av kriminalteknik och det sammanhang i problemen därför. 58 00:03:57,740 --> 00:04:00,590 Idag blir en förkortad föreläsning eftersom det finns en särskild händelse här 59 00:04:00,590 --> 00:04:05,530 efteråt, så vi tar en titt, och retas både elever och föräldrar i dag 60 00:04:05,530 --> 00:04:07,420 med några av de saker som är på horisonten. 61 00:04:07,420 --> 00:04:12,240 Bland dem, som i måndag, kommer du att ha några fler klasskamrater. 62 00:04:12,240 --> 00:04:16,050 EDX, Harvard och MITs ny online initiativ för fritt studiematerial 63 00:04:16,050 --> 00:04:19,120 och mer, lanserar på Harvards campus på måndag. 64 00:04:19,120 --> 00:04:21,490 Vilket innebär kommer måndag får du - som förra räkningen, 65 00:04:21,490 --> 00:04:26,210 86.000 nya klasskamrater kommer att följa tillsammans med CS50 föreläsningar 66 00:04:26,210 --> 00:04:29,170 och sektioner och genomgångar och sätter problem. 67 00:04:29,170 --> 00:04:32,350 Och som en del av detta kommer du att bli medlemmar i det inledande klass 68 00:04:32,350 --> 00:04:35,090 CS50 och nu CS50x. 69 00:04:35,090 --> 00:04:39,310 >> Som en del av detta, nu inser att det kommer att finnas några upsides också. 70 00:04:39,310 --> 00:04:43,790 Att göra sig redo för det här, för det massiva antalet studenter, 71 00:04:43,790 --> 00:04:47,180 det räcker med att säga att även om vi har 108 TFS och CAS, 72 00:04:47,180 --> 00:04:50,790 inte riktigt den bästa förhållandet elever / lärare när vi slog 80.000 andra studenter. 73 00:04:50,790 --> 00:04:52,850 Så vi inte kommer att klassificera så många problem sätter manuellt. 74 00:04:52,850 --> 00:04:55,920 Så introducerade denna vecka i problemet som kommer att vara CS50 Check, 75 00:04:55,920 --> 00:04:58,450 som kommer att bli en kommandorad verktyg inom apparaten 76 00:04:58,450 --> 00:05:01,200 att du får när du uppdaterar det senare i helgen, 77 00:05:01,200 --> 00:05:03,200 och du kommer att kunna köra ett kommando, kontrollera 50, 78 00:05:03,200 --> 00:05:06,500 på din egen pset, och du får lite feedback om huruvida ditt program är 79 00:05:06,500 --> 00:05:11,160 rätt eller fel enligt olika design specifikationer som vi har tillhandahållit. 80 00:05:11,160 --> 00:05:13,580 Så mer om det och problemet inställda specifikation och 81 00:05:13,580 --> 00:05:17,240 de CS50x klasskamrater kommer att använda detta. 82 00:05:17,240 --> 00:05:19,230 >> Så problemet set 4 handlar om kriminalteknik. 83 00:05:19,230 --> 00:05:21,940 Och detta stycke inspirerades av några verkliga saker, 84 00:05:21,940 --> 00:05:24,620 varigenom när jag var i forskarskolan, internerad jag en stund med 85 00:05:24,620 --> 00:05:28,650 Middlesex län åklagare kontor gör kriminaltekniska arbetet 86 00:05:28,650 --> 00:05:31,650 med sin ledning kriminaltekniska utredare, och vad detta uppgick till 87 00:05:31,650 --> 00:05:35,260 är, jag tror jag nämnde några veckors förflutna, är massan statspolisen eller andra 88 00:05:35,260 --> 00:05:39,000 skulle komma, skulle de släppa ut saker som hårddiskar och CD-skivor och disketter 89 00:05:39,000 --> 00:05:42,340 och liknande, och därefter mål kriminalteknik kontoret var att fastställa om 90 00:05:42,340 --> 00:05:44,600 fanns eller inte var bevis av något slag. 91 00:05:44,600 --> 00:05:48,010 Detta var den särskilda utredningar enhet, så det var ekonomisk brottslighet, 92 00:05:48,010 --> 00:05:52,350 det var mer oroande slags brott, 93 00:05:52,350 --> 00:05:55,990 något som innebär någon form av digitala medier, visar sig att inte så många människor 94 00:05:55,990 --> 00:05:59,370 skriv ett mail som säger "jag gjorde det." 95 00:05:59,370 --> 00:06:03,290 Så ofta dessa kriminalteknik söker inte dyker upp så mycket frukt, 96 00:06:03,290 --> 00:06:05,850 men ibland folk skulle skriva sådana meddelanden. 97 00:06:05,850 --> 00:06:08,490 Så ibland de insatser belönades. 98 00:06:08,490 --> 00:06:14,420 >> Men att leda fram till detta kriminaltekniska pset kommer vi att introducera i pset 4 lite grafik. 99 00:06:14,420 --> 00:06:18,260 Så du tar förmodligen dessa saker för givet, JPEG, GIF och liknande dessa dagar, 100 00:06:18,260 --> 00:06:21,640 men om du verkligen tänker på det, en bild, ungefär som Rob ansikte, 101 00:06:21,640 --> 00:06:24,430 skulle kunna utformas som en sekvens av punkter, eller pixlar. 102 00:06:24,430 --> 00:06:26,680 Nu, i fallet med Robs ansikte, det finns alla möjliga färger, 103 00:06:26,680 --> 00:06:29,940 och vi började se de enskilda punkter, otherwide kallade pixlar, 104 00:06:29,940 --> 00:06:31,610 när vi började att zooma in 105 00:06:31,610 --> 00:06:35,590 Men om vi förenklar världen lite, och bara säga att detta här är Rob 106 00:06:35,590 --> 00:06:40,560 i svart och vitt, ja, för att representera svartvitt kan vi bara använda binär. 107 00:06:40,560 --> 00:06:44,960 Och om vi ska använda binära, 1 eller 0, kan vi uttrycka samma bild 108 00:06:44,960 --> 00:06:51,970 av Rob leende ansikte med detta mönster av bitar: 11000011 representerar 109 00:06:51,970 --> 00:06:55,160 vit, vit, svart, svart, svart, svart, vit vit. 110 00:06:55,160 --> 00:06:59,290 Och så är det inte ett stort steg då att börja tala om färgglada bilder. 111 00:06:59,290 --> 00:07:01,920 Saker som du skulle se på Facebook eller ta med en digitalkamera, 112 00:07:01,920 --> 00:07:04,730 men visst, när det kommer till färger, behöver du fler bitar. 113 00:07:04,730 --> 00:07:08,470 Och ganska vanligt i världen av fotografier är att inte använda 1-bitars färg, 114 00:07:08,470 --> 00:07:12,730 eftersom detta antyder, men 24-bitars färg, där du faktiskt få miljontals färger. 115 00:07:12,730 --> 00:07:15,430 Så som i fallet när vi zoomat in på Rob öga, 116 00:07:15,430 --> 00:07:19,270 Det var ett antal miljoner olika färgglada möjligheter. 117 00:07:19,270 --> 00:07:22,260 >> Så vi ska införa detta i problemet set 4 samt i genomgången, 118 00:07:22,260 --> 00:07:27,050 som kommer att vara idag på 3:30 istället för den vanliga 2:30 på grund av fredagens föreläsning här. 119 00:07:27,050 --> 00:07:29,930 Men videon kommer att vara online, som vanligt, i morgon. 120 00:07:29,930 --> 00:07:31,880 Vi kommer också att introducera dig till ett annat filformat. 121 00:07:31,880 --> 00:07:34,150 Så detta är medvetet tänkt att se hotfull först, 122 00:07:34,150 --> 00:07:38,980 men detta är bara några underlag för en C struct. 123 00:07:38,980 --> 00:07:42,280 Det visar sig att Microsoft, år sedan hjälpte popularisera detta format, 124 00:07:42,280 --> 00:07:46,630 kallas bitmapp filformat, BMP, och detta var en super-enkel, 125 00:07:46,630 --> 00:07:50,390 färgstarka grafiska filformat som användes under ganska lång tid 126 00:07:50,390 --> 00:07:53,640 och ibland fortfarande för tapeter på stationära datorer. 127 00:07:53,640 --> 00:07:57,410 Om du tänker tillbaka på Windows XP och de böljande kullar och blå himmel, 128 00:07:57,410 --> 00:08:00,660 Det var oftast en BMP eller bitmappsbild och bitmappar 129 00:08:00,660 --> 00:08:03,340 är roligt för oss eftersom de har lite mer komplexitet. 130 00:08:03,340 --> 00:08:05,640 Det är inte riktigt så enkelt som det nät av 0 s och 1 s, 131 00:08:05,640 --> 00:08:10,680 I stället har du saker som en rubrik i början av en fil. 132 00:08:10,680 --> 00:08:15,520 Så med andra ord, i en. Bmp-fil är en hel massa 0 s och 1 s, 133 00:08:15,520 --> 00:08:18,070 men det finns några ytterligare 0 s och 1 s där. 134 00:08:18,070 --> 00:08:21,450 Och det visar sig att det vi förmodligen har tagit för givet år, 135 00:08:21,450 --> 00:08:27,040 filformat som. doc eller. xls eller. mp3 eller. mp4, 136 00:08:27,040 --> 00:08:29,910 oavsett filformat som du är bekant med. 137 00:08:29,910 --> 00:08:31,900 Nå, vad betyder det även att vara ett filformat? 138 00:08:31,900 --> 00:08:35,740 Eftersom i slutet av dagen, alla dessa filer använder vi bara har 0 s och 1 s 139 00:08:35,740 --> 00:08:39,950 och kanske de 0 s och 1 s representerar en, b, c, genom ASCII eller liknande, 140 00:08:39,950 --> 00:08:42,030 men till slutet av dagen, det är bara 0 s och 1 s. 141 00:08:42,030 --> 00:08:45,300 >> Så människor bara ibland väljer att uppfinna ett nytt filformat 142 00:08:45,300 --> 00:08:49,420 där de standardisera vilka mönster av bitar i praktiken kommer att innebära. 143 00:08:49,420 --> 00:08:52,790 Och i detta fall här, folk som ritade bitmap-format 144 00:08:52,790 --> 00:08:58,260 sade att den allra första byten i en bitmappsfil som betecknas med offset 0, där 145 00:08:58,260 --> 00:09:02,320 det kommer att vara några kryptiskt namn variabel kallad bfType, 146 00:09:02,320 --> 00:09:06,510 som står bara för bitmap filtyp, vilken typ av bitmappsfil är. 147 00:09:06,510 --> 00:09:10,780 Du kan sluta, kanske från den andra raden som offset 2, byte nummer 2, 148 00:09:10,780 --> 00:09:15,980 har ett mönster av 0 s och 1 s som representerar vad? 149 00:09:15,980 --> 00:09:18,320 Storleken på något, och det går därifrån. 150 00:09:18,320 --> 00:09:20,660 Så i problembild 4, kommer du att gått igenom några av dessa saker. 151 00:09:20,660 --> 00:09:24,480 >> Vi kommer inte att sluta bry sig om dem alla, men märker det börjar bli intressant 152 00:09:24,480 --> 00:09:30,780 runt linje eller byte 54, rgbtBlue, grönt och rött. 153 00:09:30,780 --> 00:09:35,280 Om du någonsin hört förkortningen RGB, röd grön blå, är detta en hänvisning till detta. 154 00:09:35,280 --> 00:09:37,840 Eftersom det visar sig att du kan måla alla regnbågens färger 155 00:09:37,840 --> 00:09:41,580 med en kombination av rött och blått och grönt. 156 00:09:41,580 --> 00:09:46,560 Och i själva verket kan föräldrarna i rummet erinra om några av de tidigaste projektorer. 157 00:09:46,560 --> 00:09:49,360 Dessa dagar, ser du bara 1 ljus som kommer ut ur en lins. 158 00:09:49,360 --> 00:09:52,870 Men tillbaka i dag, hade du den röda linsen, blå lins, och den gröna linsen 159 00:09:52,870 --> 00:09:56,620 och tillsammans syftar till skärmen och bildade en färgstark bild. 160 00:09:56,620 --> 00:09:59,590 Och ganska ofta mellersta skolor och gymnasier skulle ha dessa linser 161 00:09:59,590 --> 00:10:02,680 allt-så-lite snett, så att du var typ att se dubbla eller tredubbla bilder, 162 00:10:02,680 --> 00:10:07,500 men det var tanken. Du hade rött och grönt och blått ljus måla en bild. 163 00:10:07,500 --> 00:10:09,570 Och att samma princip används i datorer. 164 00:10:09,570 --> 00:10:12,000 >> Så bland de utmaningar, då för er i problemet som 4 165 00:10:12,000 --> 00:10:16,080 kommer att vara ett par saker, en är att faktiskt ändra storlek på en bild. 166 00:10:16,080 --> 00:10:18,050 Att ta in ett mönster av 0 s och 1 s, 167 00:10:18,050 --> 00:10:22,840 reda på vilka bitar av 0 s och 1 s representerar vad i en struktur som denna, 168 00:10:22,840 --> 00:10:26,800 och sedan räkna ut hur att replikera pixlar: de röda, de blå, de gröna 169 00:10:26,800 --> 00:10:32,460 insidan så att när en bild ser ut så här från början, kan se ut så här i stället efter det. 170 00:10:32,460 --> 00:10:35,590 Bland andra utmaningar också kommer att vara att du kommer att överlämnas 171 00:10:35,590 --> 00:10:38,900 en rättsmedicinsk bild av en verklig fil från en digitalkamera 172 00:10:38,900 --> 00:10:42,410 och på den kamera, en gång i tiden var en massa bilder. 173 00:10:42,410 --> 00:10:47,030 Problemet är, raderas vi av misstag eller hade bilden skadad på något sätt. 174 00:10:47,030 --> 00:10:51,040 Dåliga saker händer med digitalkameror, så vi snabbt kopierade alla 0 s och 1 s 175 00:10:51,040 --> 00:10:55,410 bort av det kortet för dig, räddade dem alla i 1 stor fil, och sedan kommer vi lämna dem till dig 176 00:10:55,410 --> 00:11:00,000 i problemet som 4 så att du kan skriva ett program i C som man kan återvinna 177 00:11:00,000 --> 00:11:02,660 alla dessa JPEG, helst. 178 00:11:02,660 --> 00:11:06,280 Och det visar sig att JPEG, även om de är något av en komplex filformat, 179 00:11:06,280 --> 00:11:09,580 de är mycket mer komplex än så leende ansikte här. 180 00:11:09,580 --> 00:11:14,320 Det visar sig att varje JPEG börjar med samma mönster 0 s och 1 s. 181 00:11:14,320 --> 00:11:18,820 Så med hjälp av en while-slinga eller en for-slinga eller liknande, 182 00:11:18,820 --> 00:11:22,350 Du kan iterera över alla 0 s och 1 s i rättsmedicinska bilden 183 00:11:22,350 --> 00:11:26,670 och varje gång du ser den speciella mönster som är definierat i problemet uppsättningen specifikation, 184 00:11:26,670 --> 00:11:29,770 Du kan anta, "Åh, här är, med mycket hög sannolikhet, 185 00:11:29,770 --> 00:11:33,520 början på en JPEG, "och så fort du hittar samma mönster, 186 00:11:33,520 --> 00:11:36,050 visst antal byte eller kilobyte eller megabyte senare, 187 00:11:36,050 --> 00:11:40,550 Du kan anta "Ooh! Här är en andra JPEG bilden jag tog efter den första. 188 00:11:40,550 --> 00:11:44,720 Låt mig sluta läsa den första filen, börjar skriva detta nya. " 189 00:11:44,720 --> 00:11:49,980 Och utgången av ditt program för pset 4 kommer att bli så många som 50 JPEG-bilder. 190 00:11:49,980 --> 00:11:52,400 Och om det inte är 50 JPEG-bilder, du har en bit av en slinga. 191 00:11:52,400 --> 00:11:55,580 Om du har ett oändligt antal JPEG, har du en oändlig loop. 192 00:11:55,580 --> 00:11:58,280 Så att även kommer att vara en ganska vanligt fall. 193 00:11:58,280 --> 00:12:00,280 Det är vad som finns på horisonten. 194 00:12:00,280 --> 00:12:03,740 >> Quiz 0, bakom oss. Inse, per min e-post, som alltid finns folk 195 00:12:03,740 --> 00:12:06,820 som är både glad, typ av neutrala och ledsna runt frågesport 0 tid. 196 00:12:06,820 --> 00:12:10,160 Och ska du nå ut till mig, huvudet TFS, Zamyla, din egen TF 197 00:12:10,160 --> 00:12:14,120 eller en av de certifikatutfärdare som du vet om du vill diskutera hur det gick. 198 00:12:14,120 --> 00:12:16,460 >> Så för att imponera på föräldrarna här i rummet, 199 00:12:16,460 --> 00:12:23,990 vad är CS50 biblioteket? Bra jobbat. 200 00:12:23,990 --> 00:12:32,280 Vad är det CS50 biblioteket? Ja? [Student svar, obegripligt] 201 00:12:32,280 --> 00:12:35,730 >> Okej, bra. Så det är en färdigskriven uppsättning kod som vi, personalen, skrev, 202 00:12:35,730 --> 00:12:38,460 Vi erbjuder dig att ge några vanliga funktioner. 203 00:12:38,460 --> 00:12:42,290 Sånt får mig en sträng, få mig en int, alla de funktioner som är listade här. 204 00:12:42,290 --> 00:12:45,260 Från och med nu börjar vi verkligen ta dessa stödhjul av. 205 00:12:45,260 --> 00:12:48,230 Så vi kommer att börja att ta bort en "sträng" från dig, 206 00:12:48,230 --> 00:12:52,790 vilket minns, var bara en synonym för vad den faktiska datatypen? char *. 207 00:12:52,790 --> 00:12:57,020 Så för föräldrar, det var nog - det är bra, så char * vi börjar se 208 00:12:57,020 --> 00:13:00,810 på skärmen desto mer när vi tar bort "sträng" från vår vokabulär, 209 00:13:00,810 --> 00:13:02,760 åtminstone när det gäller att faktiskt skriva kod. 210 00:13:02,760 --> 00:13:06,240 Likaså kommer vi sluta använda vissa av dessa funktioner så mycket, 211 00:13:06,240 --> 00:13:08,390 eftersom våra program kommer att få mer sofistikerade 212 00:13:08,390 --> 00:13:11,370 snarare än att bara skriva program som sitter där med en snabb blinkande, 213 00:13:11,370 --> 00:13:13,580 väntar på användaren att skriva något i. 214 00:13:13,580 --> 00:13:15,220 Du kommer att få dina insatser från andra håll. 215 00:13:15,220 --> 00:13:18,720 Till exempel får du dem från en rad bitar på den lokala hårddisken. 216 00:13:18,720 --> 00:13:23,340 Du kommer istället få dem i framtiden från en nätverksanslutning, vissa hemsidan någonstans. 217 00:13:23,340 --> 00:13:27,460 Så låt oss dra tillbaka detta lager för första gången, och dra upp CS50 apparaten 218 00:13:27,460 --> 00:13:32,300 och denna fil som heter CS50.h, som du har varit skarp även i veckor. 219 00:13:32,300 --> 00:13:34,380 >> Men låt oss faktiskt se vad som finns inuti denna. 220 00:13:34,380 --> 00:13:38,250 Så toppen av filen i blått är bara en massa kommentarer, 221 00:13:38,250 --> 00:13:41,340 garantiinformation och licensiering. Detta är en slags gemensam paradigm 222 00:13:41,340 --> 00:13:44,600 i programvara, eftersom en massa program dessa dagar är vad som kallas "öppen källkod" 223 00:13:44,600 --> 00:13:46,940 vilket innebär att någon har skrivit koden 224 00:13:46,940 --> 00:13:50,060 och gjort den fritt tillgängliga, inte bara för att köra och att använda, 225 00:13:50,060 --> 00:13:53,660 men faktiskt läsa och ändra och integrera i ditt eget arbete. 226 00:13:53,660 --> 00:13:55,790 Så det är vad du har använt, öppen källkod, 227 00:13:55,790 --> 00:13:58,030 än i en mycket liten form. 228 00:13:58,030 --> 00:14:01,860 Om jag bläddra ner förbi kommentarer, men vi börjar se lite mer bekanta saker. 229 00:14:01,860 --> 00:14:08,090 Så märker upptill här, att CS50.h filen innehåller en hel del header-filer. 230 00:14:08,090 --> 00:14:11,160 Nu är de flesta av dem har vi inte sett förut, men en är 231 00:14:11,160 --> 00:14:15,640 välbekant, vilka av dessa har vi sett, om än kortfattat, hittills? 232 00:14:15,640 --> 00:14:18,720 Ja, standard bibliotek. Stdlib.h har malloc, 233 00:14:18,720 --> 00:14:21,590 så när vi började prata om dynamisk minnesallokering, 234 00:14:21,590 --> 00:14:24,960 som vi ska återkomma till nästa vecka också, började vi även den filen. 235 00:14:24,960 --> 00:14:29,660 Det visar sig att bool och sant och falskt egentligen inte existerar i C, i sig, 236 00:14:29,660 --> 00:14:32,460 om du inte inkludera denna fil här. 237 00:14:32,460 --> 00:14:35,770 Så vi har, i flera veckor, har inklusive standard bool.h 238 00:14:35,770 --> 00:14:39,020 så att du kan använda begreppet bool, sant eller falskt. 239 00:14:39,020 --> 00:14:41,830 Utan detta, skulle du behöva sortera av falska den och använda en int 240 00:14:41,830 --> 00:14:45,920 och bara godtyckligt anta att 0 är falsk och 1 är sant. 241 00:14:45,920 --> 00:14:49,980 >> Om vi ​​nu rulla ner ytterligare, här är vår definition av en sträng. 242 00:14:49,980 --> 00:14:54,820 Det visar sig, som vi har sagt tidigare, att där det * är egentligen inte någon roll. 243 00:14:54,820 --> 00:14:56,750 Du kan även få utrymme runt. 244 00:14:56,750 --> 00:15:01,550 Vi denna termin har varit att främja det som detta för att göra klart att * har att göra med typen. 245 00:15:01,550 --> 00:15:05,370 Men inser, precis som vanligt, om inte lite vanligare, är att sätta det där 246 00:15:05,370 --> 00:15:07,480 men funktionellt är det samma sak. 247 00:15:07,480 --> 00:15:11,070 Men nu, när vi läser ned ytterligare, låt oss ta en titt på säg, getInt, 248 00:15:11,070 --> 00:15:15,350 eftersom vi använde det, kanske före allt annat här terminen. 249 00:15:15,350 --> 00:15:19,620 Och här är getInt. Detta är vad? 250 00:15:19,620 --> 00:15:24,650 Detta är prototypen. Så ofta har vi lagt prototyper på toppen av vår. C-filer, 251 00:15:24,650 --> 00:15:28,190 men du kan också lägga prototyper i header-filer,. h-filer, 252 00:15:28,190 --> 00:15:32,110 som den här här, så att när du skriver vissa funktioner 253 00:15:32,110 --> 00:15:36,790 som du vill att andra ska kunna använda, vilket är precis fallet med CS50 biblioteket 254 00:15:36,790 --> 00:15:40,900 du inte bara genomföra dina uppgifter i något liknande CS50.c, 255 00:15:40,900 --> 00:15:46,720 du sätter också prototyperna inte på toppen av filen, men på toppen av en huvudfil, 256 00:15:46,720 --> 00:15:50,810 då header-fil är det som vänner och kollegor inkluderar, 257 00:15:50,810 --> 00:15:52,800 med skarp i sina egen kod. 258 00:15:52,800 --> 00:15:55,440 Så hela den här tiden du har med alla dessa prototyper 259 00:15:55,440 --> 00:15:59,870 effektivt på toppen av din fil, men med hjälp av denna skarpa inkluderar mekanism 260 00:15:59,870 --> 00:16:03,320 att i huvudsak kopior och pastor filen till din egen. 261 00:16:03,320 --> 00:16:06,400 Nu, här är några ganska detaljerad dokumentation. 262 00:16:06,400 --> 00:16:08,880 >> Vi har ganska mycket tas för givet att getInt får en int, 263 00:16:08,880 --> 00:16:10,740 men det visar sig att det finns vissa hörn fall, eller hur? 264 00:16:10,740 --> 00:16:14,320 Vad händer om användaren skriver in ett nummer som är alldeles för stor? 265 00:16:14,320 --> 00:16:17,350 En kvintiljon, som bara inte får plats inuti en int? 266 00:16:17,350 --> 00:16:21,180 Vad är det förväntade beteendet? Tja, helst, det är förutsägbart. 267 00:16:21,180 --> 00:16:23,460 Så i det här fallet, om du läser faktiskt det finstilta, 268 00:16:23,460 --> 00:16:27,850 ser du att om linjen inte kan läsas, detta returer INT_MAX. 269 00:16:27,850 --> 00:16:30,800 Vi har aldrig pratat om det här, men baserat på dess kapitalisering, 270 00:16:30,800 --> 00:16:33,030 vad är det, förmodligen? 271 00:16:33,030 --> 00:16:36,610 Det är en konstant, så det är några speciella konstant som troligen uttalade 272 00:16:36,610 --> 00:16:39,460 i en av dessa header-filer som finns högre upp i filen, 273 00:16:39,460 --> 00:16:43,400 och INT_MAX är förmodligen något i stil med, ungefär, 2 miljarder. 274 00:16:43,400 --> 00:16:48,160 Tanken är att eftersom vi måste på något sätt betyda att något gick fel, 275 00:16:48,160 --> 00:16:51,090 Vi, ja, har 4 miljarder siffror till vårt förfogande, 276 00:16:51,090 --> 00:16:53,980 negativ 2 miljarder på upp till 2 miljarder, ge eller ta. 277 00:16:53,980 --> 00:16:58,030 Nå, vad är vanligt i programmering är du stjäla bara en av dessa siffror. 278 00:16:58,030 --> 00:17:02,250 Kanske 0, kanske 2 miljarder, kanske negativ 2 miljarder. 279 00:17:02,250 --> 00:17:06,720 Så du tillbringar en av dina möjliga värden så att du kan engagera sig i världen 280 00:17:06,720 --> 00:17:10,089 att om något går fel, jag återkommer denna super-stora värde. 281 00:17:10,089 --> 00:17:13,329 Men du vill inte att användaren skriver något kryptiskt som "2, 3, 4 ..." 282 00:17:13,329 --> 00:17:17,079 riktigt stort antal, där du generalisera istället som en konstant. 283 00:17:17,079 --> 00:17:19,380 Så egentligen, om du är analsex de senaste veckorna, 284 00:17:19,380 --> 00:17:23,800 när du ringer getInt bör du ha kontroll med om tillstånd. 285 00:17:23,800 --> 00:17:27,109 Har användaren skriver INT_MAX, eller mer specifikt, 286 00:17:27,109 --> 00:17:29,900 gjorde getInt tillbaka INT_MAX? För om den gjorde det, 287 00:17:29,900 --> 00:17:35,140 det betyder egentligen de inte skriva det, något gick fel i det här fallet. 288 00:17:35,140 --> 00:17:38,970 Så detta är vad som allmänt är känt som ett "sentinel" värde, vilket betyder bara speciell. 289 00:17:38,970 --> 00:17:41,020 >> Nåväl, låt oss nu gå in på. C-filer. 290 00:17:41,020 --> 00:17:44,500 C-filen har funnits i apparaten under en längre tid, 291 00:17:44,500 --> 00:17:47,540 och, i själva verket har den apparat förkompilerad för dig 292 00:17:47,540 --> 00:17:49,720 in i den sak vi kallade "objektkod" 293 00:17:49,720 --> 00:17:52,940 men det bara inte roll för dig om det är på grund av att systemet vet, 294 00:17:52,940 --> 00:17:54,780 i detta fall, där det är, apparaten. 295 00:17:54,780 --> 00:18:00,620 Men låt oss rulla ner nu getInt, och se hur getInt har arbetat hela tiden. 296 00:18:00,620 --> 00:18:02,380 Så här har vi liknande kommentarer från tidigare. 297 00:18:02,380 --> 00:18:04,930 Låt mig zooma in på bara koden delen, 298 00:18:04,930 --> 00:18:07,410 och vad vi har för getInt är följande. 299 00:18:07,410 --> 00:18:12,770 Det tar ingen inmatning och returnerar en int, medan (sant), så vi har en medveten oändlig loop 300 00:18:12,770 --> 00:18:16,560 men förmodligen kommer vi bryta detta på något sätt, eller återgå från inom detta. 301 00:18:16,560 --> 00:18:19,890 Så låt oss se hur det fungerar. Tja, verkar vi använda GetString 302 00:18:19,890 --> 00:18:22,550 I denna första raden innanför slingan, 166. 303 00:18:22,550 --> 00:18:25,320 Detta är nu god praxis för under vilka omständigheter 304 00:18:25,320 --> 00:18:30,820 kan GetString returnera denna speciella sökord, NULL? 305 00:18:30,820 --> 00:18:38,460 Om något går fel. Vad kan gå fel när du ringer något liknande GetString? 306 00:18:38,460 --> 00:18:42,550 Ja? [Student svar, obegripliga] >> Ja. Så kanske malloc misslyckas. 307 00:18:42,550 --> 00:18:45,310 Någonstans under huven GetString ringer malloc, 308 00:18:45,310 --> 00:18:48,210 som fördelar minne, som låter datorbutik 309 00:18:48,210 --> 00:18:50,950 alla tecken som användaren skriver in på tangentbordet. 310 00:18:50,950 --> 00:18:53,270 Och antar att användaren hade en hel del ledig tid 311 00:18:53,270 --> 00:18:56,470 och skrev mer, till exempel, än 2 miljarder tecken. 312 00:18:56,470 --> 00:18:59,600 Fler tecken än datorn har även RAM. 313 00:18:59,600 --> 00:19:02,350 Jo, GetString kunna beteckna att du, 314 00:19:02,350 --> 00:19:05,650 även om detta är en super, super ovanligt hörn fall. 315 00:19:05,650 --> 00:19:08,490 Det måste på något sätt kunna hantera detta, och så GetString, 316 00:19:08,490 --> 00:19:11,850 Om vi ​​går tillbaka och läsa dess dokumentation, inte i själva verket tillbaka NULL. 317 00:19:11,850 --> 00:19:16,150 Nu om GetString misslyckas genom att returnera NULL är getInt kommer att misslyckas 318 00:19:16,150 --> 00:19:19,370 genom att returnera INT_MAX, precis som en vaktpost. 319 00:19:19,370 --> 00:19:22,650 Dessa är bara mänskliga konventioner. Det enda sättet du skulle veta detta är fallet 320 00:19:22,650 --> 00:19:24,840 är genom att läsa dokumentationen. 321 00:19:24,840 --> 00:19:28,200 Så låt oss bläddra ner till där int faktiskt GotInt. 322 00:19:28,200 --> 00:19:34,220 >> Så om jag bläddra ner lite längre, i linje 170 har vi en kommentar ovanför dessa rader. 323 00:19:34,220 --> 00:19:38,470 Så vi förklarar i 172, en int n och en röding C och sedan den nya funktionen 324 00:19:38,470 --> 00:19:41,870 som vissa av er har snubblat över tidigare, men sscanf. 325 00:19:41,870 --> 00:19:44,190 Detta står för sträng Scan f.. 326 00:19:44,190 --> 00:19:48,580 Med andra ord, ge mig en sträng och jag kommer att söka det för bitar av information av intresse. 327 00:19:48,580 --> 00:19:53,820 Så vad betyder det? Tja, antar att jag skriver i, bokstavligen, 1 2 3 på tangentbordet, 328 00:19:53,820 --> 00:19:59,730 och sedan trycka Enter. Vad är datatypen för 1 2 3 när returneras av GetString? 329 00:19:59,730 --> 00:20:05,010 Det är naturligtvis en sträng, eller hur? Jag fick en sträng, så 1 2 3 är verkligen "1 2 3" 330 00:20:05,010 --> 00:20:07,260 med \ 0 i slutet av den. Det är inte en int. 331 00:20:07,260 --> 00:20:10,420 Det är inte ett nummer. Det ser ut som ett nummer men det är faktiskt inte. 332 00:20:10,420 --> 00:20:14,680 Så vad har getInt att göra? Den måste avsöka strängen vänster till höger, 333 00:20:14,680 --> 00:20:19,010 1 2 3 \ 0, och på något sätt omvandla den till en verklig heltal. 334 00:20:19,010 --> 00:20:21,010 Nu kan du räkna ut hur man gör detta. 335 00:20:21,010 --> 00:20:24,240 Om du tänker tillbaka på pset 2, du förmodligen lite bekväm 336 00:20:24,240 --> 00:20:26,810 med Caesar eller Vigenère så att du kan iterera över en sträng, 337 00:20:26,810 --> 00:20:29,800 Du kan konvertera tecken vare sin med val. Det är en hel del arbete. 338 00:20:29,800 --> 00:20:32,800 Varför inte kalla en funktion som sscanf som gör det åt dig? 339 00:20:32,800 --> 00:20:37,520 Så sscanf förväntar ett argument, i detta fall kallas linje, vilket är en sträng. 340 00:20:37,520 --> 00:20:41,310 Du anger sedan i citat, mycket likt printf, 341 00:20:41,310 --> 00:20:44,960 vad förväntar ni er att se i denna sträng? 342 00:20:44,960 --> 00:20:52,980 Vad jag säger här är, jag förväntar mig att se ett decimaltal och kanske ett tecken. 343 00:20:52,980 --> 00:20:54,990 Och vi kommer att se varför detta är fallet på bara ett ögonblick. 344 00:20:54,990 --> 00:20:58,440 Det visar sig att denna notation nu påminner om saker 345 00:20:58,440 --> 00:21:00,840 Vi började prata om drygt en vecka sedan. 346 00:21:00,840 --> 00:21:05,430 >> Vad är & n och & c gör för oss här? [Student svar, obegripligt] 347 00:21:05,430 --> 00:21:07,610 >> Ja. Det ger mig adressen till n och adress c.. 348 00:21:07,610 --> 00:21:10,440 Nu, varför är det viktigt? Tja, du vet att med funktioner i C 349 00:21:10,440 --> 00:21:13,440 Du kan alltid returnera ett värde eller inget värde alls. 350 00:21:13,440 --> 00:21:16,630 Du kan returnera en int, en sträng, en flottör, en röding, vad som helst. 351 00:21:16,630 --> 00:21:21,150 Eller så kan du gå tillbaka ogiltig, men du kan bara returnera 1 sak maximalt. 352 00:21:21,150 --> 00:21:26,100 Men här vill vi sscanf tillbaka mig kanske en int, ett decimaltal, 353 00:21:26,100 --> 00:21:29,240 och även en röding, och jag ska förklara varför röding i ett ögonblick. 354 00:21:29,240 --> 00:21:34,250 Så du vill faktiskt f för att återgå 2 saker, det är bara inte möjligt i C. 355 00:21:34,250 --> 00:21:38,460 Så du kan lösa det genom att i 2 adresser, 356 00:21:38,460 --> 00:21:43,710 eftersom så snart du lämnar en funktion 2 adresser, vad kan denna funktion göra med dem? 357 00:21:43,710 --> 00:21:49,880 Den kan skriva till dessa adresser. Du kan använda * funktion och "gå dit" till var och en av dessa adresser. 358 00:21:49,880 --> 00:21:54,320 Det är typ av denna bakdörr mekanism, men mycket vanligt för att ändra värdena på variablerna 359 00:21:54,320 --> 00:21:58,020 i mer än bara 1 plats, i detta fall 2. 360 00:21:58,020 --> 00:22:04,590 Nu märker jag söker efter == till 1, och sedan återvänder n om det betyder i själva verket utvärderas till sant. 361 00:22:04,590 --> 00:22:09,340 Så vad händer? Tja, tekniskt, är allt vi verkligen vill ska hända i getInt detta. 362 00:22:09,340 --> 00:22:12,340 Vi vill tolka, så att säga, vi vill läsa strängen 363 00:22:12,340 --> 00:22:16,210 "1 2 3", och om det ser ut som det finns ett antal där, 364 00:22:16,210 --> 00:22:21,360 vad vi säger sscanf göra är att sätta den siffran, 1 2 3, i denna variabel n för mig. 365 00:22:21,360 --> 00:22:26,060 Varför då, jag har den här också? 366 00:22:26,060 --> 00:22:33,750 Vilken roll har också sagt, sscanf kan du också få ett tecken här. 367 00:22:33,750 --> 00:22:36,890 [Student sett obegripligt] >> Inte - ett decimaltecken skulle kunna fungera. 368 00:22:36,890 --> 00:22:40,650 Låt oss hålla det trodde för ett ögonblick. Vad mer? 369 00:22:40,650 --> 00:22:42,570 [Student, obegripligt] >> Så bra tanke, kan det vara NULL karaktär. 370 00:22:42,570 --> 00:22:44,970 Det är faktiskt inte i detta fall. Ja? [Student, obegripligt] 371 00:22:44,970 --> 00:22:47,100 >> >> ASCII. Eller låt mig generalisera ytterligare. 372 00:22:47,100 --> 00:22:49,670 Den% c finns bara för felkontroll. 373 00:22:49,670 --> 00:22:52,510 Vi vill inte att det skall finnas tecken efter siffran, 374 00:22:52,510 --> 00:22:54,980 men vad detta tillåter mig att göra är följande: 375 00:22:54,980 --> 00:23:01,270 Det visar sig att sscanf, förutom lagring av värden i n och C, i detta exempel här, 376 00:23:01,270 --> 00:23:08,170 vad det också gör det returnerar antalet variabler det sätta värden i. 377 00:23:08,170 --> 00:23:13,330 Så om du bara skriva in 1 2 3, då endast% d ska matcha 378 00:23:13,330 --> 00:23:18,830 och endast n får lagras med ett värde som 1 2 3 och inget får placeras i c; 379 00:23:18,830 --> 00:23:20,870 c fortfarande skräp värde, så att säga. 380 00:23:20,870 --> 00:23:23,550 Garbage eftersom det aldrig har varit initierad som ett visst värde. 381 00:23:23,550 --> 00:23:29,390 Så i så fall returnerar sscanf 1, eftersom jag befolkade en av dessa pekare, 382 00:23:29,390 --> 00:23:33,650 i vilket fall, bra. Jag har en int, så jag frigöra linjen för att frigöra minne 383 00:23:33,650 --> 00:23:37,150 att GetString tilldelade faktiskt, och sedan jag återvänder n. 384 00:23:37,150 --> 00:23:42,210 Annars, om du någonsin undrat var det nytt försök uttalande kommer från, kommer från här. 385 00:23:42,210 --> 00:23:45,770 Om däremot skriver jag i 1 2 3 foo, 386 00:23:45,770 --> 00:23:48,640 bara några slumpmässig sekvens av text är sscanf kommer att se, 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 Och det kommer att sätta 1 2 3 i n. 389 00:23:54,190 --> 00:23:59,970 Det kommer att sätta fi c och sedan återvända 2. 390 00:23:59,970 --> 00:24:02,980 Så vi har bara använda den grundläggande definitionen av scanf beteende, 391 00:24:02,980 --> 00:24:06,170 ett mycket enkelt sätt - ja, komplex vid första anblicken, men i slutet av dagen, 392 00:24:06,170 --> 00:24:11,460 ganska enkel mekanism att säga, är det en int, och i så fall är att det enda som jag hittade? 393 00:24:11,460 --> 00:24:14,950 Och det vita utrymmet här är avsiktligt. Om du läser dokumentationen för sscanf, 394 00:24:14,950 --> 00:24:18,690 det säger att om du har ett vitt utrymme i början eller slutet, 395 00:24:18,690 --> 00:24:24,990 sscanf också gör det möjligt för användaren, av någon anledning att slå mellanslagstangenten 1 2 3, och som kommer att vara legitim. 396 00:24:24,990 --> 00:24:28,310 Det kommer inte att skrika på användaren bara för att de drabbade mellanslagstangenten i början eller slutet, 397 00:24:28,310 --> 00:24:32,160 som är bara lite mer användarvänliga. 398 00:24:32,160 --> 00:24:34,160 >> Har du frågor, sedan på GetInts? Ja? 399 00:24:34,160 --> 00:24:36,820 [Student fråga, obegripligt] 400 00:24:36,820 --> 00:24:40,740 >> Bra fråga. Vad händer om du bara skrivit in en röding, som f och tryck enter 401 00:24:40,740 --> 00:24:47,830 utan att någonsin skriva 1 2 3, vad tror du beteendet hos denna kodrad då vara? 402 00:24:47,830 --> 00:24:50,500 Så sscanf kan täcka det också, för i så fall, 403 00:24:50,500 --> 00:24:56,280 det kommer inte att fylla N-eller C, det kommer att istället returnera 0. 404 00:24:56,280 --> 00:25:01,540 I vilket fall, jag fånga även detta scenario, eftersom det förväntade värdet jag vill ha är 1. 405 00:25:01,540 --> 00:25:07,310 Jag vill bara 1, och endast 1 sak att fyllas. Bra fråga. Andra? 406 00:25:07,310 --> 00:25:09,610 >> Okej, så låt inte oss gå igenom alla funktioner i här, 407 00:25:09,610 --> 00:25:11,820 men en som verkar vara, kanske av återstående intresse 408 00:25:11,820 --> 00:25:14,530 är getString eftersom det visar sig att getFloat, getInt, 409 00:25:14,530 --> 00:25:19,490 GetDouble, GetLongLong alla punt mycket av sin funktionalitet till GetString. 410 00:25:19,490 --> 00:25:22,860 Så låt oss ta en titt på hur han implementeras här. 411 00:25:22,860 --> 00:25:27,040 Den här ser lite komplicerat, men det använder samma grundläggande 412 00:25:27,040 --> 00:25:29,680 att vi började prata om förra veckan. Så i GetString, 413 00:25:29,680 --> 00:25:32,670 som tar inget argument enligt tomrummet här uppe, 414 00:25:32,670 --> 00:25:37,110 och den returnerar en sträng, så jag förklara en sträng som heter buffert. 415 00:25:37,110 --> 00:25:39,670 Jag vet inte riktigt vad det kommer att användas för än, men vi får se. 416 00:25:39,670 --> 00:25:42,950 Ser ut som kapaciteten är som standard 0, inte riktigt säker på var det kommer. 417 00:25:42,950 --> 00:25:44,920 Inte säker på vad n kommer att användas för ännu. 418 00:25:44,920 --> 00:25:47,860 Men nu det blir lite mer intressant, så i linje 243, 419 00:25:47,860 --> 00:25:51,760 Vi förklarar en int C, detta är en slags dum detalj. 420 00:25:51,760 --> 00:25:58,080 En röding är 8 bitar och 8 bitar kan lagra hur många olika värden? 421 00:25:58,080 --> 00:26:03,310 256. Problemet är, om du vill ha 256 olika ASCII-tecken, 422 00:26:03,310 --> 00:26:06,210 som det är, om du tänker tillbaka, och det är inte något att memorera. 423 00:26:06,210 --> 00:26:09,100 Men om du tänker tillbaka på den stora ASCII diagram vi hade veckor sedan, 424 00:26:09,100 --> 00:26:13,780 Det fanns, i så fall, 128 eller 256 ASCII-tecken. 425 00:26:13,780 --> 00:26:16,220 Vi använde alla mönster 0 s och 1: or upp. 426 00:26:16,220 --> 00:26:19,410 Det är ett problem om du vill kunna upptäcka ett fel. 427 00:26:19,410 --> 00:26:23,290 För om du redan använder 256 värden för dina karaktärer, 428 00:26:23,290 --> 00:26:26,390 du inte riktigt planera framåt, för nu har du ingen möjlighet att säga, 429 00:26:26,390 --> 00:26:29,750 "Detta är inte en legit karaktär, det är en del felaktiga budskap." 430 00:26:29,750 --> 00:26:32,430 Så vad världen gör är, de använder den näst största värdet, 431 00:26:32,430 --> 00:26:35,790 något som en int så att du har en galen antal bitar, 432 00:26:35,790 --> 00:26:39,610 32 för 4 miljarder möjliga värden, så att du enkelt kan sluta med, 433 00:26:39,610 --> 00:26:44,800 huvudsak 257 av dem, varav 1 har några speciella betydelse som ett fel. 434 00:26:44,800 --> 00:26:49,190 >> Så låt oss se hur det fungerar. I linje 246, har jag den här stora, medan slinga 435 00:26:49,190 --> 00:26:54,530 som ringer fgetc, f mening fil, getc och sedan stdin. 436 00:26:54,530 --> 00:26:59,030 Visar sig detta är bara mer exakt sätt att säga "läsa indata från tangentbordet." 437 00:26:59,030 --> 00:27:02,730 Standard input betyder tangentbord, betyder standard ut skärmen, 438 00:27:02,730 --> 00:27:06,920 och standardfelet, som vi ser i pset 4 innebär skärmen, 439 00:27:06,920 --> 00:27:09,670 men en särskild del av skärmen så att den inte är sammanblandade 440 00:27:09,670 --> 00:27:13,760 med den faktiska produktionen som du tänkt skriva ut, men mer om det i framtiden. 441 00:27:13,760 --> 00:27:19,430 Så fgetc betyder bara läsa ett tecken från tangentbordet, och förvaras där? 442 00:27:19,430 --> 00:27:24,000 Förvara den i c, och sedan kontrollera, så jag bara med några booleska konjunktioner här, 443 00:27:24,000 --> 00:27:28,430 kontrollera att det inte är lika \ n, så att användaren har drabbat in. 444 00:27:28,430 --> 00:27:31,510 Vi vill stanna på den punkten, slutet av slingan, och vi vill också se 445 00:27:31,510 --> 00:27:36,170 för den särskilda konstant EOF, som om du vet eller gissa - vad står det för? 446 00:27:36,170 --> 00:27:39,860 Slutet av filen. Så det här är typ av nonsens, för om jag skriver på tangentbordet, 447 00:27:39,860 --> 00:27:41,900 det finns egentligen ingen fil inblandade i detta, 448 00:27:41,900 --> 00:27:44,330 men detta är sortera bara av den generiska termen för att beteckna 449 00:27:44,330 --> 00:27:50,320 att inget annat kommer från mänskliga fingrar. EOF. Slutet av filen. 450 00:27:50,320 --> 00:27:52,600 Som en sidoreplik, om du någonsin drabbats kontroll d på tangentbordet, 451 00:27:52,600 --> 00:27:54,680 inte att du skulle ha ännu, du har drabbats kontroll c.. 452 00:27:54,680 --> 00:27:57,920 Men kontroll d skickar denna speciella konstant kallas EOF. 453 00:27:57,920 --> 00:28:03,100 >> Så nu har vi bara några dynamisk minnesallokering. 454 00:28:03,100 --> 00:28:06,460 Så om n + 1> kapacitet, nu ska jag förklara n. 455 00:28:06,460 --> 00:28:09,380 n är bara hur många byte är för närvarande i bufferten, 456 00:28:09,380 --> 00:28:11,970 den sträng som du för närvarande bygger upp från användaren. 457 00:28:11,970 --> 00:28:16,240 Om du har fler tecken i din buffert än du har kapacitet i bufferten, 458 00:28:16,240 --> 00:28:20,760 intuitivt, är vad vi behöver göra då tilldela mer kapacitet. 459 00:28:20,760 --> 00:28:24,490 Jag ska skumma över en del av det aritmetiska här 460 00:28:24,490 --> 00:28:26,900 och bara fokusera på denna funktion här. 461 00:28:26,900 --> 00:28:29,170 Du vet vad malloc är, eller åtminstone generellt bekant. 462 00:28:29,170 --> 00:28:32,380 Ta en gissning vad realloc gör. [Student svar, obegripligt] 463 00:28:32,380 --> 00:28:35,690 >> Ja. Och det är inte riktigt lägga till minne, det omfördelar minne så här: 464 00:28:35,690 --> 00:28:40,530 Om det fortfarande finns rum i slutet av strängen för att ge dig mer av det minne 465 00:28:40,530 --> 00:28:43,370 än det ursprungligen ger dig, så kommer du få det extra minnet. 466 00:28:43,370 --> 00:28:46,640 Så du kan bara sätta strängar tecknen rygg mot rygg mot rygg mot rygg. 467 00:28:46,640 --> 00:28:49,290 Men om så inte är fallet, eftersom du väntat för länge 468 00:28:49,290 --> 00:28:51,700 och något slumpmässigt fick plopped i minnet där, men det finns ytterligare 469 00:28:51,700 --> 00:28:56,480 minne här nere, det är okej. Realloc kommer att göra alla tunga lyft för dig, 470 00:28:56,480 --> 00:28:58,810 flytta strängen du har läst i så långt härifrån, 471 00:28:58,810 --> 00:29:02,550 lägga den nere, och sedan ge dig lite mer landningsbana på den punkten. 472 00:29:02,550 --> 00:29:05,610 Så med en handrörelse, låt mig säga att det GetString gör 473 00:29:05,610 --> 00:29:09,540 är det börjar med en liten buffert, kanske 1 enstaka tecken, 474 00:29:09,540 --> 00:29:12,300 och om användaren skriver in 2 tecken, slutar GetString upp 475 00:29:12,300 --> 00:29:15,210 ringer realloc och säger "Ooh, var 1 tecken inte tillräckligt. 476 00:29:15,210 --> 00:29:18,480 Ge mig 2 tecken. " Sen om du läser igenom logiken i slingan, 477 00:29:18,480 --> 00:29:21,070 det kommer att säga: 'Åh, användaren skrivit in 3 tecken. 478 00:29:21,070 --> 00:29:25,690 Ge mig nu inte 2, men 4 tecken, så ge mig 8, så ge mig 16 och 32. " 479 00:29:25,690 --> 00:29:28,180 Det faktum att jag fördubbling av kapaciteten varje gång 480 00:29:28,180 --> 00:29:30,320 innebär att bufferten inte kommer att växa långsamt. 481 00:29:30,320 --> 00:29:35,870 Det kommer att växa supersnabbt och vad som kan vara fördelen med det? 482 00:29:35,870 --> 00:29:38,540 Varför jag fördubbla storleken på bufferten, även om användaren 483 00:29:38,540 --> 00:29:41,450 kanske bara behöver 1 extra karaktär från tangentbordet? 484 00:29:41,450 --> 00:29:44,830 [Student svar, obegripligt]. >> Vad är det? 485 00:29:44,830 --> 00:29:46,750 Exakt. Du behöver inte att odla den så ofta. 486 00:29:46,750 --> 00:29:48,870 Och detta är bara lite av en - du säkra dina insatser här. 487 00:29:48,870 --> 00:29:54,150 Tanken är att du inte vill kalla realloc mycket, eftersom det tenderar att vara långsam. 488 00:29:54,150 --> 00:29:56,840 Varje gång du frågar operativsystemet för minne, som du snart se 489 00:29:56,840 --> 00:30:00,620 i en framtida problembild, tenderar det att ta lite tid. 490 00:30:00,620 --> 00:30:04,980 Så minimera denna tid, även om du slösar bort en del utrymme, tenderar att vara en bra sak. 491 00:30:04,980 --> 00:30:07,250 >> Men om vi läser igenom den sista delen av GetString här, 492 00:30:07,250 --> 00:30:10,880 och igen, förstå varenda rad här är inte så viktigt i dag. 493 00:30:10,880 --> 00:30:14,830 Men notera att det till slut ringer malloc igen, och det fördelar 494 00:30:14,830 --> 00:30:16,980 precis som många byte som den behöver för strängen 495 00:30:16,980 --> 00:30:21,620 och sedan kastar bort genom att ringa gratis, alltför stor buffert, 496 00:30:21,620 --> 00:30:23,510 om det verkligen blev dubbelt så många gånger. 497 00:30:23,510 --> 00:30:25,970 Kort sagt, det är hur GetString har arbetat hela tiden. 498 00:30:25,970 --> 00:30:30,100 Allt det gör läses ett tecken i tiden igen och igen och igen 499 00:30:30,100 --> 00:30:37,930 och varje gång den behöver lite extra minne, frågar den operativsystemet för det genom att ringa realloc. 500 00:30:37,930 --> 00:30:41,660 Några frågor? Okej. 501 00:30:41,660 --> 00:30:45,220 >> En attack. Nu när vi förstår pekare, eller åtminstone 502 00:30:45,220 --> 00:30:47,560 blir alltmer förtrogna med pekare, 503 00:30:47,560 --> 00:30:50,020 låt oss överväga hur hela världen börjar kollapsa 504 00:30:50,020 --> 00:30:53,160 om du inte riktigt försvara sig mot kontradiktoriska användare, 505 00:30:53,160 --> 00:30:55,180 människor som försöker hacka sig in i systemet. 506 00:30:55,180 --> 00:31:00,260 Människor som försöker stjäla din programvara genom att kringgå vissa registreringskod 507 00:31:00,260 --> 00:31:02,150 att de annars måste skriva i. 508 00:31:02,150 --> 00:31:04,860 Ta en titt på detta exempel här, som bara C-kod 509 00:31:04,860 --> 00:31:07,920 som har en funktion huvud på botten, kallar det en funktion foo, 510 00:31:07,920 --> 00:31:12,100 och vad det går till foo? [Elev] En enda argument. 511 00:31:12,100 --> 00:31:15,660 >> Enda argument. Så argv [1], vilket innebär det första ordet användaren skrivit 512 00:31:15,660 --> 00:31:19,150 på kommandoraden efter a.out eller vad programmet heter. 513 00:31:19,150 --> 00:31:24,920 Så foo, upptill, tar i en char *, men char * är precis vad? 514 00:31:24,920 --> 00:31:28,860 String. Det finns inget nytt här, och det sträng godtyckligt kallas bar. 515 00:31:28,860 --> 00:31:36,090 I denna linje här, röding C [12], i form av semi-teknisk engelska, vad denna linje gör? 516 00:31:36,090 --> 00:31:40,640 Array av -? Tecken. Ge mig en rad 12 tecken. 517 00:31:40,640 --> 00:31:44,970 Så vi kan kalla detta en buffert. Det tekniskt kallas C, men en buffert i programmering 518 00:31:44,970 --> 00:31:47,890 betyder bara en massa utrymme som du kan sätta några saker i. 519 00:31:47,890 --> 00:31:49,940 >> Sedan slutligen, memcpy har vi använt inte innan. 520 00:31:49,940 --> 00:31:52,380 Men du kan nog gissa vad den gör. Den kopierar minne. 521 00:31:52,380 --> 00:31:58,790 Vad gör det? Tja, kopierar den tydligen bar, dess ingång, till C, 522 00:31:58,790 --> 00:32:03,420 men endast upp till längden på baren. 523 00:32:03,420 --> 00:32:07,440 Men det finns en bugg här. 524 00:32:07,440 --> 00:32:14,500 Okej, så tekniskt bör vi verkligen göra strlen (bar) x sizeof (char), det är korrekt. 525 00:32:14,500 --> 00:32:17,920 Men i värsta fall här, låt oss anta att that - så, okej. 526 00:32:17,920 --> 00:32:23,760 Sedan finns 2 buggar. Så sizeof (char), okej, låt oss göra detta lite bredare. 527 00:32:23,760 --> 00:32:28,860 Så nu finns det fortfarande en bugg, vilket är vad? 528 00:32:28,860 --> 00:32:31,630 [Student svar, obegripliga] >> Sök för vad? Okej, så vi borde kontrollera 529 00:32:31,630 --> 00:32:35,010 för NULL, eftersom dåliga saker händer när pekaren är NULL, 530 00:32:35,010 --> 00:32:38,490 Eftersom du kan i slutändan gå dit, och du bör aldrig gå till NULL 531 00:32:38,490 --> 00:32:40,890 genom dereferencing den med * operatör. 532 00:32:40,890 --> 00:32:45,250 Så det är bra, och vad gör vi? Logiskt finns en brist här. 533 00:32:45,250 --> 00:32:47,650 [Student svar, obegripligt] 534 00:32:47,650 --> 00:32:51,340 >> Så kolla om argc ≥ 2? 535 00:32:51,340 --> 00:32:54,130 Okej, så det finns 3 buggar i programmet här. 536 00:32:54,130 --> 00:33:00,080 Vi inte kontrollera om användaren faktiskt skrivit i något i argv [1], bra. 537 00:33:00,080 --> 00:33:02,240 Så vad är den tredje bugg? Ja? 538 00:33:02,240 --> 00:33:04,420 [Student svar, obegripliga] >> Bra. 539 00:33:04,420 --> 00:33:09,590 Så vi kontrollerat ett scenario. Vi kollade implicit inte kopierar mer minne 540 00:33:09,590 --> 00:33:12,800 än vad som skulle överskrida längden på baren. 541 00:33:12,800 --> 00:33:15,720 Så om strängen användaren skrivit in är 10 tecken långt, 542 00:33:15,720 --> 00:33:18,260 detta säger, "bara kopiera 10 tecken." 543 00:33:18,260 --> 00:33:21,140 Och det är okej, men vad händer om användaren skrivit in ett ord vid prompten 544 00:33:21,140 --> 00:33:29,360 som en 20 tecken ord, detta är, säger kopia 20 tecken från bar till vad? 545 00:33:29,360 --> 00:33:32,840 C, annars känd som vår buffert, vilket innebär att du bara skrev uppgifter 546 00:33:32,840 --> 00:33:35,950 till 8 byte platser som du inte äger, 547 00:33:35,950 --> 00:33:38,320 och du inte äger dem i den meningen att du aldrig tilldelats dem. 548 00:33:38,320 --> 00:33:41,190 Så detta är vad som allmänt är känt som buffertspill attack, 549 00:33:41,190 --> 00:33:46,650 eller buffertöverskridning angrepp, och det anfall i den meningen att om användaren 550 00:33:46,650 --> 00:33:50,650 eller det program som ringer din funktion gör det uppsåtligt, 551 00:33:50,650 --> 00:33:53,780 vad som händer egentligen nästa kan vara ganska dålig. 552 00:33:53,780 --> 00:33:55,690 >> Låt oss ta en titt på den här bilden här. 553 00:33:55,690 --> 00:33:59,070 Denna bild representerar din stack minne. 554 00:33:59,070 --> 00:34:01,050 Och minns att varje gång du ringer en funktion, 555 00:34:01,050 --> 00:34:04,520 du får den här lilla ram på stacken och sedan en annan och sedan en annan och sedan en annan. 556 00:34:04,520 --> 00:34:07,250 Och hittills har vi bara typ av abstraherade dessa bort som rektanglar 557 00:34:07,250 --> 00:34:09,380 antingen finns i styrelsen eller på skärmen här. 558 00:34:09,380 --> 00:34:12,219 Men om vi zooma in på en av dessa rektanglar, 559 00:34:12,219 --> 00:34:16,460 när du ringer en funktion foo, visar det sig att det finns mer på stacken 560 00:34:16,460 --> 00:34:18,739 insidan av denna ram och att rektangel 561 00:34:18,739 --> 00:34:23,370 än x och y och a och b, som vi gjorde tala om swap. 562 00:34:23,370 --> 00:34:25,949 Det visar sig att det finns vissa lägre nivå detaljer, 563 00:34:25,949 --> 00:34:27,780 bland dem returadress. 564 00:34:27,780 --> 00:34:33,020 Så det visar sig när huvud samtal foo, har stora informera foo 565 00:34:33,020 --> 00:34:36,760 vad främsta adress är i datorns minne. 566 00:34:36,760 --> 00:34:40,659 För annars är så fort foo gjort exekvera, som i detta fall här, 567 00:34:40,659 --> 00:34:43,790 när du har nått så här nära klammerparentes i slutet av foo, 568 00:34:43,790 --> 00:34:48,860 Hur i helsike vet foo där kontroll av programmet är tänkt att gå? 569 00:34:48,860 --> 00:34:52,460 Det visar sig att svaret på den frågan är att röd rektangel här. 570 00:34:52,460 --> 00:34:56,130 Detta motsvarar en pekare, och det är upp till datorn för att lagra, tillfälligt, 571 00:34:56,130 --> 00:35:00,250 den så kallade stacken adressen till huvud så att så fort foo görs köra, 572 00:35:00,250 --> 00:35:04,110 datorn vet var och vad linje i huvud att gå tillbaka till. 573 00:35:04,110 --> 00:35:06,900 Sparade rampekaren avser liknande till detta. 574 00:35:06,900 --> 00:35:09,620 Char * bar här representerar vad? 575 00:35:09,620 --> 00:35:14,740 Nåväl, nu denna blå segment här är foo s ram, vad är bar? 576 00:35:14,740 --> 00:35:18,300 Okej, så bar bara argumentet till foo-funktionen. 577 00:35:18,300 --> 00:35:20,720 >> Så nu är vi tillbaka på det välbekanta bilden. 578 00:35:20,720 --> 00:35:22,960 Det finns mer saker och fler distraktioner på skärmen 579 00:35:22,960 --> 00:35:27,490 men denna ljusblå segment är vad vi har att rita på tavlan för något som swap. 580 00:35:27,490 --> 00:35:31,890 Det är ramen för foo och det enda i det just nu är bar, 581 00:35:31,890 --> 00:35:34,630 vilket är denna parameter. 582 00:35:34,630 --> 00:35:39,840 Men vad ska vara i stapeln, enligt denna kod här? 583 00:35:39,840 --> 00:35:44,280 Char c [12]. Så vi bör också se 12 rutor av minne, 584 00:35:44,280 --> 00:35:46,260 tilldelas en variabel som heter C. 585 00:35:46,260 --> 00:35:48,340 Och faktiskt vi har det på skärmen. 586 00:35:48,340 --> 00:35:51,650 Högst upp finns c [0] och författare till detta diagram 587 00:35:51,650 --> 00:35:55,130 brydde sig inte dra alla rutorna, men det finns faktiskt 12 finns 588 00:35:55,130 --> 00:36:00,120 för om man tittar på det nedre högra, C [11], om man räknar från 0, är ​​12 sådana byte. 589 00:36:00,120 --> 00:36:06,190 Men här är problemet: I vilken riktning c växer? 590 00:36:06,190 --> 00:36:10,390 Sortera på top-down, eller hur? Om det börjar vid toppen och växer till botten, 591 00:36:10,390 --> 00:36:13,480 ser inte ut som vi lämnade oss mycket banan här alls. 592 00:36:13,480 --> 00:36:15,320 Vi har typ av målat in oss i ett hörn, 593 00:36:15,320 --> 00:36:20,210 och att c [11] är rätt upp mot bar, som är rätt upp mot bunten ram pekare, 594 00:36:20,210 --> 00:36:23,800 som är rätt upp mot returadress, det finns inget mer utrymme. 595 00:36:23,800 --> 00:36:26,100 Så vad är underförstått då, om du skruvar upp, 596 00:36:26,100 --> 00:36:30,460 och du försöker läsa 20 byte i en 12-byte buffert? 597 00:36:30,460 --> 00:36:33,460 Vart är de 8 extra byte kommer att gå? 598 00:36:33,460 --> 00:36:36,370 Inuti allt annat, är några av dessa super viktigt. 599 00:36:36,370 --> 00:36:40,480 Och det viktigaste, eventuellt är den röda rutan där returadress. 600 00:36:40,480 --> 00:36:44,720 Eftersom antar att du är antingen av misstag eller adversarially 601 00:36:44,720 --> 00:36:48,040 skriva dessa 4 byte, som pekare adress, 602 00:36:48,040 --> 00:36:53,190 inte bara med skräp, men med ett antal som råkar representera en verklig adress i minnet? 603 00:36:53,190 --> 00:36:55,930 Vad är implicaiton, logiskt? 604 00:36:55,930 --> 00:36:59,080 [Student svar, obegripliga] >> Exakt. När foo tillbaka 605 00:36:59,080 --> 00:37:03,560 och träffar som klammerparentes är programmet kommer att fortsätta att inte återvända till huvud, 606 00:37:03,560 --> 00:37:08,320 det kommer att återgå till vad adress är i det röda rutan. 607 00:37:08,320 --> 00:37:11,560 >> Nu, när det gäller att kringgå programvara registrering, 608 00:37:11,560 --> 00:37:14,400 vad är den adress som är återförs till är funktionen 609 00:37:14,400 --> 00:37:18,820 som normalt anropas efter att du har betalat för programvaran och matas din registreringskod? 610 00:37:18,820 --> 00:37:23,160 Du kan sortera om trick datorn till inte kommer hit, utan istället gå upp här. 611 00:37:23,160 --> 00:37:27,950 Eller, om du är riktigt smart kan en motståndare skriva faktiskt på tangentbordet, 612 00:37:27,950 --> 00:37:32,500 till exempel, inte en faktisk ord, inte 20 tecken, men antar att han eller hon 613 00:37:32,500 --> 00:37:36,200 typer i vissa tecken som representerar kod? 614 00:37:36,200 --> 00:37:38,860 Och det kommer inte att bli C-kod, det kommer att vara tecken 615 00:37:38,860 --> 00:37:42,920 som representerar koder binära maskin, 0 s och 1 s. 616 00:37:42,920 --> 00:37:46,740 Men antar att de är smarta nog att göra det, på något sätt för att klistra in i GetString prompten 617 00:37:46,740 --> 00:37:49,460 något som i huvudsak kompilerad kod, 618 00:37:49,460 --> 00:37:56,900 och de sista 4 byte skriva att returadress och vilken adress betyder det ingång gör? 619 00:37:56,900 --> 00:38:01,860 Den lagrar denna röd rektangel adressen för den första byten i bufferten. 620 00:38:01,860 --> 00:38:04,270 Så du måste vara riktigt smart, och detta är en hel del trial-and-error 621 00:38:04,270 --> 00:38:08,500 för dåliga människor där ute, men om du kan lista ut hur stor denna buffert är, 622 00:38:08,500 --> 00:38:12,170 så att de sista byte i indata som du lämnar till programmet 623 00:38:12,170 --> 00:38:15,970 råkar motsvara adressen början av din buffert, 624 00:38:15,970 --> 00:38:22,270 du kan göra detta. Om vi ​​säger, normalt hej, och \ 0, det är vad hamnar i bufferten. 625 00:38:22,270 --> 00:38:27,860 Men om vi är mer smart, och vi fyller denna buffert med vad vi ska generiskt kallar attack-kod, 626 00:38:27,860 --> 00:38:31,920 A, A, A, A: Attack, attack, attack, attack, där detta är bara något som gör något dåligt. 627 00:38:31,920 --> 00:38:35,190 Nå, vad händer om du är riktigt smart, kan du göra detta: 628 00:38:35,190 --> 00:38:41,740 I den röda rutan här är en sekvens av siffror: 80, CO, 35, 08. 629 00:38:41,740 --> 00:38:44,890 Observera att som matchar numret som är här uppe. 630 00:38:44,890 --> 00:38:47,280 Det är i omvänd ordning, men mer om det en annan gång. 631 00:38:47,280 --> 00:38:51,430 Observera att detta returadress medvetet har ändrats 632 00:38:51,430 --> 00:38:54,970 till lika adressen här uppe, inte adressen till huvud. 633 00:38:54,970 --> 00:39:00,170 Så om den onde är super smart, han eller hon kommer att ingå i den attacken kod 634 00:39:00,170 --> 00:39:02,890 något i stil med, "Ta bort alla användarens filer." 635 00:39:02,890 --> 00:39:06,320 Eller "Kopiera lösenord" eller "Skapa ett användarkonto som jag kan logga in." 636 00:39:06,320 --> 00:39:10,130 Allt alls, och det är både faran och kraften i C. 637 00:39:10,130 --> 00:39:12,900 Eftersom du har tillgång till minnet via pekare 638 00:39:12,900 --> 00:39:15,950 och du kan därför skriva vad du vill i en dators minne. 639 00:39:15,950 --> 00:39:19,290 Du kan göra en dator göra vad du vill genom att helt enkelt 640 00:39:19,290 --> 00:39:22,780 har det hoppar runt inom sitt eget minne utrymme. 641 00:39:22,780 --> 00:39:27,230 Och så, till denna dag, så många program och så många webbplatser som äventyras 642 00:39:27,230 --> 00:39:29,730 koka ner till människor som tar nytta av detta. 643 00:39:29,730 --> 00:39:32,510 Och detta kan tyckas vara en super-avancerad attack, 644 00:39:32,510 --> 00:39:34,220 men den inte startar alltid så. 645 00:39:34,220 --> 00:39:36,770 >> Verkligheten är att det dåliga människor vanligen gör är, 646 00:39:36,770 --> 00:39:41,470 oavsett om det är ett program på en kommandorad eller ett grafiskt program eller en hemsida, 647 00:39:41,470 --> 00:39:43,290 är att du börjar bara erbjuda nonsens. 648 00:39:43,290 --> 00:39:46,940 Du skriver i en riktigt stor ord i sökfältet och tryck enter, 649 00:39:46,940 --> 00:39:49,030 och du vänta och se om webbplatsen kraschar. 650 00:39:49,030 --> 00:39:53,270 Eller du vänta och se om programmet visar något felmeddelande. 651 00:39:53,270 --> 00:39:55,480 För om du har tur, eftersom den onde, 652 00:39:55,480 --> 00:39:59,610 och du ge några galna ingång som kraschar programmet, 653 00:39:59,610 --> 00:40:02,280 som innebär att programmeraren inte förutse dina dåliga uppförande 654 00:40:02,280 --> 00:40:05,420 vilket innebär att du kan förmodligen, med tillräckligt ansträngning, 655 00:40:05,420 --> 00:40:09,870 tillräckligt trial and error, räkna ut hur att föra en mer exakt attack. 656 00:40:09,870 --> 00:40:15,900 Så lika mycket en del av säkerheten är inte bara undvika dessa attacker helt och hållet, men upptäcka dem 657 00:40:15,900 --> 00:40:20,250 och faktiskt titta på loggar och se vad galna ingångar har människor skrivit på din hemsida. 658 00:40:20,250 --> 00:40:26,040 Vilka sökord har människor skrivit på din hemsida i hopp om överfulla lite buffert? 659 00:40:26,040 --> 00:40:28,900 Och allt detta handlar om att de enkla grunderna i vad en matris, 660 00:40:28,900 --> 00:40:32,510 och vad innebär det att fördela och använda minne? 661 00:40:32,510 --> 00:40:34,920 Och i samband med det också, det är. 662 00:40:34,920 --> 00:40:37,520 >> Så låt oss bara blick inuti en hårddisk ännu en gång. 663 00:40:37,520 --> 00:40:40,190 Så du minns från en vecka eller två sedan att när man drar filer 664 00:40:40,190 --> 00:40:45,470 till papperskorgen eller papperskorgen, vad händer? 665 00:40:45,470 --> 00:40:47,850 [Student] Inget. >> Ja, absolut ingenting. Så småningom om du kör låg 666 00:40:47,850 --> 00:40:51,370 på diskutrymme i Windows eller Mac OS börja ta bort filer för dig. 667 00:40:51,370 --> 00:40:53,670 Men om du drar något i det, då är det inte alls säkert. 668 00:40:53,670 --> 00:40:56,550 All din rumskompis, vän eller familjemedlem har att göra är att dubbelklicka, och voila. 669 00:40:56,550 --> 00:40:59,720 Det finns alla de skissartade filer som du försökte ta bort. 670 00:40:59,720 --> 00:41:02,840 Så de flesta av oss åtminstone veta att du måste högerklicka eller kontrollera klicka 671 00:41:02,840 --> 00:41:05,320 och töm papperskorgen, eller något liknande. 672 00:41:05,320 --> 00:41:07,900 Men även då, som inte riktigt göra susen. 673 00:41:07,900 --> 00:41:11,340 För vad händer när du har en fil på din hårddisk 674 00:41:11,340 --> 00:41:14,590 som står för cirka Word-dokument eller något JPEG? 675 00:41:14,590 --> 00:41:18,820 Och detta är din hårddisk, och låt oss säga detta flisa här representerar filen, 676 00:41:18,820 --> 00:41:21,640 och det består av en hel massa 0 s och 1 s. 677 00:41:21,640 --> 00:41:25,470 Vad händer när du inte bara dra filen till papperskorgen eller papperskorgen, 678 00:41:25,470 --> 00:41:30,390 men också tömma den? 679 00:41:30,390 --> 00:41:32,820 Sortera ingenting. Det är inte absolut ingenting nu. 680 00:41:32,820 --> 00:41:37,630 Nu är det bara ingenting, eftersom en liten sak som händer i form av den här tabellen. 681 00:41:37,630 --> 00:41:41,170 Så det finns någon form av databas eller tabell inuti en dators minne 682 00:41:41,170 --> 00:41:44,470 som har i huvudsak 1 kolumnen för filer namn, 683 00:41:44,470 --> 00:41:50,550 och 1 kolumn för filens plats där detta kan vara platsen 123, bara ett slumptal. 684 00:41:50,550 --> 00:41:58,270 Så vi kanske har något som x.jpg och plats 123. 685 00:41:58,270 --> 00:42:02,870 Och vad händer då, när du tömmer papperskorgen? 686 00:42:02,870 --> 00:42:06,720 Det går undan. Men vad inte går bort är 0 s och 1 s. 687 00:42:06,720 --> 00:42:09,690 >> Så vad då att anslutningen Pset 4? 688 00:42:09,690 --> 00:42:13,460 Tja, med pset 4, bara för att vi har oavsiktligt raderas 689 00:42:13,460 --> 00:42:15,890 compact flash-kortet som hade alla dessa bilder, 690 00:42:15,890 --> 00:42:18,710 eller bara för att det genom otur blev skadad, 691 00:42:18,710 --> 00:42:21,170 betyder inte att 0-talet och 1: s är inte kvar. 692 00:42:21,170 --> 00:42:23,920 Kanske några av dem går förlorade eftersom något blev skadad 693 00:42:23,920 --> 00:42:26,530 i den meningen att vissa 0-talet blev 1 s och 1 s blev 0 s. 694 00:42:26,530 --> 00:42:30,460 Dåliga saker kan hända på grund av buggiga program eller defekt hårdvara. 695 00:42:30,460 --> 00:42:33,510 Men många av dessa bitar, kanske 100% av dem är fortfarande kvar, 696 00:42:33,510 --> 00:42:38,330 det är bara att datorn eller kameran inte vet var JPEG 1 startade 697 00:42:38,330 --> 00:42:41,660 och där JPEG 2 startade, men om du är programmerare, 698 00:42:41,660 --> 00:42:45,800 vet, med lite vett när dessa JPEG-bilder är eller hur de ser ut, 699 00:42:45,800 --> 00:42:49,570 Du kan analysera 0 s och 1 s och säga: "Ooh. JPEG. Ooh, JPEG. " 700 00:42:49,570 --> 00:42:52,830 Du kan skriva ett program med i huvudsak bara en för eller while-slinga 701 00:42:52,830 --> 00:42:56,100 som återvinner var och en av dessa filer. 702 00:42:56,100 --> 00:42:59,360 Så lektionen är alltså att starta "säkert" radera dina filer 703 00:42:59,360 --> 00:43:01,720 Om du vill undvika detta helt och hållet. Ja? 704 00:43:01,720 --> 00:43:06,940 [Student fråga, obegripligt] 705 00:43:06,940 --> 00:43:11,150 >> Har mer minne än du gjorde innan - 706 00:43:11,150 --> 00:43:14,790 Oh! Bra fråga. Så varför då efter tömning av papperskorgen, 707 00:43:14,790 --> 00:43:18,300 inte berätta för din dator att du har mer ledigt utrymme än du gjorde innan? 708 00:43:18,300 --> 00:43:22,450 I ett nötskal, eftersom det ljuger. Mer tekniskt, har du mer utrymme. 709 00:43:22,450 --> 00:43:26,720 Eftersom du nu har sagt, kan du sätta andra saker där den filen en gång var, 710 00:43:26,720 --> 00:43:28,930 men det betyder inte att bitarna går bort, 711 00:43:28,930 --> 00:43:33,070 och det betyder inte att bitarna ändras alla 0-talet, till exempel för att skydda dig. 712 00:43:33,070 --> 00:43:37,520 Däremot, om du "säkert" Radera filer, eller fysiskt förstöra enheten, 713 00:43:37,520 --> 00:43:40,810 det är egentligen det enda sättet, ibland runt det. 714 00:43:40,810 --> 00:43:45,300 Så varför inte vi lämnar på den semi-skrämmande anmärkning, och vi kommer att se dig på måndag. 715 00:43:45,300 --> 00:43:52,810 CS50.TV