1 00:00:00,000 --> 00:00:02,760 [Powered by Google Translate] [UGE 5] 2 00:00:02,760 --> 00:00:04,760 [David J. Malan, Harvard University] 3 00:00:04,760 --> 00:00:11,990 [Dette er CS50.] [CS50.TV] 4 00:00:11,990 --> 00:00:17,780 [Kvinde] Han lyver, om hvad, ved jeg ikke. 5 00:00:17,780 --> 00:00:20,300 [Man] Så hvad ved vi? 6 00:00:20,300 --> 00:00:24,120 [Kvinde] At kl 9:15, var Ray Santoya på ATM. 7 00:00:24,120 --> 00:00:27,420 [Man] Så spørgsmålet er, hvordan var han laver på 9:16? 8 00:00:27,420 --> 00:00:29,980 [Kvinde] Optagelse af 9 mm på noget. 9 00:00:29,980 --> 00:00:31,900 Måske så han snigskytte. 10 00:00:31,900 --> 00:00:34,000 [Man] Eller han arbejdede sammen med ham. 11 00:00:34,000 --> 00:00:36,330 [Kvinde] Vent. Gå tilbage én. 12 00:00:36,330 --> 00:00:38,330 [Man] Hvad ser du? 13 00:00:38,330 --> 00:00:44,520 [♫ spændingsfyldt musik ♫] 14 00:00:44,520 --> 00:00:48,320 [Kvinde] Bring hans ansigt op. Fuld skærm. 15 00:00:48,320 --> 00:00:51,230 [Man] hans briller. >> Der er en refleksion. 16 00:00:51,230 --> 00:01:00,810 [♫ spændingsfyldt musik ♫] 17 00:01:00,810 --> 00:01:03,580 [Man] Det er Nuevita baseball hold. Det er deres logo. 18 00:01:03,580 --> 00:01:07,790 [Kvinde] Og han taler til hvem er iført denne jakke. 19 00:01:07,790 --> 00:01:13,730 >> [David Malan] Så det er CS50 uge 5, og i dag har vi ødelægge lidt af tv og film for dig. 20 00:01:13,730 --> 00:01:16,170 Så når du ser et show som denne her, 21 00:01:16,170 --> 00:01:19,910 og politiet siger "Kan du rense det op?" eller "Enhance" 22 00:01:19,910 --> 00:01:21,900 der ikke er nogen forbedring i den virkelige verden. 23 00:01:21,900 --> 00:01:25,220 I virkeligheden er det, du virkelig får en lille ting som dette. 24 00:01:25,220 --> 00:01:27,570 Jeg har trukket op en af ​​de ansatte fotos fra siden. 25 00:01:27,570 --> 00:01:30,980 Dette er et program kaldet Photoshop. Dette er 1 af 2 Bowdens, 26 00:01:30,980 --> 00:01:36,300 1 af 3 Bowdens faktisk i dag, fordi vi har fru Bowden her så godt, med Rob og Paul. 27 00:01:36,300 --> 00:01:41,950 Men her er Rob på skærmen, og hvis vi zoome ind på den glimt han altid havde i øjet, 28 00:01:41,950 --> 00:01:47,600 hvad du faktisk se, er, at hvad du ser, er hvad du får. 29 00:01:47,600 --> 00:01:51,690 Dette er "forbedret", så "CSI" har det en smule forkert. 30 00:01:51,690 --> 00:01:55,190 Der er en anden klip, hvis vi kan samle på "CSI" bare en lille smule længere. 31 00:01:55,190 --> 00:01:58,500 Denne ene er en dejlig sætning at sige fremover, hvis du vil 32 00:01:58,500 --> 00:02:10,280 en god teknisk med dine venner, når, virkelig, du siger absolut ingenting. 33 00:02:10,280 --> 00:02:12,970 >> [Man] For uger, jeg har været at undersøge de Cabby Killer mord 34 00:02:12,970 --> 00:02:15,360 med en vis morbid fascination. 35 00:02:15,360 --> 00:02:17,160 [Woman # 1] Dette er i realtid. 36 00:02:17,160 --> 00:02:22,930 [Kvinde # 2] Jeg vil lave en GUI interface ved hjælp af Visual Basic, se om jeg kan spore en IP-adresse. 37 00:02:22,930 --> 00:02:29,570 >> [Malan] Så audio ude af sync til side, hvilket skaber en GUI interface ved hjælp af Visual Basic 38 00:02:29,570 --> 00:02:31,820 at spore en IP-adresse er komplet nonsens. 39 00:02:31,820 --> 00:02:33,840 Disse dage ville du ikke bruge Visual Basic, 40 00:02:33,840 --> 00:02:38,920 der er ikke behov for en GUI, og IP-adressen var en teknisk præcise ord. 41 00:02:38,920 --> 00:02:41,730 Så hold øje med disse, og en af ​​mine favoritter: 42 00:02:41,730 --> 00:02:45,070 Denne ene er lidt mere mystisk, fordi du har brug for at vide et andet sprog. 43 00:02:45,070 --> 00:02:47,860 Der er et sprog kaldet Objective-C, som er en overordnet C. 44 00:02:47,860 --> 00:02:51,960 Hvilket betyder, at det er C plus nogle ekstra funktioner, blandt dem objektorienteret programmering. 45 00:02:51,960 --> 00:02:55,070 Og det er det sprog, at Apple har populariseret til iOS programmering. 46 00:02:55,070 --> 00:02:58,760 Og så her er et klip fra en anden vis helt fra "Numbers", 47 00:02:58,760 --> 00:03:02,450 at hvis du rent faktisk ser nøje på din TiVo og pause på det rigtige tidspunkt, 48 00:03:02,450 --> 00:03:07,700 vil du se, at det, de søger på, er ikke helt, hvad der bliver beskrevet. 49 00:03:07,700 --> 00:03:11,170 Og lad mig prøve en anden lydstik her og se om vi ikke kan 50 00:03:11,170 --> 00:03:13,780 holde lyden i sync denne gang. 51 00:03:13,780 --> 00:03:20,530 Jeg giver dig "Numbers". 52 00:03:20,530 --> 00:03:23,240 >> [Man # 1] Det er en 32-bit IPv4-adresse. 53 00:03:23,240 --> 00:03:38,930 [Man # 2] IP, det er internettet. >> Privat netværk. Det er Anita private netværk. 54 00:03:38,930 --> 00:03:43,810 [Malan] Okay. Dette er Objective-C, og det er for nogle barns farve program, 55 00:03:43,810 --> 00:03:51,140 som du måske kan udlede af navnet på den variabel der. 56 00:03:51,140 --> 00:03:54,410 Så det var altså "Numbers". Så i dag, og i denne uge har vi introducere 57 00:03:54,410 --> 00:03:57,740 en lille smule af den verden af ​​retsvidenskab og den sammenhæng, de problemer, derfor. 58 00:03:57,740 --> 00:04:00,590 I dag vil være en forkortet foredrag, fordi der er en særlig begivenhed i her 59 00:04:00,590 --> 00:04:05,530 bagefter, så vi vil tage et kig, og drille både elever og forældre i dag 60 00:04:05,530 --> 00:04:07,420 med nogle af de ting, der er i horisonten. 61 00:04:07,420 --> 00:04:12,240 Blandt dem, som mandag vil du have nogle flere klassekammerater. 62 00:04:12,240 --> 00:04:16,050 EDX, Harvard og MITs nye online initiativ for åben kursusmateriale 63 00:04:16,050 --> 00:04:19,120 og mere, lancerer på Harvards campus på mandag. 64 00:04:19,120 --> 00:04:21,490 Hvilket betyder kommer mandag vil du have - som i sidste optælling, 65 00:04:21,490 --> 00:04:26,210 86.000 ekstra klassekammerater vil følge sammen med CS50 foredrag 66 00:04:26,210 --> 00:04:29,170 og sektioner og walkthroughs og problemstillinger sæt. 67 00:04:29,170 --> 00:04:32,350 Og som en del af dette, vil du blive medlemmer af det konstituerende klasse 68 00:04:32,350 --> 00:04:35,090 CS50 og nu CS50x. 69 00:04:35,090 --> 00:04:39,310 >> Som en del af dette, nu indse, at der vil være nogle upsides så godt. 70 00:04:39,310 --> 00:04:43,790 For at blive klar til dette, for det massive antal af studerende, 71 00:04:43,790 --> 00:04:47,180 er det tilstrækkeligt at sige, at selvom vi har 108 TF'er og CA, 72 00:04:47,180 --> 00:04:50,790 ikke helt den bedste elev / lærer ratio, når vi rammer 80.000 andre studerende. 73 00:04:50,790 --> 00:04:52,850 Så vi vil ikke være sortering så mange problem sætter manuelt. 74 00:04:52,850 --> 00:04:55,920 Så introduceret i denne uge i det problem sæt vil være CS50 Check, 75 00:04:55,920 --> 00:04:58,450 der vil være en kommandolinje utility inden apparatet 76 00:04:58,450 --> 00:05:01,200 at du får, når du opdatere det senere i denne weekend, 77 00:05:01,200 --> 00:05:03,200 og du vil være i stand til at køre en kommando, kontrol 50, 78 00:05:03,200 --> 00:05:06,500 på din egen Pset, du og får nogle tilbagemeldinger om, hvorvidt dit program er 79 00:05:06,500 --> 00:05:11,160 korrekt eller ukorrekt ifølge forskellige design specifikationer, som vi har leveret. 80 00:05:11,160 --> 00:05:13,580 Så mere om det og problemet indstillede specifikation og 81 00:05:13,580 --> 00:05:17,240 de CS50x klassekammerater vil bruge det så godt. 82 00:05:17,240 --> 00:05:19,230 >> Så problem set 4 handler om retsvidenskab. 83 00:05:19,230 --> 00:05:21,940 Og dette stykke er inspireret af nogle virkelige liv stuff, 84 00:05:21,940 --> 00:05:24,620 hvorved da jeg var i graduate skole, jeg interneret i et stykke tid med 85 00:05:24,620 --> 00:05:28,650 Den Middlesex Amts District Attorney kontor laver retsmedicinsk arbejde 86 00:05:28,650 --> 00:05:31,650 med deres bly retsmedicinske efterforsker, hvad og dette beløb sig til 87 00:05:31,650 --> 00:05:35,260 er, tror jeg, jeg nævnte et par uges fortid, er massen statslige politi eller andre 88 00:05:35,260 --> 00:05:39,000 ville komme i, ville de slippe væk fra ting som harddiske og cd'er og disketter 89 00:05:39,000 --> 00:05:42,340 og lignende, og derefter målet for retsvidenskab office var at undersøge 90 00:05:42,340 --> 00:05:44,600 der var eller ikke var tegn på en slags. 91 00:05:44,600 --> 00:05:48,010 Det var den særlige Undersøgelser Unit, så det var white collar kriminalitet, 92 00:05:48,010 --> 00:05:52,350 det var mere bekymrende slags forbrydelser 93 00:05:52,350 --> 00:05:55,990 noget der involverer en form for digitale medier, viser sig, at ikke så mange mennesker 94 00:05:55,990 --> 00:05:59,370 skrive en e-mail at sige "jeg gjorde det." 95 00:05:59,370 --> 00:06:03,290 Så ganske ofte disse retsvidenskab søgninger dukkede ikke op så meget frugt, 96 00:06:03,290 --> 00:06:05,850 men nogle gange folk ville skrive sådanne e-mails. 97 00:06:05,850 --> 00:06:08,490 Så nogle gange indsatsen blev belønnet. 98 00:06:08,490 --> 00:06:14,420 >> Men at lede op til dette retsmedicinsk Pset, vil vi introducere i Pset 4 en smule af grafik. 99 00:06:14,420 --> 00:06:18,260 Så du sandsynligvis tage disse ting for givet, JPEG, GIF og lignende disse dage, 100 00:06:18,260 --> 00:06:21,640 men hvis du virkelig tænker over det, et billede, ligesom Rob ansigt, 101 00:06:21,640 --> 00:06:24,430 kunne modelleres som en sekvens af punkter eller pixels. 102 00:06:24,430 --> 00:06:26,680 Nu, i tilfælde af Rob ansigt, er der alle mulige farver, 103 00:06:26,680 --> 00:06:29,940 og vi begyndte at se de enkelte prikker, otherwide kendt som pixels, 104 00:06:29,940 --> 00:06:31,610 når vi begyndte at zoome ind 105 00:06:31,610 --> 00:06:35,590 Men hvis vi forenkler verden en smule, og bare sige, at det her er Rob 106 00:06:35,590 --> 00:06:40,560 i sort og hvid, godt, til at repræsentere sort og hvid kan vi bare bruge binær. 107 00:06:40,560 --> 00:06:44,960 Og hvis vi kommer til at bruge binær, 1 eller 0, kan vi udtrykke dette samme billede 108 00:06:44,960 --> 00:06:51,970 af Robs smilende ansigt med dette mønster af bits: 11000011 repræsenterer 109 00:06:51,970 --> 00:06:55,160 hvid, hvid, sort, sort, sort, sort, hvid hvid. 110 00:06:55,160 --> 00:06:59,290 Og så er det ikke et stort spring, så at begynde at tale om farverige fotografier. 111 00:06:59,290 --> 00:07:01,920 Ting, som du ville se på Facebook eller tage med et digitalt kamera, 112 00:07:01,920 --> 00:07:04,730 men helt sikkert, når det kommer til farver, du har brug for flere bits. 113 00:07:04,730 --> 00:07:08,470 Og ganske almindeligt i verden af ​​billeder er at bruge ikke 1-bit farver, 114 00:07:08,470 --> 00:07:12,730 som dette antyder, men 24-bit farver, hvor du faktisk få millioner af farver. 115 00:07:12,730 --> 00:07:15,430 Således som det er tilfældet, når vi zoomet ind på Rob øje, 116 00:07:15,430 --> 00:07:19,270 det var helst antal millioner af forskellige farverige muligheder. 117 00:07:19,270 --> 00:07:22,260 >> Så vi vil indføre dette i problem set 4 såvel som i walkthrough, 118 00:07:22,260 --> 00:07:27,050 som vil være i dag kl 3:30 i stedet for de sædvanlige 2:30 på grund af fredagens foredrag her. 119 00:07:27,050 --> 00:07:29,930 Men videoen vil være online, som sædvanlig, i morgen. 120 00:07:29,930 --> 00:07:31,880 Vi vil også introducere dig til et andet filformat. 121 00:07:31,880 --> 00:07:34,150 Så dette er bevidst beregnet til at se skræmmende i starten, 122 00:07:34,150 --> 00:07:38,980 men dette er blot nogle dokumentation for en C struct. 123 00:07:38,980 --> 00:07:42,280 Det viser sig, at Microsoft, år siden hjalp popularisere dette format, 124 00:07:42,280 --> 00:07:46,630 kaldet bitmap filformat, BMP, og dette var en super-simpel, 125 00:07:46,630 --> 00:07:50,390 farverige grafisk format, der blev brugt i temmelig lang tid 126 00:07:50,390 --> 00:07:53,640 og til tider stadig for wallpapers på desktops. 127 00:07:53,640 --> 00:07:57,410 Hvis du tænker tilbage til Windows XP og de bølgende bakker og blå himmel, 128 00:07:57,410 --> 00:08:00,660 Det var typisk en BMP, eller bitmapbillede, og bitmaps 129 00:08:00,660 --> 00:08:03,340 er sjovt for os, fordi de har en smule mere kompliceret. 130 00:08:03,340 --> 00:08:05,640 Det er ikke helt så simpelt som dette net af 0 s og 1 s; 131 00:08:05,640 --> 00:08:10,680 i stedet, du har ting som en header i starten af ​​en fil. 132 00:08:10,680 --> 00:08:15,520 Så med andre ord, er inde i en. Bmp fil en hel bunke af 0 s og 1 s, 133 00:08:15,520 --> 00:08:18,070 men der er nogle ekstra 0 s og 1-taller der. 134 00:08:18,070 --> 00:08:21,450 Og det viser sig, at det vi har nok taget for givet i årevis, 135 00:08:21,450 --> 00:08:27,040 filformater som. doc eller. xls eller. mp3 eller. mp4, 136 00:08:27,040 --> 00:08:29,910 uanset hvilke filformater, som du er fortrolig med. 137 00:08:29,910 --> 00:08:31,900 Nå, hvad betyder det endda sige at være et filformat? 138 00:08:31,900 --> 00:08:35,740 Fordi ved slutningen af ​​dagen, har alle disse filer bruger vi bare 0 s og 1 s 139 00:08:35,740 --> 00:08:39,950 og måske dem 0'er og 1'er repræsenterer a, b, c, gennem ASCII eller lignende, 140 00:08:39,950 --> 00:08:42,030 men gennem slutningen af ​​dagen, er det bare 0 s og 1-taller. 141 00:08:42,030 --> 00:08:45,300 >> Så mennesker bare lejlighedsvis beslutte at opfinde et nyt filformat 142 00:08:45,300 --> 00:08:49,420 hvor de standardisere hvilke mønstre af bits rent faktisk vil betyde. 143 00:08:49,420 --> 00:08:52,790 Og i dette tilfælde her, de folk, der har designet bitmap filformat 144 00:08:52,790 --> 00:08:58,260 sagde, at i det første byte i en bitmap-fil, som angivet ved offset 0, der, 145 00:08:58,260 --> 00:09:02,320 der kommer til at være nogle kryptisk navngivne variabel kaldet bfType, 146 00:09:02,320 --> 00:09:06,510 der bare står for bitmap filtype, hvilken type bitmapfil dette er. 147 00:09:06,510 --> 00:09:10,780 Du kan udlede, måske, fra anden række, offset 2, byte nummer 2, 148 00:09:10,780 --> 00:09:15,980 har et mønster af 0 s og 1 s, der repræsenterer hvad? 149 00:09:15,980 --> 00:09:18,320 Størrelsen af ​​noget, og det går videre derfra. 150 00:09:18,320 --> 00:09:20,660 Så i problemet sæt 4, vil du blive ført gennem nogle af disse ting. 151 00:09:20,660 --> 00:09:24,480 >> Vi vil ikke ende op bekymre sig om dem alle, men bemærker det begynder at blive interessant 152 00:09:24,480 --> 00:09:30,780 omkring linje eller byte 54, rgbtBlue, grøn og rød. 153 00:09:30,780 --> 00:09:35,280 Hvis du nogensinde har hørt forkortelsen RGB, rød grøn blå, dette er en reference til det. 154 00:09:35,280 --> 00:09:37,840 Fordi det viser sig, du kan male alle regnbuens farver 155 00:09:37,840 --> 00:09:41,580 med en kombination af rød og blå og grøn. 156 00:09:41,580 --> 00:09:46,560 Og i virkeligheden kan forældrene i rummet minde om nogle af de tidligste projektorer. 157 00:09:46,560 --> 00:09:49,360 Disse dage, du bare se 1 lys der kommer ud af en linse. 158 00:09:49,360 --> 00:09:52,870 Men tilbage i dag, havde du den røde linse, den blå linse, og den grønne linse 159 00:09:52,870 --> 00:09:56,620 og sammen med henblik på skærmen, og dannede et farverigt billede. 160 00:09:56,620 --> 00:09:59,590 Og ganske ofte midt skoler og gymnasier vil have disse linser 161 00:09:59,590 --> 00:10:02,680 nogensinde-så-lidt skævt, så du var slags at se dobbelt eller tredobbelt billeder, 162 00:10:02,680 --> 00:10:07,500 men det var tanken. Du havde rødt og grønt og blåt lys maler et billede. 163 00:10:07,500 --> 00:10:09,570 Og det samme princip bruges i computere. 164 00:10:09,570 --> 00:10:12,000 >> Så blandt de udfordringer, så for dig i problemer sæt 4 165 00:10:12,000 --> 00:10:16,080 vil være et par ting, den ene er til rent faktisk at ændre størrelsen på et billede. 166 00:10:16,080 --> 00:10:18,050 At tage i et mønster af 0 s og 1 s, 167 00:10:18,050 --> 00:10:22,840 finde ud af hvilken bidder af 0 s og 1 s repræsenterer hvad i en struktur som denne, 168 00:10:22,840 --> 00:10:26,800 og derefter finde ud af at kopiere de pixels: De røde, blues, De Grønne 169 00:10:26,800 --> 00:10:32,460 inde, så at når et billede ser sådan ud i første omgang, kunne se sådan ud i stedet efter det. 170 00:10:32,460 --> 00:10:35,590 Blandt de andre udfordringer, også vil være at du vil blive udleveret 171 00:10:35,590 --> 00:10:38,900 en retsmedicinsk billede af en egentlig fil fra et digitalt kamera 172 00:10:38,900 --> 00:10:42,410 og på dette kamera, engang var en hel bunke af fotos. 173 00:10:42,410 --> 00:10:47,030 Problemet er, at vi ved et uheld slettet eller haft det image beskadiget eller anden måde. 174 00:10:47,030 --> 00:10:51,040 Dårlige ting sker med digitale kameraer, og så vi hurtigt kopieret alle 0 s og 1 s 175 00:10:51,040 --> 00:10:55,410 off af kortet for dig, gemte dem alle i 1 stor fil, og så vil vi udlevere dem til dig 176 00:10:55,410 --> 00:11:00,000 i problem indstille 4, således at du kan skrive et program i C med til at inddrive 177 00:11:00,000 --> 00:11:02,660 alle disse JPEG, ideelt. 178 00:11:02,660 --> 00:11:06,280 Og det viser sig, at JPEG, selvom det er noget af en kompleks filformat, 179 00:11:06,280 --> 00:11:09,580 de er meget mere kompleks end denne smilende ansigt her. 180 00:11:09,580 --> 00:11:14,320 Det viser sig, at hver JPEG starter med de samme mønstre af 0 s og 1-taller. 181 00:11:14,320 --> 00:11:18,820 Så ved hjælp af en while-løkke eller en for-løkke eller lignende, 182 00:11:18,820 --> 00:11:22,350 du kan gentage over alle 0-og 1-taller i denne retsmedicinsk billede 183 00:11:22,350 --> 00:11:26,670 og hver gang du ser det specielle mønster, der er defineret i det problem sæt specifikationer, 184 00:11:26,670 --> 00:11:29,770 du kan antage, 'Åh, her er, med meget stor sandsynlighed, 185 00:11:29,770 --> 00:11:33,520 starten på en JPEG ', og så snart du finder det samme mønster, 186 00:11:33,520 --> 00:11:36,050 et antal byte eller kilobyte eller megabyte senere, 187 00:11:36,050 --> 00:11:40,550 du kan antage, 'Ooh! Her er en anden JPEG, fotoet jeg tog efter det første. 188 00:11:40,550 --> 00:11:44,720 Lad mig stoppe læse, at første fil, begynder at skrive denne ny. ' 189 00:11:44,720 --> 00:11:49,980 Og udgangen på din program for Pset 4 kommer til at være så mange som 50 JPEG. 190 00:11:49,980 --> 00:11:52,400 Og hvis det ikke er 50 JPEG-billeder, du har lidt af en løkke. 191 00:11:52,400 --> 00:11:55,580 Hvis du har et uendeligt antal JPEG, har du en uendelig løkke. 192 00:11:55,580 --> 00:11:58,280 Så det vil også være en ganske almindelig sag. 193 00:11:58,280 --> 00:12:00,280 Det er hvad der er i horisonten. 194 00:12:00,280 --> 00:12:03,740 >> Quiz 0, bag os. Indse, pr min e-mail, der uvægerligt er der folk 195 00:12:03,740 --> 00:12:06,820 der er både glade, slags neutral, og trist omkring quiz 0 tid. 196 00:12:06,820 --> 00:12:10,160 Og er du nå ud til mig, hovedet TFS, Zamyla, din egen TF 197 00:12:10,160 --> 00:12:14,120 eller et af de nøglecentre, som du ved, hvis du gerne vil diskutere, hvordan det gik. 198 00:12:14,120 --> 00:12:16,460 >> Så for at imponere forældrene her i rummet, 199 00:12:16,460 --> 00:12:23,990 hvad er CS50 biblioteket? Godt arbejde. 200 00:12:23,990 --> 00:12:32,280 Hvad er det CS50 biblioteket? Ja? [Student svar, uforståelig] 201 00:12:32,280 --> 00:12:35,730 >> Okay, godt. Så det er en skrevet sæt kode, som vi, personalet, skrev, 202 00:12:35,730 --> 00:12:38,460 vi leverer til dig, at give nogle fælles funktioner. 203 00:12:38,460 --> 00:12:42,290 Ting som får mig en streng, få mig en int, alle de funktioner, der er angivet her. 204 00:12:42,290 --> 00:12:45,260 Start nu, begynder vi virkelig at tage disse støttehjul off. 205 00:12:45,260 --> 00:12:48,230 Så vi vil til at begynde at tage væk et "streng" fra dig, 206 00:12:48,230 --> 00:12:52,790 der, tilbagekaldelse, var blot et synonym for, hvad egentlige datatype? char *. 207 00:12:52,790 --> 00:12:57,020 Så for forældre, der var sandsynligvis - det er godt, så char * vi vil begynde at se 208 00:12:57,020 --> 00:13:00,810 på skærmen desto mere som vi fjerner "streng" fra vores ordforråd, 209 00:13:00,810 --> 00:13:02,760 i hvert fald når det kommer til faktisk at skrive kode. 210 00:13:02,760 --> 00:13:06,240 Ligeledes vil vi stoppe med at bruge nogle af disse funktioner så meget, 211 00:13:06,240 --> 00:13:08,390 fordi vores programmer vil få mere sofistikerede 212 00:13:08,390 --> 00:13:11,370 snarere end blot at skrive programmer, der sidder der med en prompt blinker, 213 00:13:11,370 --> 00:13:13,580 venter på brugeren at skrive noget i. 214 00:13:13,580 --> 00:13:15,220 Du får dine input fra andre steder. 215 00:13:15,220 --> 00:13:18,720 For eksempel, vil du få dem fra en række af bits på den lokale harddisk. 216 00:13:18,720 --> 00:13:23,340 Du vil i stedet få dem i fremtiden fra en netværksforbindelse, nogle hjemmeside eller andet sted. 217 00:13:23,340 --> 00:13:27,460 Så lad os skrælle dette lag for første gang, og træk op CS50 apparatet 218 00:13:27,460 --> 00:13:32,300 og denne fil kaldet CS50.h, som du har været skarp, herunder i ugevis. 219 00:13:32,300 --> 00:13:34,380 >> Men lad os nu se, hvad der er inde i dette. 220 00:13:34,380 --> 00:13:38,250 Så toppen af ​​filen i blå er bare en hel masse kommentarer, 221 00:13:38,250 --> 00:13:41,340 oplysninger om garanti og licensering. Det er en slags fælles paradigme 222 00:13:41,340 --> 00:13:44,600 i software, en masse software disse dage, fordi er, hvad der kaldes "open source", 223 00:13:44,600 --> 00:13:46,940 hvilket betyder, at nogen har skrevet koden 224 00:13:46,940 --> 00:13:50,060 og gjorde det frit tilgængelige, ikke kun i drift og anvende, 225 00:13:50,060 --> 00:13:53,660 men faktisk læse og ændre og integrere i dit eget arbejde. 226 00:13:53,660 --> 00:13:55,790 Så det er, hvad du har brugt, open source-software, 227 00:13:55,790 --> 00:13:58,030 omend i en meget lille form. 228 00:13:58,030 --> 00:14:01,860 Hvis jeg rulle ned forbi de bemærkninger, dog vil vi begynde at se nogle mere velkendte ting. 229 00:14:01,860 --> 00:14:08,090 Så mærke øverst her, at CS50.h-fil indeholder en hel masse header-filer. 230 00:14:08,090 --> 00:14:11,160 Nu er de fleste af dem vi ikke har set før, men man er 231 00:14:11,160 --> 00:14:15,640 velkendt, hvilke af disse har vi set, om end kortvarigt, indtil videre? 232 00:14:15,640 --> 00:14:18,720 Ja, standard biblioteker. Stdlib.h har malloc, 233 00:14:18,720 --> 00:14:21,590 så når vi begyndte at snakke om dynamisk allokering af hukommelse, 234 00:14:21,590 --> 00:14:24,960 som vi vil komme tilbage til i næste uge så godt, vi begyndte herunder at fil. 235 00:14:24,960 --> 00:14:29,660 Det viser sig, at bool og sandt og falsk faktisk ikke findes i C, per se, 236 00:14:29,660 --> 00:14:32,460 medmindre du medtage denne fil her. 237 00:14:32,460 --> 00:14:35,770 Så vi har, for uger, herunder blevet standard bool.h 238 00:14:35,770 --> 00:14:39,020 så du kan bruge begrebet en bool, sand eller falsk. 239 00:14:39,020 --> 00:14:41,830 Uden dette, ville du nødt til at sortere i fake det og bruge en int 240 00:14:41,830 --> 00:14:45,920 og bare vilkårligt antage, at 0 er falsk og 1 er sandt. 241 00:14:45,920 --> 00:14:49,980 >> Hvis vi nu rulle ned yderligere, her er vores definition af en streng. 242 00:14:49,980 --> 00:14:54,820 Det viser sig, som vi har sagt før, at hvis dette * er ikke rigtig noget. 243 00:14:54,820 --> 00:14:56,750 Du kan endda have plads hele vejen rundt. 244 00:14:56,750 --> 00:15:01,550 Vi, dette semester har været fremme det som dette at gøre det klart, at den * har at gøre med den type. 245 00:15:01,550 --> 00:15:05,370 Men indse, lige så almindeligt, hvis ikke lidt mere almindelig, er at sætte det der 246 00:15:05,370 --> 00:15:07,480 men funktionelt er det det samme. 247 00:15:07,480 --> 00:15:11,070 Men nu, hvis vi læser yderligere ned, lad os tage et kig på sige, GetInt, 248 00:15:11,070 --> 00:15:15,350 fordi vi brugte det måske, før noget andet i dette semester. 249 00:15:15,350 --> 00:15:19,620 Og her er GetInt. Dette er, hvad? 250 00:15:19,620 --> 00:15:24,650 Dette er prototypen. Så ofte har vi lagt prototyper på toppen af ​​vores. C-filer, 251 00:15:24,650 --> 00:15:28,190 men du kan også sætte prototyper i header-filer,. H filer, 252 00:15:28,190 --> 00:15:32,110 som denne her, så når du skriver nogle funktioner 253 00:15:32,110 --> 00:15:36,790 at du vil have andre mennesker til at være i stand til at bruge, hvilket er præcis tilfældet med CS50 bibliotek, 254 00:15:36,790 --> 00:15:40,900 du ikke kun implementere dine funktioner i noget lignende CS50.c, 255 00:15:40,900 --> 00:15:46,720 man også sætte prototyperne ikke på toppen af ​​filen, men i toppen af ​​en header-fil, 256 00:15:46,720 --> 00:15:50,810 så at header filen er hvad venner og kolleger omfatter, 257 00:15:50,810 --> 00:15:52,800 med skarpe i deres egen kode. 258 00:15:52,800 --> 00:15:55,440 Så al den tid du har, herunder alle disse prototyper 259 00:15:55,440 --> 00:15:59,870 effektivt i toppen af ​​din fil, men ved hjælp af denne skarpe omfatte mechanism 260 00:15:59,870 --> 00:16:03,320 at stort set kopier og pastaer denne fil ind i din egen. 261 00:16:03,320 --> 00:16:06,400 Nu, her er nogle temmelig detaljeret dokumentation. 262 00:16:06,400 --> 00:16:08,880 >> Vi har stort set taget for givet, at GetInt får en int, 263 00:16:08,880 --> 00:16:10,740 men det viser sig der er nogle hjørne tilfælde, right? 264 00:16:10,740 --> 00:16:14,320 Hvad hvis brugeren skriver i et nummer, der er alt for stor? 265 00:16:14,320 --> 00:16:17,350 En quintillion, der bare ikke kan passe inde i en int? 266 00:16:17,350 --> 00:16:21,180 Hvad er den forventede adfærd? Nå, ideelt, det er forudsigeligt. 267 00:16:21,180 --> 00:16:23,460 Så i dette tilfælde, hvis du rent faktisk læser det med småt, 268 00:16:23,460 --> 00:16:27,850 vil du se, at hvis den linje ikke kan læses, dette afkast INT_MAX. 269 00:16:27,850 --> 00:16:30,800 Vi har aldrig talt om dette, men baseret på dens kapitalisering, 270 00:16:30,800 --> 00:16:33,030 hvad er det, sandsynligvis? 271 00:16:33,030 --> 00:16:36,610 Det er en konstant, så det er nogle særlige konstant, er sandsynligvis erklæret 272 00:16:36,610 --> 00:16:39,460 i en af ​​disse header-filer, der er højere op i filen, 273 00:16:39,460 --> 00:16:43,400 og INT_MAX er nok noget lignende, groft, 2 mia. 274 00:16:43,400 --> 00:16:48,160 Ideen er, at fordi vi er nødt til en eller anden måde betyde, at noget gik galt, 275 00:16:48,160 --> 00:16:51,090 vi, ja, have 4 milliarder numre til vores rådighed, 276 00:16:51,090 --> 00:16:53,980 negativ 2 mia op til 2 mia give eller tage. 277 00:16:53,980 --> 00:16:58,030 Nå, hvad er almindelig i programmering er du stjæler bare en af ​​disse numre. 278 00:16:58,030 --> 00:17:02,250 Måske 0, måske 2 mia måske negativ 2 mia. 279 00:17:02,250 --> 00:17:06,720 Så du bruger en af ​​dine mulige værdier, så du kan forpligte sig til verden 280 00:17:06,720 --> 00:17:10,089 at hvis noget går galt, vil jeg vende tilbage denne super-big værdi. 281 00:17:10,089 --> 00:17:13,329 Men du ikke ønsker, at brugeren skrive noget kryptisk som "2, 3, 4 ..." 282 00:17:13,329 --> 00:17:17,079 af virkelig store nummer, hvor du generaliserer i stedet som en konstant. 283 00:17:17,079 --> 00:17:19,380 Så virkelig, hvis du var anal de sidste par uger, 284 00:17:19,380 --> 00:17:23,800 når som helst du kalder GetInt, bør du have været til kontrol med en hvis betingelse. 285 00:17:23,800 --> 00:17:27,109 Gjorde brugeren type i INT_MAX, eller mere specifikt, 286 00:17:27,109 --> 00:17:29,900 gjorde GetInt tilbage INT_MAX? For hvis det gjorde, 287 00:17:29,900 --> 00:17:35,140 der rent faktisk betyder, at de ikke skrive det, noget gik galt i denne sag. 288 00:17:35,140 --> 00:17:38,970 Så dette er hvad der normalt betegnes som en "sentinel"-værdi, hvilket betyder bare speciel. 289 00:17:38,970 --> 00:17:41,020 >> Nå, lad os nu vende ind på. C-filer. 290 00:17:41,020 --> 00:17:44,500 Den C-fil har eksisteret i apparatet i nogen tid, 291 00:17:44,500 --> 00:17:47,540 og faktisk har apparatet det forkompileret for dig 292 00:17:47,540 --> 00:17:49,720 ind i den ting, vi kaldte "objektkode" 293 00:17:49,720 --> 00:17:52,940 men det bare ikke noget for dig, hvor det er fordi systemet ved, 294 00:17:52,940 --> 00:17:54,780 i dette tilfælde, hvor det er, apparatet. 295 00:17:54,780 --> 00:18:00,620 Men lad os rulle ned nu at GetInt, og se, hvordan GetInt har arbejdet hele tiden. 296 00:18:00,620 --> 00:18:02,380 Så her har vi lignende kommentarer fra før. 297 00:18:02,380 --> 00:18:04,930 Lad mig zoome ind på netop den kode portion, 298 00:18:04,930 --> 00:18:07,410 og hvad vi har for GetInt er følgende. 299 00:18:07,410 --> 00:18:12,770 Det tager ingen input og den returnerer en int, mens (sand), så vi har en bevidst uendelig løkke 300 00:18:12,770 --> 00:18:16,560 men formentlig vil vi bryde ud af denne eller anden måde, eller vende tilbage fra inden for dette. 301 00:18:16,560 --> 00:18:19,890 Så lad os se hvordan det virker. Nå, vi synes at benytte GetString 302 00:18:19,890 --> 00:18:22,550 i denne første linie inde i løkken, 166. 303 00:18:22,550 --> 00:18:25,320 Dette er nu god praksis, fordi under hvilke omstændigheder 304 00:18:25,320 --> 00:18:30,820 kunne GetString returnere denne særlige søgeord, NULL? 305 00:18:30,820 --> 00:18:38,460 Hvis noget går galt. Hvad kunne gå galt, når du kalder noget GetString? 306 00:18:38,460 --> 00:18:42,550 Ja? [Student svar, uforståelig] >> Yeah. Så måske malloc mislykkes. 307 00:18:42,550 --> 00:18:45,310 Et eller andet sted under hætten GetString ringer malloc, 308 00:18:45,310 --> 00:18:48,210 som tildeler hukommelse, hvilket lader computeren butik 309 00:18:48,210 --> 00:18:50,950 alle de tegn, som bruger skriver i tastaturet. 310 00:18:50,950 --> 00:18:53,270 Og formoder, at brugeren havde en hel masse fritid 311 00:18:53,270 --> 00:18:56,470 og skrives mere, f.eks end 2000 millioner karakterer. 312 00:18:56,470 --> 00:18:59,600 Flere tegn end computer, selv har RAM. 313 00:18:59,600 --> 00:19:02,350 Nå, GetString skal være i stand til at betyde, at for dig, 314 00:19:02,350 --> 00:19:05,650 selv om dette er en super, super ualmindeligt hjørne sag. 315 00:19:05,650 --> 00:19:08,490 Det skal en eller anden måde kunne håndtere det, og så GetString, 316 00:19:08,490 --> 00:19:11,850 hvis vi går tilbage og læse sin dokumentation, er i virkeligheden returnere NULL. 317 00:19:11,850 --> 00:19:16,150 Nu, hvis GetString mislykkes ved at returnere NULL er GetInt vil mislykkes 318 00:19:16,150 --> 00:19:19,370 ved at returnere INT_MAX, ligesom en skildvagt. 319 00:19:19,370 --> 00:19:22,650 Disse er blot menneskelige konventioner. Den eneste måde du ville vide dette er tilfældet 320 00:19:22,650 --> 00:19:24,840 er ved at læse dokumentationen. 321 00:19:24,840 --> 00:19:28,200 Så lad os rulle ned til hvor int er faktisk GotInt. 322 00:19:28,200 --> 00:19:34,220 >> Så hvis jeg rulle ned lidt længere, på linje 170 har vi en kommentar over disse linjer. 323 00:19:34,220 --> 00:19:38,470 Så vi erklære, i 172, en int n og en char c, og så er denne nye funktion 324 00:19:38,470 --> 00:19:41,870 som nogle af jer har snublet over før, men sscanf. 325 00:19:41,870 --> 00:19:44,190 Det står for streng scan f.. 326 00:19:44,190 --> 00:19:48,580 Med andre ord, giv mig en streng, og jeg vil scanne det for stykker af information af interesse. 327 00:19:48,580 --> 00:19:53,820 Så hvad betyder det? Nå, antage, at jeg skriver i, bogstaveligt talt, 1 2 3 ved tastaturet, 328 00:19:53,820 --> 00:19:59,730 og derefter tryk enter. Hvad er datatypen for 1 2 3 når returneres af GetString? 329 00:19:59,730 --> 00:20:05,010 Det er naturligvis en streng, ikke? Jeg fik en snor, så 1 2 3 er virkelig "1 2 3" 330 00:20:05,010 --> 00:20:07,260 med \ 0 ved udgangen af ​​det. Det er ikke en int. 331 00:20:07,260 --> 00:20:10,420 Det er ikke et tal. Det ligner et nummer, men det er faktisk ikke. 332 00:20:10,420 --> 00:20:14,680 Så hvad gør GetInt nødt til at gøre? Det skal scanne, at strengen venstre mod højre, 333 00:20:14,680 --> 00:20:19,010 1 2 3 \ 0, og en eller anden måde konvertere det til et virkeligt heltal. 334 00:20:19,010 --> 00:20:21,010 Nu kan du finde ud af, hvordan du gør dette. 335 00:20:21,010 --> 00:20:24,240 Hvis du tænker tilbage til Pset 2, du formentlig fik en lille behagelig 336 00:20:24,240 --> 00:20:26,810 med Cæsar eller vigenere, så du kan gentage over en snor, 337 00:20:26,810 --> 00:20:29,800 du kan konvertere tegn til int'er med pick. Det er en hel masse arbejde. 338 00:20:29,800 --> 00:20:32,800 Hvorfor ikke kalde en funktion som sscanf der gør det for dig? 339 00:20:32,800 --> 00:20:37,520 Så sscanf forventer et argument, i dette tilfælde kaldet linje, der er en streng. 340 00:20:37,520 --> 00:20:41,310 Du kan derefter angive, i citationstegn, meget lig printf, 341 00:20:41,310 --> 00:20:44,960 hvad forventer du at se i denne streng? 342 00:20:44,960 --> 00:20:52,980 Hvad jeg siger her er, jeg forventer at se et decimaltal og måske et tegn. 343 00:20:52,980 --> 00:20:54,990 Og vi vil se, hvorfor dette er tilfældet i bare et øjeblik. 344 00:20:54,990 --> 00:20:58,440 Det viser sig, at denne notation er nu minder om ting 345 00:20:58,440 --> 00:21:00,840 vi begyndte at tale om lidt over en uge siden. 346 00:21:00,840 --> 00:21:05,430 >> Hvad er & n og & c gør for os her? [Student svar, uforståelig] 347 00:21:05,430 --> 00:21:07,610 >> Yeah. Det giver mig adressen på n og adresse på ca. 348 00:21:07,610 --> 00:21:10,440 Nu, hvorfor er det vigtigt? Tja, du ved, at med funktioner i C 349 00:21:10,440 --> 00:21:13,440 du kan altid returnere en værdi eller ingen værdi overhovedet. 350 00:21:13,440 --> 00:21:16,630 Du kan returnere en int, en streng, en float, en char, uanset hvad. 351 00:21:16,630 --> 00:21:21,150 Eller du kan returnere ugyldige, men du kan kun returnere 1 ting maksimalt. 352 00:21:21,150 --> 00:21:26,100 Men her ønsker vi sscanf at returnere mig måske en int, et decimaltal, 353 00:21:26,100 --> 00:21:29,240 og også en char, og jeg vil forklare hvorfor den char i et øjeblik. 354 00:21:29,240 --> 00:21:34,250 Så du faktisk ønsker f for at vende tilbage 2 ting, det er bare ikke muligt i C. 355 00:21:34,250 --> 00:21:38,460 Så du kan arbejde omkring, ved at passere i 2 adresser, 356 00:21:38,460 --> 00:21:43,710 fordi så snart du afleverer en funktion 2 adresser, hvad kan denne funktion gøre med dem? 357 00:21:43,710 --> 00:21:49,880 Det kan skrive til disse adresser. Du kan bruge * operation og "derned" til hver af disse adresser. 358 00:21:49,880 --> 00:21:54,320 Det er en slags denne bagdør mekanisme, men meget almindeligt for at ændre værdierne af variabler 359 00:21:54,320 --> 00:21:58,020 i mere end blot 1 plads, i dette tilfælde 2. 360 00:21:58,020 --> 00:22:04,590 Nu, bemærker jeg kontrollerer for == til1, og derefter vende tilbage n hvis det betyder i virkeligheden evaluere til true. 361 00:22:04,590 --> 00:22:09,340 Så hvad sker der? Nå, teknisk, alle vi virkelig ønsker skal ske i GetInt er dette. 362 00:22:09,340 --> 00:22:12,340 Vi ønsker at parse, så at sige, vi ønsker at læse strengen 363 00:22:12,340 --> 00:22:16,210 "1 2 3", og hvis det ser ud som om der er et tal der, 364 00:22:16,210 --> 00:22:21,360 hvad vi fortæller sscanf gøre er at sætte det tal, 1 2 3, i denne variable n for mig. 365 00:22:21,360 --> 00:22:26,060 Hvorfor havde jeg det så godt? 366 00:22:26,060 --> 00:22:33,750 Hvilken rolle også sige, sscanf, kan du også få en karakter her. 367 00:22:33,750 --> 00:22:36,890 [Student set uforståelig] >> ikke - et komma kunne virke. 368 00:22:36,890 --> 00:22:40,650 Lad os holde det tænkte sig om et øjeblik. Hvad ellers? 369 00:22:40,650 --> 00:22:42,570 [Studerende, uforståelig] >> Så god tanke, kunne det være NULL karakter. 370 00:22:42,570 --> 00:22:44,970 Det er faktisk ikke i dette tilfælde. Ja? [Studerende, uforståelig] 371 00:22:44,970 --> 00:22:47,100 >> >> ASCII. Eller lad mig generalisere yderligere. 372 00:22:47,100 --> 00:22:49,670 Den% c der er bare for fejlkontrol. 373 00:22:49,670 --> 00:22:52,510 Vi ønsker ikke, at der er tegnet efter det antal, 374 00:22:52,510 --> 00:22:54,980 men hvad dette giver mig mulighed for at gøre, er følgende: 375 00:22:54,980 --> 00:23:01,270 Det viser sig, at sscanf foruden lagring af værdier i n og c, i dette eksempel her, 376 00:23:01,270 --> 00:23:08,170 hvad den også gør, er det returnerer antallet af variabler det sætte værdier i. 377 00:23:08,170 --> 00:23:13,330 Så hvis du kun skrive 1 2 3, er det kun% d kommer til at matche 378 00:23:13,330 --> 00:23:18,830 og kun n bliver gemt med en værdi som 1 2 3 og intet bliver sat i c; 379 00:23:18,830 --> 00:23:20,870 c fortsat en garbage værdi, så at sige. 380 00:23:20,870 --> 00:23:23,550 Garbage fordi det er aldrig blevet initialiseret som en vis værdi. 381 00:23:23,550 --> 00:23:29,390 Så i dette tilfælde returnerer sscanf 1, fordi jeg befolkede en af ​​disse markører, 382 00:23:29,390 --> 00:23:33,650 i hvilket tilfælde. great Jeg har en int, så jeg befri den linje for at frigøre hukommelse 383 00:23:33,650 --> 00:23:37,150 at GetString faktisk allokeret, og så vender jeg tilbage n.. 384 00:23:37,150 --> 00:23:42,210 Else, hvis du nogensinde spekuleret over, hvor der retry erklæring kommer fra, kommer fra højre her. 385 00:23:42,210 --> 00:23:45,770 Hvis det derimod, skriver jeg i 1 2 3 foo, 386 00:23:45,770 --> 00:23:48,640 bare nogle tilfældige sekvens af tekst, sscanf kommer til at 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 Og det kommer til at sætte 1 2 3 i n. 389 00:23:54,190 --> 00:23:59,970 Det kommer til at sætte f i c, og derefter vende tilbage 2. 390 00:23:59,970 --> 00:24:02,980 Så vi har, bare ved hjælp af grundlæggende definition af scanf adfærd, 391 00:24:02,980 --> 00:24:06,170 en meget enkel måde - ja, kompleks ved første øjekast, men i slutningen af ​​dagen, 392 00:24:06,170 --> 00:24:11,460 forholdsvis enkel mekanisme at sige, er der en int, og hvis ja, er at det eneste, jeg fandt? 393 00:24:11,460 --> 00:24:14,950 Og det hvide rum her er bevidst. Hvis du læser dokumentationen til sscanf, 394 00:24:14,950 --> 00:24:18,690 det fortæller dig, at hvis du inkluderer et stykke hvidt plads i starten eller slutningen, 395 00:24:18,690 --> 00:24:24,990 sscanf også vil gøre det muligt for brugeren, uanset årsagen, at ramme mellemrumstasten 1 2 3, og det vil være legitimt. 396 00:24:24,990 --> 00:24:28,310 Det vil ikke råbe på brugeren, bare fordi de ramte mellemrumstasten ved begyndelsen eller slutningen, 397 00:24:28,310 --> 00:24:32,160 der er bare en smule mere brugervenlig. 398 00:24:32,160 --> 00:24:34,160 >> Eventuelle spørgsmål, derefter på GetInts? Ja? 399 00:24:34,160 --> 00:24:36,820 [Student spørgsmål, uforståelig] 400 00:24:36,820 --> 00:24:40,740 >> Godt spørgsmål. Hvad hvis du lige har skrevet i en char, ligesom f, og tryk enter 401 00:24:40,740 --> 00:24:47,830 uden nogensinde at skrive 1 2 3, hvad tror du opførslen af ​​denne linje kode vil så være? 402 00:24:47,830 --> 00:24:50,500 Så sscanf kan dække det også, fordi der i så fald 403 00:24:50,500 --> 00:24:56,280 det kommer ikke til at fylde N eller C, det vil i stedet returnere 0. 404 00:24:56,280 --> 00:25:01,540 I så fald, er jeg også at fange det scenarie, fordi den forventede værdi jeg ønsker, er 1. 405 00:25:01,540 --> 00:25:07,310 Jeg ønsker kun 1, og kun 1 ting, der skal besættes. Godt spørgsmål. Andre? 406 00:25:07,310 --> 00:25:09,610 >> Okay, så lad os ikke gå igennem alle de funktioner i her, 407 00:25:09,610 --> 00:25:11,820 men den ene, der synes at være, måske, af resterende renter 408 00:25:11,820 --> 00:25:14,530 er GetString fordi det viser sig, at GetFloat, GetInt, 409 00:25:14,530 --> 00:25:19,490 GetDouble, GetLongLong al punt en masse af deres funktionalitet til GetString. 410 00:25:19,490 --> 00:25:22,860 Så lad os tage et kig på, hvordan han er implementeret her. 411 00:25:22,860 --> 00:25:27,040 Denne ene ser lidt kompliceret, men det bruger de samme fundamentale 412 00:25:27,040 --> 00:25:29,680 at vi begyndte at tale om i sidste uge. Så i GetString, 413 00:25:29,680 --> 00:25:32,670 der tager noget argument som pr tomrum op her, 414 00:25:32,670 --> 00:25:37,110 og det returnerer en streng, så jeg om en streng kaldet buffer. 415 00:25:37,110 --> 00:25:39,670 Jeg ved ikke rigtig, hvad der kommer til at blive brugt til endnu, men vi vil se. 416 00:25:39,670 --> 00:25:42,950 Ligner kapacitet er, som standard, 0; ikke helt sikker på, hvor dette foregår. 417 00:25:42,950 --> 00:25:44,920 Ikke sikker på hvad n kommer til at blive brugt til endnu. 418 00:25:44,920 --> 00:25:47,860 Men nu er det bliver lidt mere interessant, så i linje 243, 419 00:25:47,860 --> 00:25:51,760 vi erklærer en int c, dette er en slags dum detalje. 420 00:25:51,760 --> 00:25:58,080 En char er 8 bit, og 8 bit kan gemme hvor mange forskellige værdier? 421 00:25:58,080 --> 00:26:03,310 256. Problemet er, hvis du vil have 256 forskellige ASCII-tegn, 422 00:26:03,310 --> 00:26:06,210 som der er, hvis du tænker tilbage, og det er ikke noget at huske. 423 00:26:06,210 --> 00:26:09,100 Men hvis du tænker tilbage på den store ASCII diagram havde vi uger siden, 424 00:26:09,100 --> 00:26:13,780 Der var i dette tilfælde, 128 eller 256 ASCII-tegn. 425 00:26:13,780 --> 00:26:16,220 Vi brugte alle de mønstre af 0 s og 1 er op. 426 00:26:16,220 --> 00:26:19,410 Det er et problem, hvis du ønsker at være i stand til at opdage en fejl. 427 00:26:19,410 --> 00:26:23,290 Fordi hvis du allerede bruger 256 værdier for dine karakterer, 428 00:26:23,290 --> 00:26:26,390 du ikke rigtig planlægge, fordi nu har du ingen måde at sige, 429 00:26:26,390 --> 00:26:29,750 "Dette er ikke en legit karakter, dette er nogle fejlagtige budskab." 430 00:26:29,750 --> 00:26:32,430 Så hvad verden gør, er, de bruger den næststørste værdi, 431 00:26:32,430 --> 00:26:35,790 noget som en int, så du har et vanvittigt antal bit, 432 00:26:35,790 --> 00:26:39,610 32 for 4 milliarder mulige værdier, så du bare kan ende med at bruge, 433 00:26:39,610 --> 00:26:44,800 væsentlige 257 af dem, 1 som har nogle særlige betydning som en fejl. 434 00:26:44,800 --> 00:26:49,190 >> Så lad os se hvordan det virker. I tråd 246, har jeg denne store while-løkke 435 00:26:49,190 --> 00:26:54,530 , der ringer fgetc f mening fil, getc, og derefter stdin. 436 00:26:54,530 --> 00:26:59,030 Sving ud dette er blot mere præcis måde at sige "læse input fra tastaturet." 437 00:26:59,030 --> 00:27:02,730 Standard input betyder tastatur, standard output betyder skærm, 438 00:27:02,730 --> 00:27:06,920 og standardfejlen, som vi vil se i Pset 4, betyder skærmen, 439 00:27:06,920 --> 00:27:09,670 men en særlig del af skærmen, så det er ikke smelter sammen 440 00:27:09,670 --> 00:27:13,760 med faktiske produktion, du ville udskrive, men mere om det i fremtiden. 441 00:27:13,760 --> 00:27:19,430 Så fgetc betyder blot læse et tegn fra tastaturet, og gem den hvor? 442 00:27:19,430 --> 00:27:24,000 Opbevar det i c, og derefter kontrollere, så jeg bare bruge nogle boolean konjunktioner her, 443 00:27:24,000 --> 00:27:28,430 kontrollere, at det ikke er lig \ n, så brugeren har tryk enter. 444 00:27:28,430 --> 00:27:31,510 Vi ønsker at stoppe på det tidspunkt, slutningen af ​​løkken, og vi ønsker også at kontrollere 445 00:27:31,510 --> 00:27:36,170 for den særlige konstant, EOF, som hvis du kender eller gætte - hvad står det for? 446 00:27:36,170 --> 00:27:39,860 Slut på filen. Så dette er lidt meningsløst, fordi hvis jeg skriver på tastaturet, 447 00:27:39,860 --> 00:27:41,900 der er virkelig ingen fil involveret i dette, 448 00:27:41,900 --> 00:27:44,330 men dette er blot sortere af artsbetegnelsen bruges til at betyde 449 00:27:44,330 --> 00:27:50,320 at intet andet kommer fra de menneskelige fingre. EOF. Slut på filen. 450 00:27:50,320 --> 00:27:52,600 Som en sidebemærkning, hvis du nogensinde har ramt kontrol d på dit tastatur 451 00:27:52,600 --> 00:27:54,680 ikke at du ville have endnu, du har ramt kontrol c. 452 00:27:54,680 --> 00:27:57,920 Men kontrol d sender denne særlige konstant kaldet EOF. 453 00:27:57,920 --> 00:28:03,100 >> Så nu har vi bare have nogle dynamisk allokering af hukommelse. 454 00:28:03,100 --> 00:28:06,460 Så hvis n + 1> kapacitet, nu vil jeg forklare n. 455 00:28:06,460 --> 00:28:09,380 n er bare hvor mange bytes er i øjeblikket i bufferen, 456 00:28:09,380 --> 00:28:11,970 den streng, du i øjeblikket er ved at bygge op fra brugeren. 457 00:28:11,970 --> 00:28:16,240 Hvis du har flere karakterer i din buffer, end du har kapacitet i bufferen, 458 00:28:16,240 --> 00:28:20,760 intuitivt, hvad vi skal gøre så allokere mere kapacitet. 459 00:28:20,760 --> 00:28:24,490 Jeg har tænkt mig at skimme over nogle af de aritmetiske her 460 00:28:24,490 --> 00:28:26,900 og kun fokusere på denne funktion her. 461 00:28:26,900 --> 00:28:29,170 Du ved, hvad malloc er, eller i det mindste generelt velkendt. 462 00:28:29,170 --> 00:28:32,380 Tag et gæt hvad realloc gør. [Student svar, uforståelig] 463 00:28:32,380 --> 00:28:35,690 >> Yeah. Og det er ikke helt tilføjelse af hukommelse, det omfordeler hukommelse på følgende måde: 464 00:28:35,690 --> 00:28:40,530 Hvis der stadig er plads i slutningen af ​​strengen for at give dig mere af denne hukommelse 465 00:28:40,530 --> 00:28:43,370 end det oprindeligt giver dig, så vil du få det ekstra hukommelse. 466 00:28:43,370 --> 00:28:46,640 Så du kan bare sætte strenge tegn tilbage til back to back to back. 467 00:28:46,640 --> 00:28:49,290 Men hvis det ikke er tilfældet, fordi du ventede for længe 468 00:28:49,290 --> 00:28:51,700 og noget tilfældigt fik plopped i hukommelsen der, men der er ekstra 469 00:28:51,700 --> 00:28:56,480 hukommelse hernede, det er okay. Realloc vil gøre alt det tunge arbejde for dig, 470 00:28:56,480 --> 00:28:58,810 flytte den streng, du har læst i hidtil herfra, 471 00:28:58,810 --> 00:29:02,550 sætte den ned der, og derefter give dig nogle flere landingsbane på dette punkt. 472 00:29:02,550 --> 00:29:05,610 Så med en bølge af hånden, lad mig sige, hvad GetString gør 473 00:29:05,610 --> 00:29:09,540 Det er begyndt med en lille puffer, måske en enkelt karakter, 474 00:29:09,540 --> 00:29:12,300 og hvis brugeren skriver i 2 tegn, ender GetString op 475 00:29:12,300 --> 00:29:15,210 ringer realloc og siger, "Ooh, 1 karakter var ikke nok. 476 00:29:15,210 --> 00:29:18,480 Giv mig 2 tegn. ' Så hvis du læser gennem logikken i løkken, 477 00:29:18,480 --> 00:29:21,070 det kommer til at sige: 'Ooh, brugeren har indtastet i 3 karakterer. 478 00:29:21,070 --> 00:29:25,690 Giv mig nu ikke 2 men 4 tegn, så giv mig 8, så giv mig 16 og 32 «. 479 00:29:25,690 --> 00:29:28,180 Det faktum, at jeg fordobler kapaciteten hver gang 480 00:29:28,180 --> 00:29:30,320 betyder, at pufferen ikke vil vokse langsomt. 481 00:29:30,320 --> 00:29:35,870 Det kommer til at vokse super hurtigt, og hvad der kan være den fordel det? 482 00:29:35,870 --> 00:29:38,540 Hvorfor er jeg fordobling af størrelsen af ​​bufferen, selvom brugeren 483 00:29:38,540 --> 00:29:41,450 måske bare brug for 1 ekstra tegn fra tastaturet? 484 00:29:41,450 --> 00:29:44,830 [Student svar, uforståelig]. >> Hvad er det? 485 00:29:44,830 --> 00:29:46,750 Præcis. Du behøver ikke at dyrke det så ofte. 486 00:29:46,750 --> 00:29:48,870 Og det er bare sådan en - du afdækning dine indsatser her. 487 00:29:48,870 --> 00:29:54,150 Ideen er, at du ikke ønsker at kalde realloc en masse, fordi det har tendens til at være langsom. 488 00:29:54,150 --> 00:29:56,840 Hver gang du beder operativsystemet for hukommelse, som du snart vil se 489 00:29:56,840 --> 00:30:00,620 i et fremtidigt problem sæt, har den tendens til at tage lidt tid. 490 00:30:00,620 --> 00:30:04,980 Så minimere den mængde af tid, selvom du spilder nogle rum, har tendens til at være en god ting. 491 00:30:04,980 --> 00:30:07,250 >> Men hvis vi læser igennem den sidste del af GetString her, 492 00:30:07,250 --> 00:30:10,880 og igen, at forstå hver enkelt linje her er ikke så vigtigt i dag. 493 00:30:10,880 --> 00:30:14,830 Men bemærk, at det i sidste ende kalder malloc igen, og det tildeler 494 00:30:14,830 --> 00:30:16,980 præcis som mange bytes som den har brug for streng 495 00:30:16,980 --> 00:30:21,620 og derefter smider ved at ringe gratis, den alt for store buffer, 496 00:30:21,620 --> 00:30:23,510 hvis det virkelig blev fordoblet for mange gange. 497 00:30:23,510 --> 00:30:25,970 Kort sagt, er, at hvordan GetString har arbejdet hele tiden. 498 00:30:25,970 --> 00:30:30,100 Alt det gør, er læst ét ​​tegn ad gangen igen og igen og igen 499 00:30:30,100 --> 00:30:37,930 og hver gang den har brug for nogle ekstra hukommelse, spørger operativsystemet for det ved at kalde realloc. 500 00:30:37,930 --> 00:30:41,660 Eventuelle spørgsmål? Ok. 501 00:30:41,660 --> 00:30:45,220 >> Et angreb. Nu, hvor vi forstår pegepinde, eller i det mindste 502 00:30:45,220 --> 00:30:47,560 bliver stadig mere fortrolige med pegepinde, 503 00:30:47,560 --> 00:30:50,020 lad os overveje, hvordan hele verden begynder at kollapse 504 00:30:50,020 --> 00:30:53,160 hvis du ikke helt forsvare sig mod kontradiktorisk brugere, 505 00:30:53,160 --> 00:30:55,180 mennesker, der forsøger at hacke ind i dit system. 506 00:30:55,180 --> 00:31:00,260 Folk, der forsøger at stjæle din software ved at omgå nogle registreringskode 507 00:31:00,260 --> 00:31:02,150 som de ellers måtte have til at skrive i. 508 00:31:02,150 --> 00:31:04,860 Tag et kig på dette eksempel her, som er lige C-kode 509 00:31:04,860 --> 00:31:07,920 der har en funktion main i bunden, der kalder en funktion foo, 510 00:31:07,920 --> 00:31:12,100 og hvad det går til Foo? [Student] Et enkelt argument. 511 00:31:12,100 --> 00:31:15,660 >> Single argument. Så argv [1], hvilket betyder, det første ord brugeren har indtastet 512 00:31:15,660 --> 00:31:19,150 på kommandolinjen efter a.out eller hvad programmet hedder. 513 00:31:19,150 --> 00:31:24,920 Så foo, på toppen tager i en char *, men char * er bare hvad? 514 00:31:24,920 --> 00:31:28,860 String. Der er ikke noget nyt her, og at strengen er vilkårligt at blive kaldt bar. 515 00:31:28,860 --> 00:31:36,090 I denne linje her, c char [12], i en slags semi-teknisk engelsk, er hvad denne linie gør? 516 00:31:36,090 --> 00:31:40,640 Array af -? Tegn. Giv mig en vifte af 12 tegn. 517 00:31:40,640 --> 00:31:44,970 Så vi kan kalde dette en buffer. Det er teknisk kaldes c, men en buffer i programmering 518 00:31:44,970 --> 00:31:47,890 betyder blot en masse plads, som du kan sætte nogle ting i. 519 00:31:47,890 --> 00:31:49,940 >> Så endelig memcpy har vi ikke brugt før. 520 00:31:49,940 --> 00:31:52,380 Men du kan sikkert gætte hvad det gør. Den kopierer hukommelse. 521 00:31:52,380 --> 00:31:58,790 Hvad gør det? Tja, det tilsyneladende kopierer bar, dens input, til c, 522 00:31:58,790 --> 00:32:03,420 men kun op til længden af ​​baren. 523 00:32:03,420 --> 00:32:07,440 Men der er en fejl her. 524 00:32:07,440 --> 00:32:14,500 Okay, så teknisk set bør vi virkelig gøre strlen (bar) x sizeof (char), det er korrekt. 525 00:32:14,500 --> 00:32:17,920 Men i værste fald her, lad os antage, at that's - så, okay. 526 00:32:17,920 --> 00:32:23,760 Så er der 2 bugs. Så sizeof (char), okay, lad os gøre dette til en lidt bredere. 527 00:32:23,760 --> 00:32:28,860 Så nu er der stadig en fejl, hvilket er hvad? 528 00:32:28,860 --> 00:32:31,630 [Student svar, uforståelig] >> Check for hvad? Okay, så vi skal kontrollere 529 00:32:31,630 --> 00:32:35,010 for NULL, fordi dårlige ting ske, når markøren er NULL 530 00:32:35,010 --> 00:32:38,490 Fordi du måske ender med at gå der, og du bør aldrig gå til NULL 531 00:32:38,490 --> 00:32:40,890 ved at dereferere det med * operatør. 532 00:32:40,890 --> 00:32:45,250 Så det er godt, og hvad der ellers gør vi? Logisk er der en fejl her. 533 00:32:45,250 --> 00:32:47,650 [Student svar, uforståelig] 534 00:32:47,650 --> 00:32:51,340 >> Så tjek hvis argc ≥ 2? 535 00:32:51,340 --> 00:32:54,130 Okay, så der er 3 fejl i dette program her. 536 00:32:54,130 --> 00:33:00,080 Vi er ikke at kontrollere, om brugeren rent faktisk har skrevet i noget i argv [1], godt. 537 00:33:00,080 --> 00:33:02,240 Så hvad er den tredje bug? Ja? 538 00:33:02,240 --> 00:33:04,420 [Student svar, uforståelig] >> Godt. 539 00:33:04,420 --> 00:33:09,590 Så vi tjekket en scenario. Vi implicit kontrolleres ikke kopiere mere hukommelse 540 00:33:09,590 --> 00:33:12,800 end det ville overstige længden af ​​baren. 541 00:33:12,800 --> 00:33:15,720 Så hvis strengen brugeren har indtastet i er 10 tegn lang, 542 00:33:15,720 --> 00:33:18,260 dette er at sige, 'Only kopierer 10 tegn.' 543 00:33:18,260 --> 00:33:21,140 Og det er okay, men hvad nu hvis brugeren har indtastet i et ord ved prompten 544 00:33:21,140 --> 00:33:29,360 ligesom en 20 tegn ord, det er, siger kopi 20 karakterer fra bar til hvad? 545 00:33:29,360 --> 00:33:32,840 c, ellers kendt som vores buffer, hvilket betyder, at du lige har skrevet data 546 00:33:32,840 --> 00:33:35,950 til 8 byte steder, du ikke ejer, 547 00:33:35,950 --> 00:33:38,320 og du ikke ejer dem i den forstand, at du aldrig tildelt dem. 548 00:33:38,320 --> 00:33:41,190 Så dette er hvad der almindeligvis kendt som buffer overflow angreb, 549 00:33:41,190 --> 00:33:46,650 eller bufferoverløb angreb, og det angreb i den forstand, at hvis brugeren 550 00:33:46,650 --> 00:33:50,650 eller det program, der kalder din funktion gør dette skadeligt, 551 00:33:50,650 --> 00:33:53,780 hvad der faktisk sker næste kunne være helt slemt. 552 00:33:53,780 --> 00:33:55,690 >> Lad os tage et kig på dette billede her. 553 00:33:55,690 --> 00:33:59,070 Dette billede repræsenterer din stak af hukommelse. 554 00:33:59,070 --> 00:34:01,050 Og huske, at hver gang du kalder en funktion, 555 00:34:01,050 --> 00:34:04,520 du får denne lille ramme på stakken og derefter en anden og derefter en anden og derefter en anden. 556 00:34:04,520 --> 00:34:07,250 Og hidtil vi har bare lidt indvindes disse væk som rektangler 557 00:34:07,250 --> 00:34:09,380 enten der på tavlen eller på skærmen her. 558 00:34:09,380 --> 00:34:12,219 Men hvis vi zoomer ind på en af ​​disse rektangler, 559 00:34:12,219 --> 00:34:16,460 når du kalder en funktion foo, viser det sig, at der er mere på stakken 560 00:34:16,460 --> 00:34:18,739 indersiden af ​​denne ramme, og dette rektangel 561 00:34:18,739 --> 00:34:23,370 end blot x og y og a og b, ligesom vi gjorde tale om swap. 562 00:34:23,370 --> 00:34:25,949 Det viser sig, at der er nogle lavere niveauer detaljer, 563 00:34:25,949 --> 00:34:27,780 blandt dem returadresse. 564 00:34:27,780 --> 00:34:33,020 Så det viser sig, når main kalder foo, main skal underrette Foo 565 00:34:33,020 --> 00:34:36,760 hvad main adresse er i computerens hukommelse. 566 00:34:36,760 --> 00:34:40,659 Fordi ellers så snart Foo gjort udføre, som i dette tilfælde her, 567 00:34:40,659 --> 00:34:43,790 når du når dette tæt klammeparentes i slutningen af ​​foo, 568 00:34:43,790 --> 00:34:48,860 hvordan dælen gør Foo vide, hvor kontrol af programmet er meningen at gå? 569 00:34:48,860 --> 00:34:52,460 Det viser sig, at svaret på det spørgsmål er i den røde rektangel her. 570 00:34:52,460 --> 00:34:56,130 Dette er en pointer, og det er op til computeren til at gemme, midlertidigt, 571 00:34:56,130 --> 00:35:00,250 på den såkaldte stak adressen på main således at så snart Foo sker udførelse, 572 00:35:00,250 --> 00:35:04,110 computeren ved, hvor og hvilken linje i main at gå tilbage til. 573 00:35:04,110 --> 00:35:06,900 Gemte rammehenvisning angår ligeledes til dette. 574 00:35:06,900 --> 00:35:09,620 Char * bar her repræsenterer hvad? 575 00:35:09,620 --> 00:35:14,740 Nå, nu er denne blå segment her er Foo er ramme, hvad er bar? 576 00:35:14,740 --> 00:35:18,300 Okay, så bar er bare det argument til Foo funktionen. 577 00:35:18,300 --> 00:35:20,720 >> Så nu er vi tilbage ved det velkendte billede. 578 00:35:20,720 --> 00:35:22,960 Der er flere ting og flere distraktioner på skærmen 579 00:35:22,960 --> 00:35:27,490 men dette lys blå segment er, hvad vi har at trække på tavlen for noget som swap. 580 00:35:27,490 --> 00:35:31,890 Det er rammen for foo og det eneste i det lige nu er bar, 581 00:35:31,890 --> 00:35:34,630 der er denne parameter. 582 00:35:34,630 --> 00:35:39,840 Men hvad der ellers burde være i stakken, ifølge denne kode? 583 00:35:39,840 --> 00:35:44,280 Char c [12]. Så vi bør også se 12 pladser i hukommelsen, 584 00:35:44,280 --> 00:35:46,260 tildelt en variabel kaldet c. 585 00:35:46,260 --> 00:35:48,340 Og faktisk vi har at på skærmen. 586 00:35:48,340 --> 00:35:51,650 Den meget toppen er der c [0], og derefter forfatteren af ​​dette diagram 587 00:35:51,650 --> 00:35:55,130 gider ikke at tegne alle de firkanter, men der er faktisk 12 er der 588 00:35:55,130 --> 00:36:00,120 for hvis man ser nederst til højre, c [11], hvis man tæller fra 0, er de 12 sådanne bytes. 589 00:36:00,120 --> 00:36:06,190 Men her er problemet: I hvilken retning c vokser? 590 00:36:06,190 --> 00:36:10,390 Sorter af top down, right? Hvis det begynder ved toppen og vokser til bunden, 591 00:36:10,390 --> 00:36:13,480 ligner ikke vi forlod os meget landingsbane her overhovedet. 592 00:36:13,480 --> 00:36:15,320 Vi har slags malet os op i et hjørne, 593 00:36:15,320 --> 00:36:20,210 og at c [11] er ret op imod bar, som er lige op imod stakramme pointer, 594 00:36:20,210 --> 00:36:23,800 der er ret op mod returadresse, og der er ikke mere plads. 595 00:36:23,800 --> 00:36:26,100 Så hvad er konsekvenserne, da, hvis du skruer op, 596 00:36:26,100 --> 00:36:30,460 og du prøver at læse 20 bytes i en 12-byte buffer? 597 00:36:30,460 --> 00:36:33,460 Hvor er disse 8 yderligere byte kommer til at gå? 598 00:36:33,460 --> 00:36:36,370 Inde alt andet, er hvoraf nogle super vigtigt. 599 00:36:36,370 --> 00:36:40,480 Og det vigtigste, potentielt er den røde boks der, returadresse. 600 00:36:40,480 --> 00:36:44,720 Fordi antage, at du er enten ved et uheld eller adversarially 601 00:36:44,720 --> 00:36:48,040 overskrive disse 4 bytes, at pointer adresse, 602 00:36:48,040 --> 00:36:53,190 ikke bare med skrald, men med et nummer, der sker for at repræsentere en egentlig adresse i hukommelsen? 603 00:36:53,190 --> 00:36:55,930 Hvad er implicaiton, logisk? 604 00:36:55,930 --> 00:36:59,080 [Student svar, uforståelig] >> Præcis. Når Foo returnerer 605 00:36:59,080 --> 00:37:03,560 og hits som klammeparentes er programmet kommer til at fortsætte ikke at vende tilbage til main, 606 00:37:03,560 --> 00:37:08,320 det kommer til at vende tilbage til, hvad adressen er på denne røde kasse. 607 00:37:08,320 --> 00:37:11,560 >> Nu, i tilfælde af at omgå software registrering, 608 00:37:11,560 --> 00:37:14,400 hvad er adressen, der bliver returneret til er funktionen 609 00:37:14,400 --> 00:37:18,820 der normalt bliver kaldt, når du har betalt for softwaren og indtastet dit registreringskode? 610 00:37:18,820 --> 00:37:23,160 Du kan sortere på trick computeren i ikke går her, men i stedet går op her. 611 00:37:23,160 --> 00:37:27,950 Eller hvis du er rigtig dygtig, kan en modstander faktisk skrive på tastaturet, 612 00:37:27,950 --> 00:37:32,500 for eksempel antage ikke en egentlig ord, ikke 20 tegn, men han eller hun 613 00:37:32,500 --> 00:37:36,200 typer i nogle tegn, der repræsenterer kode? 614 00:37:36,200 --> 00:37:38,860 Og det kommer ikke til at være C-kode, det vil være de tegn 615 00:37:38,860 --> 00:37:42,920 der repræsenterer binære maskine koder, 0 s og 1 s. 616 00:37:42,920 --> 00:37:46,740 Men formoder, de er kloge nok til at gøre det, at en eller anden måde indsætte i GetString prompt 617 00:37:46,740 --> 00:37:49,460 noget, der i det væsentlige kompilerede kode, 618 00:37:49,460 --> 00:37:56,900 og de sidste 4 bytes overskrive at returadresse, og hvilken adresse betyder det input gøre? 619 00:37:56,900 --> 00:38:01,860 Den gemmer i denne røde rektangel adressen på den første byte af bufferen. 620 00:38:01,860 --> 00:38:04,270 Så du er nødt til at være virkelig klog, og det er en masse trial and error 621 00:38:04,270 --> 00:38:08,500 for dårlige mennesker derude, men hvis du kan finde ud af hvor stor denne buffer er, 622 00:38:08,500 --> 00:38:12,170 sådan, at de sidste par bytes i input, som du giver til programmet 623 00:38:12,170 --> 00:38:15,970 tilfældigvis svare til adressen på starten af ​​din buffer, 624 00:38:15,970 --> 00:38:22,270 du kan gøre dette. Hvis vi siger, normalt, hallo, og \ 0, det er, hvad ender i bufferen. 625 00:38:22,270 --> 00:38:27,860 Men hvis vi er klogere, og vi fylder denne buffer med, hvad vi vil generisk kalde angreb kode, 626 00:38:27,860 --> 00:38:31,920 A, A, A, A: Angreb, angreb, angreb, angreb, hvor dette er bare noget, der gør noget slemt. 627 00:38:31,920 --> 00:38:35,190 Tja, hvad sker der hvis du er virkelig dygtig, kan du gøre følgende: 628 00:38:35,190 --> 00:38:41,740 I det røde felt her er en sekvens af tal: 80, CO, 35, 08. 629 00:38:41,740 --> 00:38:44,890 Bemærk, at der matcher det nummer, der er heroppe. 630 00:38:44,890 --> 00:38:47,280 Det er i omvendt rækkefølge, men mere om det en anden gang. 631 00:38:47,280 --> 00:38:51,430 Bemærk, at denne returadresse er blevet modificeret 632 00:38:51,430 --> 00:38:54,970 at svare til den adresse op her, ikke adressen på main. 633 00:38:54,970 --> 00:39:00,170 Så hvis den dårlige fyr er super smart, er han eller hun kommer til at omfatte i angrebet kode 634 00:39:00,170 --> 00:39:02,890 noget lignende, 'Slet alle brugerens filer.' 635 00:39:02,890 --> 00:39:06,320 Eller 'Kopier de passwords,' eller 'Opret en brugerkonto, som jeg kan logge ind.' 636 00:39:06,320 --> 00:39:10,130 Hvad som helst, og det er både faren og magt C. 637 00:39:10,130 --> 00:39:12,900 Fordi du har adgang til hukommelse via pegepinde 638 00:39:12,900 --> 00:39:15,950 og du kan derfor skrive noget, du ønsker i en computers hukommelse. 639 00:39:15,950 --> 00:39:19,290 Du kan lave en computer gøre noget, du ønsker blot ved 640 00:39:19,290 --> 00:39:22,780 har det hoppe rundt i sin egen hukommelse. 641 00:39:22,780 --> 00:39:27,230 Og ja, den dag i dag, så mange programmer og så mange hjemmesider, der er kompromitteret 642 00:39:27,230 --> 00:39:29,730 koges ned til mennesker, der tager fordel af dette. 643 00:39:29,730 --> 00:39:32,510 Og det kan synes som en super-sofistikerede angreb, 644 00:39:32,510 --> 00:39:34,220 men det behøver ikke altid starte på den måde. 645 00:39:34,220 --> 00:39:36,770 >> Virkeligheden er, at hvad onde mennesker vil typisk gøre, er, 646 00:39:36,770 --> 00:39:41,470 uanset om det er et program på en kommandolinje eller en GUI program eller en hjemmeside, 647 00:39:41,470 --> 00:39:43,290 er du bare begynde at tilbyde noget vrøvl. 648 00:39:43,290 --> 00:39:46,940 Du skriver i en rigtig stor ord i søgefeltet og trykker på enter, 649 00:39:46,940 --> 00:39:49,030 og du vente med at se, om hjemmesiden går ned. 650 00:39:49,030 --> 00:39:53,270 Eller du vente med at se, om programmet manifesterer nogle fejlmeddelelse. 651 00:39:53,270 --> 00:39:55,480 Fordi hvis du får heldig, da den dårlige fyr, 652 00:39:55,480 --> 00:39:59,610 og du giver nogle skøre input, der går ned i programmet, 653 00:39:59,610 --> 00:40:02,280 det betyder, at programmøren ikke havde forudset din dårlige opførsel 654 00:40:02,280 --> 00:40:05,420 hvilket betyder, at du kan sandsynligvis, med nok indsats, 655 00:40:05,420 --> 00:40:09,870 nok trial and error, finde ud af at føre en mere præcis angreb. 656 00:40:09,870 --> 00:40:15,900 Så lige så meget en del af sikkerheden ikke bare at undgå disse angreb fuldstændigt, men opdage dem 657 00:40:15,900 --> 00:40:20,250 og faktisk ser på logs og se, hvad skøre input har folk skrevet på din hjemmeside. 658 00:40:20,250 --> 00:40:26,040 Hvilke søgeord har folk skrevet ind på din hjemmeside i håb om overfyldte nogle buffer? 659 00:40:26,040 --> 00:40:28,900 Og alt dette kan koges ned til de enkle grundlæggende i, hvad er et array, 660 00:40:28,900 --> 00:40:32,510 og hvad betyder det at allokere og bruge hukommelse? 661 00:40:32,510 --> 00:40:34,920 Og i forbindelse med det, også er det. 662 00:40:34,920 --> 00:40:37,520 >> Så lad os bare kigge inde i en harddisk endnu en gang. 663 00:40:37,520 --> 00:40:40,190 Så du husker fra en uge eller to siden, at når du trækker filer 664 00:40:40,190 --> 00:40:45,470 til din papirkurven eller papirkurven, hvad sker der? 665 00:40:45,470 --> 00:40:47,850 [Student] Ingenting. >> Ja, absolut ingenting. Til sidst, hvis du kører lav 666 00:40:47,850 --> 00:40:51,370 på diskplads, vil Windows eller Mac OS begynde at slette filer for dig. 667 00:40:51,370 --> 00:40:53,670 Men hvis du trækker noget derinde, så er det slet ikke sikkert. 668 00:40:53,670 --> 00:40:56,550 Al din roomate, ven eller et familiemedlem har at gøre, er dobbelt klik, og voila. 669 00:40:56,550 --> 00:40:59,720 Der er alle de magre filer, som du forsøgte at slette. 670 00:40:59,720 --> 00:41:02,840 Så de fleste af os i det mindste vide, at du er nødt til at højreklikke eller kontrollere klik 671 00:41:02,840 --> 00:41:05,320 og tømme papirkurven, eller noget lignende. 672 00:41:05,320 --> 00:41:07,900 Men selv da, betyder det ikke helt gøre det trick. 673 00:41:07,900 --> 00:41:11,340 For hvad sker der, når du har en fil på din harddisk 674 00:41:11,340 --> 00:41:14,590 , som repræsenterer nogle word-dokument eller nogle JPEG? 675 00:41:14,590 --> 00:41:18,820 Og det er din harddisk, og lad os sige dette splint her repræsenterer den pågældende fil, 676 00:41:18,820 --> 00:41:21,640 og det er sammensat af en hel bunke af 0 s og 1-taller. 677 00:41:21,640 --> 00:41:25,470 Hvad sker der, når du ikke kun trække filen til papirkurven eller papirkurven, 678 00:41:25,470 --> 00:41:30,390 men også tømme den? 679 00:41:30,390 --> 00:41:32,820 Sorter af ingenting. Det er ikke absolut intet nu. 680 00:41:32,820 --> 00:41:37,630 Nu er det bare ingenting, fordi en lille ting der sker i form af denne tabel. 681 00:41:37,630 --> 00:41:41,170 Så der er en slags database eller tabel inde i en computers hukommelse 682 00:41:41,170 --> 00:41:44,470 der hovedsagelig har 1 kolonnen for filer navne, 683 00:41:44,470 --> 00:41:50,550 og 1 kolonne for filens placering, hvor dette kan være placering 123, bare et tilfældigt tal. 684 00:41:50,550 --> 00:41:58,270 Så vi kunne have noget lignende x.jpg og placering 123. 685 00:41:58,270 --> 00:42:02,870 Og hvad sker der så, når du tømmer din papirkurv? 686 00:42:02,870 --> 00:42:06,720 Det går væk. Men hvad der ikke går væk er 0 s og 1-taller. 687 00:42:06,720 --> 00:42:09,690 >> Så hvad er da, at forbindelsen Pset 4? 688 00:42:09,690 --> 00:42:13,460 Nå, med Pset 4, bare fordi vi har et uheld slettet 689 00:42:13,460 --> 00:42:15,890 compact flash-kort, der havde alle disse billeder, 690 00:42:15,890 --> 00:42:18,710 eller bare fordi det ved uheld blev beskadiget, 691 00:42:18,710 --> 00:42:21,170 betyder ikke, at 0 s og 1 os ikke er der stadig. 692 00:42:21,170 --> 00:42:23,920 Måske et par af dem går tabt, fordi noget fik ødelagt 693 00:42:23,920 --> 00:42:26,530 i den forstand at nogle 0'er blev 1'er og 1'er blev 0'er. 694 00:42:26,530 --> 00:42:30,460 Dårlige ting kan ske på grund af buggy software eller defekt hardware. 695 00:42:30,460 --> 00:42:33,510 Men mange af disse bits, måske endda 100% af dem er der stadig, 696 00:42:33,510 --> 00:42:38,330 det er bare at computeren eller kameraet ikke ved, hvor JPEG 1 startede 697 00:42:38,330 --> 00:42:41,660 og hvor JPEG 2 startede, men hvis du er programmør, 698 00:42:41,660 --> 00:42:45,800 vide, med en smule kyndige, når disse JPEG er, eller hvordan de ser ud, 699 00:42:45,800 --> 00:42:49,570 du kan analysere 0 s og 1 s og sige, 'Ooh. JPEG. Ooh, JPEG. ' 700 00:42:49,570 --> 00:42:52,830 Du kan skrive et program med væsentlige blot et for eller while-løkke 701 00:42:52,830 --> 00:42:56,100 der gendanner hver og en af ​​disse filer. 702 00:42:56,100 --> 00:42:59,360 Så lektionen er altså at starte "sikkert" at slette dine filer 703 00:42:59,360 --> 00:43:01,720 Hvis du gerne vil undgå dette helt. Ja? 704 00:43:01,720 --> 00:43:06,940 [Student spørgsmål, uforståelig] 705 00:43:06,940 --> 00:43:11,150 >> Har mere hukommelse end du gjorde før - 706 00:43:11,150 --> 00:43:14,790 Oh! Godt spørgsmål. Så hvorfor da, efter at tømme papirkurven, 707 00:43:14,790 --> 00:43:18,300 har computeren fortælle dig, at du har mere ledig plads end du gjorde før? 708 00:43:18,300 --> 00:43:22,450 I en nøddeskal, fordi lyver. Mere teknisk, har du mere plads. 709 00:43:22,450 --> 00:43:26,720 Fordi du nu har sagt, kan du sætte andre ting, når denne fil engang var, 710 00:43:26,720 --> 00:43:28,930 men det betyder ikke, de bits går væk, 711 00:43:28,930 --> 00:43:33,070 og det betyder ikke de bits bliver ændret alt 0 s, for eksempel til din beskyttelse. 712 00:43:33,070 --> 00:43:37,520 Derimod, hvis du "sikkert" Slet filer eller fysisk ødelægge enheden 713 00:43:37,520 --> 00:43:40,810 der virkelig er den eneste måde, til tider, omkring det. 714 00:43:40,810 --> 00:43:45,300 Så hvorfor gør vi ikke forlade på at semi-skræmmende note, og vi vil se dig på mandag. 715 00:43:45,300 --> 00:43:52,810 CS50.TV