1 00:00:00,000 --> 00:00:02,760 [Powered by Google Translate] [TÝŽDEŇ 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] Klame, o tom, čo, ja neviem. 5 00:00:17,780 --> 00:00:20,300 [Muž] Tak čo vieme? 6 00:00:20,300 --> 00:00:24,120 [Žena] To v 9:15, Ray Santoya bol pri bankomate. 7 00:00:24,120 --> 00:00:27,420 [Muž] Takže otázka je, čo sa robí v 9:16? 8 00:00:27,420 --> 00:00:29,980 [Žena] Streľba 9 mm na niečo. 9 00:00:29,980 --> 00:00:31,900 Možno videl ostreľovača. 10 00:00:31,900 --> 00:00:34,000 [Muž] Alebo bol s ním pracovať. 11 00:00:34,000 --> 00:00:36,330 [Žena] počkaj. Vráťte sa jeden. 12 00:00:36,330 --> 00:00:38,330 [Muž] Čo vidíš? 13 00:00:38,330 --> 00:00:44,520 [♫ napínavý music ♫] 14 00:00:44,520 --> 00:00:48,320 [Žena] Prineste mu lícom nahor. Celá obrazovka. 15 00:00:48,320 --> 00:00:51,230 [Man] Jeho okuliare. >> 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 ich logo. 18 00:01:03,580 --> 00:01:07,790 [Žena] A hovorí na toho, kto má na sebe tú bundu. 19 00:01:07,790 --> 00:01:13,730 >> [David Malan] Tak, toto je CS50 týždeň 5, a dnes sme zničiť trochu o televíziu a film pre vás. 20 00:01:13,730 --> 00:01:16,170 Takže zakaždým, keď sledujete reláciu, ako je tento tu, 21 00:01:16,170 --> 00:01:19,910 a policajti hovoria "Môžete vyčistiť, že sa deje?" alebo "vylepšenia," 22 00:01:19,910 --> 00:01:21,900 nie je zvýšiť v reálnom svete. 23 00:01:21,900 --> 00:01:25,220 V skutočnosti to, čo naozaj dostanete, je trochu niečo ako toto. 24 00:01:25,220 --> 00:01:27,570 Ja som vytiahol jeden z pracovníkov fotografií z stránke. 25 00:01:27,570 --> 00:01:30,980 Toto je program s názvom Photoshop. To je 1 z 2 Bowdeny, 26 00:01:30,980 --> 00:01:36,300 Pre 1 z 3 Bowdeny vlastne, dnes, pretože máme pani bowden aj tu, s Robom a Pavla. 27 00:01:36,300 --> 00:01:41,950 Ale tu je Rob na obrazovke, a ak sa zoom na uvedenom lesk vždy mal v očiach, 28 00:01:41,950 --> 00:01:47,600 to, čo skutočne vidieť, že to, čo vidíte, je to, čo dostanete. 29 00:01:47,600 --> 00:01:51,690 Toto je "lepšia," takže "CSI" si to trochu zle. 30 00:01:51,690 --> 00:01:55,190 Je tu ešte jedna klip, ak si môžeme vybrať na "CSI" len trochu dlhšie. 31 00:01:55,190 --> 00:01:58,500 Tento je pekný výraz vysloviť ďalej, ak chcete 32 00:01:58,500 --> 00:02:10,280 riadne technické so svojimi priateľmi, keď naozaj, hovoríš vôbec nič. 33 00:02:10,280 --> 00:02:12,970 >> [Muž] Celé týždne som vyšetroval taxikár Killer vraždy 34 00:02:12,970 --> 00:02:15,360 s určitou morbídne fascináciou. 35 00:02:15,360 --> 00:02:17,160 [Žena # 1] To je v reálnom čase. 36 00:02:17,160 --> 00:02:22,930 [Woman # 2] Budem vytvoriť grafické užívateľské rozhranie pomocou jazyka Visual Basic, uvidíme, či môžete sledovať IP adresy. 37 00:02:22,930 --> 00:02:29,570 >> [Malan] Tak audio out of sync stranou, vytváranie GUI rozhraní pomocou jazyka Visual Basic 38 00:02:29,570 --> 00:02:31,820 sledovať IP adresy je úplný nezmysel. 39 00:02:31,820 --> 00:02:33,840 V týchto dňoch by ste sa použiť Visual Basic, 40 00:02:33,840 --> 00:02:38,920 nie je potreba GUI, a IP adresa bola technicky presný termín. 41 00:02:38,920 --> 00:02:41,730 Takže dávať pozor na to, a jeden z mojich obľúbených: 42 00:02:41,730 --> 00:02:45,070 Toto je trochu tajomný, pretože musíte vedieť, iný jazyk. 43 00:02:45,070 --> 00:02:47,860 Tam je jazyk tzv Objective-C, ktorý je nadmnožinou C. 44 00:02:47,860 --> 00:02:51,960 Čo znamená, že je C plus niektoré ďalšie funkcie, medzi nimi objektovo orientované programovanie. 45 00:02:51,960 --> 00:02:55,070 A to je jazyk, ktorý Apple popularizoval pre programovanie iOS. 46 00:02:55,070 --> 00:02:58,760 A tak tu je klip z iného prehliadky dohromady, z "čísla," 47 00:02:58,760 --> 00:03:02,450 , Že ak skutočne pozriete pozorne na TiVo a pauzy v pravú chvíľu, 48 00:03:02,450 --> 00:03:07,700 uvidíte, že to, čo hľadajú na nie je to, čo je popisované. 49 00:03:07,700 --> 00:03:11,170 A skúsim iný audio konektor sem a uvidíme, či nemôžeme 50 00:03:11,170 --> 00:03:13,780 udržať zvuk v synchronizáciu tentoraz. 51 00:03:13,780 --> 00:03:20,530 Dávam 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 siete. Je to Anita je privátna sieť. 54 00:03:38,930 --> 00:03:43,810 [Malan] Dobre. To je Objective-C, a to je pre niektoré detský sfarbenie programu, 55 00:03:43,810 --> 00:03:51,140 ako môžete snáď odvodiť z názvu premennej tam. 56 00:03:51,140 --> 00:03:54,410 Tak, že potom bol "Čísla." Takže dnes a tento týždeň sme sa predstaviť 57 00:03:54,410 --> 00:03:57,740 trochu zo sveta forenznej a kontext v problematike preto. 58 00:03:57,740 --> 00:04:00,590 Dnes bude skrátený prednáška, pretože tam je zvláštne udalosť tu 59 00:04:00,590 --> 00:04:05,530 potom, takže budeme sa pozrieť, a dráždiť obaja študentov aj ich rodičia dnes 60 00:04:05,530 --> 00:04:07,420 s niektorými z vecí, ktoré sú na obzore. 61 00:04:07,420 --> 00:04:12,240 Medzi nimi, v pondelok, budete mať niekoľko ďalších spolužiakov. 62 00:04:12,240 --> 00:04:16,050 EDX, Harvard a MIT nových on-line iniciatíva pre otvorený výukový 63 00:04:16,050 --> 00:04:19,120 a viac, je spustenie na akademickej pôde Harvarde v pondelok. 64 00:04:19,120 --> 00:04:21,490 Čo znamená, že príde pondelok sa bude mať - ako posledný počtu, 65 00:04:21,490 --> 00:04:26,210 86000 ďalší spolužiaci budú sledovať spolu s prednáškami CS50 tieto 66 00:04:26,210 --> 00:04:29,170 a oddiely a návody a problém súpravy. 67 00:04:29,170 --> 00:04:32,350 A ako súčasť tohto, stanete sa členmi inauguračnej triedy 68 00:04:32,350 --> 00:04:35,090 CS50 a teraz CS50x. 69 00:04:35,090 --> 00:04:39,310 >> V rámci tohto, teraz si uvedomiť, že dôjde k určitým upsides rovnako. 70 00:04:39,310 --> 00:04:43,790 Ak chcete získať pripravený na to, pre masívne počet študentov, 71 00:04:43,790 --> 00:04:47,180 stačí povedať, že aj keď máme 108 TFS a CAS, 72 00:04:47,180 --> 00:04:50,790 nie je úplne najlepší študent / učiteľ pomer, akonáhle sa dostaneme 80.000 ďalšími študentmi. 73 00:04:50,790 --> 00:04:52,850 Takže my nebudeme sa triedenie toľko problém nastavuje ručne. 74 00:04:52,850 --> 00:04:55,920 Takže predstavil tento týždeň v problémovej sady budú CS50 Check, 75 00:04:55,920 --> 00:04:58,450 ktorý bude príkazového riadku v zariadení 76 00:04:58,450 --> 00:05:01,200 že budete mať po aktualizácii neskôr tento víkend, 77 00:05:01,200 --> 00:05:03,200 a budete môcť spustiť príkaz, skontrolovať 50, 78 00:05:03,200 --> 00:05:06,500 na vlastné PSet, a dostanete nejakú spätnú väzbu o tom, či je váš program 79 00:05:06,500 --> 00:05:11,160 správne alebo nesprávne podľa rôznych konštrukčných špecifikácií, ktoré sme stanovili. 80 00:05:11,160 --> 00:05:13,580 Takže o tom viac a problém set špecifikácie a 81 00:05:13,580 --> 00:05:17,240 sa CS50x spolužiaci budú používať to rovnako. 82 00:05:17,240 --> 00:05:19,230 >> Takže problém set 4 je všetko o kriminalistike. 83 00:05:19,230 --> 00:05:21,940 A tento kúsok bol inšpirovaný nejakým reálnom živote veci, 84 00:05:21,940 --> 00:05:24,620 pričom, keď som bol v postgraduálnom štúdiu, som internovaný na chvíľu sa 85 00:05:24,620 --> 00:05:28,650 na Middlesex County je okresné zastupiteľstvo robí forenznej prácu 86 00:05:28,650 --> 00:05:31,650 s ich hlavnou forenznú vyšetrovateľ, a čo to robil 87 00:05:31,650 --> 00:05:35,260 je, myslím, že som sa zmienil niektoré poznatky týždeň minulosť, je Mass Štátna polícia alebo iných 88 00:05:35,260 --> 00:05:39,000 by prísť, by odídu veci ako pevné disky a CD a diskety 89 00:05:39,000 --> 00:05:42,340 a podobne, a potom sa cieľom forenznej obdobie bolo zistiť, či 90 00:05:42,340 --> 00:05:44,600 tam bol alebo nebol dôkaz nejakého druhu. 91 00:05:44,600 --> 00:05:48,010 To bolo zvláštne Oddelenie pre vyšetrovanie, tak to bolo úradnícky zločin, 92 00:05:48,010 --> 00:05:52,350 to bolo viac znepokojujúce druh trestnej činnosti, 93 00:05:52,350 --> 00:05:55,990 nič zahŕňajúce nejaký digitálnych médií, ukazuje sa, že nie, že mnoho ľudí 94 00:05:55,990 --> 00:05:59,370 napísať e-mail, "som to urobil." 95 00:05:59,370 --> 00:06:03,290 Takže často sú tieto forenznej vyhľadávania neobjavil všade toľko ovocia, 96 00:06:03,290 --> 00:06:05,850 ale niekedy ľudia by písať také e-maily. 97 00:06:05,850 --> 00:06:08,490 Takže niekedy snaha bola odmenená. 98 00:06:08,490 --> 00:06:14,420 >> Ale viesť až k tomuto forenznú PSet, budeme zavádzať na PSet 4 bit grafiky. 99 00:06:14,420 --> 00:06:18,260 Takže pravdepodobne vziať tieto veci ako samozrejmosť, JPEG, GIF a ako v týchto dňoch, 100 00:06:18,260 --> 00:06:21,640 ale ak si naozaj myslíte, že o tom, obraz, podobne ako tvár Rob, 101 00:06:21,640 --> 00:06:24,430 môže byť modelovaný ako sled bodiek, alebo pixeloch. 102 00:06:24,430 --> 00:06:26,680 Teraz, v prípade tváre Robertov, je tu všetky druhy farieb, 103 00:06:26,680 --> 00:06:29,940 a začali sme vidieť jednotlivé body, otherwide známe ako obrazové body, 104 00:06:29,940 --> 00:06:31,610 akonáhle sme začali pre priblíženie 105 00:06:31,610 --> 00:06:35,590 Ale ak budeme zjednodušovať svet o trochu, a jednoducho povedať, že toto je Rob 106 00:06:35,590 --> 00:06:40,560 v čiernej a bielej, dobre, k reprezentácii čiernej a bielej sa môžeme len použiť binárne. 107 00:06:40,560 --> 00:06:44,960 A ak budeme používať binárne, 1 alebo 0, môžeme vyjadriť rovnaký obrázok 108 00:06:44,960 --> 00:06:51,970 usmievavá tvár Robertov s týmto vzorom bitov: 11000011 predstavuje 109 00:06:51,970 --> 00:06:55,160 biela, biela, čierna, čierna, čierna, čierna, biela. 110 00:06:55,160 --> 00:06:59,290 A tak to nie je obrovský skok, potom začať hovoriť o farebných fotografiách. 111 00:06:59,290 --> 00:07:01,920 Veci, ktoré by ste vidieť na Facebooku, alebo sa s digitálnym fotoaparátom, 112 00:07:01,920 --> 00:07:04,730 ale iste, pokiaľ ide o farby, budete potrebovať viac bitov. 113 00:07:04,730 --> 00:07:08,470 A celkom bežné vo svete fotografií je použiť nie 1-bitové farby, 114 00:07:08,470 --> 00:07:12,730 , Pretože to naznačuje, ale 24-bitové farby, kam vlastne získať milióny farieb. 115 00:07:12,730 --> 00:07:15,430 Tak ako v prípade, keď sme sa priblížili na oko Rob, 116 00:07:15,430 --> 00:07:19,270 , Ktorý bol ľubovoľný počet miliónov rôznych farebných možností. 117 00:07:19,270 --> 00:07:22,260 >> Takže budeme zavádzať to v probléme sade 4 rovnako ako v návode, 118 00:07:22,260 --> 00:07:27,050 ktorá bude dnes v 03:30 namiesto obvyklých 02:30, pretože prednášky piatkovom tu. 119 00:07:27,050 --> 00:07:29,930 Ale video bude on-line, ako zvyčajne, zajtra. 120 00:07:29,930 --> 00:07:31,880 Budeme tiež predstaví vám do iného formátu. 121 00:07:31,880 --> 00:07:34,150 Tak to je zámerne chcel pozrieť zastrašujúce na prvý, 122 00:07:34,150 --> 00:07:38,980 ale to je len nejaká dokumentácia pre struct C. 123 00:07:38,980 --> 00:07:42,280 Ukazuje sa, že Microsoft pred rokmi, pomohol popularizovať tento formát, 124 00:07:42,280 --> 00:07:46,630 volal bitmapový formát súboru, BMP, a to super-jednoduchý, 125 00:07:46,630 --> 00:07:50,390 farebné grafické formát súboru, ktorý bol použitý na nejakú dobu 126 00:07:50,390 --> 00:07:53,640 a niekedy ešte pre tapety na stolné počítače. 127 00:07:53,640 --> 00:07:57,410 Ak si myslíte, že späť na systém Windows XP a pahorkatiny a modrú oblohu, 128 00:07:57,410 --> 00:08:00,660 to bolo typicky BMP, alebo bitmapový obraz, a bitmapy 129 00:08:00,660 --> 00:08:03,340 sú zábavné pre nás, pretože majú trochu väčšiu komplexnosť. 130 00:08:03,340 --> 00:08:05,640 Nie je to tak jednoduché, ako tento mriežky 0 a 1 je; 131 00:08:05,640 --> 00:08:10,680 miesto, máte veci ako hlavičky na začiatku súboru. 132 00:08:10,680 --> 00:08:15,520 Takže inými slovami, vo vnútri. Súbor BMP je celá partia 0 a 1 je, 133 00:08:15,520 --> 00:08:18,070 ale tam je nejaký ďalší 0 a 1 je tam. 134 00:08:18,070 --> 00:08:21,450 A ukázalo sa, že to, čo sme pravdepodobne zaujatý za samozrejmosť rokov, 135 00:08:21,450 --> 00:08:27,040 formáty súborov, ako. doc alebo. xls alebo. mp3 alebo. mp4, 136 00:08:27,040 --> 00:08:29,910 bez ohľadu na formáty súborov, ktoré ste zvyknutí. 137 00:08:29,910 --> 00:08:31,900 No, čo to vôbec znamená byť formát súboru? 138 00:08:31,900 --> 00:08:35,740 Vzhľadom k tomu, na konci dňa, všetky tieto súbory používame mať len 0 a 1 je 139 00:08:35,740 --> 00:08:39,950 a možno ti 0 a 1 reprezentujú, b, c, a to prostredníctvom ASCII alebo podobne, 140 00:08:39,950 --> 00:08:42,030 ale až do konca dňa, je to len 0 a 1 je. 141 00:08:42,030 --> 00:08:45,300 >> Takže ľudia len občas rozhodnú vymyslieť nový formát súborov 142 00:08:45,300 --> 00:08:49,420 kde štandardizovať čo vzory bitov bude skutočne znamenať. 143 00:08:49,420 --> 00:08:52,790 A v tomto prípade tu, že ľudia, ktorí navrhli bitmapový formát súboru 144 00:08:52,790 --> 00:08:58,260 povedal, že pri prvom bajtu v rastrového súboru, ako ich označil offset 0, tam, 145 00:08:58,260 --> 00:09:02,320 tam to bude nejaký nezrozumiteľné názvy premenné volal bfType, 146 00:09:02,320 --> 00:09:06,510 ktorý práve skratka pre bitmapový typ súboru, aký typ rastrového súboru je. 147 00:09:06,510 --> 00:09:10,780 Môžete usudzovať, snáď, z druhej série, ktorá ofsetovou 2, byte číslo 2, 148 00:09:10,780 --> 00:09:15,980 má vzor 0 a 1 je, že predstavuje to, čo? 149 00:09:15,980 --> 00:09:18,320 Veľkosť niečo, a pokračuje odtiaľ. 150 00:09:18,320 --> 00:09:20,660 Takže problém sade 4, budete prešiel niektoré z týchto vecí. 151 00:09:20,660 --> 00:09:24,480 >> Nebudeme skončiť starať o všetky z nich, ale všimnete, že začína byť zaujímavé 152 00:09:24,480 --> 00:09:30,780 okolo riadku alebo bytového 54, rgbtBlue, zelenej a červenej. 153 00:09:30,780 --> 00:09:35,280 Ak ste niekedy počuli skratku RGB, červená zelená modrá, to je odkaz na to. 154 00:09:35,280 --> 00:09:37,840 Vzhľadom k tomu, že ukáže, že môžete maľovať všetky farby dúhy 155 00:09:37,840 --> 00:09:41,580 s nejakou kombináciu červenej a modrej a zelenej. 156 00:09:41,580 --> 00:09:46,560 A v skutočnosti, môže rodičia v izbe pripomenúť niektoré z prvých projektorov. 157 00:09:46,560 --> 00:09:49,360 V týchto dňoch, stačí vidieť 1 jasné svetlo vychádzajúce z objektívu. 158 00:09:49,360 --> 00:09:52,870 Ale späť v deň, ste mali červené šošovky, modré šošovky, a zelené šošovky 159 00:09:52,870 --> 00:09:56,620 a spoločne sa snažili na obrazovku a tvoril farebné fotografie. 160 00:09:56,620 --> 00:09:59,590 A docela často strednej školy a vysokej školy by mala tie šošovky 161 00:09:59,590 --> 00:10:02,680 niekedy-tak-trochu nakrivo, takže si trochu vidieť dvojité alebo trojité obrázkov, 162 00:10:02,680 --> 00:10:07,500 ale že bol nápad. Vy ste mali červené a zelené a modré svetlo maľovanie obrazu. 163 00:10:07,500 --> 00:10:09,570 A to rovnaký princíp je použitý v počítačoch. 164 00:10:09,570 --> 00:10:12,000 >> Takže medzi problémy, potom pre vás v problému nastavenia 4 165 00:10:12,000 --> 00:10:16,080 sa bude pár vecí, jeden je skutočne zmeniť veľkosť obrazu. 166 00:10:16,080 --> 00:10:18,050 Ak chcete vo vzore 0 a 1 je, 167 00:10:18,050 --> 00:10:22,840 zistiť, ktoré kúsky 0 a 1 reprezentujú to, čo do štruktúry ako je tento, 168 00:10:22,840 --> 00:10:26,800 a potom zistiť, ako sa replikovať pixelov: Reds, blues, Zelení 169 00:10:26,800 --> 00:10:32,460 vnútri tak, že keď obraz vyzerá to spočiatku môže vyzerať toto miesto po tom. 170 00:10:32,460 --> 00:10:35,590 Medzi ďalšie problémy, príliš, bude, že budete odovzdaná 171 00:10:35,590 --> 00:10:38,900 forenznú obraz skutočného súboru z digitálneho fotoaparátu 172 00:10:38,900 --> 00:10:42,410 a na tomto fotoaparáte, kedysi, boli celá partia fotografií. 173 00:10:42,410 --> 00:10:47,030 Problém je, že sme omylom vymazané alebo mal obraz poškodený nejako. 174 00:10:47,030 --> 00:10:51,040 Zlé veci sa stávajú s digitálnymi fotoaparátmi, a tak sme sa rýchlo kopírovať všetky 0 a 1 je 175 00:10:51,040 --> 00:10:55,410 vypnutie tejto karte pre vás, zachránil všetko v 1 veľkom súbore, a potom budeme odovzdávať je na vás 176 00:10:55,410 --> 00:11:00,000 v problému nastaviť 4 tak, že môžete napísať program v C, s ktorými sa späť 177 00:11:00,000 --> 00:11:02,660 všetkých týchto JPEG, ideálne. 178 00:11:02,660 --> 00:11:06,280 A ukázalo sa, že JPEG, aj keď sú trochu zložité formáte, 179 00:11:06,280 --> 00:11:09,580 sú oveľa zložitejšie, než tento usmievavá tvár tu. 180 00:11:09,580 --> 00:11:14,320 Ukazuje sa, že každá JPEG začína rovnakými vzormi 0 a 1 je. 181 00:11:14,320 --> 00:11:18,820 Takže pomocou slučky while alebo pre sláčiky alebo podobné, 182 00:11:18,820 --> 00:11:22,350 môžete určiť iteráciou cez všetky 0 a 1 je v tomto súdnom obrázok 183 00:11:22,350 --> 00:11:26,670 a zakaždým, keď vidíte špeciálny vzor, ​​ktorý je definovaný v problému sete špecifikácie, 184 00:11:26,670 --> 00:11:29,770 môžete predpokladať, "Oh, tu je, s veľmi vysokou pravdepodobnosťou, 185 00:11:29,770 --> 00:11:33,520 začiatok vo formáte JPEG, "a akonáhle zistíte, že rovnaký vzor, 186 00:11:33,520 --> 00:11:36,050 niektoré počet bajtov alebo kilobajtov alebo megabajtovou neskôr, 187 00:11:36,050 --> 00:11:40,550 môžete predpokladať, "Ooh! Tu je druhý JPEG, fotka som sa po prvej. 188 00:11:40,550 --> 00:11:44,720 Dovoľte mi, aby som prestať čítať, že prvý súbor, začnite písať tento nový. " 189 00:11:44,720 --> 00:11:49,980 A výstup programu pre PSet 4 bude toľko ako 50 JPEG. 190 00:11:49,980 --> 00:11:52,400 A ak to nie je 50 JPEG záberov, budete mať trochu slučky. 191 00:11:52,400 --> 00:11:55,580 Ak máte nekonečný počet JPEG, máte nekonečnú slučku. 192 00:11:55,580 --> 00:11:58,280 Takže, aj bude celkom bežný prípad. 193 00:11:58,280 --> 00:12:00,280 To je to, čo je na obzore. 194 00:12:00,280 --> 00:12:03,740 >> Kvíz 0, za nami. Uvedomte si, na môj e-mail, že vždy je tu ľudí 195 00:12:03,740 --> 00:12:06,820 ktorí sú obaja šťastní, tak nejako neutrálne a smutný okolo kvíz 0 hranie. 196 00:12:06,820 --> 00:12:10,160 A prosím, dostať sa ku mne, hlavové TFS, Zamyla, vlastné TF 197 00:12:10,160 --> 00:12:14,120 alebo jeden z úradov, ktoré budete vedieť, či by ste chceli diskutovať o tom, ako to šlo. 198 00:12:14,120 --> 00:12:16,460 >> Takže zapôsobiť na rodičov tu v izbe, 199 00:12:16,460 --> 00:12:23,990 čo je CS50 knižnica? Dobrá práce. 200 00:12:23,990 --> 00:12:32,280 Čo je to CS50 knižnica? Jo? [Študent odpovede, nezrozumiteľným] 201 00:12:32,280 --> 00:12:35,730 >> Dobre, dobre. Takže je to prewritten súbor kódu, ktorý sme, personál, napísal, 202 00:12:35,730 --> 00:12:38,460 vám poskytneme, aby niektoré spoločné funkcie. 203 00:12:38,460 --> 00:12:42,290 Veci ako sa mi reťazec, získate mi int, všetky funkcie, ktoré sú tu uvedené. 204 00:12:42,290 --> 00:12:45,260 Od teraz, začneme skutočne brať tieto vzdelávacie kolesá off. 205 00:12:45,260 --> 00:12:48,230 Takže budeme začať odniesť "reťazec" od vás, 206 00:12:48,230 --> 00:12:52,790 ktoré pripomínajú, bol len synonymom pre aký skutočný dátový typ? char *. 207 00:12:52,790 --> 00:12:57,020 Takže pre rodičov, to bolo asi - to je dobré, tak char * začneme vidieť 208 00:12:57,020 --> 00:13:00,810 na obrazovke o to viac, ako sme odstrániť "reťazec" z nášho slovníka, 209 00:13:00,810 --> 00:13:02,760 aspoň pokiaľ ide o skutočnosti písania kódu. 210 00:13:02,760 --> 00:13:06,240 Podobne, budeme prestať používať niektoré z týchto funkcií rovnako, 211 00:13:06,240 --> 00:13:08,390 pretože naše programy sa dostať sofistikovanejšie 212 00:13:08,390 --> 00:13:11,370 skôr než len písať programy, ktoré sedí tam s riadku bliká, 213 00:13:11,370 --> 00:13:13,580 čaká na užívateľa niečo písať palcov 214 00:13:13,580 --> 00:13:15,220 Získate vaše vstupy odinakiaľ. 215 00:13:15,220 --> 00:13:18,720 Napríklad, budete si ich z radu bitov na lokálny pevný disk. 216 00:13:18,720 --> 00:13:23,340 Budete miesto si v budúcnosti od sieťového pripojenia, niektoré webové stránky niekde. 217 00:13:23,340 --> 00:13:27,460 Takže poďme Zlúpnite tejto vrstvy prvýkrát, a zdvihnite CS50 spotrebiče 218 00:13:27,460 --> 00:13:32,300 a tento súbor s názvom CS50.h, ktoré ste boli ostré vrátane týždňov. 219 00:13:32,300 --> 00:13:34,380 >> Ale poďme skutočne vidieť, čo je vo vnútri toho. 220 00:13:34,380 --> 00:13:38,250 Takže začiatok súboru v modrej farbe je len celá partia komentárov, 221 00:13:38,250 --> 00:13:41,340 Informácie o záruke a licencovania. To je druh spoločného paradigmy 222 00:13:41,340 --> 00:13:44,600 v softvéri, pretože veľa softvér v týchto dňoch je to, čo sa nazýva "open source", 223 00:13:44,600 --> 00:13:46,940 čo znamená, že niekto napísal kód 224 00:13:46,940 --> 00:13:50,060 a robil to voľne k dispozícii, a to nielen spustiť a používať, 225 00:13:50,060 --> 00:13:53,660 ale v skutočnosti čítať a meniť a integrovať do svojej vlastnej práce. 226 00:13:53,660 --> 00:13:55,790 Takže to je to, čo ste doteraz používali, open source softvér, 227 00:13:55,790 --> 00:13:58,030 aj keď vo veľmi malom formulára. 228 00:13:58,030 --> 00:14:01,860 Keby som posunúť dole okolo pripomienky, keď začneme sa pozrieť na nejaké ďalšie známe veci. 229 00:14:01,860 --> 00:14:08,090 Takže všimnete hore tu, že súbor CS50.h obsahuje veľa hlavičkových súborov. 230 00:14:08,090 --> 00:14:11,160 Teraz, väčšina z nich sme nevideli, ale jeden je 231 00:14:11,160 --> 00:14:15,640 oboznámení, ktoré z nich sme videli, hoci krátko, tak ďaleko? 232 00:14:15,640 --> 00:14:18,720 Jo, štandardné knižnice. Stdlib.h má malloc, 233 00:14:18,720 --> 00:14:21,590 takže akonáhle sme začali hovoriť o dynamické prideľovanie pamäti, 234 00:14:21,590 --> 00:14:24,960 ktoré sa vrátime na budúci týždeň, rovnako, sme začali vrátane tohto súboru. 235 00:14:24,960 --> 00:14:29,660 Ukazuje sa, že bool a pravdivé a falošné robiť nie vlastne existovať v C, samo o sebe, 236 00:14:29,660 --> 00:14:32,460 ak tento súbor zahrnúť tu. 237 00:14:32,460 --> 00:14:35,770 Tak sme celé týždne, bola vrátane štandardnej bool.h 238 00:14:35,770 --> 00:14:39,020 takže môžete použiť pojem bool, true alebo false. 239 00:14:39,020 --> 00:14:41,830 Bez toho, mali by ste sa trochu falošné neho a použiť int 240 00:14:41,830 --> 00:14:45,920 a len svojvoľne predpokladať, že 0 je false a 1 je pravda. 241 00:14:45,920 --> 00:14:49,980 >> Teraz, keď sme prejdite dole ďalej, tu je naša definícia reťazca. 242 00:14:49,980 --> 00:14:54,820 Ukázalo sa, ako sme povedali skôr, že ak to * je naozaj nezáleží. 243 00:14:54,820 --> 00:14:56,750 Môžete dokonca mať priestor všade okolo. 244 00:14:56,750 --> 00:15:01,550 My, tento semester, boli propagovať ju, pretože to, aby bolo jasné, že * má čo do činenia s typom. 245 00:15:01,550 --> 00:15:05,370 Ale uvedomiť, rovnako ako časté, ak nie o niečo bežnejšie, je to tam 246 00:15:05,370 --> 00:15:07,480 ale funkčne je to to isté. 247 00:15:07,480 --> 00:15:11,070 Ale teraz, keď sme si stanoví ďalšie, poďme sa pozrieť na, povedzme, GetInt, 248 00:15:11,070 --> 00:15:15,350 pretože sme použili, že možno skôr, ako čokoľvek iného tento semester. 249 00:15:15,350 --> 00:15:19,620 A tu je GetInt. To je to, čo? 250 00:15:19,620 --> 00:15:24,650 To je prototypom. Tak často, dali sme prototypy na vrcholky našich. C súbory, 251 00:15:24,650 --> 00:15:28,190 ale môžete tiež dať prototypy v hlavičkových súboroch,. H súbory, 252 00:15:28,190 --> 00:15:32,110 ako je tento tu, takže keď píšete niektoré funkcie 253 00:15:32,110 --> 00:15:36,790 že chcete, aby ostatní ľudia mohli používať, čo je presne ten prípad s CS50 knižnice, 254 00:15:36,790 --> 00:15:40,900 môžete nielen realizovať svoje funkcie v niečo ako CS50.c, 255 00:15:40,900 --> 00:15:46,720 si tiež dať prototypov nie je v hornej časti tohto súboru, ale v hornej časti hlavičky súboru, 256 00:15:46,720 --> 00:15:50,810 potom, že hlavičkový súbor je to, čo priatelia a kolegovia patrí, 257 00:15:50,810 --> 00:15:52,800 s ostrými patrí vo svojom vlastnom kódu. 258 00:15:52,800 --> 00:15:55,440 Takže celú tú dobu ste boli, vrátane všetkých týchto prototypov 259 00:15:55,440 --> 00:15:59,870 účinne na začiatok súboru, ale prostredníctvom tohto ostrý zahŕňajú mechanizmus 260 00:15:59,870 --> 00:16:03,320 že v podstate kópia a pasty tento súbor do svojej vlastnej. 261 00:16:03,320 --> 00:16:06,400 Nuž, tu je niekoľko pomerne podrobná dokumentácia. 262 00:16:06,400 --> 00:16:08,880 >> Sme skoro za samozrejmé, že GetInt dostane int, 263 00:16:08,880 --> 00:16:10,740 ale to dopadá, že je nejaké rohové prípadoch, že jo? 264 00:16:10,740 --> 00:16:14,320 Čo keď používateľ zadá do položky, ktorá je príliš veľké? 265 00:16:14,320 --> 00:16:17,350 Quintillion, že jednoducho nemôže vojsť z int? 266 00:16:17,350 --> 00:16:21,180 Čo je to očakávané správanie? No, v ideálnom prípade, je to predvídateľné. 267 00:16:21,180 --> 00:16:23,460 Takže v tomto prípade, ak si skutočne prečítať drobným písmom, 268 00:16:23,460 --> 00:16:27,850 uvidíte, že v prípade, že linka nemôže byť prečítať, vráti INT_MAX. 269 00:16:27,850 --> 00:16:30,800 Nikdy sme o tom hovorili, ale na základe jeho kapitalizácie, 270 00:16:30,800 --> 00:16:33,030 čo to je, asi? 271 00:16:33,030 --> 00:16:36,610 Je to konštantný, tak je to nejaký špeciálny konštanta, ktorá je pravdepodobne vyhlásená za 272 00:16:36,610 --> 00:16:39,460 v jednom z tých hlavičkových súborov, ktoré sa nachádza v vyššie v súbore, 273 00:16:39,460 --> 00:16:43,400 a INT_MAX je asi niečo ako, hrubo, 2 miliardy. 274 00:16:43,400 --> 00:16:48,160 Myšlienka je, že preto, že musíme nejako znamenať, že niečo sa pokazilo, 275 00:16:48,160 --> 00:16:51,090 sme, áno, majú 4000000000 čísla máme k dispozícii, 276 00:16:51,090 --> 00:16:53,980 negatívny 2000000000 až na 2 miliardy, dávať alebo brať. 277 00:16:53,980 --> 00:16:58,030 No, to, čo je bežné v programovaní je budete kradnúť len jeden z tých čísel. 278 00:16:58,030 --> 00:17:02,250 Možno 0, možno 2 miliardy, možno negatívne 2000000000. 279 00:17:02,250 --> 00:17:06,720 Takže budete tráviť jeden z vašich možných hodnôt, takže môžete zaviazať k svetu 280 00:17:06,720 --> 00:17:10,089 že keď sa niečo pokazí, budem vráťte tento super-veľké hodnoty. 281 00:17:10,089 --> 00:17:13,329 Ale nechcete užívateľ zadaním niečo mystické, ako "2, 3, 4 ..." 282 00:17:13,329 --> 00:17:17,079 z naozaj veľkého počtu, kde sa zovšeobecniť miesto ako konštanta. 283 00:17:17,079 --> 00:17:19,380 Takže naozaj, ak ste boli anal v posledných niekoľkých týždňoch, 284 00:17:19,380 --> 00:17:23,800 kedykoľvek zavoláte GetInt, mali by ste byť kontrola s IF podmienka. 285 00:17:23,800 --> 00:17:27,109 Bolo typ užívateľa v INT_MAX, alebo viac špecificky, 286 00:17:27,109 --> 00:17:29,900 urobil GetInt vrátiť INT_MAX? Pretože keby to urobil, 287 00:17:29,900 --> 00:17:35,140 to vlastne znamená, že ani písať to, niečo sa pokazilo v tomto prípade. 288 00:17:35,140 --> 00:17:38,970 Tak toto je to, čo je všeobecne známe ako "Sentinel" hodnotou, čo vyžaduje zvláštne. 289 00:17:38,970 --> 00:17:41,020 >> No, poďme sa teraz v na. C súbory. 290 00:17:41,020 --> 00:17:44,500 Súbor C existuje v zariadení nejakú dobu, 291 00:17:44,500 --> 00:17:47,540 a, v skutočnosti, prístroj má to predkompilované pre vás 292 00:17:47,540 --> 00:17:49,720 do tej veci sme nazvali "objektový kód," 293 00:17:49,720 --> 00:17:52,940 ale to jednoducho nie je jedno, kde to je, pretože systém vie, 294 00:17:52,940 --> 00:17:54,780 v tomto prípade, ak je, zariadenie. 295 00:17:54,780 --> 00:18:00,620 Ale poďme prejdite teraz GetInt, a uvidíte, ako GetInt pôsobí celú tú dobu. 296 00:18:00,620 --> 00:18:02,380 Takže tu máme podobné poznámky z obdobia pred. 297 00:18:02,380 --> 00:18:04,930 Dovoľte mi, aby som priblížiť len na kóde časti, 298 00:18:04,930 --> 00:18:07,410 a to, čo máme na GetInt je nasledujúce. 299 00:18:07,410 --> 00:18:12,770 To trvá žiadny vstup a vracia hodnotu typu int, while (true), takže máme úmyselné nekonečnú slučku 300 00:18:12,770 --> 00:18:16,560 ale zrejme budeme vypuknúť to nejako, alebo sa vrátiť v rámci tohto. 301 00:18:16,560 --> 00:18:19,890 Tak uvidíme, ako to funguje. No, zdá sa, že používate GetString 302 00:18:19,890 --> 00:18:22,550 V tomto prvom riadku vnútri slučky, 166. 303 00:18:22,550 --> 00:18:25,320 To je teraz dobré praxe, pretože za akých podmienok 304 00:18:25,320 --> 00:18:30,820 by GetString vrátiť túto špeciálnu kľúčové slovo, NULL? 305 00:18:30,820 --> 00:18:38,460 Ak sa niečo pokazí. Čo sa môže pokaziť, keď budete volať niečo ako GetString? 306 00:18:38,460 --> 00:18:42,550 Jo? [Študent odpoveď, nezrozumiteľné] >> Jo. Takže možno malloc zlyhá. 307 00:18:42,550 --> 00:18:45,310 Niekde pod kapotou GetString volá malloc, 308 00:18:45,310 --> 00:18:48,210 ktoré prideľuje pamäť, čo umožňuje obchod s počítačmi 309 00:18:48,210 --> 00:18:50,950 všetky znaky, ktoré užívateľ zadá do klávesnice. 310 00:18:50,950 --> 00:18:53,270 A predpokladám, že užívateľ mal veľa voľného času 311 00:18:53,270 --> 00:18:56,470 a napísal viac, napríklad, ako 2000000000 znakov. 312 00:18:56,470 --> 00:18:59,600 Viac znakov, ako v počítači, má dokonca aj RAM. 313 00:18:59,600 --> 00:19:02,350 No, GetString musí byť schopný znamenať, že na vás, 314 00:19:02,350 --> 00:19:05,650 aj keď je to super, super neobvyklé rohový prípad. 315 00:19:05,650 --> 00:19:08,490 Má sa nejako byť schopný zvládnuť, a tak GetString, 316 00:19:08,490 --> 00:19:11,850 ak by sme sa vrátiť a prečítať si jeho dokumentáciu, sa v skutočnosti, vráti NULL. 317 00:19:11,850 --> 00:19:16,150 Teraz, keď GetString zlyhá vrátením NULL, GetInt bude zlyhanie 318 00:19:16,150 --> 00:19:19,370 vrátením INT_MAX, rovnako ako hliadka. 319 00:19:19,370 --> 00:19:22,650 To sú len ľudské konvencie. Jediný spôsob, ako by sa, že toto je prípad 320 00:19:22,650 --> 00:19:24,840 je tým, čítanie dokumentácie. 321 00:19:24,840 --> 00:19:28,200 Tak poďme prejdite na miesto, kde int je vlastne GotInt. 322 00:19:28,200 --> 00:19:34,220 >> Takže ak som posunúť nadol o kúsok ďalej, v súlade 170 máme komentár nad týmito riadkami. 323 00:19:34,220 --> 00:19:38,470 Takže my deklarujeme, v 172, int n a char c, a potom sa toto nové funkcie 324 00:19:38,470 --> 00:19:41,870 ktoré niektorí z vás narazil predtým, ale sscanf. 325 00:19:41,870 --> 00:19:44,190 To je skratka pre reťazce f skenovanie. 326 00:19:44,190 --> 00:19:48,580 Inými slovami, daj mi reťazec a budem testovať to na kusy informácií záujmu. 327 00:19:48,580 --> 00:19:53,820 Takže čo to znamená? No, predpokladám, že som typ v doslova, 1 2 3 na klávesnici, 328 00:19:53,820 --> 00:19:59,730 a potom stlačte kláves Enter. Aký je dátový typ 1 2 3 keď sa vrátil od GetString? 329 00:19:59,730 --> 00:20:05,010 Je to samozrejme string, nie? Mám reťazec, takže 1 2 3 je naozaj "1 2 3" 330 00:20:05,010 --> 00:20:07,260 s \ 0 na jej konci. To nie je int. 331 00:20:07,260 --> 00:20:10,420 To nie je číslo. Vyzerá to ako číslo, ale nie je to vlastne. 332 00:20:10,420 --> 00:20:14,680 Takže to, čo sa GetInt urobiť? To má skenovať, že reťazec zľava doprava, 333 00:20:14,680 --> 00:20:19,010 1 2 3 \ 0, a nejako previesť na skutočné číslo. 334 00:20:19,010 --> 00:20:21,010 Teraz môžete zistiť, ako to urobiť. 335 00:20:21,010 --> 00:20:24,240 Ak si myslíte, že späť do PSet 2, budete pravdepodobne sa trochu pohodlné 336 00:20:24,240 --> 00:20:26,810 s Caesarom alebo Vigenère, takže si môžete určiť iteráciou cez reťazec, 337 00:20:26,810 --> 00:20:29,800 môžete previesť znaky na ints s výberom. To je veľa práce. 338 00:20:29,800 --> 00:20:32,800 Prečo nie volať funkciu ako sscanf, ktorý robí to pre vás? 339 00:20:32,800 --> 00:20:37,520 Takže sscanf očakáva argument, v tomto prípade nazýva linka, ktorá je reťazec. 340 00:20:37,520 --> 00:20:41,310 Tie potom zadať v úvodzovkách, veľmi podobný printf, 341 00:20:41,310 --> 00:20:44,960 čo očakávať, že v tomto reťazci? 342 00:20:44,960 --> 00:20:52,980 Čo tu hovorím je, že som očakávať, že desatinné číslo a možno aj charakter. 343 00:20:52,980 --> 00:20:54,990 A uvidíme, prečo tomu tak je za chvíľu. 344 00:20:54,990 --> 00:20:58,440 Ukazuje sa, že tento záznam je teraz pripomína vecí 345 00:20:58,440 --> 00:21:00,840 sme začali hovoriť o niečo viac než pred týždňom. 346 00:21:00,840 --> 00:21:05,430 >> Čo je a n a a c robí pre nás? [Študent odpovede, nezrozumiteľný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 teraz, prečo je to tak dôležité? No, viete, že s funkciou v C 349 00:21:10,440 --> 00:21:13,440 môžete vždy vrátiť hodnotu, alebo žiadnu hodnotu. 350 00:21:13,440 --> 00:21:16,630 Môžete sa vrátiť int, je reťazec, float, char, čokoľvek. 351 00:21:16,630 --> 00:21:21,150 Alebo sa môžete vrátiť void, ale môžete vrátiť iba 1 vec maximálne. 352 00:21:21,150 --> 00:21:26,100 Ale tu chceme sscanf vrátiť mi možno int, desatinné číslo, 353 00:21:26,100 --> 00:21:29,240 a tiež char, a ja ti to vysvetlím, prečo char za chvíľu. 354 00:21:29,240 --> 00:21:34,250 Takže ste skutočne chcete f vrátiť 2 veci, to jednoducho nie je možné v C. 355 00:21:34,250 --> 00:21:38,460 Takže si môžete obísť, že odovzdaním 2 adresy, 356 00:21:38,460 --> 00:21:43,710 pretože akonáhle podáš funkciu, 2 adresy, čo môže táto funkcia s nimi robiť? 357 00:21:43,710 --> 00:21:49,880 To môže napísať na tieto adresy. Môžete použiť * operácie a "tam", aby každý z týchto adries. 358 00:21:49,880 --> 00:21:54,320 Je to niečo tohto backdoor mechanizmu, ale veľmi bežné pre zmenu hodnôt premenných 359 00:21:54,320 --> 00:21:58,020 vo viac ako len 1 miesto, v tomto prípade 2. 360 00:21:58,020 --> 00:22:04,590 Teraz si všimnite, som kontrola == HK1, a potom sa vracať n prípade, že sa v skutočnosti, vyhodnotí na true. 361 00:22:04,590 --> 00:22:09,340 Tak čo sa deje? No, technicky vzaté, všetko, čo sme naozaj chceme, aby sa stalo v GetInt je tento. 362 00:22:09,340 --> 00:22:12,340 Chceme analyzovať, aby som tak povedal, chceme čítať reťazec 363 00:22:12,340 --> 00:22:16,210 "1 2 3" a ak je to vyzerá, ako by to číslo tam, 364 00:22:16,210 --> 00:22:21,360 čo hovoríte, sscanf urobiť, je dať to číslo, 1 2 3, v tejto premennej n pre mňa. 365 00:22:21,360 --> 00:22:26,060 Prečo teda, robil som to rovnako? 366 00:22:26,060 --> 00:22:33,750 Aká je úloha tiež hovorí, sscanf, môžete tiež získať postavu tu. 367 00:22:33,750 --> 00:22:36,890 [Študent povedané, nezrozumiteľné] >> Nie je - desatinná čiarka by mohlo fungovať. 368 00:22:36,890 --> 00:22:40,650 Poďme si myslia, že sa na chvíľu zamyslel. Čo ešte? 369 00:22:40,650 --> 00:22:42,570 [Študent, nezrozumiteľné] >> Tak, dobrá myšlienka, mohlo by to byť znak NULL. 370 00:22:42,570 --> 00:22:44,970 Je to v skutočnosti nie je, je v tomto prípade. Jo? [Študent, nezrozumiteľným] 371 00:22:44,970 --> 00:22:47,100 >> >> ASCII. Alebo, dovoľte mi, aby som upresniť ešte ďalej. 372 00:22:47,100 --> 00:22:49,670 Znak% c je len pre kontrolu chýb. 373 00:22:49,670 --> 00:22:52,510 Nechceme tam byť znak po čísle, 374 00:22:52,510 --> 00:22:54,980 ale čo to mi umožňuje urobiť, je nasledovné: 375 00:22:54,980 --> 00:23:01,270 Ukazuje sa, že sscanf, okrem ukladanie hodnôt v N a C, v tomto príklade tu, 376 00:23:01,270 --> 00:23:08,170 čo to tiež robí, je, že vracia počet premenných je kladený hodnoty palcov 377 00:23:08,170 --> 00:23:13,330 Takže ak ste zadať iba v 1 2 3, potom len% d bude zodpovedať 378 00:23:13,330 --> 00:23:18,830 a len n je uložená s hodnotou, ako je 1 2 3 a nič dostane dať do c; 379 00:23:18,830 --> 00:23:20,870 c zostáva odpadky hodnotu, aby som tak povedal. 380 00:23:20,870 --> 00:23:23,550 Garbage, pretože je to nikdy nebola inicializovaná ako nejakú hodnotu. 381 00:23:23,550 --> 00:23:29,390 Takže v tomto prípade, sscanf vráti 1, pretože som naplnený jeden z tých ukazovateľov, 382 00:23:29,390 --> 00:23:33,650 v tom prípade, skvelé. Mám int, tak som uvoľniť linku uvoľniť pamäť 383 00:23:33,650 --> 00:23:37,150 že GetString skutočne pridelené, a potom som sa vrátiť n 384 00:23:37,150 --> 00:23:42,210 Else, ak ste niekedy nad tým, kde to zopakovať tvrdenie pochádza, pochádza priamo odtiaľto. 385 00:23:42,210 --> 00:23:45,770 Ak naopak, píšem v 1 2 3 foo, 386 00:23:45,770 --> 00:23:48,640 len nejaký náhodný sled textu, sscanf sa 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 dať 1 2 3 v n 389 00:23:54,190 --> 00:23:59,970 Je to dám F v C, a potom sa vrátiť 2. 390 00:23:59,970 --> 00:24:02,980 Takže máme, len pomocou základnej definícii správanie scanf je, 391 00:24:02,980 --> 00:24:06,170 veľmi jednoduchý spôsob - dobre, komplex na prvý pohľad, ale na konci dňa, 392 00:24:06,170 --> 00:24:11,460 pomerne jednoduché mechanizmus hovorí, je tam int, a ak áno, je, že jediná vec, ktorú som našiel? 393 00:24:11,460 --> 00:24:14,950 A biely priestor je tu zámerne. Ak budete čítať dokumentáciu k sscanf, 394 00:24:14,950 --> 00:24:18,690 to vám povie, že ak sú kúsok bieleho miesta na začiatku alebo na konci, 395 00:24:18,690 --> 00:24:24,990 sscanf príliš umožní užívateľovi, z akéhokoľvek dôvodu, hit medzerník 1 2 3, a to bude legitímne. 396 00:24:24,990 --> 00:24:28,310 To nebude kričať na užívateľa len preto, že narazia na medzerník na začiatku alebo na konci, 397 00:24:28,310 --> 00:24:32,160 čo je len o málo viac užívateľsky príjemný. 398 00:24:32,160 --> 00:24:34,160 >> Akékoľvek otázky, potom na GetInts? Jo? 399 00:24:34,160 --> 00:24:36,820 [Študent otázka, nezrozumiteľným] 400 00:24:36,820 --> 00:24:40,740 >> Dobrá otázka. Čo keď ste práve zadali v char, ako je f, a stlačte klávesu Enter 401 00:24:40,740 --> 00:24:47,830 bez písania 1 2 3; čo si myslíte, že správanie tejto riadok kódu by potom? 402 00:24:47,830 --> 00:24:50,500 Takže sscanf môže zahŕňať, že aj preto, že v tomto prípade, 403 00:24:50,500 --> 00:24:56,280 to nebude vypĺňať n alebo C; to bude miesto vrátiť 0. 404 00:24:56,280 --> 00:25:01,540 V tom prípade, ja som tiež chytí, že scenár, pretože predpokladaná hodnota chcem je 1. 405 00:25:01,540 --> 00:25:07,310 Chcem len 1 a len 1 vec byť vyplnené. Dobrá otázka. Ostatné? 406 00:25:07,310 --> 00:25:09,610 >> Dobre, tak nech to nie je prejsť všetky funkcie v tu, 407 00:25:09,610 --> 00:25:11,820 ale ten, ktorý sa zdá byť, snáď, zostávajúci podiel 408 00:25:11,820 --> 00:25:14,530 je GetString, pretože sa ukázalo, že GetFloat, GetInt, 409 00:25:14,530 --> 00:25:19,490 GetDouble, GetLongLong všetky Punt veľa ich funkčnosti pre GetString. 410 00:25:19,490 --> 00:25:22,860 Takže poďme sa pozrieť na to, ako on je realizovaný tu. 411 00:25:22,860 --> 00:25:27,040 Tohle vyzerá trochu zložitejšie, ale používa rovnaké základy 412 00:25:27,040 --> 00:25:29,680 že sme začali hovoriť o minulý týždeň. Takže v GetString, 413 00:25:29,680 --> 00:25:32,670 ktorý neberie argument, podľa prázdnoty tu, 414 00:25:32,670 --> 00:25:37,110 a vráti reťazec, takže som sa prehlasuje, že reťazec s názvom vyrovnávacia pamäť. 415 00:25:37,110 --> 00:25:39,670 Ja naozaj neviem, čo že sa to využiť na ešte, ale uvidíme. 416 00:25:39,670 --> 00:25:42,950 Vyzerá to kapacity, v predvolenom nastavení, 0, nie je celkom istý, kde to bude. 417 00:25:42,950 --> 00:25:44,920 Nie ste si istí, čo sa n to bude byť použité pre ešte. 418 00:25:44,920 --> 00:25:47,860 Ale teraz je to už trochu zaujímavejšie, tak v súlade 243, 419 00:25:47,860 --> 00:25:51,760 prehlasujeme int c, to je niečo ako hlúpe detailu. 420 00:25:51,760 --> 00:25:58,080 Char je 8 bitov, a 8 bitov možno uložiť, koľko rôznych hodnôt? 421 00:25:58,080 --> 00:26:03,310 256. Problém je, že ak chcete mať 256 rôznych znakov ASCII, 422 00:26:03,310 --> 00:26:06,210 ktoré sú, ak si myslíte, späť, a to nie je niečo, čo pamätať. 423 00:26:06,210 --> 00:26:09,100 Ale ak si myslíte, že späť do tej veľkej ASCII tabuľky sme mali pred niekoľkými týždňami, 424 00:26:09,100 --> 00:26:13,780 bolo v tomto prípade, 128 alebo 256 znakov ASCII. 425 00:26:13,780 --> 00:26:16,220 Použili sme všetky vzory 0 a 1 sa deje. 426 00:26:16,220 --> 00:26:19,410 To je problém, ak chcete byť schopní odhaliť chyby. 427 00:26:19,410 --> 00:26:23,290 Pretože ak ste už používate 256 hodnôt pre svoje postavy, 428 00:26:23,290 --> 00:26:26,390 ste naozaj plánovať dopredu, pretože teraz nemáte spôsob, ako hovoriť, 429 00:26:26,390 --> 00:26:29,750 "To nie je legitímny charakter, to je nejaký chybný správa." 430 00:26:29,750 --> 00:26:32,430 Takže to, čo sa svet skutočne je, že používajú nasledujúce najväčšiu hodnotu, 431 00:26:32,430 --> 00:26:35,790 niečo ako int, takže máte šialený počet bitov, 432 00:26:35,790 --> 00:26:39,610 32 pre 4 miliardy možných hodnôt, takže môžete jednoducho skončiť s použitím, 433 00:26:39,610 --> 00:26:44,800 v podstate, 257 z nich, 1, ktorý má nejaký zvláštny význam ako chyba. 434 00:26:44,800 --> 00:26:49,190 >> Tak uvidíme, ako to funguje. V súlade 246, mám veľkú while 435 00:26:49,190 --> 00:26:54,530 že volá fgetc; f znamená súbor, getc, a potom sa stdin. 436 00:26:54,530 --> 00:26:59,030 Ukázalo sa, že to je len presnejšie spôsob, ako povedať "číta vstup z klávesnice." 437 00:26:59,030 --> 00:27:02,730 Štandardná vstupná prostriedky klávesnica, štandardný výkon znamená obrazovku, 438 00:27:02,730 --> 00:27:06,920 a štandardná chyba, ktorú uvidíme v PSet 4, sa rozumie obrazovku, 439 00:27:06,920 --> 00:27:09,670 ale osobitná časť obrazovky tak, aby to nie je zjednotený 440 00:27:09,670 --> 00:27:13,760 s aktuálnym výkonom, ktorý ste chceli vytlačiť, ale o tom viac v budúcnosti. 441 00:27:13,760 --> 00:27:19,430 Takže fgetc len znamená čítať jeden znak z klávesnice, a uložte ho tam, kde? 442 00:27:19,430 --> 00:27:24,000 Uložte ho v C, a potom skontrolujte, takže som len pomocou nejaké logické spojky tu, 443 00:27:24,000 --> 00:27:28,430 uistite sa, že nie je rovné \ n, takže užívateľ stlačte Enter. 444 00:27:28,430 --> 00:27:31,510 Chceme zastaviť v tomto bode, koniec slučky, a tiež chceme overiť 445 00:27:31,510 --> 00:27:36,170 pre špeciálne konštanty, EOF, ktorá, ak viete, alebo hádať - čo to znamená? 446 00:27:36,170 --> 00:27:39,860 Koniec súboru. Takže toto je nezmyselné, pretože keď píšem na klávesnici, 447 00:27:39,860 --> 00:27:41,900 je to naozaj žiadny súbor sa na tomto, 448 00:27:41,900 --> 00:27:44,330 ale to je len trochu generický termín použitý znamenať 449 00:27:44,330 --> 00:27:50,320 že nič iné sa blíži z ľudského prsty. EOF. Koniec súboru. 450 00:27:50,320 --> 00:27:52,600 Ako stranou, ak ste niekedy hit ovládacie d na klávesnici, 451 00:27:52,600 --> 00:27:54,680 nie, že by ste ešte, ste hit ovládač C. 452 00:27:54,680 --> 00:27:57,920 Ale kontrola d zasiela túto špeciálnu konštantný názvom EOF. 453 00:27:57,920 --> 00:28:03,100 >> Takže teraz máme len nejaké dynamické prideľovanie pamäte. 454 00:28:03,100 --> 00:28:06,460 Takže ak n + 1> kapacita, teraz budem vysvetľovať n 455 00:28:06,460 --> 00:28:09,380 n je len, koľko bytov je v súčasnej dobe vo vyrovnávacej pamäti, 456 00:28:09,380 --> 00:28:11,970 reťazec, ktorý ste v súčasnej dobe buduje od užívateľa. 457 00:28:11,970 --> 00:28:16,240 Ak máte viac znakov vo vašom vyrovnávacej pamäte, než budete mať kapacitu vyrovnávacej pamäte, 458 00:28:16,240 --> 00:28:20,760 intuitívne, čo musíme urobiť, a potom je prideliť väčšiu kapacitu. 459 00:28:20,760 --> 00:28:24,490 Idem zbierať nad niektorými aritmetického tu 460 00:28:24,490 --> 00:28:26,900 a sústrediť sa iba na túto funkciu tu. 461 00:28:26,900 --> 00:28:29,170 Viete, čo malloc je, alebo aspoň všeobecne známe. 462 00:28:29,170 --> 00:28:32,380 Hádať, čo realloc robí. [Študent odpoveď, nezrozumiteľným] 463 00:28:32,380 --> 00:28:35,690 Jo >>. A nie je to úplne pridanie pamäti, že prerozdeľuje pamäti takto: 464 00:28:35,690 --> 00:28:40,530 Ak je ešte stále priestor na konci reťazca, aby vám viac, že ​​pamäť 465 00:28:40,530 --> 00:28:43,370 ako pôvodne vám dáva, potom budete môcť dať ďalšie pamäť. 466 00:28:43,370 --> 00:28:46,640 Takže stačí uvedenie reťazcov znakov chrbtom k sebe, aby sa chrbtom k sebe. 467 00:28:46,640 --> 00:28:49,290 Ale ak to nie je tento prípad, pretože ste čakali príliš dlho 468 00:28:49,290 --> 00:28:51,700 a niečo náhodne dostal zvalil do pamäte tam, ale je tu navyše 469 00:28:51,700 --> 00:28:56,480 pamäť tu, to je v poriadku. Realloc bude robiť všetko ťažkú ​​prácu za vás, 470 00:28:56,480 --> 00:28:58,810 presunúť reťazec čo ste si prečítali v tak ďaleko odtiaľ, 471 00:28:58,810 --> 00:29:02,550 dal ju tam, a potom vám ešte trochu dráhu v tomto bode. 472 00:29:02,550 --> 00:29:05,610 Takže s mávnutím ruky, dovoľte mi povedať, že to, čo robí GetString 473 00:29:05,610 --> 00:29:09,540 je to začína s malým pufru, možno 1 jednoposteľová charakteru, 474 00:29:09,540 --> 00:29:12,300 a pokiaľ užívateľ zadá do 2 znaky, GetString skončí 475 00:29:12,300 --> 00:29:15,210 volanie realloc a hovorí, "Ooh, 1 znak nebolo dosť. 476 00:29:15,210 --> 00:29:18,480 Dajte mi 2 znaky. " Potom, ak budete čítať cez logiky slučky, 477 00:29:18,480 --> 00:29:21,070 to bude hovoriť, "Ooh, používateľskú zadaný do 3 znaky. 478 00:29:21,070 --> 00:29:25,690 Daj mi teraz nie je 2, ale 4 znaky, tak mi daj 8, tak mi daj 16 a 32. " 479 00:29:25,690 --> 00:29:28,180 Skutočnosť, že som Zdvojnásobenie kapacity zakaždým 480 00:29:28,180 --> 00:29:30,320 Znamená to, že vyrovnávacia pamäť nie je porastie pomaly. 481 00:29:30,320 --> 00:29:35,870 Bude to rast veľmi rýchly, a čo by mohlo byť výhodou, že? 482 00:29:35,870 --> 00:29:38,540 Prečo som zdvojnásobenie veľkosti vyrovnávacej pamäte, a to aj napriek tomu, že užívateľ 483 00:29:38,540 --> 00:29:41,450 možno stačí 1 ďalší znak z klávesnice? 484 00:29:41,450 --> 00:29:44,830 [Študent odpoveď, nezrozumiteľné]. >> Čo je to? 485 00:29:44,830 --> 00:29:46,750 Presne tak. Nemusíte pestovať to, ako často. 486 00:29:46,750 --> 00:29:48,870 A to je len druh - Si zabezpečenie svojej stávky tu. 487 00:29:48,870 --> 00:29:54,150 Myšlienka je, že nechcete volať realloc veľa, pretože to má tendenciu byť pomalé. 488 00:29:54,150 --> 00:29:56,840 Kedykoľvek môžete požiadať operačný systém pre pamäte, ako skoro uvidíte, 489 00:29:56,840 --> 00:30:00,620 v budúcnosti problém sade, má tendenciu trvať nejaký čas. 490 00:30:00,620 --> 00:30:04,980 Takže je minimalizovať množstvo času, aj keď strácame trochu miesta, má tendenciu byť dobrá vec. 491 00:30:04,980 --> 00:30:07,250 >> Ale ak budeme čítať prostredníctvom záverečnej časti GetString tu, 492 00:30:07,250 --> 00:30:10,880 a znova, pochopenie každý riadok tu nie je tak dôležitá aj dnes. 493 00:30:10,880 --> 00:30:14,830 Ale všimnite si, že nakoniec zavolá malloc znova, a prideľuje 494 00:30:14,830 --> 00:30:16,980 presne tak, ako veľa bajtov ako je potrebné pre reťazec 495 00:30:16,980 --> 00:30:21,620 a potom vyhodí volaním zadarmo, príliš veľké vyrovnávacej pamäte, 496 00:30:21,620 --> 00:30:23,510 ak to naozaj dostal dvojnásobok príliš mnohokrát. 497 00:30:23,510 --> 00:30:25,970 Stručne povedané, je to, ako GetString pôsobí celú tú dobu. 498 00:30:25,970 --> 00:30:30,100 Všetko, čo to robí je čítať jeden znak v čase, znova a znova a znova 499 00:30:30,100 --> 00:30:37,930 a zakaždým, keď potrebuje nejaký ďalší pamäť, požiada operačný systém pre neho volaním realloc. 500 00:30:37,930 --> 00:30:41,660 Nejaké otázky? Dobrá. 501 00:30:41,660 --> 00:30:45,220 >> Útok. Teraz, keď chápeme ukazovatele, alebo aspoň 502 00:30:45,220 --> 00:30:47,560 sú stále viac oboznámení s ukazovateľmi, 503 00:30:47,560 --> 00:30:50,020 Poďme zvážiť, ako celý svet začne rúcať 504 00:30:50,020 --> 00:30:53,160 ak nemáte dosť brániť sporných užívateľov, 505 00:30:53,160 --> 00:30:55,180 ľudia, ktorí sa snažia preniknúť do vášho systému. 506 00:30:55,180 --> 00:31:00,260 Ľudia, ktorí sa snažia ukradnúť vaše softvér a tým obísť nejaký registračný kód 507 00:31:00,260 --> 00:31:02,150 že by inak mohla písať palcov 508 00:31:02,150 --> 00:31:04,860 Pozrite sa na tento príklad tu, čo je len C kód 509 00:31:04,860 --> 00:31:07,920 , Ktorý má funkciu hlavného dole, že vyvolá funkciu foo, 510 00:31:07,920 --> 00:31:12,100 a čo je okolo, aby foo? [Študent] jediný argument. 511 00:31:12,100 --> 00:31:15,660 >> Single argument. Takže ArGV [1], čo znamená, že prvé slovo používateľ zadaný 512 00:31:15,660 --> 00:31:19,150 na príkazovom riadku po a.out alebo čokoľvek iné, sa nazýva program. 513 00:31:19,150 --> 00:31:24,920 Takže foo, v hornej časti, má v char *, ale char * je presne to, čo? 514 00:31:24,920 --> 00:31:28,860 String. Tam je nič nové, a že reťazec je ľubovoľne sa nazýva bar. 515 00:31:28,860 --> 00:31:36,090 V tomto riadku tu, char c [12], v druhu semi-technickej angličtiny, čo sa tento riadok robí? 516 00:31:36,090 --> 00:31:40,640 Array of -? Postavy. Daj mi rad 12 znakov. 517 00:31:40,640 --> 00:31:44,970 Tak by sme mohli nazvať tento vyrovnávacej pamäte. Je to odborne nazýva c, ale vyrovnávaciu pamäť v programovaní 518 00:31:44,970 --> 00:31:47,890 len znamená veľa miesta, ktoré si môžete dať nejaké veci dovnútra 519 00:31:47,890 --> 00:31:49,940 >> Potom konečne, memcpy, sme to používali skôr. 520 00:31:49,940 --> 00:31:52,380 Ale asi tušíte, čo to robí. Je to kópia pamäte. 521 00:31:52,380 --> 00:31:58,790 Čo to robí? No, to zrejme skopíruje bar, jeho vstup, do c, 522 00:31:58,790 --> 00:32:03,420 ale len do dĺžky pruhu. 523 00:32:03,420 --> 00:32:07,440 Ale je tu chyba tu. 524 00:32:07,440 --> 00:32:14,500 Dobre, takže technicky by sme mali naozaj strlen (bar) x sizeof (char), to je pravda. 525 00:32:14,500 --> 00:32:17,920 Ale v najhoršom prípade tu, poďme predpokladať, že to je - tak, v poriadku. 526 00:32:17,920 --> 00:32:23,760 Potom je tu 2 chyby. Takže sizeof (char), v poriadku, poďme urobiť to trochu širšie. 527 00:32:23,760 --> 00:32:28,860 Takže teraz je tu stále chyba, ktorá je čo? 528 00:32:28,860 --> 00:32:31,630 [Študent odpoveď, nezrozumiteľné] >> Overiť za čo? Dobre, takže by sme mali byť kontrola 529 00:32:31,630 --> 00:32:35,010 pre NULL, pretože zlé veci sa stávajú, keď ukazovateľ myši je NULL, 530 00:32:35,010 --> 00:32:38,490 Vzhľadom k tomu, ktoré by vás mohli skončiť ísť tam, a nemali by ste nikdy ísť 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 čo iného robíme? Logicky je to chyba aj tu. 533 00:32:45,250 --> 00:32:47,650 [Študent odpoveď, nezrozumiteľným] 534 00:32:47,650 --> 00:32:51,340 Takže >> skontrolovať, či argc ≥ 2? 535 00:32:51,340 --> 00:32:54,130 Dobre, tak tam je to 3 chyby v tomto programe tu. 536 00:32:54,130 --> 00:33:00,080 Nie sme skontrolovať, či užívateľ skutočne zadali niečo do ArGV [1], dobré. 537 00:33:00,080 --> 00:33:02,240 Takže to, čo je tretia chyba? Jo? 538 00:33:02,240 --> 00:33:04,420 [Študent odpoveď, nezrozumiteľné] >> Good. 539 00:33:04,420 --> 00:33:09,590 Takže sme preverili jeden scenár. My implicitne kontrolovať nekopírujte viac pamäte 540 00:33:09,590 --> 00:33:12,800 ako by presiahnuť dĺžku tyče. 541 00:33:12,800 --> 00:33:15,720 Takže ak reťazec užívateľ zadali, je 10 znakov, 542 00:33:15,720 --> 00:33:18,260 to hovorí, "len skopírovať 10 znakov." 543 00:33:18,260 --> 00:33:21,140 A to je v poriadku, ale čo v prípade, že užívateľ napísal v slove na príkazovom riadku 544 00:33:21,140 --> 00:33:29,360 ako 20 znakov slová, to je, povedal kopírovanie 20 znakov z baru do čoho? 545 00:33:29,360 --> 00:33:32,840 c, inak známa ako náš pufra, čo znamená, že práve napísal dát 546 00:33:32,840 --> 00:33:35,950 na 8 byte miesta, ktoré ste nevlastníte, 547 00:33:35,950 --> 00:33:38,320 a nemáte vlastný je v tom zmysle, že ste nikdy pridelené im. 548 00:33:38,320 --> 00:33:41,190 Tak toto je to, čo je všeobecne známe ako útok pretečeniu vyrovnávacej pamäte, 549 00:33:41,190 --> 00:33:46,650 alebo pretečeniu vyrovnávacej pamäte útok, a je to útok v tom zmysle, že v prípade, že užívateľ 550 00:33:46,650 --> 00:33:50,650 alebo program, ktorý volá svoje funkcie robí to v zlom úmysle, 551 00:33:50,650 --> 00:33:53,780 čo sa vlastne bude diať ďalej by mohlo byť docela zlé. 552 00:33:53,780 --> 00:33:55,690 >> Poďme sa pozrieť na tento obrázok tu. 553 00:33:55,690 --> 00:33:59,070 Tento obrázok predstavuje svoj stack pamäte. 554 00:33:59,070 --> 00:34:01,050 A pripomenul, že zakaždým, keď volanie funkcie, 555 00:34:01,050 --> 00:34:04,520 získate tento malý rámček na zásobníku a potom ďalšie a potom ďalšie a potom ďalšie. 556 00:34:04,520 --> 00:34:07,250 A tak ďaleko sme to jednoducho odobraté nich preč ako obdĺžniky 557 00:34:07,250 --> 00:34:09,380 buď tam na tabuli alebo na obrazovke tu. 558 00:34:09,380 --> 00:34:12,219 Ale keď sa priblížite na jednom z týchto obdĺžnikov, 559 00:34:12,219 --> 00:34:16,460 Pri volaní funkcie foo, ukázalo sa, že je tu viac na zásobníku 560 00:34:16,460 --> 00:34:18,739 vnútri tohto rámu a tento obdĺžnik 561 00:34:18,739 --> 00:34:23,370 ako len x a y a a b, rovnako ako sme sa hovoriť o swapu. 562 00:34:23,370 --> 00:34:25,949 Ukazuje sa, že tam sú niektoré nižšie úrovne podrobnosti, 563 00:34:25,949 --> 00:34:27,780 medzi nimi vráti adresu. 564 00:34:27,780 --> 00:34:33,020 Tak to dopadá, keď hlavné volá foo, hlavné je informovať foo 565 00:34:33,020 --> 00:34:36,760 Aké hlavné je adresa v pamäti počítača. 566 00:34:36,760 --> 00:34:40,659 Vzhľadom k tomu, inak, akonáhle foo sa vykonáva prevedení, ako je v tomto prípade tu, 567 00:34:40,659 --> 00:34:43,790 akonáhle sa dostanete túto úzku zložená zátvorka na konci foo, 568 00:34:43,790 --> 00:34:48,860 Ako to sakra to foo vedieť, kde je ovládanie programu má ísť? 569 00:34:48,860 --> 00:34:52,460 Ukazuje sa, že odpoveď na túto otázku, je v tomto červenom obdĺžniku tu. 570 00:34:52,460 --> 00:34:56,130 To predstavuje ukazovateľ, a to až do počítača na uloženie, dočasne, 571 00:34:56,130 --> 00:35:00,250 na tzv zásobníka je adresa hlavnej tak, že akonáhle foo urobiť vykonávania, 572 00:35:00,250 --> 00:35:04,110 počítač vie, kde a čo riadok v hlavnom ísť späť. 573 00:35:04,110 --> 00:35:06,900 Uložené frame pointer týka podobne to. 574 00:35:06,900 --> 00:35:09,620 Char * bar tu predstavuje, čo? 575 00:35:09,620 --> 00:35:14,740 No, teraz to modrá časť je tu foo je rám, čo je bar? 576 00:35:14,740 --> 00:35:18,300 Dobre, tak bar je len argument k funkcii foo. 577 00:35:18,300 --> 00:35:20,720 >> Takže teraz sme späť u známeho obrázku. 578 00:35:20,720 --> 00:35:22,960 Je tu ďalšie veci, a ďalšie rozptýlenie na obrazovke 579 00:35:22,960 --> 00:35:27,490 ale to svetlo modrá časť je to, čo sme boli kreslenie na tabuľu niečo ako swap. 580 00:35:27,490 --> 00:35:31,890 To je rámec pre foo a jediná vec v tom teraz je bar, 581 00:35:31,890 --> 00:35:34,630 ktorý je tento parameter. 582 00:35:34,630 --> 00:35:39,840 Ale čo iného by mal byť v zásobníku, podľa tohto kódu tu? 583 00:35:39,840 --> 00:35:44,280 Char c [12]. Takže by sme mali vidieť aj 12 štvorcov pamäti, 584 00:35:44,280 --> 00:35:46,260 pridelené premenné s názvom c 585 00:35:46,260 --> 00:35:48,340 A skutočne máme, že na obrazovke. 586 00:35:48,340 --> 00:35:51,650 Samom vrchole je c [0], a potom autor tejto schémy 587 00:35:51,650 --> 00:35:55,130 nevadilo čerpanie všetkých štvorcov, ale je skutočne 12 tam 588 00:35:55,130 --> 00:36:00,120 pretože keď sa pozriete na pravom dolnom rohu, c [11], ak budete počítať od 0, je 12 takých bytov. 589 00:36:00,120 --> 00:36:06,190 Ale tu je problém: V akom smere je c rastie? 590 00:36:06,190 --> 00:36:10,390 Druh zhora dole, nie? Ak sa začína na vrchole a rastie až na dno, 591 00:36:10,390 --> 00:36:13,480 nevyzerá to, že sme opustili sami moc dráhu tu vôbec. 592 00:36:13,480 --> 00:36:15,320 Sme trochu maľoval seba do kúta, 593 00:36:15,320 --> 00:36:20,210 a že c [11] je správna proti baru, ktorý je priamo proti ukazovateľ zásobníka rámu, 594 00:36:20,210 --> 00:36:23,800 ktorá je priamo proti spiatočnú adresu, tam to nie je miesto. 595 00:36:23,800 --> 00:36:26,100 Takže to, čo je dôsledok, potom, ak ste zpackat, 596 00:36:26,100 --> 00:36:30,460 a skúste si prečítať 20 bajtov do 12-byte pamäti? 597 00:36:30,460 --> 00:36:33,460 Ak sú tieto 8 ďalších bytov ísť? 598 00:36:33,460 --> 00:36:36,370 Vnútri všetko ostatné, z ktorých niektoré sú super dôležité. 599 00:36:36,370 --> 00:36:40,480 A to najdôležitejšie, potenciálne, je červený rámček tam, spiatočná adresa. 600 00:36:40,480 --> 00:36:44,720 Pretože predpokladám, že ste buď náhodne, alebo adversarially 601 00:36:44,720 --> 00:36:48,040 prepíšte tieto 4 byty, ktorý ukazovateľ adresu, 602 00:36:48,040 --> 00:36:53,190 nielen s odpadkami, ale s číslom, ktoré sa stane predstavujú skutočnú adresu v pamäti? 603 00:36:53,190 --> 00:36:55,930 Čo je implicaiton, logicky? 604 00:36:55,930 --> 00:36:59,080 [Študent odpovede, nezrozumiteľné] >> Presne tak. Pri foo vráti 605 00:36:59,080 --> 00:37:03,560 a hity, ktoré rovnátka kučeravé, program bude pokračovať nebude pre návrat na hlavnú, 606 00:37:03,560 --> 00:37:08,320 to bude návrat na čokoľvek adresa je v tomto červenom poli. 607 00:37:08,320 --> 00:37:11,560 >> Teraz, v prípade, že obišli softvéru registráciu, 608 00:37:11,560 --> 00:37:14,400 Aká je adresa, ktorá je momentálne vrátil do funkcie je 609 00:37:14,400 --> 00:37:18,820 , Ktoré sa obvykle volaná potom, čo ste zaplatili za softvér a zadali vaše registračný kód? 610 00:37:18,820 --> 00:37:23,160 Dalo by sa nejako trik počítač do nebudete tu, ale namiesto toho, ide tu. 611 00:37:23,160 --> 00:37:27,950 Alebo, ak ste naozaj šikovný, môže protivník skutočne zadajte na klávesnici, 612 00:37:27,950 --> 00:37:32,500 Napríklad, nie je skutočné slovo, nie 20 znakov, ale predpokladám, on alebo ona 613 00:37:32,500 --> 00:37:36,200 Typy niektorých znakov, ktoré predstavujú 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 ktoré predstavujú kódy binárne stroje, 0 a 1 je. 616 00:37:42,920 --> 00:37:46,740 Ale predpokladám, že to dosť šikovný, aby to urobil, nejako vložiť do GetString riadku 617 00:37:46,740 --> 00:37:49,460 niečo, čo je v podstate zostavený kód, 618 00:37:49,460 --> 00:37:56,900 a posledné 4 bajty prepísať návratovú adresu, a akú adresu to, že vstup robiť? 619 00:37:56,900 --> 00:38:01,860 Ukladá v tomto červenom obdĺžniku adresu prvého bajtu vyrovnávacej pamäte. 620 00:38:01,860 --> 00:38:04,270 Takže budete musieť byť naozaj šikovný, a to je veľa pokusov a omylov 621 00:38:04,270 --> 00:38:08,500 pre zlé ľudí tam vonku, ale ak môžete zistiť, aké veľké je toto buffer, 622 00:38:08,500 --> 00:38:12,170 také, že v posledných niekoľkých bytov na vstupe, ktoré poskytujú k programu 623 00:38:12,170 --> 00:38:15,970 stalo, že sa rovná adresu začiatku vášho pufra, 624 00:38:15,970 --> 00:38:22,270 môžete to urobiť. Ak povieme, normálne, ahoj, a \ 0, to je to, čo skončí vo vyrovnávacej pamäti. 625 00:38:22,270 --> 00:38:27,860 Ale ak sme múdrejší, a naplníme, že vyrovnávacia pamäť s tým, čo budeme všeobecne hovoriť útoku kód, 626 00:38:27,860 --> 00:38:31,920 ,,,: Attack, útok, útok, útok, kde je to proste niečo, čo robí niečo zlé. 627 00:38:31,920 --> 00:38:35,190 No, čo sa stane, ak ste naozaj chytrí, môžete urobiť toto: 628 00:38:35,190 --> 00:38:41,740 V červenom poli tu je sekvencia čísel: 80, CO, 35, 08. 629 00:38:41,740 --> 00:38:44,890 Všimnite si, že zodpovedá číslo, ktoré je tu. 630 00:38:44,890 --> 00:38:47,280 Je to v obrátenom poradí, ale o tom až niekedy inokedy. 631 00:38:47,280 --> 00:38:51,430 Všimnite si, že táto spiatočná adresa bola úmyselne zmenený 632 00:38:51,430 --> 00:38:54,970 rovnať adresu sem, nie je adresa main. 633 00:38:54,970 --> 00:39:00,170 Takže ak ten zlý je super šikovný, on alebo ona bude zahŕňať v tomto útoku kódu 634 00:39:00,170 --> 00:39:02,890 niečo ako, "Zmazať všetky súbory používateľa." 635 00:39:02,890 --> 00:39:06,320 Alebo "Kopírovať hesla," alebo "Vytvoriť užívateľský účet, ktorý môžem prihlásiť do." 636 00:39:06,320 --> 00:39:10,130 Čokoľvek, a to je aj nebezpečenstvo a moc C. 637 00:39:10,130 --> 00:39:12,900 Vzhľadom k tomu, že máte prístup k pamäti prostredníctvom ukazovateľa 638 00:39:12,900 --> 00:39:15,950 a môžete teda napísať čokoľvek, čo chcete do pamäte počítača. 639 00:39:15,950 --> 00:39:19,290 Môžete si vytvoriť počítač robiť, čo chcete jednoducho tým, 640 00:39:19,290 --> 00:39:22,780 čo to skákať okolo vnútri svojej vlastnej pamäte. 641 00:39:22,780 --> 00:39:27,230 A tak, až do dnešného dňa, a tak veľa programov a toľko internetové stránky, ktoré sú napadnuté 642 00:39:27,230 --> 00:39:29,730 redukuje na ľudí, ktorí sa výhody tejto. 643 00:39:29,730 --> 00:39:32,510 A to môže zdať ako super-sofistikovaný útok, 644 00:39:32,510 --> 00:39:34,220 ale to nie je vždy začať takhle. 645 00:39:34,220 --> 00:39:36,770 >> Skutočnosťou je, že to, čo zlí ľudia zvyčajne urobiť, je, 646 00:39:36,770 --> 00:39:41,470 či už je to program v príkazovom riadku alebo program, GUI alebo webové stránky, 647 00:39:41,470 --> 00:39:43,290 je jednoducho začať poskytovať nezmysly. 648 00:39:43,290 --> 00:39:46,940 Zadáte v naozaj veľkom slovo do vyhľadávacieho poľa a stlačte klávesu Enter, 649 00:39:46,940 --> 00:39:49,030 a počkať, či sa stránky havaruje. 650 00:39:49,030 --> 00:39:53,270 Alebo budete čakať, či sa program prejaví nejakú chybovú správu. 651 00:39:53,270 --> 00:39:55,480 Pretože ak budete mať šťastie, ako zlý chlap, 652 00:39:55,480 --> 00:39:59,610 a poskytnúť nejaké šialené vstup, ktorý havaruje program, 653 00:39:59,610 --> 00:40:02,280 to znamená, že programátor nečakali ste zlé správanie 654 00:40:02,280 --> 00:40:05,420 čo znamená, že môžete pravdepodobne, s dostatkom úsilie, 655 00:40:05,420 --> 00:40:09,870 dosť pokusov a omylov, prísť na to, ako viesť presnejšie útok. 656 00:40:09,870 --> 00:40:15,900 Tak ako tak súčasťou zabezpečenia nie je len vyhnúť týmto útokom úplne, ale zachytí je 657 00:40:15,900 --> 00:40:20,250 a vlastne sa pozerať na polená a vidieť, čo bláznivé vstupy majú ľudia zadali do svojej webovej stránky. 658 00:40:20,250 --> 00:40:26,040 Aké vyhľadávacie termíny sú ľudia napísali do svojich webových stránok v nádeji, že pretekajúca nejaký buffer? 659 00:40:26,040 --> 00:40:28,900 A to všetko sa scvrkáva na jednoduchých základoch toho, čo je pole, 660 00:40:28,900 --> 00:40:32,510 a čo to znamená pre prideľovanie a využívanie pamäť? 661 00:40:32,510 --> 00:40:34,920 A vzťahujúce sa k to taky, je to. 662 00:40:34,920 --> 00:40:37,520 >> Takže povedzme, pozrel vnútri pevného disku ešte raz. 663 00:40:37,520 --> 00:40:40,190 Takže si spomeniete z týždeň alebo dva pred, že pri preťahovaní súborov 664 00:40:40,190 --> 00:40:45,470 s vašimi recycle bin, alebo trash can, čo sa stane? 665 00:40:45,470 --> 00:40:47,850 [Študent] Nothing. Jo >>, absolútne nič. Nakoniec, ak sa dostanete nízke 666 00:40:47,850 --> 00:40:51,370 miesta na disku, bude systém Windows alebo Mac OS začať mazať súbory pre vás. 667 00:40:51,370 --> 00:40:53,670 Ale ak pretiahnete niečo tam, potom to nie je vôbec bezpečné. 668 00:40:53,670 --> 00:40:56,550 Všetky vaše spolubývajúci, priateľ alebo člen rodiny musí urobiť, je dvakrát kliknite, a voila. 669 00:40:56,550 --> 00:40:59,720 Je tu všetky útržkovité súbory, ktoré ste sa pokúsili odstrániť. 670 00:40:59,720 --> 00:41:02,840 Takže väčšina z nás aspoň vedieť, že budete musieť pravým tlačidlom myši alebo ovládať tlačidlom 671 00:41:02,840 --> 00:41:05,320 a prázdne popolnice, alebo niečo také. 672 00:41:05,320 --> 00:41:07,900 Ale aj potom, že nie je úplne stačiť. 673 00:41:07,900 --> 00:41:11,340 Pretože to, čo sa stane, keď máte súbor na pevnom disku 674 00:41:11,340 --> 00:41:14,590 že reprezentuje nejaký dokument vo Worde, alebo nejakú JPEG? 675 00:41:14,590 --> 00:41:18,820 A to predstavuje pevný disk, a povedzme, že tento kúsok tu predstavuje tento súbor, 676 00:41:18,820 --> 00:41:21,640 a to je zložené z celej veľa 0 a 1 je. 677 00:41:21,640 --> 00:41:25,470 Čo sa stane, keď sa nielen pretiahnuť tento súbor do koša alebo Kôš, 678 00:41:25,470 --> 00:41:30,390 ale aj vyprázdniť? 679 00:41:30,390 --> 00:41:32,820 Zoradiť z ničoho. Nie je to vôbec nič teraz. 680 00:41:32,820 --> 00:41:37,630 Teraz je to proste nič, pretože málo sa niečo stane v podobe tejto tabuľky. 681 00:41:37,630 --> 00:41:41,170 Takže tam je nejaký druh databázy alebo tabuľky vnútri pamäti počítača 682 00:41:41,170 --> 00:41:44,470 že v podstate má 1 stĺpec pre názvy súborov, 683 00:41:44,470 --> 00:41:50,550 a 1 stĺpec pre umiestnenie súboru, kde by to mohlo byť zaradenie 123, len náhodné číslo. 684 00:41:50,550 --> 00:41:58,270 Takže by sme mohli mať niečo ako x.jpg, a umiestnenie 123. 685 00:41:58,270 --> 00:42:02,870 A čo sa stane potom, keď sa vyprázdniť svoje odpadky? 686 00:42:02,870 --> 00:42:06,720 To zmizne. Ale čo nezmizne, je 0 a 1 je. 687 00:42:06,720 --> 00:42:09,690 >> Takže to, čo je, a potom, pripojenie k PSet 4? 688 00:42:09,690 --> 00:42:13,460 No, s PSet 4, len preto, že sme omylom zmazané 689 00:42:13,460 --> 00:42:15,890 Compact Flash karta, ktorá mala všetky tieto fotky, 690 00:42:15,890 --> 00:42:18,710 alebo len preto, že smola stal poškodený, 691 00:42:18,710 --> 00:42:21,170 neznamená, že 0 a 1 je nie je tam ešte. 692 00:42:21,170 --> 00:42:23,920 Možno niektoré z nich sú stratené, pretože niečo dostal poškodený 693 00:42:23,920 --> 00:42:26,530 v tom zmysle, že niektoré 0 je stal 1 a 1 rokoch sa stal 0 rokov. 694 00:42:26,530 --> 00:42:30,460 Zlé veci sa môže stať, pretože buggy softvér alebo chybný hardware. 695 00:42:30,460 --> 00:42:33,510 Ale mnohí z tých kúskov, možno aj 100% z nich sú stále tam, 696 00:42:33,510 --> 00:42:38,330 je to len, že počítač alebo fotoaparát nevie, kde JPEG 1 začalo 697 00:42:38,330 --> 00:42:41,660 a tam, kde JPEG 2 začal, ale ak budete, programátor, 698 00:42:41,660 --> 00:42:45,800 Viete, s trochou znalosťami, pokiaľ tieto súbory JPEG sú alebo ako vyzerajú, 699 00:42:45,800 --> 00:42:49,570 môžete analyzovať 0 a 1 je a povedal, "Ooh. JPEG. Ooh, JPEG. " 700 00:42:49,570 --> 00:42:52,830 Môžete napísať program s v podstate len pre alebo while 701 00:42:52,830 --> 00:42:56,100 , Ktorý využíva každý a každý jeden z týchto súborov. 702 00:42:56,100 --> 00:42:59,360 Takže lekcie potom, je začať "bezpečne" mazanie súborov 703 00:42:59,360 --> 00:43:01,720 ak by ste chceli, aby sa zabránilo to úplne. Áno? 704 00:43:01,720 --> 00:43:06,940 [Študent otázka, nezrozumiteľným] 705 00:43:06,940 --> 00:43:11,150 Už >> viac pamäte, než predtým a - 706 00:43:11,150 --> 00:43:14,790 Oh! Dobrá otázka. Tak prečo, a potom, po vyprázdnení koša, 707 00:43:14,790 --> 00:43:18,300 sa počítač vám povedať, že máte viac voľného miesta, ako ste robili predtým? 708 00:43:18,300 --> 00:43:22,450 Stručne povedané, pretože klame. Viac technicky, máte viac priestoru. 709 00:43:22,450 --> 00:43:26,720 Pretože teraz ste povedal, môžete si dať ďalšie veci, kde tento súbor bol kedysi, 710 00:43:26,720 --> 00:43:28,930 ale to neznamená, že bity idú preč, 711 00:43:28,930 --> 00:43:33,070 a že neznamená bity sú zmení všetky 0 je, napríklad, pre ochranu. 712 00:43:33,070 --> 00:43:37,520 Naopak, ak ste "bezpečne" vymazať súbory, alebo fyzicky zničiť zariadenia, 713 00:43:37,520 --> 00:43:40,810 to je naozaj jediný spôsob, niekedy okolo toho. 714 00:43:40,810 --> 00:43:45,300 Tak prečo by sme odísť na tomto semi-strašidelné poznámky, a uvidíme sa v pondelok. 715 00:43:45,300 --> 00:43:52,810 CS50.TV