1 00:00:00,000 --> 00:00:02,760 [Powered by Google Translate] [TÝDEN 5] 2 00:00:02,760 --> 00:00:04,760 [David J. Malan, Harvard University] 3 00:00:04,760 --> 00:00:11,990 [To je CS50.] [CS50.TV] 4 00:00:11,990 --> 00:00:17,780 [Žena] Lže, o tom, co, já nevím. 5 00:00:17,780 --> 00:00:20,300 [Muž] Tak co víme? 6 00:00:20,300 --> 00:00:24,120 [Žena] To v 9:15, Ray Santoya byl u bankomatu. 7 00:00:24,120 --> 00:00:27,420 [Muž] Takže otázka je, co se dělá v 9:16? 8 00:00:27,420 --> 00:00:29,980 [Žena] Střelba 9 mm na něco. 9 00:00:29,980 --> 00:00:31,900 Možná viděl odstřelovače. 10 00:00:31,900 --> 00:00:34,000 [Muž] Nebo byl s ním pracovat. 11 00:00:34,000 --> 00:00:36,330 [Žena] Počkej. Vraťte se jeden. 12 00:00:36,330 --> 00:00:38,330 [Muž] Co vidíš? 13 00:00:38,330 --> 00:00:44,520 [♫ napínavý music ♫] 14 00:00:44,520 --> 00:00:48,320 [Žena] Přineste mu lícem nahoru. Celá obrazovka. 15 00:00:48,320 --> 00:00:51,230 [Man] Jeho brýle. >> Tam to odraz. 16 00:00:51,230 --> 00:01:00,810 [♫ napínavý music ♫] 17 00:01:00,810 --> 00:01:03,580 [Muž] To je ten Nuevita je baseballový tým. To je jejich logo. 18 00:01:03,580 --> 00:01:07,790 [Žena] A mluví na toho, kdo má na sobě tu bundu. 19 00:01:07,790 --> 00:01:13,730 >> [David Malan] Tak, tohle je CS50 týden 5, a dnes jsme zničit trochu o televizi a film pro vás. 20 00:01:13,730 --> 00:01:16,170 Takže pokaždé, když sledujete pořad, jako je tenhle tady, 21 00:01:16,170 --> 00:01:19,910 a policajti říkají "Můžete vyčistit, že se děje?" nebo "vylepšení," 22 00:01:19,910 --> 00:01:21,900 není zvýšit v reálném světě. 23 00:01:21,900 --> 00:01:25,220 Ve skutečnosti to, co opravdu dostanete, je trochu něco jako toto. 24 00:01:25,220 --> 00:01:27,570 Já jsem vytáhl jeden z pracovníků fotografií z stránce. 25 00:01:27,570 --> 00:01:30,980 Toto je program s názvem Photoshop. To je 1 z 2 Bowdeny, 26 00:01:30,980 --> 00:01:36,300 Pro 1 ze 3 Bowdeny vlastně, dnes, protože máme paní bowden i zde, s Robem a Pavla. 27 00:01:36,300 --> 00:01:41,950 Ale tady je Rob na obrazovce, a pokud se zoom na uvedeném lesk vždycky měl v očích, 28 00:01:41,950 --> 00:01:47,600 to, co skutečně vidět, že to, co vidíte, je to, co dostanete. 29 00:01:47,600 --> 00:01:51,690 Toto je "lepší," takže "CSI" si to trochu špatně. 30 00:01:51,690 --> 00:01:55,190 Je tu ještě jedna klip, pokud si můžeme vybrat na "CSI" jen trochu déle. 31 00:01:55,190 --> 00:01:58,500 Tenhle je pěkný výraz vyslovit dále, pokud chcete 32 00:01:58,500 --> 00:02:10,280 řádné technické se svými přáteli, když opravdu, říkáš vůbec nic. 33 00:02:10,280 --> 00:02:12,970 >> [Muž] Celé týdny jsem vyšetřoval taxikář Killer vraždy 34 00:02:12,970 --> 00:02:15,360 s určitou morbidní fascinací. 35 00:02:15,360 --> 00:02:17,160 [Žena # 1] To je v reálném čase. 36 00:02:17,160 --> 00:02:22,930 [Woman # 2] Budu vytvořit grafické uživatelské rozhraní pomocí jazyka Visual Basic, uvidíme, jestli můžete sledovat IP adresy. 37 00:02:22,930 --> 00:02:29,570 >> [Malan] Tak audio out of sync stranou, vytváření GUI rozhraní pomocí jazyka Visual Basic 38 00:02:29,570 --> 00:02:31,820 sledovat IP adresy je úplný nesmysl. 39 00:02:31,820 --> 00:02:33,840 V těchto dnech byste se použít Visual Basic, 40 00:02:33,840 --> 00:02:38,920 není potřeba GUI, a IP adresa byla technicky přesný termín. 41 00:02:38,920 --> 00:02:41,730 Takže dávat pozor na to, a jeden z mých oblíbených: 42 00:02:41,730 --> 00:02:45,070 Tohle je trochu tajemný, protože musíte vědět, jiný jazyk. 43 00:02:45,070 --> 00:02:47,860 Tam je jazyk tzv. Objective-C, který je nadmnožinou C. 44 00:02:47,860 --> 00:02:51,960 Což znamená, že je C plus některé další funkce, mezi nimi objektově orientované programování. 45 00:02:51,960 --> 00:02:55,070 A to je jazyk, který Apple popularizoval pro programování iOS. 46 00:02:55,070 --> 00:02:58,760 A tak tady je klip z jiného přehlídky dohromady, z "čísla," 47 00:02:58,760 --> 00:03:02,450 , že pokud skutečně podíváte pozorně na TiVo a pauzy v pravou chvíli, 48 00:03:02,450 --> 00:03:07,700 uvidíte, že to, co hledají na není to, co je popisováno. 49 00:03:07,700 --> 00:03:11,170 A zkusím jiný audio konektor sem a uvidíme, jestli nemůžeme 50 00:03:11,170 --> 00:03:13,780 udržet zvuk v synchronizaci tentokrát. 51 00:03:13,780 --> 00:03:20,530 Dávám ti "čísla." 52 00:03:20,530 --> 00:03:23,240 >> [Man # 1] Je to 32-bit IPv4 adresy. 53 00:03:23,240 --> 00:03:38,930 [Man # 2] IP, to je Internet. >> Private sítě. Je to Anita je privátní síť. 54 00:03:38,930 --> 00:03:43,810 [Malan] Dobře. To je Objective-C, a to je pro některé dětský zbarvení programu, 55 00:03:43,810 --> 00:03:51,140 jak můžete snad odvodit z názvu proměnné tam. 56 00:03:51,140 --> 00:03:54,410 Tak, že pak byl "Čísla." Takže dnes a tento týden jsme se představit 57 00:03:54,410 --> 00:03:57,740 trochu ze světa forenzní a kontext v problematice proto. 58 00:03:57,740 --> 00:04:00,590 Dnes bude zkrácen přednáška, protože tam je zvláštní událost zde 59 00:04:00,590 --> 00:04:05,530 potom, takže budeme se podívat, a dráždit oba studenty i jejich rodiče dnes 60 00:04:05,530 --> 00:04:07,420 s některými z věcí, které jsou na obzoru. 61 00:04:07,420 --> 00:04:12,240 Mezi nimi, v pondělí, budete mít několik dalších spolužáků. 62 00:04:12,240 --> 00:04:16,050 EDX, Harvard a MIT nových on-line iniciativa pro otevřený výukový 63 00:04:16,050 --> 00:04:19,120 a více, je spuštění na akademické půdě Harvardu v pondělí. 64 00:04:19,120 --> 00:04:21,490 Což znamená, že přijde pondělí se bude mít - jako poslední počtu, 65 00:04:21,490 --> 00:04:26,210 86000 další spolužáci budou sledovat spolu s přednáškami CS50 tyto 66 00:04:26,210 --> 00:04:29,170 a oddíly a návody a problém soupravy. 67 00:04:29,170 --> 00:04:32,350 A jako součást tohoto, stanete se členy inaugurační třídy 68 00:04:32,350 --> 00:04:35,090 CS50 a nyní CS50x. 69 00:04:35,090 --> 00:04:39,310 >> V rámci tohoto, nyní si uvědomit, že dojde k určitým upsides stejně. 70 00:04:39,310 --> 00:04:43,790 Chcete-li získat připraven na to, pro masivní počet studentů, 71 00:04:43,790 --> 00:04:47,180 stačí říct, že i když máme 108 TFS a CAS, 72 00:04:47,180 --> 00:04:50,790 není zcela nejlepší student / učitel poměr, jakmile se dostaneme 80.000 dalšími studenty. 73 00:04:50,790 --> 00:04:52,850 Takže my nebudeme se třídění tolik problém nastavuje ručně. 74 00:04:52,850 --> 00:04:55,920 Takže představil tento týden v problémové sady budou CS50 Check, 75 00:04:55,920 --> 00:04:58,450 který bude příkazového řádku v zařízení 76 00:04:58,450 --> 00:05:01,200 že budete mít po aktualizaci později tento víkend, 77 00:05:01,200 --> 00:05:03,200 a budete moci spustit příkaz, zkontrolovat 50, 78 00:05:03,200 --> 00:05:06,500 na vlastní PSet, a dostanete nějakou zpětnou vazbu o tom, zda je váš program 79 00:05:06,500 --> 00:05:11,160 správné nebo nesprávné podle různých konstrukčních specifikací, které jsme stanovili. 80 00:05:11,160 --> 00:05:13,580 Takže o tom více a problém set specifikace a 81 00:05:13,580 --> 00:05:17,240 se CS50x spolužáci budou používat to stejně. 82 00:05:17,240 --> 00:05:19,230 >> Takže problém set 4 je všechno o kriminalistice. 83 00:05:19,230 --> 00:05:21,940 A tento kousek byl inspirován nějakým reálném životě věci, 84 00:05:21,940 --> 00:05:24,620 přičemž, když jsem byl v postgraduálním studiu, jsem internován na chvíli se 85 00:05:24,620 --> 00:05:28,650 na Middlesex County je okresní zastupitelství dělá forenzní práci 86 00:05:28,650 --> 00:05:31,650 s jejich hlavní forenzní vyšetřovatel, a co to činil 87 00:05:31,650 --> 00:05:35,260 je, myslím, že jsem se zmínil některé poznatky týden minulost, je Mass Státní policie nebo jiných 88 00:05:35,260 --> 00:05:39,000 by přijít, by odejdou věci jako pevné disky a CD a diskety 89 00:05:39,000 --> 00:05:42,340 a podobně, a pak se cílem forenzní období bylo zjistit, zda 90 00:05:42,340 --> 00:05:44,600 tam byl nebo nebyl důkaz nějakého druhu. 91 00:05:44,600 --> 00:05:48,010 To bylo zvláštní Oddělení pro vyšetřování, tak to bylo úřednický zločin, 92 00:05:48,010 --> 00:05:52,350 to bylo více znepokojující druh trestné činnosti, 93 00:05:52,350 --> 00:05:55,990 nic zahrnující nějaký digitálních médií, ukazuje se, že ne, že mnoho lidí 94 00:05:55,990 --> 00:05:59,370 napsat e-mail, "jsem to udělal." 95 00:05:59,370 --> 00:06:03,290 Takže často jsou tyto forenzní vyhledávání neobjevil všude tolik ovoce, 96 00:06:03,290 --> 00:06:05,850 ale někdy lidé by psát takové e-maily. 97 00:06:05,850 --> 00:06:08,490 Takže někdy snaha byla odměněna. 98 00:06:08,490 --> 00:06:14,420 >> Ale vést až k tomuto forenzní PSet, budeme zavádět na PSet 4 bit grafiky. 99 00:06:14,420 --> 00:06:18,260 Takže pravděpodobně vzít tyto věci jako samozřejmost, JPEG, GIF a jako v těchto dnech, 100 00:06:18,260 --> 00:06:21,640 ale pokud si opravdu myslíte, že o tom, obraz, podobně jako obličej Rob, 101 00:06:21,640 --> 00:06:24,430 může být modelován jako sled teček, nebo pixelech. 102 00:06:24,430 --> 00:06:26,680 Nyní, v případě obličeje Robertův, je tu všechny druhy barev, 103 00:06:26,680 --> 00:06:29,940 a začali jsme vidět jednotlivé body, otherwide známé jako obrazové body, 104 00:06:29,940 --> 00:06:31,610 jakmile jsme začali pro přiblížení 105 00:06:31,610 --> 00:06:35,590 Ale pokud budeme zjednodušovat svět o trochu, a prostě říct, že tohle je Rob 106 00:06:35,590 --> 00:06:40,560 v černé a bílé, dobře, k reprezentaci černé a bílé se můžeme jen použít binární. 107 00:06:40,560 --> 00:06:44,960 A pokud budeme používat binární, 1 nebo 0, můžeme vyjádřit stejný obrázek 108 00:06:44,960 --> 00:06:51,970 usmívající se tvář Robertův s tímto vzorem bitů: 11000011 představuje 109 00:06:51,970 --> 00:06:55,160 bílá, bílá, černá, černá, černá, černá, bílá. 110 00:06:55,160 --> 00:06:59,290 A tak to není obrovský skok, pak začít mluvit o barevných fotografiích. 111 00:06:59,290 --> 00:07:01,920 Věci, které byste vidět na Facebooku, nebo se s digitálním fotoaparátem, 112 00:07:01,920 --> 00:07:04,730 ale jistě, pokud jde o barvy, budete potřebovat více bitů. 113 00:07:04,730 --> 00:07:08,470 A docela běžné ve světě fotografií je použít ne 1-bitové barvy, 114 00:07:08,470 --> 00:07:12,730 , protože to naznačuje, ale 24-bitové barvy, kam vlastně získat miliony barev. 115 00:07:12,730 --> 00:07:15,430 Tak jako v případě, kdy jsme se přiblížili na oko Rob, 116 00:07:15,430 --> 00:07:19,270 , který byl libovolný počet milionů různých barevných možností. 117 00:07:19,270 --> 00:07:22,260 >> Takže budeme zavádět to v problému sadě 4 stejně jako v návodu, 118 00:07:22,260 --> 00:07:27,050 která bude dnes v 03:30 místo obvyklých 02:30, protože přednášky pátečním zde. 119 00:07:27,050 --> 00:07:29,930 Ale video bude on-line, jako obvykle, zítra. 120 00:07:29,930 --> 00:07:31,880 Budeme také představí vám do jiného formátu. 121 00:07:31,880 --> 00:07:34,150 Tak to je záměrně chtěl podívat zastrašující na první, 122 00:07:34,150 --> 00:07:38,980 ale to je jen nějaká dokumentace pro struct C. 123 00:07:38,980 --> 00:07:42,280 Ukazuje se, že Microsoft před lety, pomohl popularizovat tento formát, 124 00:07:42,280 --> 00:07:46,630 volal bitmapový formát souboru, BMP, a to super-jednoduchý, 125 00:07:46,630 --> 00:07:50,390 barevné grafické formát souboru, který byl použit na nějakou dobu 126 00:07:50,390 --> 00:07:53,640 a někdy ještě pro tapety na stolní počítače. 127 00:07:53,640 --> 00:07:57,410 Pokud si myslíte, že zpět na systém Windows XP a pahorkatiny a modrou oblohu, 128 00:07:57,410 --> 00:08:00,660 to bylo typicky BMP, nebo bitmapový obraz, a bitmapy 129 00:08:00,660 --> 00:08:03,340 jsou zábavné pro nás, protože mají trochu větší komplexnost. 130 00:08:03,340 --> 00:08:05,640 Není to tak jednoduché, jak tento mřížky 0 a 1 je; 131 00:08:05,640 --> 00:08:10,680 místo, máte věci jako záhlaví na začátku souboru. 132 00:08:10,680 --> 00:08:15,520 Takže jinými slovy, uvnitř. Soubor BMP je celá parta 0 a 1 je, 133 00:08:15,520 --> 00:08:18,070 ale tam je nějaký další 0 a 1 je tam. 134 00:08:18,070 --> 00:08:21,450 A ukázalo se, že to, co jsme pravděpodobně zaujatý za samozřejmost let, 135 00:08:21,450 --> 00:08:27,040 formáty souborů, jako. doc nebo. xls nebo. mp3 nebo. mp4, 136 00:08:27,040 --> 00:08:29,910 bez ohledu na formáty souborů, které jste zvyklí. 137 00:08:29,910 --> 00:08:31,900 No, co to vůbec znamená být formát souboru? 138 00:08:31,900 --> 00:08:35,740 Vzhledem k tomu, na konci dne, všechny tyto soubory používáme mít jen 0 a 1 je 139 00:08:35,740 --> 00:08:39,950 a možná ti 0 a 1 reprezentují, b, c, a to prostřednictvím ASCII nebo podobně, 140 00:08:39,950 --> 00:08:42,030 ale až do konce dne, je to jen 0 a 1 je. 141 00:08:42,030 --> 00:08:45,300 >> Takže lidé jen občas rozhodnou vymyslet nový formát souborů 142 00:08:45,300 --> 00:08:49,420 kde standardizovat co vzory bitů bude skutečně znamenat. 143 00:08:49,420 --> 00:08:52,790 A v tomto případě zde jsou lidé, kteří navrhli bitmapový formát souboru 144 00:08:52,790 --> 00:08:58,260 řekl, že při prvním bajtu v rastrového souboru, jak je označil offset 0, tam, 145 00:08:58,260 --> 00:09:02,320 tam to bude nějaký nesrozumitelné názvy proměnné volal bfType, 146 00:09:02,320 --> 00:09:06,510 který právě zkratka pro bitmapový typ souboru, jaký typ rastrového souboru je. 147 00:09:06,510 --> 00:09:10,780 Můžete usuzovat, snad, ze druhé řady, která ofsetovou 2, byte číslo 2, 148 00:09:10,780 --> 00:09:15,980 má vzor 0 a 1 je, že představuje to, co? 149 00:09:15,980 --> 00:09:18,320 Velikost něco, a pokračuje odtud. 150 00:09:18,320 --> 00:09:20,660 Takže problém sadě 4, budete prošel některé z těchto věcí. 151 00:09:20,660 --> 00:09:24,480 >> Nebudeme skončit starat o všechny z nich, ale všimnete, že začíná být zajímavé 152 00:09:24,480 --> 00:09:30,780 kolem řádku nebo bytového 54, rgbtBlue, zelené a červené. 153 00:09:30,780 --> 00:09:35,280 Pokud jste někdy slyšeli zkratku RGB, červená zelená modrá, to je odkaz na to. 154 00:09:35,280 --> 00:09:37,840 Vzhledem k tomu, že ukáže, že můžete malovat všechny barvy duhy 155 00:09:37,840 --> 00:09:41,580 s nějakou kombinaci červené a modré a zelené. 156 00:09:41,580 --> 00:09:46,560 A ve skutečnosti, může rodiče v pokoji připomenout některé z prvních projektorů. 157 00:09:46,560 --> 00:09:49,360 V těchto dnech, stačí vidět 1 jasné světlo vycházející z objektivu. 158 00:09:49,360 --> 00:09:52,870 Ale zpět v den, jste měli červené čočky, modré čočky, a zelené čočky 159 00:09:52,870 --> 00:09:56,620 a společně se snažily na obrazovku a tvořil barevné fotografie. 160 00:09:56,620 --> 00:09:59,590 A docela často střední školy a vysoké školy by měla ty čočky 161 00:09:59,590 --> 00:10:02,680 někdy-tak-trochu nakřivo, takže jsi trochu vidět dvojité nebo trojité obrázků, 162 00:10:02,680 --> 00:10:07,500 ale že byl nápad. Vy jste měli červené a zelené a modré světlo malování obrazu. 163 00:10:07,500 --> 00:10:09,570 A to stejný princip je použit v počítačích. 164 00:10:09,570 --> 00:10:12,000 >> Takže mezi problémy, pak pro vás v problému nastavení 4 165 00:10:12,000 --> 00:10:16,080 se bude pár věcí, jeden je skutečně změnit velikost obrazu. 166 00:10:16,080 --> 00:10:18,050 Chcete-li ve vzoru 0 a 1 je, 167 00:10:18,050 --> 00:10:22,840 zjistit, které kousky 0 a 1 reprezentují to, co do struktury jako je tento, 168 00:10:22,840 --> 00:10:26,800 a pak zjistit, jak replikovat pixelů: Reds, blues, Zelení 169 00:10:26,800 --> 00:10:32,460 uvnitř tak, že když obraz vypadá to zpočátku může vypadat toto místo po tom. 170 00:10:32,460 --> 00:10:35,590 Mezi další problémy, příliš, bude, že budete předána 171 00:10:35,590 --> 00:10:38,900 forenzní obraz skutečného souboru z digitálního fotoaparátu 172 00:10:38,900 --> 00:10:42,410 a na tomto fotoaparátu, kdysi, byli celá parta fotografií. 173 00:10:42,410 --> 00:10:47,030 Problém je, že jsme omylem vymazány nebo měl obraz poškozen nějak. 174 00:10:47,030 --> 00:10:51,040 Špatné věci se stávají s digitálními fotoaparáty, a tak jsme se rychle kopírovat všechny 0 a 1 je 175 00:10:51,040 --> 00:10:55,410 vypnutí této kartě pro vás, zachránil vše v 1 velkém souboru, a pak budeme předat vám je 176 00:10:55,410 --> 00:11:00,000 v problému nastavit 4 tak, že můžete napsat program v C, s nimiž se zpět 177 00:11:00,000 --> 00:11:02,660 všech těchto JPEG, ideálně. 178 00:11:02,660 --> 00:11:06,280 A ukázalo se, že JPEG, i když jsou poněkud složité formátu, 179 00:11:06,280 --> 00:11:09,580 jsou mnohem složitější, než tento usmívající se tvář zde. 180 00:11:09,580 --> 00:11:14,320 Ukazuje se, že každá JPEG začíná stejnými vzory 0 a 1 je. 181 00:11:14,320 --> 00:11:18,820 Takže pomocí smyčky while nebo pro smyčce nebo podobné, 182 00:11:18,820 --> 00:11:22,350 můžete iterovat přes všechny 0 a 1 je v tomto soudním obrázek 183 00:11:22,350 --> 00:11:26,670 a pokaždé, když vidíte speciální vzor, ​​který je definován v problému setu specifikace, 184 00:11:26,670 --> 00:11:29,770 můžete předpokládat, "Oh, tady je, s velmi vysokou pravděpodobností, 185 00:11:29,770 --> 00:11:33,520 začátek ve formátu JPEG, "a jakmile zjistíte, že stejný vzor, 186 00:11:33,520 --> 00:11:36,050 některé počet bajtů nebo kilobajtů nebo megabyty později, 187 00:11:36,050 --> 00:11:40,550 můžete předpokládat, "Ooh! Zde je druhý JPEG, fotografie jsem si vzal po prvním. 188 00:11:40,550 --> 00:11:44,720 Dovolte mi, abych přestat číst, že první soubor, začněte psát tento nový. " 189 00:11:44,720 --> 00:11:49,980 A výstup vašeho programu pro PSet 4 bude tolik jako 50 JPEG. 190 00:11:49,980 --> 00:11:52,400 A pokud to není 50 JPEG snímků, budete mít trochu smyčky. 191 00:11:52,400 --> 00:11:55,580 Pokud máte nekonečný počet JPEG, máte nekonečnou smyčku. 192 00:11:55,580 --> 00:11:58,280 Takže, i bude docela běžný případ. 193 00:11:58,280 --> 00:12:00,280 To je to, co je na obzoru. 194 00:12:00,280 --> 00:12:03,740 >> Kvíz 0, za námi. Uvědomte si, na můj e-mail, že vždy je tu lidi 195 00:12:03,740 --> 00:12:06,820 kteří jsou oba šťastní, tak nějak neutrální a smutný kolem kvíz 0 hraní. 196 00:12:06,820 --> 00:12:10,160 A prosím, dostat se ke mně, hlavové TFS, Zamyla, vlastní TF 197 00:12:10,160 --> 00:12:14,120 nebo jeden z úřadů, které budete vědět, jestli byste chtěli diskutovat o tom, jak to šlo. 198 00:12:14,120 --> 00:12:16,460 >> Takže zapůsobit na rodiče tady v pokoji, 199 00:12:16,460 --> 00:12:23,990 co je CS50 knihovna? Dobrá práce. 200 00:12:23,990 --> 00:12:32,280 Co je to CS50 knihovna? Jo? [Student odpovědi, nesrozumitelným] 201 00:12:32,280 --> 00:12:35,730 >> Dobře, dobře. Takže je to prewritten soubor kódu, který jsme, personál, napsal, 202 00:12:35,730 --> 00:12:38,460 vám poskytneme, aby některé společné funkce. 203 00:12:38,460 --> 00:12:42,290 Věci jako se mi řetězec, získáte mi int, všechny funkce, které jsou zde uvedeny. 204 00:12:42,290 --> 00:12:45,260 Od teď, začneme skutečně brát tyto vzdělávací kola off. 205 00:12:45,260 --> 00:12:48,230 Takže budeme začít odnést "řetězec" od vás, 206 00:12:48,230 --> 00:12:52,790 které připomínají, byl jen synonymem pro jaký skutečný datový typ? char *. 207 00:12:52,790 --> 00:12:57,020 Takže pro rodiče, to bylo asi - to je dobré, tak char * začneme vidět 208 00:12:57,020 --> 00:13:00,810 na obrazovce o to víc, jak jsme odstranit "řetězec" z našeho slovníku, 209 00:13:00,810 --> 00:13:02,760 alespoň pokud jde o skutečnosti psaní kódu. 210 00:13:02,760 --> 00:13:06,240 Podobně, budeme přestat používat některé z těchto funkcí stejně, 211 00:13:06,240 --> 00:13:08,390 protože naše programy se dostat sofistikovanější 212 00:13:08,390 --> 00:13:11,370 spíše než jen psát programy, které sedí tam s výzvou, bliká, 213 00:13:11,370 --> 00:13:13,580 čeká na uživatele něco psát palců 214 00:13:13,580 --> 00:13:15,220 Získáte vaše vstupy odjinud. 215 00:13:15,220 --> 00:13:18,720 Například, budete si je z řady bitů na místní pevný disk. 216 00:13:18,720 --> 00:13:23,340 Budete místo si v budoucnu od síťového připojení, některé webové stránky někde. 217 00:13:23,340 --> 00:13:27,460 Takže pojďme Sloupněte této vrstvy poprvé, a zvedněte CS50 spotřebiče 218 00:13:27,460 --> 00:13:32,300 a tento soubor s názvem CS50.h, které jste byli ostré včetně týdnů. 219 00:13:32,300 --> 00:13:34,380 >> Ale pojďme skutečně vidět, co je uvnitř toho. 220 00:13:34,380 --> 00:13:38,250 Takže začátek souboru v modré barvě je jen celá parta komentářů, 221 00:13:38,250 --> 00:13:41,340 Informace o záruce a licencování. To je druh společného paradigmatu 222 00:13:41,340 --> 00:13:44,600 v softwaru, protože spousta software v těchto dnech je to, co se nazývá "open source", 223 00:13:44,600 --> 00:13:46,940 což znamená, že někdo napsal kód 224 00:13:46,940 --> 00:13:50,060 a dělal to volně k dispozici, a to nejen spustit a používat, 225 00:13:50,060 --> 00:13:53,660 ale ve skutečnosti číst a měnit a integrovat do své vlastní práce. 226 00:13:53,660 --> 00:13:55,790 Takže to je to, co jste dosud používali, open source software, 227 00:13:55,790 --> 00:13:58,030 i když ve velmi malém formuláře. 228 00:13:58,030 --> 00:14:01,860 Kdybych posunout dolů kolem připomínky, když začneme vidět některé další známé věci. 229 00:14:01,860 --> 00:14:08,090 Takže všimnete nahoře zde, že soubor CS50.h obsahuje spoustu hlavičkových souborů. 230 00:14:08,090 --> 00:14:11,160 Nyní, většina z nich jsme neviděli, ale jeden je 231 00:14:11,160 --> 00:14:15,640 obeznámeni, které z nich jsme viděli, byť krátce, tak daleko? 232 00:14:15,640 --> 00:14:18,720 Jo, standardní knihovny. Stdlib.h má malloc, 233 00:14:18,720 --> 00:14:21,590 takže jakmile jsme začali mluvit o dynamické přidělování paměti, 234 00:14:21,590 --> 00:14:24,960 které se vrátíme na příští týden, stejně, jsme začali včetně tohoto souboru. 235 00:14:24,960 --> 00:14:29,660 Ukazuje se, že bool a pravdivé a falešné dělat ne vlastně existovat v C, samo o sobě, 236 00:14:29,660 --> 00:14:32,460 pokud tento soubor zahrnout zde. 237 00:14:32,460 --> 00:14:35,770 Tak jsme celé týdny, byla včetně standardní bool.h 238 00:14:35,770 --> 00:14:39,020 takže můžete použít pojem typu bool, true nebo false. 239 00:14:39,020 --> 00:14:41,830 Bez toho, měli byste se trochu falešné něj a použít int 240 00:14:41,830 --> 00:14:45,920 a jen svévolně předpokládat, že 0 je false a 1 je pravda. 241 00:14:45,920 --> 00:14:49,980 >> Teď, když jsme přejděte dolů dál, tady je naše definice řetězce. 242 00:14:49,980 --> 00:14:54,820 Ukázalo se, jak jsme řekli dříve, že pokud to * je opravdu nezáleží. 243 00:14:54,820 --> 00:14:56,750 Můžete dokonce mít prostor všude kolem. 244 00:14:56,750 --> 00:15:01,550 My, tento semestr, byly propagovat ji, protože to, aby bylo jasné, že * má co do činění s typem. 245 00:15:01,550 --> 00:15:05,370 Ale uvědomit, stejně jako časté, ne-li o něco běžnější, je to tam 246 00:15:05,370 --> 00:15:07,480 ale funkčně je to totéž. 247 00:15:07,480 --> 00:15:11,070 Ale teď, když jsme si stanoví další, pojďme se podívat na, řekněme, GetInt, 248 00:15:11,070 --> 00:15:15,350 protože jsme použili, že možná dříve, než cokoli jiného tento semestr. 249 00:15:15,350 --> 00:15:19,620 A tady je GetInt. To je to, co? 250 00:15:19,620 --> 00:15:24,650 To je prototypem. Tak často, dali jsme prototypy na vrcholky našich. C soubory, 251 00:15:24,650 --> 00:15:28,190 ale můžete také dát prototypy v hlavičkových souborech,. H soubory, 252 00:15:28,190 --> 00:15:32,110 jako je tento zde, takže když píšete některé funkce 253 00:15:32,110 --> 00:15:36,790 že chcete, aby ostatní lidé mohli používat, což je přesně ten případ s CS50 knihovny, 254 00:15:36,790 --> 00:15:40,900 můžete nejen realizovat své funkce v něco jako CS50.c, 255 00:15:40,900 --> 00:15:46,720 si také dát prototypy nejsou v horní části tohoto souboru, ale v horní části záhlaví souboru, 256 00:15:46,720 --> 00:15:50,810 pak, že hlavičkový soubor je to, co přátelé a kolegové patří, 257 00:15:50,810 --> 00:15:52,800 s ostrými patří ve svém vlastním kódu. 258 00:15:52,800 --> 00:15:55,440 Takže celou tu dobu jste byli, včetně všech těchto prototypů 259 00:15:55,440 --> 00:15:59,870 efektivně v horní části souboru, ale prostřednictvím tohoto ostrý patří mechanismus 260 00:15:59,870 --> 00:16:03,320 že v podstatě kopie a pasty tento soubor do své vlastní. 261 00:16:03,320 --> 00:16:06,400 Nuže, zde je několik poměrně podrobná dokumentace. 262 00:16:06,400 --> 00:16:08,880 >> Jsme skoro za samozřejmé, že GetInt dostane int, 263 00:16:08,880 --> 00:16:10,740 ale to dopadá, že je nějaké rohové případech, že jo? 264 00:16:10,740 --> 00:16:14,320 Co když uživatel zadá do čísla, které je příliš velké? 265 00:16:14,320 --> 00:16:17,350 A quintillion, že prostě nemůže vejít z int? 266 00:16:17,350 --> 00:16:21,180 Co je očekávané chování? No, v ideálním případě, je to předvídatelné. 267 00:16:21,180 --> 00:16:23,460 Takže v tomto případě, pokud si skutečně přečíst drobným písmem, 268 00:16:23,460 --> 00:16:27,850 uvidíte, že v případě, že linka nemůže být přečíst, vrátí INT_MAX. 269 00:16:27,850 --> 00:16:30,800 Nikdy jsme o tom mluvili, ale na základě jeho kapitalizace, 270 00:16:30,800 --> 00:16:33,030 co to je, asi? 271 00:16:33,030 --> 00:16:36,610 Je to konstantní, tak je to nějaký speciální konstanta, která je pravděpodobně prohlášena za 272 00:16:36,610 --> 00:16:39,460 v jednom z těch hlavičkových souborů, které se nachází v výš v souboru, 273 00:16:39,460 --> 00:16:43,400 a INT_MAX je asi něco jako, hrubě, 2 miliardy. 274 00:16:43,400 --> 00:16:48,160 Myšlenka je, že proto, že musíme nějak znamenat, že něco se pokazilo, 275 00:16:48,160 --> 00:16:51,090 jsme, ano, mají 4000000000 čísla máme k dispozici, 276 00:16:51,090 --> 00:16:53,980 negativní 2000000000 až na 2 miliardy, dávat nebo brát. 277 00:16:53,980 --> 00:16:58,030 No, to, co je běžné v programování je budete krást jen jeden z těch čísel. 278 00:16:58,030 --> 00:17:02,250 Možná 0, možná 2 miliardy, možná negativní 2000000000. 279 00:17:02,250 --> 00:17:06,720 Takže budete trávit jeden z vašich možných hodnot, takže můžete zavázat k světu 280 00:17:06,720 --> 00:17:10,089 že když se něco pokazí, budu vraťte tento super-velké hodnoty. 281 00:17:10,089 --> 00:17:13,329 Ale nechcete uživatel zadáním něco mystické, jako "2, 3, 4 ..." 282 00:17:13,329 --> 00:17:17,079 z opravdu velkého počtu, kde se zobecnit místo jako konstanta. 283 00:17:17,079 --> 00:17:19,380 Takže opravdu, pokud jste byli anal v posledních několika týdnech, 284 00:17:19,380 --> 00:17:23,800 kdykoliv zavoláte GetInt, měli byste být kontrola s IF podmínka. 285 00:17:23,800 --> 00:17:27,109 Bylo typ uživatele v INT_MAX, nebo více specificky, 286 00:17:27,109 --> 00:17:29,900 udělal GetInt vrátit INT_MAX? Protože kdyby to udělal, 287 00:17:29,900 --> 00:17:35,140 to vlastně znamená, že ani psát to, něco se pokazilo v tomto případě. 288 00:17:35,140 --> 00:17:38,970 Tak tohle je to, co je všeobecně známo jako "Sentinel" hodnotou, což vyžaduje zvláštní. 289 00:17:38,970 --> 00:17:41,020 >> No, pojďme se nyní v na. C soubory. 290 00:17:41,020 --> 00:17:44,500 Soubor C existuje v zařízení nějakou dobu, 291 00:17:44,500 --> 00:17:47,540 a, ve skutečnosti, přístroj má to předkompilovaný pro vás 292 00:17:47,540 --> 00:17:49,720 do té věci jsme nazvali "objektový kód," 293 00:17:49,720 --> 00:17:52,940 ale to prostě není jedno, kde to je, protože systém ví, 294 00:17:52,940 --> 00:17:54,780 v tomto případě, je-li, zařízení. 295 00:17:54,780 --> 00:18:00,620 Ale pojďme přejděte nyní GetInt, a uvidíte, jak GetInt působí celou tu dobu. 296 00:18:00,620 --> 00:18:02,380 Takže tady máme podobné poznámky z období před. 297 00:18:02,380 --> 00:18:04,930 Dovolte mi, abych přiblížit jen na kódu části, 298 00:18:04,930 --> 00:18:07,410 a to, co máme na GetInt je následující. 299 00:18:07,410 --> 00:18:12,770 To trvá žádný vstup a vrací hodnotu typu int, while (true), takže máme úmyslné nekonečnou smyčku 300 00:18:12,770 --> 00:18:16,560 ale patrně budeme vypuknout to nějak, nebo se vrátit v rámci tohoto. 301 00:18:16,560 --> 00:18:19,890 Tak uvidíme, jak to funguje. No, zdá se, že používáte GetString 302 00:18:19,890 --> 00:18:22,550 V tomto prvním řádku uvnitř smyčky, 166. 303 00:18:22,550 --> 00:18:25,320 To je nyní dobré praxe, protože za jakých podmínek 304 00:18:25,320 --> 00:18:30,820 by GetString vrátit tuto speciální klíčové slovo, NULL? 305 00:18:30,820 --> 00:18:38,460 Pokud se něco pokazí. Co se může pokazit, když budete volat něco jako GetString? 306 00:18:38,460 --> 00:18:42,550 Jo? [Student odpověď, nesrozumitelné] >> Jo. Takže možná malloc nezdaří. 307 00:18:42,550 --> 00:18:45,310 Někde pod kapotou GetString volá malloc, 308 00:18:45,310 --> 00:18:48,210 které přiděluje paměť, což umožňuje obchod s počítači 309 00:18:48,210 --> 00:18:50,950 všechny znaky, které uživatel zadá do klávesnice. 310 00:18:50,950 --> 00:18:53,270 A předpokládám, že uživatel měl spoustu volného času 311 00:18:53,270 --> 00:18:56,470 a napsal více, například, než 2000000000 znaků. 312 00:18:56,470 --> 00:18:59,600 Více znaků, než v počítači, má dokonce i RAM. 313 00:18:59,600 --> 00:19:02,350 No, GetString musí být schopen znamenat, že na vás, 314 00:19:02,350 --> 00:19:05,650 i když je to super, super neobvyklé rohový případ. 315 00:19:05,650 --> 00:19:08,490 Je nějak být schopen zvládnout, a tak GetString, 316 00:19:08,490 --> 00:19:11,850 pokud bychom se vrátit a přečíst si jeho dokumentaci, se ve skutečnosti, vrátí NULL. 317 00:19:11,850 --> 00:19:16,150 Nyní, když GetString selže vrácením NULL, GetInt bude selhání 318 00:19:16,150 --> 00:19:19,370 vrácením INT_MAX, stejně jako hlídka. 319 00:19:19,370 --> 00:19:22,650 To jsou jen lidské konvence. Jediný způsob, jak by se, že tohle je případ 320 00:19:22,650 --> 00:19:24,840 je tím, čtení dokumentace. 321 00:19:24,840 --> 00:19:28,200 Tak pojďme přejděte na místo, kde int je vlastně GotInt. 322 00:19:28,200 --> 00:19:34,220 >> Takže pokud jsem posunout dolů o kousek dál, v souladu 170 máme komentář nad těmito řádky. 323 00:19:34,220 --> 00:19:38,470 Takže my deklarujeme, v 172, int n a char c, a pak se toto nové funkce 324 00:19:38,470 --> 00:19:41,870 které někteří z vás narazil předtím, ale sscanf. 325 00:19:41,870 --> 00:19:44,190 To je zkratka pro řetězce f skenování. 326 00:19:44,190 --> 00:19:48,580 Jinými slovy, dej mi řetězec a budu testovat to na kusy informací zájmu. 327 00:19:48,580 --> 00:19:53,820 Takže co to znamená? No, předpokládám, že jsem typ v doslova, 1 2 3 na klávesnici, 328 00:19:53,820 --> 00:19:59,730 a poté stiskněte klávesu Enter. Jaký je datový typ 1 2 3 když se vrátil od GetString? 329 00:19:59,730 --> 00:20:05,010 Je to samozřejmě string, ne? Mám řetězec, takže 1 2 3 je opravdu "1 2 3" 330 00:20:05,010 --> 00:20:07,260 s \ 0 na jejím konci. To není int. 331 00:20:07,260 --> 00:20:10,420 To není číslo. Vypadá to jako číslo, ale není to vlastně. 332 00:20:10,420 --> 00:20:14,680 Takže to, co se GetInt udělat? To má skenovat, že řetězec zleva doprava, 333 00:20:14,680 --> 00:20:19,010 1 2 3 \ 0, a nějak převést na skutečné číslo. 334 00:20:19,010 --> 00:20:21,010 Nyní můžete zjistit, jak to udělat. 335 00:20:21,010 --> 00:20:24,240 Pokud si myslíte, že zpět do PSet 2, budete pravděpodobně se trochu pohodlné 336 00:20:24,240 --> 00:20:26,810 s Caesarem nebo Vigenère, takže si můžete iterovat přes řetězec, 337 00:20:26,810 --> 00:20:29,800 můžete převést znaky to ints s výběrem. To je spousta práce. 338 00:20:29,800 --> 00:20:32,800 Proč ne volat funkci jako sscanf, který dělá to pro vás? 339 00:20:32,800 --> 00:20:37,520 Takže sscanf očekává argument, v tomto případě nazývá linka, která je řetězec. 340 00:20:37,520 --> 00:20:41,310 Ty pak zadat v uvozovkách, velmi podobný printf, 341 00:20:41,310 --> 00:20:44,960 co očekávat, že v tomto řetězci? 342 00:20:44,960 --> 00:20:52,980 Co tu říkám je, že jsem očekávat, že desetinné číslo a možná i charakter. 343 00:20:52,980 --> 00:20:54,990 A uvidíme, proč tomu tak je za chvíli. 344 00:20:54,990 --> 00:20:58,440 Ukazuje se, že tento záznam je nyní připomíná věcí 345 00:20:58,440 --> 00:21:00,840 jsme začali mluvit o něco více než před týdnem. 346 00:21:00,840 --> 00:21:05,430 >> Co je a n a a c dělá pro nás? [Student odpovědi, nesrozumitelným] 347 00:21:05,430 --> 00:21:07,610 Jo >>. Je to, že mi dal adresu n a adresu c. 348 00:21:07,610 --> 00:21:10,440 A teď, proč je to tak důležité? No, víte, že s funkcí v C 349 00:21:10,440 --> 00:21:13,440 můžete vždy vrátit hodnotu, nebo žádnou hodnotu. 350 00:21:13,440 --> 00:21:16,630 Můžete se vrátit int, je řetězec, float, char, cokoliv. 351 00:21:16,630 --> 00:21:21,150 Nebo se můžete vrátit void, ale můžete vrátit pouze 1 věc maximálně. 352 00:21:21,150 --> 00:21:26,100 Ale tady chceme sscanf vrátit mi možná int, desetinné číslo, 353 00:21:26,100 --> 00:21:29,240 a také char, a já ti to vysvětlím, proč char za chvíli. 354 00:21:29,240 --> 00:21:34,250 Takže jste skutečně chcete f vrátit 2 věci, to prostě není možné v C. 355 00:21:34,250 --> 00:21:38,460 Takže si můžete obejít, že předáním 2 adresy, 356 00:21:38,460 --> 00:21:43,710 protože jakmile podáš funkci, 2 adresy, co může tato funkce s nimi dělat? 357 00:21:43,710 --> 00:21:49,880 To může napsat na tyto adresy. Můžete použít * operace a "tam", aby každý z těchto adres. 358 00:21:49,880 --> 00:21:54,320 Je to něco tohoto backdoor mechanismu, ale velmi běžné pro změnu hodnot proměnných 359 00:21:54,320 --> 00:21:58,020 ve více než jen 1 místo, v tomto případě 2. 360 00:21:58,020 --> 00:22:04,590 Nyní si všimněte, jsem kontrola == TO1, a pak se vracet n případě, že se ve skutečnosti, vyhodnotí na true. 361 00:22:04,590 --> 00:22:09,340 Tak co se děje? No, technicky vzato, všechno, co jsme opravdu chceme, aby se stalo v GetInt je tento. 362 00:22:09,340 --> 00:22:12,340 Chceme analyzovat, abych tak řekl, chceme číst řetězec 363 00:22:12,340 --> 00:22:16,210 "1 2 3" a je-li to vypadá, jako by to číslo tam, 364 00:22:16,210 --> 00:22:21,360 co říkáte, sscanf udělat, je dát to číslo, 1 2 3, v této proměnné n pro mě. 365 00:22:21,360 --> 00:22:26,060 Proč tedy, dělal jsem to stejně? 366 00:22:26,060 --> 00:22:33,750 Jaká je role také říká, sscanf, můžete také získat postavu zde. 367 00:22:33,750 --> 00:22:36,890 [Student řečeno, nesrozumitelné] >> Není - desetinná čárka by mohlo fungovat. 368 00:22:36,890 --> 00:22:40,650 Pojďme si myslí, že se na chvíli zamyslel. Co ještě? 369 00:22:40,650 --> 00:22:42,570 [Student, nesrozumitelné] >> Tak, dobrá myšlenka, mohlo by to být znak NULL. 370 00:22:42,570 --> 00:22:44,970 Je to ve skutečnosti není, je v tomto případě. Jo? [Student, nesrozumitelným] 371 00:22:44,970 --> 00:22:47,100 >> >> ASCII. Nebo, dovolte mi, abych zobecnit ještě dále. 372 00:22:47,100 --> 00:22:49,670 % C je jen pro kontrolu chyb. 373 00:22:49,670 --> 00:22:52,510 Nechceme tam být znak po čísle, 374 00:22:52,510 --> 00:22:54,980 ale co to mi umožňuje udělat, je následující: 375 00:22:54,980 --> 00:23:01,270 Ukazuje se, že sscanf, kromě ukládání hodnot v N a C, v tomto příkladu zde, 376 00:23:01,270 --> 00:23:08,170 co to také dělá, je, že vrací počet proměnných je kladen hodnoty palců 377 00:23:08,170 --> 00:23:13,330 Takže pokud jste zadat pouze v 1 2 3, pak pouze% d bude odpovídat 378 00:23:13,330 --> 00:23:18,830 a jen n je uložena s hodnotou, jako je 1 2 3 a nic dostane dát do c; 379 00:23:18,830 --> 00:23:20,870 c zůstává odpadky hodnotu, abych tak řekl. 380 00:23:20,870 --> 00:23:23,550 Garbage, protože je to nikdy nebyla inicializována jako nějakou hodnotu. 381 00:23:23,550 --> 00:23:29,390 Takže v tomto případě, sscanf vrátí 1, protože jsem naplněn jeden z těch ukazatelů, 382 00:23:29,390 --> 00:23:33,650 v tom případě, skvělé. Mám int, tak jsem uvolnit linku uvolnit paměť 383 00:23:33,650 --> 00:23:37,150 že GetString skutečně přidělené, a pak jsem se vrátit n. 384 00:23:37,150 --> 00:23:42,210 Else, pokud jste někdy nad tím, kde to zopakovat tvrzení pochází, pochází přímo odsud. 385 00:23:42,210 --> 00:23:45,770 Pokud naopak, píšu v 1 2 3 foo, 386 00:23:45,770 --> 00:23:48,640 jen nějaký náhodný sled textu, sscanf se uvidí, 387 00:23:48,640 --> 00:23:51,500 ooh, číslo, ooh, číslo, ooh, číslo, ooh - f. 388 00:23:51,500 --> 00:23:54,190 A to bude dát 1 2 3 v n. 389 00:23:54,190 --> 00:23:59,970 Je to dám F v C, a pak se vrátit 2. 390 00:23:59,970 --> 00:24:02,980 Takže máme, jen pomocí základní definici chování scanf je, 391 00:24:02,980 --> 00:24:06,170 velmi jednoduchý způsob - dobře, komplex na první pohled, ale na konci dne, 392 00:24:06,170 --> 00:24:11,460 poměrně jednoduchý mechanismus, jak říct, je tam int, a pokud ano, je to, že jediná věc, kterou jsem našel? 393 00:24:11,460 --> 00:24:14,950 A bílý prostor je zde záměrně. Pokud budete číst dokumentaci k sscanf, 394 00:24:14,950 --> 00:24:18,690 to vám řekne, že pokud jsou kousek bílého místa na začátku nebo na konci, 395 00:24:18,690 --> 00:24:24,990 sscanf příliš umožní uživateli, z jakéhokoliv důvodu, hit mezerník 1 2 3, a to bude legitimní. 396 00:24:24,990 --> 00:24:28,310 To nebude křičet na uživatele jen proto, že narazí na mezerník na začátku nebo na konci, 397 00:24:28,310 --> 00:24:32,160 což je jen o málo více uživatelsky příjemný. 398 00:24:32,160 --> 00:24:34,160 >> Jakékoliv dotazy, pak na GetInts? Jo? 399 00:24:34,160 --> 00:24:36,820 [Student otázka, nesrozumitelným] 400 00:24:36,820 --> 00:24:40,740 >> Dobrá otázka. Co když jste právě zadali v char, jako je f, a stiskněte klávesu Enter 401 00:24:40,740 --> 00:24:47,830 aniž by psaní 1 2 3; co si myslíte, že chování této řádek kódu by pak? 402 00:24:47,830 --> 00:24:50,500 Takže sscanf může zahrnovat, že také proto, že v tomto případě, 403 00:24:50,500 --> 00:24:56,280 to nebude vyplňovat n nebo C; to bude místo vrátit 0. 404 00:24:56,280 --> 00:25:01,540 V tom případě, já jsem také chytí, že scénář, neboť předpokládaná hodnota chci je 1. 405 00:25:01,540 --> 00:25:07,310 Chci jen 1 a jen 1 věc být vyplněny. Dobrá otázka. Ostatní? 406 00:25:07,310 --> 00:25:09,610 >> Dobře, tak ať to není projít všechny funkce v zde, 407 00:25:09,610 --> 00:25:11,820 ale ten, který se zdá být, snad, zbývající podíl 408 00:25:11,820 --> 00:25:14,530 je GetString, protože se ukázalo, že GetFloat, GetInt, 409 00:25:14,530 --> 00:25:19,490 GetDouble, GetLongLong všechny Punt spoustu jejich funkčnosti na GetString. 410 00:25:19,490 --> 00:25:22,860 Takže pojďme se podívat na to, jak on je realizován zde. 411 00:25:22,860 --> 00:25:27,040 Tohle vypadá trochu složitější, ale používá stejné základy 412 00:25:27,040 --> 00:25:29,680 že jsme začali mluvit o minulý týden. Takže v GetString, 413 00:25:29,680 --> 00:25:32,670 který nebere argument, podle prázdnoty tady, 414 00:25:32,670 --> 00:25:37,110 a vrátí řetězec, takže jsem se prohlašuje, že řetězec s názvem vyrovnávací paměť. 415 00:25:37,110 --> 00:25:39,670 Já opravdu nevím, co že se to využít k ještě, ale uvidíme. 416 00:25:39,670 --> 00:25:42,950 Vypadá to kapacity, ve výchozím nastavení, 0, není zcela jistý, kde to bude. 417 00:25:42,950 --> 00:25:44,920 Nejste si jisti, co se n to bude být použity pro ještě. 418 00:25:44,920 --> 00:25:47,860 Ale teď je to už trochu zajímavější, tak v souladu 243, 419 00:25:47,860 --> 00:25:51,760 prohlašujeme int c, to je něco jako hloupé detailu. 420 00:25:51,760 --> 00:25:58,080 Char je 8 bitů, a 8 bitů lze uložit, kolik různých hodnot? 421 00:25:58,080 --> 00:26:03,310 256. Problém je, že pokud chcete mít 256 různých znaků ASCII, 422 00:26:03,310 --> 00:26:06,210 které jsou, pokud si myslíte, zpět, a to není něco, co pamatovat. 423 00:26:06,210 --> 00:26:09,100 Ale pokud si myslíte, že zpět do té velké ASCII tabulky jsme měli před několika týdny, 424 00:26:09,100 --> 00:26:13,780 bylo v tomto případě, 128 nebo 256 znaků ASCII. 425 00:26:13,780 --> 00:26:16,220 Použili jsme všechny vzory 0 a 1 se děje. 426 00:26:16,220 --> 00:26:19,410 To je problém, pokud chcete být schopni odhalit chyby. 427 00:26:19,410 --> 00:26:23,290 Protože pokud jste již používáte 256 hodnot pro své postavy, 428 00:26:23,290 --> 00:26:26,390 jste opravdu plánovat dopředu, protože teď nemáte způsob, jak říkat, 429 00:26:26,390 --> 00:26:29,750 "To není legitimní charakter, to je nějaký chybný zpráva." 430 00:26:29,750 --> 00:26:32,430 Takže to, co se svět skutečně je, že používají následující největší hodnotu, 431 00:26:32,430 --> 00:26:35,790 něco jako int, takže máte šílený počet bitů, 432 00:26:35,790 --> 00:26:39,610 32 pro 4 miliardy možných hodnot, takže můžete jednoduše skončit s použitím, 433 00:26:39,610 --> 00:26:44,800 v podstatě, 257 z nich, 1, který má nějaký zvláštní význam jako chyba. 434 00:26:44,800 --> 00:26:49,190 >> Tak uvidíme, jak to funguje. V souladu 246, mám velkou while 435 00:26:49,190 --> 00:26:54,530 že volá fgetc; f znamená soubor, getc, a pak se stdin. 436 00:26:54,530 --> 00:26:59,030 Ukázalo se, že to je jen přesnější způsob, jak říct "čte vstup z klávesnice." 437 00:26:59,030 --> 00:27:02,730 Standardní vstupní prostředky klávesnice, standardní výkon znamená obrazovku, 438 00:27:02,730 --> 00:27:06,920 a standardní chyba, kterou uvidíme v PSet 4, se rozumí obrazovku, 439 00:27:06,920 --> 00:27:09,670 ale zvláštní část obrazovky tak, aby to není sjednocen 440 00:27:09,670 --> 00:27:13,760 s aktuálním výkonem, který jste chtěli vytisknout, ale o tom více v budoucnu. 441 00:27:13,760 --> 00:27:19,430 Takže fgetc jen znamená číst jeden znak z klávesnice, a uložte ho tam, kde? 442 00:27:19,430 --> 00:27:24,000 Uložte jej v C, a potom zkontrolujte, takže jsem jen pomocí nějaké logické spojky zde, 443 00:27:24,000 --> 00:27:28,430 ujistěte se, že není rovno \ n, takže uživatel stiskněte Enter. 444 00:27:28,430 --> 00:27:31,510 Chceme zastavit v tomto bodě, konec smyčky, a také chceme ověřit 445 00:27:31,510 --> 00:27:36,170 pro speciální konstanty, EOF, která, pokud víte, nebo hádat - co to znamená? 446 00:27:36,170 --> 00:27:39,860 Konec souboru. Takže tohle je nesmyslné, protože když píšu na klávesnici, 447 00:27:39,860 --> 00:27:41,900 je to opravdu žádný soubor se na tomto, 448 00:27:41,900 --> 00:27:44,330 ale to je jen trochu generický termín použitý znamenat 449 00:27:44,330 --> 00:27:50,320 že nic jiného se blíží z lidského prsty. EOF. Konec souboru. 450 00:27:50,320 --> 00:27:52,600 Jak stranou, pokud jste někdy hit ovládací d na klávesnici, 451 00:27:52,600 --> 00:27:54,680 ne, že byste ještě, jste hit ovladač C. 452 00:27:54,680 --> 00:27:57,920 Ale kontrola d zasílá tuto speciální konstantní názvem EOF. 453 00:27:57,920 --> 00:28:03,100 >> Takže teď máme jen nějaké dynamické přidělování paměti. 454 00:28:03,100 --> 00:28:06,460 Takže pokud n + 1> kapacita, teď budu vysvětlovat n. 455 00:28:06,460 --> 00:28:09,380 n je jen, kolik bytů je v současné době ve vyrovnávací paměti, 456 00:28:09,380 --> 00:28:11,970 řetězec, který jste v současné době buduje od uživatele. 457 00:28:11,970 --> 00:28:16,240 Pokud máte více znaků ve vašem vyrovnávací paměti, než budete mít kapacitu vyrovnávací paměti, 458 00:28:16,240 --> 00:28:20,760 intuitivně, co musíme udělat, a pak je přidělit větší kapacitu. 459 00:28:20,760 --> 00:28:24,490 Jdu sbírat nad některými aritmetického zde 460 00:28:24,490 --> 00:28:26,900 a soustředit se pouze na tuto funkci zde. 461 00:28:26,900 --> 00:28:29,170 Víte, co malloc je, nebo alespoň obecně známé. 462 00:28:29,170 --> 00:28:32,380 Hádat, co realloc dělá. [Student odpověď, nesrozumitelným] 463 00:28:32,380 --> 00:28:35,690 Jo >>. A není to úplně přidání paměti, že přerozděluje paměti takto: 464 00:28:35,690 --> 00:28:40,530 Pokud je stále ještě prostor na konci řetězce, aby vám více, že paměť 465 00:28:40,530 --> 00:28:43,370 než původně vám dává, pak budete moci dát další paměť. 466 00:28:43,370 --> 00:28:46,640 Takže stačí uvedení řetězců znaků zády k sobě k sobě dozadu. 467 00:28:46,640 --> 00:28:49,290 Ale pokud to není tento případ, protože jste čekali příliš dlouho 468 00:28:49,290 --> 00:28:51,700 a něco náhodně dostal svalil do paměti tam, ale je tu navíc 469 00:28:51,700 --> 00:28:56,480 paměť tady, to je v pořádku. Realloc bude dělat vše těžkou práci za vás, 470 00:28:56,480 --> 00:28:58,810 přesunout řetězec co jste si přečetli v tak daleko odtud, 471 00:28:58,810 --> 00:29:02,550 dal ji tam, a pak vám ještě trochu dráhu v tomto bodě. 472 00:29:02,550 --> 00:29:05,610 Takže s mávnutím ruky, dovolte mi říci, že to, co dělá GetString 473 00:29:05,610 --> 00:29:09,540 je to začíná s malým pufru, možná 1 jednolůžkový charakteru, 474 00:29:09,540 --> 00:29:12,300 a pokud uživatel zadá do 2 znaky, GetString skončí 475 00:29:12,300 --> 00:29:15,210 volání realloc a říká, "Ooh, 1 znak nebylo dost. 476 00:29:15,210 --> 00:29:18,480 Dejte mi 2 znaky. " Pak, pokud budete číst přes logiky smyčky, 477 00:29:18,480 --> 00:29:21,070 to bude říkat, "Ooh, uživatelskou zadaný do 3 znaky. 478 00:29:21,070 --> 00:29:25,690 Dej mi teď není 2, ale 4 znaky, tak mi dej 8, tak mi dej 16 a 32. " 479 00:29:25,690 --> 00:29:28,180 Skutečnost, že jsem Zdvojnásobení kapacity pokaždé 480 00:29:28,180 --> 00:29:30,320 Znamená to, že vyrovnávací paměť není poroste pomalu. 481 00:29:30,320 --> 00:29:35,870 Bude to růst velmi rychlý, a co by mohlo být výhodou, že? 482 00:29:35,870 --> 00:29:38,540 Proč jsem zdvojnásobení velikosti vyrovnávací paměti, a to i přesto, že uživatel 483 00:29:38,540 --> 00:29:41,450 možná stačí 1 další znak z klávesnice? 484 00:29:41,450 --> 00:29:44,830 [Student odpověď, nesrozumitelné]. >> Co je to? 485 00:29:44,830 --> 00:29:46,750 Přesně tak. Nemusíte pěstovat to, jak často. 486 00:29:46,750 --> 00:29:48,870 A to je jen druh - Jsi zajištění své sázky zde. 487 00:29:48,870 --> 00:29:54,150 Myšlenka je, že nechcete volat realloc hodně, protože to má tendenci být pomalé. 488 00:29:54,150 --> 00:29:56,840 Kdykoliv můžete požádat operační systém pro paměti, jak brzy uvidíte, 489 00:29:56,840 --> 00:30:00,620 v budoucnu problém sadě, má tendenci trvat nějaký čas. 490 00:30:00,620 --> 00:30:04,980 Takže je minimalizovat množství času, i když ztrácíme trochu místa, má tendenci být dobrá věc. 491 00:30:04,980 --> 00:30:07,250 >> Ale pokud budeme číst prostřednictvím závěrečné části GetString zde, 492 00:30:07,250 --> 00:30:10,880 a znovu, pochopení každý řádek zde není tak důležitá i dnes. 493 00:30:10,880 --> 00:30:14,830 Ale všimněte si, že nakonec zavolá malloc znovu, a přiděluje 494 00:30:14,830 --> 00:30:16,980 přesně tak, jak mnoho bajtů jako je třeba pro řetězec 495 00:30:16,980 --> 00:30:21,620 a pak vyhodí voláním zdarma, příliš velké vyrovnávací paměti, 496 00:30:21,620 --> 00:30:23,510 pokud to opravdu dostal dvojnásobek příliš mnohokrát. 497 00:30:23,510 --> 00:30:25,970 Stručně řečeno, je to, jak GetString působí celou tu dobu. 498 00:30:25,970 --> 00:30:30,100 Vše, co to dělá je číst jeden znak v době, znovu a znovu a znovu 499 00:30:30,100 --> 00:30:37,930 a pokaždé, když potřebuje nějaký další paměť, požádá operační systém pro něj voláním realloc. 500 00:30:37,930 --> 00:30:41,660 Nějaké otázky? Dobrá. 501 00:30:41,660 --> 00:30:45,220 >> Útok. Nyní, když chápeme ukazatele, nebo alespoň 502 00:30:45,220 --> 00:30:47,560 jsou stále více obeznámeni s ukazateli, 503 00:30:47,560 --> 00:30:50,020 Pojďme zvážit, jak bude celý svět začne hroutit 504 00:30:50,020 --> 00:30:53,160 pokud nemáte dost bránit sporných uživatelů, 505 00:30:53,160 --> 00:30:55,180 lidé, kteří se snaží proniknout do vašeho systému. 506 00:30:55,180 --> 00:31:00,260 Lidé, kteří se snaží ukrást vaše software a tím obejít nějaký registrační kód 507 00:31:00,260 --> 00:31:02,150 že by jinak mohla psát palců 508 00:31:02,150 --> 00:31:04,860 Podívejte se na tento příklad zde, což je jen C kód 509 00:31:04,860 --> 00:31:07,920 , který má funkci hlavního dole, že vyvolá funkci foo, 510 00:31:07,920 --> 00:31:12,100 a co je kolem, aby foo? [Student] jediný argument. 511 00:31:12,100 --> 00:31:15,660 >> Single argument. Takže argv [1], což znamená, že na první slovo uživatel zadaný 512 00:31:15,660 --> 00:31:19,150 na příkazovém řádku po a.out nebo cokoliv jiného, ​​se nazývá program. 513 00:31:19,150 --> 00:31:24,920 Takže foo, v horní části, má v char *, ale char * je přesně to, co? 514 00:31:24,920 --> 00:31:28,860 String. Tam je nic nového, a že řetězec je libovolně se nazývá bar. 515 00:31:28,860 --> 00:31:36,090 V tomto řádku zde, char c [12], v druhu semi-technické angličtiny, co se tento řádek dělá? 516 00:31:36,090 --> 00:31:40,640 Array of -? Postavy. Dej mi řadu 12 znaků. 517 00:31:40,640 --> 00:31:44,970 Tak bychom mohli nazvat tento vyrovnávací paměti. Je to odborně nazývá c, ale vyrovnávací paměť v programování 518 00:31:44,970 --> 00:31:47,890 jen znamená spoustu místa, které si můžete dát nějaké věci dovnitř 519 00:31:47,890 --> 00:31:49,940 >> Pak konečně, memcpy, jsme to používali dříve. 520 00:31:49,940 --> 00:31:52,380 Ale asi tušíte, co to dělá. Je to kopie paměti. 521 00:31:52,380 --> 00:31:58,790 Co to dělá? No, to zřejmě zkopíruje bar, jeho vstup, do c, 522 00:31:58,790 --> 00:32:03,420 ale pouze do délky pruhu. 523 00:32:03,420 --> 00:32:07,440 Ale je tu chyba tady. 524 00:32:07,440 --> 00:32:14,500 Dobře, takže technicky bychom měli opravdu strlen (bar) x sizeof (char), to je pravda. 525 00:32:14,500 --> 00:32:17,920 Ale v nejhorším případě tady, pojďme předpokládat, že to je - tak, v pořádku. 526 00:32:17,920 --> 00:32:23,760 Pak je tu 2 chyby. Takže sizeof (char), v pořádku, pojďme udělat to trochu širší. 527 00:32:23,760 --> 00:32:28,860 Takže teď je tu stále chyba, která je co? 528 00:32:28,860 --> 00:32:31,630 [Student odpověď, nesrozumitelné] >> Ověřit za co? Dobře, takže bychom měli být kontrola 529 00:32:31,630 --> 00:32:35,010 pro NULL, protože špatné věci se stávají, když ukazatel myši je NULL, 530 00:32:35,010 --> 00:32:38,490 Vzhledem k tomu, které by vás mohly skončit jít tam, a neměli byste nikdy jít na NULL 531 00:32:38,490 --> 00:32:40,890 od dereferencing s operátoru *. 532 00:32:40,890 --> 00:32:45,250 Tak to je dobré, a co jiného děláme? Logicky je to chyba i zde. 533 00:32:45,250 --> 00:32:47,650 [Student odpověď, nesrozumitelným] 534 00:32:47,650 --> 00:32:51,340 Takže >> zkontrolovat, zda argc ≥ 2? 535 00:32:51,340 --> 00:32:54,130 Dobře, tak tam je to 3 chyby v tomto programu zde. 536 00:32:54,130 --> 00:33:00,080 Nejsme kontrolovat, zda uživatel skutečně zadali něco do argv [1], dobré. 537 00:33:00,080 --> 00:33:02,240 Takže to, co je třetí chyba? Jo? 538 00:33:02,240 --> 00:33:04,420 [Student odpověď, nesrozumitelné] >> Good. 539 00:33:04,420 --> 00:33:09,590 Takže jsme prověřili jeden scénář. My implicitně kontrolovat nekopírujte více paměti 540 00:33:09,590 --> 00:33:12,800 než by přesáhnout délku tyče. 541 00:33:12,800 --> 00:33:15,720 Takže pokud řetězec uživatel zadali, je 10 znaků, 542 00:33:15,720 --> 00:33:18,260 to říká, "jen zkopírovat 10 znaků." 543 00:33:18,260 --> 00:33:21,140 A to je v pořádku, ale co v případě, že uživatel napsal ve slově na příkazovém řádku 544 00:33:21,140 --> 00:33:29,360 jako 20 znaků slova, to je, řekl kopírování 20 znaků z baru do čeho? 545 00:33:29,360 --> 00:33:32,840 c, jinak známá jako náš pufru, což znamená, že právě napsal dat 546 00:33:32,840 --> 00:33:35,950 na 8 byte místa, která jste nevlastníte, 547 00:33:35,950 --> 00:33:38,320 a nemáte vlastní je v tom smyslu, že jste nikdy přidělené jim. 548 00:33:38,320 --> 00:33:41,190 Tak tohle je to, co je všeobecně známo jako útok přetečení vyrovnávací paměti, 549 00:33:41,190 --> 00:33:46,650 nebo přetečení vyrovnávací paměti útok, a je to útok v tom smyslu, že v případě, že uživatel 550 00:33:46,650 --> 00:33:50,650 nebo program, který volá své funkce dělá to ve zlém úmyslu, 551 00:33:50,650 --> 00:33:53,780 co se vlastně bude dít dál by mohlo být docela špatné. 552 00:33:53,780 --> 00:33:55,690 >> Pojďme se podívat na tento obrázek zde. 553 00:33:55,690 --> 00:33:59,070 Tento obrázek představuje svůj stack paměti. 554 00:33:59,070 --> 00:34:01,050 A připomněl, že pokaždé, když volání funkce, 555 00:34:01,050 --> 00:34:04,520 získáte tento malý rámeček na zásobníku a pak další a pak další a pak další. 556 00:34:04,520 --> 00:34:07,250 A tak daleko jsme to prostě odebrané nich pryč jako obdélníky 557 00:34:07,250 --> 00:34:09,380 buď tam na tabuli nebo na obrazovce zde. 558 00:34:09,380 --> 00:34:12,219 Ale když se přiblížíte na jednom z těchto obdélníků, 559 00:34:12,219 --> 00:34:16,460 Při volání funkce foo, ukázalo se, že je tu více na zásobníku 560 00:34:16,460 --> 00:34:18,739 uvnitř tohoto rámu a tento obdélník 561 00:34:18,739 --> 00:34:23,370 než jen x a y a a b, stejně jako jsme se mluvit o swapu. 562 00:34:23,370 --> 00:34:25,949 Ukazuje se, že tam jsou některé nižší úrovně podrobnosti, 563 00:34:25,949 --> 00:34:27,780 mezi nimi vrátí adresu. 564 00:34:27,780 --> 00:34:33,020 Tak to dopadá, když hlavní volá foo, hlavní je informovat foo 565 00:34:33,020 --> 00:34:36,760 Jaké hlavní je adresa v paměti počítače. 566 00:34:36,760 --> 00:34:40,659 Vzhledem k tomu, jinak, jakmile foo se provádí provedení, jak je v tomto případě zde, 567 00:34:40,659 --> 00:34:43,790 jakmile se dostanete tuto úzkou složená závorka na konci foo, 568 00:34:43,790 --> 00:34:48,860 Jak se to sakra se foo vědět, kde je ovládání programu má jít? 569 00:34:48,860 --> 00:34:52,460 Ukazuje se, že odpověď na tuto otázku, je v tomto červeném obdélníku zde. 570 00:34:52,460 --> 00:34:56,130 To představuje ukazatel, a to až do počítače k ​​uložení, dočasně, 571 00:34:56,130 --> 00:35:00,250 na tzv. zásobníku je adresa hlavní tak, že jakmile foo udělat provádění, 572 00:35:00,250 --> 00:35:04,110 počítač ví, kde a co řádek v hlavní vrátit do. 573 00:35:04,110 --> 00:35:06,900 Uloženo frame pointer týká podobně to. 574 00:35:06,900 --> 00:35:09,620 Char * bar zde představuje, co? 575 00:35:09,620 --> 00:35:14,740 No, teď to modrá část je zde foo je rám, co je bar? 576 00:35:14,740 --> 00:35:18,300 Dobře, tak bar je jen argument k funkci foo. 577 00:35:18,300 --> 00:35:20,720 >> Takže teď jsme zpátky u známého obrázku. 578 00:35:20,720 --> 00:35:22,960 Je tu další věci, a další rozptýlení na obrazovce 579 00:35:22,960 --> 00:35:27,490 ale to světle modrá část je to, co jsme byli kreslení na tabuli něco jako swap. 580 00:35:27,490 --> 00:35:31,890 To je rámec pro foo a jediná věc v tom teď je bar, 581 00:35:31,890 --> 00:35:34,630 který je tento parametr. 582 00:35:34,630 --> 00:35:39,840 Ale co jiného by měl být v zásobníku, podle tohoto kódu zde? 583 00:35:39,840 --> 00:35:44,280 Char c [12]. Takže bychom měli vidět také 12 čtverců paměti, 584 00:35:44,280 --> 00:35:46,260 přidělené proměnné s názvem c. 585 00:35:46,260 --> 00:35:48,340 A skutečně máme, že na obrazovce. 586 00:35:48,340 --> 00:35:51,650 Samém vrcholu je c [0], a poté autor tohoto schématu 587 00:35:51,650 --> 00:35:55,130 nevadilo čerpání všech čtverců, ale je skutečně 12 tam 588 00:35:55,130 --> 00:36:00,120 protože když se podíváte na pravém dolním rohu, c [11], pokud budete počítat od 0, je 12 takových bytů. 589 00:36:00,120 --> 00:36:06,190 Ale tady je problém: V jakém směru je c roste? 590 00:36:06,190 --> 00:36:10,390 Druh shora dolů, ne? Pokud se začíná na vrcholu a roste až na dno, 591 00:36:10,390 --> 00:36:13,480 nevypadá to, že jsme opustili sami moc dráhu tady vůbec. 592 00:36:13,480 --> 00:36:15,320 Jsme trochu maloval sebe do kouta, 593 00:36:15,320 --> 00:36:20,210 a že c [11] je správná proti baru, který je přímo proti ukazatel zásobníku rámu, 594 00:36:20,210 --> 00:36:23,800 která je přímo proti zpáteční adresu, tam to není místo. 595 00:36:23,800 --> 00:36:26,100 Takže to, co je důsledek, pak, pokud jste zpackat, 596 00:36:26,100 --> 00:36:30,460 a zkuste si přečíst 20 bajtů do 12-byte paměti? 597 00:36:30,460 --> 00:36:33,460 Pokud jsou tyto 8 dalších bytů jít? 598 00:36:33,460 --> 00:36:36,370 Uvnitř všechno ostatní, z nichž některé jsou super důležité. 599 00:36:36,370 --> 00:36:40,480 A to nejdůležitější, potenciálně, je červený rámeček tam, zpáteční adresa. 600 00:36:40,480 --> 00:36:44,720 Protože předpokládám, že jste buď náhodně, nebo adversarially 601 00:36:44,720 --> 00:36:48,040 přepište tyto 4 byty, který ukazatel adresu, 602 00:36:48,040 --> 00:36:53,190 nejen s odpadky, ale s číslem, které se stane představují skutečnou adresu v paměti? 603 00:36:53,190 --> 00:36:55,930 Co je implicaiton, logicky? 604 00:36:55,930 --> 00:36:59,080 [Student odpovědi, nesrozumitelné] >> Přesně tak. Při foo vrátí 605 00:36:59,080 --> 00:37:03,560 a hity, které rovnátka kudrnaté, program bude pokračovat nebude pro návrat na hlavní, 606 00:37:03,560 --> 00:37:08,320 to bude návrat na cokoliv adresa je v tomto červeném poli. 607 00:37:08,320 --> 00:37:11,560 >> Nyní, v případě, že obešly softwaru registraci, 608 00:37:11,560 --> 00:37:14,400 co je adresa, která je momentálně vrátil do funkce je 609 00:37:14,400 --> 00:37:18,820 , které se obvykle volána poté, co jste zaplatili za software a zadali vaše registrační kód? 610 00:37:18,820 --> 00:37:23,160 Dalo by se nějak trik počítače do nebudete tady, ale místo toho, jde tady. 611 00:37:23,160 --> 00:37:27,950 Nebo, pokud jste opravdu chytrý, může protivník skutečně zadejte na klávesnici, 612 00:37:27,950 --> 00:37:32,500 Například, není skutečné slovo, ne 20 znaků, ale předpokládám, on nebo ona 613 00:37:32,500 --> 00:37:36,200 Typy některých znaků, které představují kód? 614 00:37:36,200 --> 00:37:38,860 A to nebude C kód, to bude znaky 615 00:37:38,860 --> 00:37:42,920 které představují kódy binární stroje, 0 a 1 je. 616 00:37:42,920 --> 00:37:46,740 Ale předpokládám, že to dost chytrý, aby to udělal, nějak vložit do GetString řádku 617 00:37:46,740 --> 00:37:49,460 něco, co je v podstatě sestaven kód, 618 00:37:49,460 --> 00:37:56,900 a poslední 4 bajty přepsat návratovou adresu, a jakou adresu to, že vstup dělat? 619 00:37:56,900 --> 00:38:01,860 To ukládá v tomto červeném obdélníku adresu prvního bajtu pufru. 620 00:38:01,860 --> 00:38:04,270 Takže budete muset být opravdu chytrý, a to je hodně pokusů a omylů 621 00:38:04,270 --> 00:38:08,500 pro špatné lidi tam venku, ale pokud můžete zjistit, jak velké je toto buffer, 622 00:38:08,500 --> 00:38:12,170 takové, že v posledních několika bytů na vstupu, které poskytují k programu 623 00:38:12,170 --> 00:38:15,970 stalo, že se rovná adresu začátku vašeho pufru, 624 00:38:15,970 --> 00:38:22,270 můžete to udělat. Pokud řekneme, normálně, ahoj, a \ 0, to je to, co skončí ve vyrovnávací paměti. 625 00:38:22,270 --> 00:38:27,860 Ale pokud jsme chytřejší, a naplníme, že vyrovnávací paměť s tím, co budeme obecně říkat útoku kód, 626 00:38:27,860 --> 00:38:31,920 ,,,: Attack, útok, útok, útok, kde je to prostě něco, co dělá něco špatného. 627 00:38:31,920 --> 00:38:35,190 No, co se stane, pokud jste opravdu chytří, můžete udělat toto: 628 00:38:35,190 --> 00:38:41,740 V červeném poli zde je sekvence čísel: 80, CO, 35, 08. 629 00:38:41,740 --> 00:38:44,890 Všimněte si, že odpovídá číslo, které je tady. 630 00:38:44,890 --> 00:38:47,280 Je to v obráceném pořadí, ale o tom až někdy jindy. 631 00:38:47,280 --> 00:38:51,430 Všimněte si, že tato zpáteční adresa byla úmyslně změněn 632 00:38:51,430 --> 00:38:54,970 rovnat adresu sem, není adresa main. 633 00:38:54,970 --> 00:39:00,170 Takže pokud ten špatný je super chytrý, on nebo ona bude zahrnovat v tomto útoku kódu 634 00:39:00,170 --> 00:39:02,890 něco jako, "Smazat všechny soubory uživatele." 635 00:39:02,890 --> 00:39:06,320 Nebo "Kopírovat hesla," nebo "Vytvořit uživatelský účet, který mohu přihlásit do." 636 00:39:06,320 --> 00:39:10,130 Cokoli, a to je i nebezpečí a moc C. 637 00:39:10,130 --> 00:39:12,900 Vzhledem k tomu, že máte přístup k paměti prostřednictvím ukazatele 638 00:39:12,900 --> 00:39:15,950 a můžete tedy napsat cokoliv, co chcete do paměti počítače. 639 00:39:15,950 --> 00:39:19,290 Můžete si vytvořit počítač dělat, co chcete jednoduše tím, 640 00:39:19,290 --> 00:39:22,780 co to skákat kolem uvnitř své vlastní paměti. 641 00:39:22,780 --> 00:39:27,230 A tak, až do dnešního dne, a tak mnoho programů a tolik internetové stránky, které jsou napadené 642 00:39:27,230 --> 00:39:29,730 redukuje na lidi, kteří se výhody této. 643 00:39:29,730 --> 00:39:32,510 A to může zdát jako super-sofistikovaný útok, 644 00:39:32,510 --> 00:39:34,220 ale to není vždy začít takhle. 645 00:39:34,220 --> 00:39:36,770 >> Skutečností je, že to, co špatní lidé obvykle udělat, je, 646 00:39:36,770 --> 00:39:41,470 ať už je to program v příkazovém řádku nebo program, GUI nebo webové stránky, 647 00:39:41,470 --> 00:39:43,290 je prostě začít poskytovat nesmysly. 648 00:39:43,290 --> 00:39:46,940 Zadáte v opravdu velkém slovo do vyhledávacího pole a stiskněte klávesu Enter, 649 00:39:46,940 --> 00:39:49,030 a počkat, jestli se stránky havaruje. 650 00:39:49,030 --> 00:39:53,270 Nebo budete čekat, zda se program projeví nějakou chybovou zprávu. 651 00:39:53,270 --> 00:39:55,480 Protože pokud budete mít štěstí, jak špatný člověk, 652 00:39:55,480 --> 00:39:59,610 a poskytnout nějaké šílené vstup, který havaruje program, 653 00:39:59,610 --> 00:40:02,280 to znamená, že programátor nečekali jste špatné chování 654 00:40:02,280 --> 00:40:05,420 což znamená, že můžete pravděpodobně, s dostatkem úsilí, 655 00:40:05,420 --> 00:40:09,870 dost pokusů a omylů, přijít na to, jak vést přesnější útok. 656 00:40:09,870 --> 00:40:15,900 Tak jako tak součástí zabezpečení není jen vyhnout těmto útokům úplně, ale odhalením 657 00:40:15,900 --> 00:40:20,250 a vlastně se dívat na polena a vidět, co bláznivé vstupy mají lidé zadali do své webové stránky. 658 00:40:20,250 --> 00:40:26,040 Jaké vyhledávací termíny jsou lidi napsali do svých webových stránek v naději, že přetékající nějaký buffer? 659 00:40:26,040 --> 00:40:28,900 A to všechno se scvrkává na jednoduchých základech toho, co je pole, 660 00:40:28,900 --> 00:40:32,510 a co to znamená pro přidělování a využívání paměť? 661 00:40:32,510 --> 00:40:34,920 A ve vztahu k, i, je to. 662 00:40:34,920 --> 00:40:37,520 >> Takže řekněme, podíval uvnitř pevného disku ještě jednou. 663 00:40:37,520 --> 00:40:40,190 Takže si vzpomenete z týden nebo dva před, že při přetahování souborů 664 00:40:40,190 --> 00:40:45,470 s vašimi recycle bin, nebo trash can, co se stane? 665 00:40:45,470 --> 00:40:47,850 [Student] Nothing. Jo >>, absolutně nic. Nakonec, pokud se dostanete nízké 666 00:40:47,850 --> 00:40:51,370 místa na disku, bude systém Windows nebo Mac OS začít mazat soubory pro vás. 667 00:40:51,370 --> 00:40:53,670 Ale pokud přetáhnete něco tam, pak to není vůbec bezpečné. 668 00:40:53,670 --> 00:40:56,550 Všechny vaše spolubydlící, přítel nebo člen rodiny musí udělat, je dvakrát klikněte, a voila. 669 00:40:56,550 --> 00:40:59,720 Je tu všechny útržkovité soubory, které jste se pokusili odstranit. 670 00:40:59,720 --> 00:41:02,840 Takže většina z nás alespoň vím, že máte pravým tlačítkem myši nebo regulace kliknutím 671 00:41:02,840 --> 00:41:05,320 a prázdné popelnice, nebo něco takového. 672 00:41:05,320 --> 00:41:07,900 Ale i pak, že není úplně stačit. 673 00:41:07,900 --> 00:41:11,340 Protože to, co se stane, když máte soubor na pevném disku 674 00:41:11,340 --> 00:41:14,590 že reprezentuje nějaký dokument ve Wordu, nebo nějakou JPEG? 675 00:41:14,590 --> 00:41:18,820 A to představuje pevný disk, a řekněme, že tento kousek zde představuje tento soubor, 676 00:41:18,820 --> 00:41:21,640 a to je složeno z celé spoustu 0 a 1 je. 677 00:41:21,640 --> 00:41:25,470 Co se stane, když se nejen přetáhnout tento soubor do koše nebo Koš, 678 00:41:25,470 --> 00:41:30,390 ale také vyprázdnit? 679 00:41:30,390 --> 00:41:32,820 Seřadit z ničeho. Není to vůbec nic teď. 680 00:41:32,820 --> 00:41:37,630 Teď je to prostě nic, protože málo se něco stane v podobě této tabulky. 681 00:41:37,630 --> 00:41:41,170 Takže tam je nějaký druh databáze nebo tabulky uvnitř paměti počítače 682 00:41:41,170 --> 00:41:44,470 že v podstatě má 1 sloupec pro názvy souborů, 683 00:41:44,470 --> 00:41:50,550 a 1 sloupec pro umístění souboru, kde by to mohlo být zařazení 123, jen náhodné číslo. 684 00:41:50,550 --> 00:41:58,270 Takže bychom mohli mít něco jako x.jpg, a umístění 123. 685 00:41:58,270 --> 00:42:02,870 A co se stane pak, když se vyprázdnit své odpadky? 686 00:42:02,870 --> 00:42:06,720 To zmizí. Ale co nezmizí, je 0 a 1 je. 687 00:42:06,720 --> 00:42:09,690 >> Takže to, co je, a pak, připojení k PSet 4? 688 00:42:09,690 --> 00:42:13,460 No, s PSet 4, jen proto, že jsme omylem smazány 689 00:42:13,460 --> 00:42:15,890 Compact Flash karta, která měla všechny tyhle fotky, 690 00:42:15,890 --> 00:42:18,710 nebo jen proto, že smůla stal poškozen, 691 00:42:18,710 --> 00:42:21,170 neznamená, že 0 a 1 je není tam ještě. 692 00:42:21,170 --> 00:42:23,920 Možná některé z nich jsou ztraceny, protože něco dostal poškozen 693 00:42:23,920 --> 00:42:26,530 v tom smyslu, že některé 0 je stal 1 a 1 letech se stal 0 let. 694 00:42:26,530 --> 00:42:30,460 Špatné věci se může stát, protože buggy software nebo vadný hardware. 695 00:42:30,460 --> 00:42:33,510 Ale mnozí z těch kousků, možná i 100% z nich jsou stále tam, 696 00:42:33,510 --> 00:42:38,330 je to jen, že je počítač nebo fotoaparát neví, kde JPEG 1 začalo 697 00:42:38,330 --> 00:42:41,660 a tam, kde JPEG 2 začal, ale pokud budete, programátor, 698 00:42:41,660 --> 00:42:45,800 Víte, s trochou znalostmi, pokud tyto soubory JPEG jsou nebo jak vypadají, 699 00:42:45,800 --> 00:42:49,570 můžete analyzovat 0 a 1 je a řekl, "Ooh. JPEG. Ooh, JPEG. " 700 00:42:49,570 --> 00:42:52,830 Můžete napsat program s v podstatě jen pro nebo while 701 00:42:52,830 --> 00:42:56,100 , který využívá každý a každý jeden z těchto souborů. 702 00:42:56,100 --> 00:42:59,360 Takže poučení pak, je začít "bezpečně" mazání souborů 703 00:42:59,360 --> 00:43:01,720 pokud byste chtěli, aby se zabránilo to úplně. Ano? 704 00:43:01,720 --> 00:43:06,940 [Student otázka, nesrozumitelným] 705 00:43:06,940 --> 00:43:11,150 Už >> více paměti, než dřív a - 706 00:43:11,150 --> 00:43:14,790 Oh! Dobrá otázka. Tak proč, a pak, po vyprázdnění koše, 707 00:43:14,790 --> 00:43:18,300 se počítač vám říct, že máte více volného místa, než jste dělali předtím? 708 00:43:18,300 --> 00:43:22,450 Stručně řečeno, protože lže. Více technicky, máte více prostoru. 709 00:43:22,450 --> 00:43:26,720 Protože teď jste řekl, můžete si dát další věci, kde tento soubor byl kdysi, 710 00:43:26,720 --> 00:43:28,930 ale to neznamená, že bity jdou pryč, 711 00:43:28,930 --> 00:43:33,070 a že neznamená bity jsou změní všechny 0 je, například, pro ochranu. 712 00:43:33,070 --> 00:43:37,520 Naopak, pokud jste "bezpečně" vymazat soubory, nebo fyzicky zničit zařízení, 713 00:43:37,520 --> 00:43:40,810 to je opravdu jediný způsob, někdy kolem toho. 714 00:43:40,810 --> 00:43:45,300 Tak proč bychom odjet na tomto semi-strašidelné poznámky, a uvidíme se v pondělí. 715 00:43:45,300 --> 00:43:52,810 CS50.TV