1 00:00:00,000 --> 00:00:02,860 [Powered by Google Translate] [5. týždeň] 2 00:00:02,860 --> 00:00:04,860 [David J. Malan - Harvard University] 3 00:00:04,860 --> 00:00:07,260 [To je CS50. - CS50.TV] 4 00:00:07,260 --> 00:00:09,740 >> To je CS50, 5. týždeň. 5 00:00:09,740 --> 00:00:12,900 Dnes a tento týždeň, predstavíme trochu svete forenznú 6 00:00:12,900 --> 00:00:14,850 v kontexte problému Set 4. 7 00:00:14,850 --> 00:00:18,480 Dnes bude skrátený prednáška, pretože tam je zvláštne udalosť v tú potom. 8 00:00:18,480 --> 00:00:21,940 Takže budeme sa pozrieť a dráždiť obaja študentov aj ich rodičia dnes 9 00:00:21,940 --> 00:00:24,600 s niektorými z vecí, ktoré sú na obzore. 10 00:00:24,600 --> 00:00:29,050 >> Medzi nimi, v pondelok, budete mať niekoľko ďalších spolužiakov. 11 00:00:29,050 --> 00:00:32,980 EDX, Harvard a MIT nových on-line iniciatíva pre OpenCourseWare a viac, 12 00:00:32,980 --> 00:00:36,730 začína na akademickej pôde Harvarde v pondelok, čo znamená, že príde pondelok 13 00:00:36,730 --> 00:00:40,930 budete mať, ako posledné sčítanie, 86000 ďalšie spolužiakmi 14 00:00:40,930 --> 00:00:43,680 ktorí budú sledovať spolu s prednáškami CS50 tieto a profilov 15 00:00:43,680 --> 00:00:45,890 a návody a problémové súbory. 16 00:00:45,890 --> 00:00:51,870 A ako súčasť tohto, stanete sa členmi inauguračnej triedy CS50 a teraz CS50x. 17 00:00:51,870 --> 00:00:56,150 Ako súčasť teraz si uvedomiť, že tam budú nejaké upsides rovnako. 18 00:00:56,150 --> 00:01:00,620 Ak chcete získať pripravený na to, pre masívne počet študentov, 19 00:01:00,620 --> 00:01:03,820 stačí povedať, že aj keď máme 108 TFS a CAS, 20 00:01:03,820 --> 00:01:07,560 to nie je tak celkom najlepší študent-učiteľ pomer, akonáhle sa dostaneme 80.000 študentov. 21 00:01:07,560 --> 00:01:09,830 Nebudeme sa triedenie toľko problém nastaví ručne, 22 00:01:09,830 --> 00:01:13,050 tak predstavil tento týždeň v problémovej sady budú CS50 Check, 23 00:01:13,050 --> 00:01:15,410 ktorá sa bude nástroj príkazového riadku vnútri umývačky 24 00:01:15,410 --> 00:01:17,880 že budete mať po aktualizácii neskôr tento víkend. 25 00:01:17,880 --> 00:01:21,030 Budete môcť spustiť príkaz, check50, na vlastné PSet, 26 00:01:21,030 --> 00:01:24,770 a budete mať okamžitú spätnú väzbu o tom, či je váš program je správne alebo nesprávne 27 00:01:24,770 --> 00:01:27,980 podľa rôznych konštrukčných špecifikácií, ktoré sme poskytli. 28 00:01:27,980 --> 00:01:30,310 Viac na ktoré v špecifikácii problému set. 29 00:01:30,310 --> 00:01:34,220 The CS50x spolužiaci budú používať to rovnako. 30 00:01:34,220 --> 00:01:36,170 >> Problém Set 4 je všetko o kriminalistike, 31 00:01:36,170 --> 00:01:38,630 a to Pset naozaj inšpirovaný nejakým real-life veci 32 00:01:38,630 --> 00:01:41,210 pričom, keď som bol v postgraduálnom štúdiu som internovaný na chvíľu 33 00:01:41,210 --> 00:01:45,270 s Middlesex County je okresné zastupiteľstvo robí forenznej prácu 34 00:01:45,270 --> 00:01:47,660 s ich hlavnou forenznú vyšetrovateľ. 35 00:01:47,660 --> 00:01:50,280 Čo to robil, ako myslím, že som spomenul niekoľko týždňov minulosti, 36 00:01:50,280 --> 00:01:52,720 je polícia Mass štát alebo iní by prísť, 37 00:01:52,720 --> 00:01:56,150 by odísť veci ako pevné disky a CD a diskiet a podobne, 38 00:01:56,150 --> 00:01:58,770 a potom cieľom forenznej kancelárie bolo zistiť 39 00:01:58,770 --> 00:02:01,470 či bol alebo nebol dôkaz nejakého druhu. 40 00:02:01,470 --> 00:02:04,730 To bolo zvláštne Oddelenie pre vyšetrovanie, tak to bolo úradnícky zločin. 41 00:02:04,730 --> 00:02:10,949 Bolo to viac znepokojujúce druh trestných činov, nič zahŕňajúce nejakú digitálnych médií. 42 00:02:10,949 --> 00:02:16,450 Ukazuje sa, že nie, že mnoho ľudí napísať e-mail hovoriť, "ja to urobil." 43 00:02:16,450 --> 00:02:20,490 Takže docela často, tieto forenznú vyhľadávanie neobjavil všade toľko ovocia, 44 00:02:20,490 --> 00:02:22,820 ale niekedy ľudia by písať také e-maily. 45 00:02:22,820 --> 00:02:25,240 Takže niekedy, boli odmenení úsilie. 46 00:02:25,240 --> 00:02:31,210 >> Ale viesť až k tomuto forenznú PSet, budeme zavádzať na pset4 trochu grafiky. 47 00:02:31,210 --> 00:02:35,410 Pravdepodobne ste sa tieto veci ako samozrejmosť - JPEG, GIF, a podobne - v týchto dňoch. 48 00:02:35,410 --> 00:02:38,320 Ale ak si naozaj myslíte, že o tom, obraz, podobne ako tvár Rob, 49 00:02:38,320 --> 00:02:41,270 môže byť modelovaný ako sled bodiek alebo pixelov. 50 00:02:41,270 --> 00:02:43,380 V prípade tváre Robertov, je tu všetky druhy farieb, 51 00:02:43,380 --> 00:02:46,760 a začali sme vidieť jednotlivé body, inak známy ako pixely, 52 00:02:46,760 --> 00:02:48,610 akonáhle sme začali pre priblíženie 53 00:02:48,610 --> 00:02:54,660 Ale ak budeme zjednodušovať svet o trochu a len povedať, že toto je Rob v čiernej a bielej, 54 00:02:54,660 --> 00:02:57,490 k reprezentácii čiernej a bielej, môžeme jednoducho použiť binárne. 55 00:02:57,490 --> 00:03:01,660 A ak budeme používať binárne, 1 alebo 0, môžeme vyjadriť rovnaký obrázok 56 00:03:01,660 --> 00:03:06,140 usmievavá tvár Robertov s týmto vzorom bitov. 57 00:03:06,140 --> 00:03:12,100 11000011 predstavuje biela, biela, čierna, čierna, čierna, čierna, biela, biela. 58 00:03:12,100 --> 00:03:16,150 A tak to nie je obrovský skok a potom začať hovoriť o farebných fotografiách, 59 00:03:16,150 --> 00:03:18,600 veci, ktoré by ste vidieť na Facebooku, alebo sa s digitálnym fotoaparátom. 60 00:03:18,600 --> 00:03:21,410 Ale iste, pokiaľ ide o farby, budete potrebovať viac bitov. 61 00:03:21,410 --> 00:03:25,690 A celkom bežné vo svete fotografií je použiť nie 1-bitové farby, 62 00:03:25,690 --> 00:03:29,560 , Pretože to naznačuje, ale 24-bitové farby, kam vlastne získať milióny farieb. 63 00:03:29,560 --> 00:03:32,250 Tak ako v prípade, keď sme sa priblížili na oko Rob, 64 00:03:32,250 --> 00:03:36,370 , Ktorý bol ľubovoľný počet miliónov rôznych farebných možností. 65 00:03:36,370 --> 00:03:39,040 Takže budeme zavádzať to v probléme Set 4 rovnako ako v návode, 66 00:03:39,040 --> 00:03:43,370 ktorá bude dnes v 03:30 namiesto obvyklých 02:30, pretože prednášky piatkovom tu. 67 00:03:43,370 --> 00:03:46,620 Ale video bude on-line ako obvykle zajtra. 68 00:03:46,620 --> 00:03:48,820 >> Budeme tiež predstaví vám do iného formátu. 69 00:03:48,820 --> 00:03:51,270 Toto je zámerne chcel pozrieť zastrašujúce na prvý, 70 00:03:51,270 --> 00:03:55,670 ale to je len nejaká dokumentácia pre struct C. 71 00:03:55,670 --> 00:03:58,940 Ukazuje sa, že Microsoft pred rokmi pomohol popularizovať tento formát 72 00:03:58,940 --> 00:04:05,150 volal bitmapový formát súboru, bmp, a to bolo super jednoduché, farebné grafické formát súboru 73 00:04:05,150 --> 00:04:10,150 , Ktorá bola použitá pre docela nejaký čas, a niekedy ešte pre tapety na stolné počítače. 74 00:04:10,150 --> 00:04:14,760 Ak si myslíte, že späť na systém Windows XP a zvlnené kopce a modrú oblohu, 75 00:04:14,760 --> 00:04:17,170 to bolo typicky bmp alebo bitmapový obraz. 76 00:04:17,170 --> 00:04:19,959 Bitmapy sú zábavné pre nás, pretože majú trochu väčšiu komplexnosť. 77 00:04:19,959 --> 00:04:22,610 Nie je to tak jednoduché, ako tento mriežka 0s a 1s. 78 00:04:22,610 --> 00:04:27,510 Namiesto toho máte veci ako hlavičky na začiatku súboru. 79 00:04:27,510 --> 00:04:31,990 Takže inými slovami, vo vnútri. Súbor BMP je celá partia 0s a 1s, 80 00:04:31,990 --> 00:04:34,910 ale tam je nejaký ďalší 0s a 1s tam. 81 00:04:34,910 --> 00:04:38,220 A ukázalo sa, že to, čo sme pravdepodobne zaujatý za samozrejmosť rokov - 82 00:04:38,220 --> 00:04:45,170 formáty súborov, ako. doc alebo. xls alebo. mp3, mp4., bez ohľadu na formáty súborov 83 00:04:45,170 --> 00:04:48,480 že ste sa zoznámili s - čo to vôbec znamená byť formát súboru, 84 00:04:48,480 --> 00:04:52,480 pretože na konci dňa všetky tieto súbory používame majú len 0 a 1. 85 00:04:52,480 --> 00:04:56,810 A možno ti 0s a 1s predstavujú ABC cez ASCII alebo ako, 86 00:04:56,810 --> 00:04:58,820 ale na konci dňa, je to ešte len 0 a 1. 87 00:04:58,820 --> 00:05:02,100 Takže ľudia len občas rozhodnú vymyslieť nový formát súborov 88 00:05:02,100 --> 00:05:06,420 kde štandardizovať čo vzory bitov bude skutočne znamenať. 89 00:05:06,420 --> 00:05:09,220 A v tomto prípade tu, že ľudia, ktorí navrhli bitmapový formát súboru 90 00:05:09,220 --> 00:05:15,620 povedal, že pri prvom bajtu v rastrového súboru, ako ich označil ofsetových 0 tam, 91 00:05:15,620 --> 00:05:18,940 tam bude nejaký nezrozumiteľné názvy premenné volal bfType, 92 00:05:18,940 --> 00:05:23,080 ktorý práve skratka pre bitmapový typ súboru, aký typ rastrového súboru je to. 93 00:05:23,080 --> 00:05:27,700 Môžete vyvodiť snáď z druhej rady, ktorá ofsetovou 2, byte číslo 2, 94 00:05:27,700 --> 00:05:33,740 má vzor 0s a 1s, ktorý predstavuje to, čo? Veľkosť niečo. 95 00:05:33,740 --> 00:05:35,310 A to ide o odtiaľ. 96 00:05:35,310 --> 00:05:37,410 Takže v problému Set 4, budete prešiel niektoré z týchto vecí. 97 00:05:37,410 --> 00:05:39,520 Nebudeme skončiť starať o všetky z nich. 98 00:05:39,520 --> 00:05:47,510 Všimnime si ale, že začína byť zaujímavé okolie bytu 54: rgbtBlue, zelená, červená a 99 00:05:47,510 --> 00:05:52,110 Ak ste niekedy počuli skratka RGB - červená, zelená, modrá - to je odkaz na ktorý 100 00:05:52,110 --> 00:05:54,610 pretože sa ukázalo, môžete maľovať všetky farby dúhy 101 00:05:54,610 --> 00:05:58,180 s nejakou kombináciu červenej a modrej a zelenej. 102 00:05:58,180 --> 00:06:03,320 A v skutočnosti, môže rodičia v izbe pripomenúť niektoré z prvých projektorov. 103 00:06:03,320 --> 00:06:05,890 V týchto dňoch, stačí vidieť jeden jasne svetlo prichádzajúce z objektívu, 104 00:06:05,890 --> 00:06:09,800 ale späť v deň, kedy mal červenú šošovicu, modré šošovky, a zelené objektív, 105 00:06:09,800 --> 00:06:13,380 a spoločne sa snažili na obrazovku a tvoril farebné fotografie. 106 00:06:13,380 --> 00:06:16,270 A docela často, by stredné školy a vysoké školy majú tieto šošovky 107 00:06:16,270 --> 00:06:19,720 niekedy tak trochu nakrivo, takže si trochu vidieť dvojlôžkových a trojlôžkových obrázkov. 108 00:06:19,720 --> 00:06:24,100 Ale to bol nápad. Vy ste mali červené a zelené a modré svetlo maľovanie obrazu. 109 00:06:24,100 --> 00:06:26,590 A to rovnaký princíp je použitý v počítačoch. 110 00:06:26,590 --> 00:06:30,230 >> Takže medzi úlohami potom pre vás v probléme Set 4 sa bude pár vecí. 111 00:06:30,230 --> 00:06:34,800 Jedným z nich je skutočne zmeniť veľkosť obrázka, aby sa vo vzore 0s a 1s, 112 00:06:34,800 --> 00:06:40,200 zistiť, ktoré kúsky 0s a 1s predstavujú to, čo do štruktúry ako je tento, 113 00:06:40,200 --> 00:06:43,630 a potom zistiť, ako replikovať pixelov - Reds, blues, Zelení - 114 00:06:43,630 --> 00:06:46,660 vnútri tak, že keď obraz vyzerá spočiatku, 115 00:06:46,660 --> 00:06:49,210 by to mohlo vyzerať toto miesto po tom. 116 00:06:49,210 --> 00:06:53,640 Medzi ďalšie problémy príliš sa bude, že budete podal súdne obrázok 117 00:06:53,640 --> 00:06:56,030 o skutočnom súboru z digitálneho fotoaparátu. 118 00:06:56,030 --> 00:06:58,960 A na tomto fotoaparáte, kedysi, boli celá partia fotografií. 119 00:06:58,960 --> 00:07:03,760 Problém je, že sme náhodnému zmazanie alebo mal obraz poškodený nejako. 120 00:07:03,760 --> 00:07:05,750 Zlé veci sa stávajú digitálnymi fotoaparátmi. 121 00:07:05,750 --> 00:07:09,150 A tak sme sa rýchlo kopírovať všetky 0s a 1s vypnutie tejto karty pre Vás, 122 00:07:09,150 --> 00:07:13,610 zachránil všetko v jednom veľkom súbore, a potom budeme odovzdať vám je v probléme Set 4 123 00:07:13,610 --> 00:07:19,320 takže môžete napísať program v C, s ktorými sa obnoviť všetky tieto JPEG, ideálne. 124 00:07:19,320 --> 00:07:23,330 A ukázalo sa, že JPEG, aj keď sú trochu zložité formáte - 125 00:07:23,330 --> 00:07:26,360 sú oveľa zložitejšie, než tento úsmevom na tvári tu - 126 00:07:26,360 --> 00:07:31,160 ukazuje sa, že každý JPEG začína rovnakými vzormi 0s a 1s. 127 00:07:31,160 --> 00:07:35,630 Takže pomocou, nakoniec, while alebo pre slučku alebo podobné, 128 00:07:35,630 --> 00:07:38,880 môžete určiť iteráciou cez všetky 0s a 1s v tomto súdnom obrazu, 129 00:07:38,880 --> 00:07:43,150 a zakaždým, keď vidíte špeciálny vzor, ​​ktorý je definovaný v špecifikácii problému set, 130 00:07:43,150 --> 00:07:47,880 môžete predpokladať, tu je, s veľmi vysokou pravdepodobnosťou, začiatok JPEG. 131 00:07:47,880 --> 00:07:51,230 A akonáhle zistíte, rovnaký vzor určitý počet bajtov 132 00:07:51,230 --> 00:07:55,430 alebo kilobytoch alebo megabytoch neskôr, môžete predpokladať, tu je druhá JPEG, 133 00:07:55,430 --> 00:07:57,380 foto som vzal po prvom. 134 00:07:57,380 --> 00:08:01,370 Dovoľte mi, aby som prestať čítať, že prvý súbor, začnite písať tento nový, 135 00:08:01,370 --> 00:08:06,310 a výstup programu pre pset4 bude toľko ako 50 JPEG. 136 00:08:06,310 --> 00:08:09,270 A ak to nie je 50 JPEG záberov, budete mať trochu slučky. 137 00:08:09,270 --> 00:08:12,490 Ak máte nekonečný počet JPEG, máte nekonečnú slučku. 138 00:08:12,490 --> 00:08:14,910 Takže aj bude celkom bežný prípad. 139 00:08:14,910 --> 00:08:16,600 Takže to je to, čo je na obzore. 140 00:08:16,600 --> 00:08:21,310 >> Kvíz 0 za nami, si uvedomiť, za môj e-mail, že vždy existujú ľudia, ktorí sú obaja šťastní, 141 00:08:21,310 --> 00:08:23,640 druh neutrálne a smutný okolo kvíz 0 času. 142 00:08:23,640 --> 00:08:26,800 A prosím, dostať sa ku mne, hlava TF Zamyla, vlastné TF, 143 00:08:26,800 --> 00:08:31,180 alebo jeden z úradov, ktoré budete vedieť, či by ste chceli diskutovať o tom, ako to šlo. 144 00:08:31,180 --> 00:08:35,539 >> Takže zapôsobiť na rodičov tu v izbe, čo je CS50 knižnica? 145 00:08:36,429 --> 00:08:40,390 [Smiech] Dobrá práce. 146 00:08:40,390 --> 00:08:48,340 Čo je to CS50 knižnica? Jo. >> [Študent] Je to pre-písaný súbor kódu [nepočuteľné] 147 00:08:48,340 --> 00:08:49,750 Dobre, dobre. 148 00:08:49,750 --> 00:08:53,240 Je to pre-písaný súbor kódu, ktorý pracovníci napísali, ktoré vám poskytneme, 149 00:08:53,240 --> 00:08:55,030 , Ktorá poskytuje niektoré spoločné funkcie, 150 00:08:55,030 --> 00:08:59,020 Veci ako sa mi reťazec, aby som int - všetky funkcie, ktoré sú tu uvedené. 151 00:08:59,020 --> 00:09:02,260 >> Od teraz, začneme skutočne brať tieto vzdelávacie kolesá off. 152 00:09:02,260 --> 00:09:05,050 Budeme začať vziať reťazec od vás, 153 00:09:05,050 --> 00:09:08,870 ktoré pripomínajú bol len synonymom pre aký skutočný dátový typ? [Viac >> študenti] Char *. 154 00:09:08,870 --> 00:09:12,730 Char *. Pre rodičov, to bolo asi [je whooshing zvuk]. To je dobre. 155 00:09:12,730 --> 00:09:17,550 Char * začneme vidieť na obrazovke všetky viac ako odstrániť reťazec z nášho slovníka, 156 00:09:17,550 --> 00:09:19,730 aspoň pokiaľ ide o skutočnosti písania kódu. 157 00:09:19,730 --> 00:09:22,840 Podobne, prestaneme s použitím niektorej z týchto funkcií až 158 00:09:22,840 --> 00:09:25,280 pretože naše programy sa dostať sofistikovanejšie. 159 00:09:25,280 --> 00:09:28,480 Skôr než len písať programy, ktoré sedí tam s riadku bliká, 160 00:09:28,480 --> 00:09:31,870 čaká na užívateľa, aby niečo písať v, dostanete vaše vstupy odinakiaľ. 161 00:09:31,870 --> 00:09:35,490 Napríklad, budete si ich z radu bitov na lokálny pevný disk. 162 00:09:35,490 --> 00:09:38,580 Budete miesto si v budúcnosti od pripojenia k sieti, 163 00:09:38,580 --> 00:09:40,230 Niektoré webové stránky niekde. 164 00:09:40,230 --> 00:09:44,110 >> Takže poďme Zlúpnite tejto vrstvy prvýkrát a zdvihnite CS50 Appliance 165 00:09:44,110 --> 00:09:49,010 a tento súbor s názvom cs50.h, ktoré ste # vrátane týždňov, 166 00:09:49,010 --> 00:09:51,140 ale poďme skutočne vidieť, čo je vo vnútri toho. 167 00:09:51,140 --> 00:09:54,430 V hornej časti súboru v modrej farbe je len celá partia komentárov: 168 00:09:54,430 --> 00:09:57,050 Informácie o záruke a licencovania. 169 00:09:57,050 --> 00:09:59,050 To je druh spoločného paradigmy v softvéru 170 00:09:59,050 --> 00:10:01,580 pretože veľa softvér v týchto dňoch je to, čo sa nazýva open source, 171 00:10:01,580 --> 00:10:05,220 čo znamená, že niekto napísal kód a robil to voľne k dispozícii 172 00:10:05,220 --> 00:10:10,470 nielen spustiť a používať, ale skutočne čítať a meniť a integrovať do svojej vlastnej práce. 173 00:10:10,470 --> 00:10:14,660 Takže to je to, čo ste doteraz používali, open source softvér, aj keď vo veľmi malom formulára. 174 00:10:14,660 --> 00:10:18,560 Keby som posunúť dole okolo pripomienky, keď začneme sa pozrieť na nejaké ďalšie známe veci. 175 00:10:18,560 --> 00:10:25,010 Upozornenie na vrchole tu súbor cs50.h obsahuje veľa hlavičkových súborov. 176 00:10:25,010 --> 00:10:28,560 Väčšina z nich, sme ešte nevideli, ale jeden je oboznámený. 177 00:10:28,560 --> 00:10:32,270 Ktorý z nich sme videli, hoci krátko, tak ďaleko? >> [Študent] Štandardná knižnica. 178 00:10:32,270 --> 00:10:35,810 Jo, štandardné knižnice. stdlib.h má malloc. 179 00:10:35,810 --> 00:10:38,320 Akonáhle sme začali hovoriť o dynamické prideľovanie pamäti, 180 00:10:38,320 --> 00:10:41,650 ktoré sa vrátime na budúci týždeň, rovnako, sme začali vrátane tohto súboru. 181 00:10:41,650 --> 00:10:46,640 Ukazuje sa, že bool a pravdivé a falošné robiť nie vlastne existovať v C samo o sebe 182 00:10:46,640 --> 00:10:49,440 ak tento súbor zahrnúť tu. 183 00:10:49,440 --> 00:10:52,710 Sme celé týždne boli, vrátane stdbool.h 184 00:10:52,710 --> 00:10:55,620 takže môžete použiť pojem bool, true alebo false. 185 00:10:55,620 --> 00:10:58,620 Bez toho, mali by ste sa trochu falošné neho a použiť int 186 00:10:58,620 --> 00:11:02,610 a len svojvoľne predpokladať, že 0 je false a 1 je pravda. 187 00:11:02,610 --> 00:11:07,150 Ak by sme posunúť nadol ďalej, tu je naša definícia reťazca. 188 00:11:07,150 --> 00:11:11,390 Ukázalo sa, ako sme povedali skôr, že ak táto hviezda je naozaj nezáleží. 189 00:11:11,390 --> 00:11:13,720 Môžete dokonca mať priestor všade okolo. 190 00:11:13,720 --> 00:11:16,740 Sme tento semester boli jej reklamu, pretože to aby bolo jasné, 191 00:11:16,740 --> 00:11:18,620 že hviezda má čo do činenia s typom, 192 00:11:18,620 --> 00:11:21,700 ale uvedomte si, rovnako bežné, ak nie o niečo častejšie, 193 00:11:21,700 --> 00:11:24,430 je to tam dal, ale funkčne je to to isté. 194 00:11:24,430 --> 00:11:27,720 Ale teraz, keď čítame stanovuje ďalšie, poďme sa pozrieť na GetInt 195 00:11:27,720 --> 00:11:32,190 pretože sme použili, že možno skôr, ako čokoľvek iného tento semester. 196 00:11:32,190 --> 00:11:37,440 Tu je GetInt. To je to, čo? >> [Študent] prototyp. >> To je len prototyp. 197 00:11:37,440 --> 00:11:41,410 Často, dali sme prototypy na vrcholky našich. C súbory, 198 00:11:41,410 --> 00:11:46,690 ale môžete tiež dať prototypy v hlavičkových súboroch,. h súbory, ako je tento tu 199 00:11:46,690 --> 00:11:50,840 takže keď budete písať nejaké funkcie, ktoré chcete, aby ostatní ľudia mohli používať, 200 00:11:50,840 --> 00:11:53,550 čo je presne prípad knižnice CS50, 201 00:11:53,550 --> 00:11:57,040 môžete nielen realizovať svoje funkcie v niečo ako cs50.c, 202 00:11:57,040 --> 00:12:02,790 si tiež dať prototypy nie sú v hornej časti tohto súboru, ale v hornej časti hlavičky súboru. 203 00:12:02,790 --> 00:12:07,170 Potom, že hlavičkový súbor je to, čo priatelia a kolegovia patrí 204 00:12:07,170 --> 00:12:09,760 s # include vo svojom vlastnom kódu. 205 00:12:09,760 --> 00:12:12,210 Takže celú tú dobu, čo ste boli, vrátane všetkých týchto prototypov, 206 00:12:12,210 --> 00:12:16,580 účinne na začiatok súboru, ale prostredníctvom tohto # zahŕňa mechanizmus, 207 00:12:16,580 --> 00:12:20,070 ktoré v podstate kópia a pasty tento súbor do svojej vlastnej. 208 00:12:20,070 --> 00:12:23,070 Tu je niekoľko pomerne podrobná dokumentácia. 209 00:12:23,070 --> 00:12:25,640 Sme skoro za samozrejmé, že GetInt dostane int, 210 00:12:25,640 --> 00:12:27,640 ale to dopadá tam sú niektoré rohové prípady. 211 00:12:27,640 --> 00:12:31,810 Čo keď používateľ zadá do položky, ktorá je príliš veľké, quintillion, 212 00:12:31,810 --> 00:12:35,490 že jednoducho nemôže vojsť z int? Čo je to očakávané správanie? 213 00:12:35,490 --> 00:12:38,020 V ideálnom prípade, je to predvídateľné. 214 00:12:38,020 --> 00:12:40,280 Takže v tomto prípade, ak si skutočne prečítať drobným písmom, 215 00:12:40,280 --> 00:12:44,500 budete skutočne vidieť, že v prípade, že linka nemôže byť prečítať, vráti INT_MAX. 216 00:12:44,500 --> 00:12:48,320 Nikdy sme o tom hovorili, ale na základe jeho kapitalizácie, čo je to asi? 217 00:12:48,320 --> 00:12:50,640 [Študent] konštantný. >> Je to konštanta. 218 00:12:50,640 --> 00:12:54,770 Je to nejaký zvláštny konštanta, ktorá je pravdepodobne vyhlásený v jednom z týchto hlavičkových súborov 219 00:12:54,770 --> 00:13:00,090 to vyššie v súbore, a INT_MAX je asi niečo ako zhruba 2 mld Sk, 220 00:13:00,090 --> 00:13:04,990 Myšlienka je, že preto, že musíme nejako znamenať, že niečo sa pokazilo, 221 00:13:04,990 --> 00:13:10,700 sme, áno, majú 4000000000 čísla máme k dispozícii: -2000000000 až na 2 miliardy, dávať alebo brať. 222 00:13:10,700 --> 00:13:14,710 No, to, čo je bežné v programovaní je budete kradnúť len jedno z týchto čísel, 223 00:13:14,710 --> 00:13:18,920 Možno 0, možno 2 miliardy, možno -2000000000, 224 00:13:18,920 --> 00:13:23,280 takže strávite jednu zo svojich možných hodnôt, takže môžete zaviazať k svetu 225 00:13:23,280 --> 00:13:26,820 že keď sa niečo pokazí, vrátim to super veľkú hodnotu. 226 00:13:26,820 --> 00:13:31,030 Ale nechcete užívateľ zadaním niečo mystické ako 234 ..., naozaj veľké číslo. 227 00:13:31,030 --> 00:13:34,060 Môžete upresniť to miesto ako konštanta. 228 00:13:34,060 --> 00:13:38,060 Takže naozaj, ak ste boli análny posledných pár týždňov, kedykoľvek si zavolala GetInt, 229 00:13:38,060 --> 00:13:42,900 mali by ste byť kontrola s, ak podmienka urobil typ užívateľa v INT_MAX, 230 00:13:42,900 --> 00:13:46,590 alebo, presnejšie, urobil GetInt spiatočnej INT_MAX, pretože keby to urobil, 231 00:13:46,590 --> 00:13:51,830 to vlastne znamená, že ani písať. Niečo sa pokazilo v tomto prípade. 232 00:13:51,830 --> 00:13:56,080 Tak toto je to, čo je všeobecne známe ako sentinelovej hodnota, čo vyžaduje zvláštne. 233 00:13:56,080 --> 00:13:58,120 >> Poďme sa teraz do súboru. C. 234 00:13:58,120 --> 00:14:01,340 Súbor C existuje v zariadení nejakú dobu. 235 00:14:01,340 --> 00:14:06,840 A v skutočnosti, prístroj má to predkompilované pre vás do tejto veci sme nazvali objektový kód, 236 00:14:06,840 --> 00:14:09,540 ale to jednoducho nie je jedno, kde to je, pretože systém vie, 237 00:14:09,540 --> 00:14:11,730 v tomto prípade, kedy je: zariadenie. 238 00:14:11,730 --> 00:14:17,400 Poďme prejdite teraz GetInt a uvidíte, ako GetInt pôsobí celú tú dobu. 239 00:14:17,400 --> 00:14:19,460 Tu máme podobné poznámky z obdobia pred. 240 00:14:19,460 --> 00:14:21,660 Dovoľte mi, aby som priblížiť len na kóde časti. 241 00:14:21,660 --> 00:14:23,900 A čo máme pre GetInt je nasledujúci. 242 00:14:23,900 --> 00:14:25,700 Trvá žiadny vstup. 243 00:14:25,700 --> 00:14:29,510 Vracia int, while (true), takže máme úmyselné nekonečnú slučku, 244 00:14:29,510 --> 00:14:33,180 ale pravdepodobne budeme vypuknúť to nejako alebo sa vrátiť v rámci tohto. 245 00:14:33,180 --> 00:14:34,870 >> Poďme sa pozrieť, ako to funguje. 246 00:14:34,870 --> 00:14:39,240 Zdá sa, že pomocou GetString v tomto prvom riadku vnútri slučky, 166. 247 00:14:39,240 --> 00:14:43,780 To je teraz dobré praxe, pretože, za akých okolností by GetString vrátiť 248 00:14:43,780 --> 00:14:47,660 špeciálny kľúčové slovo NULL? >> [Študent] Ak sa niečo pokazí. 249 00:14:47,660 --> 00:14:51,630 Ak sa niečo pokazí. A čo by sa mohlo pokaziť, keď budete volať niečo ako GetString? 250 00:14:54,960 --> 00:14:57,640 Jo. >> [Študent] malloc nedokáže dať na ints. 251 00:14:57,640 --> 00:14:59,150 Jo. Možno malloc zlyhá. 252 00:14:59,150 --> 00:15:03,190 Niekde pod pokrievku, GetString volá malloc, ktorý by určoval pamäť, 253 00:15:03,190 --> 00:15:06,020 ktorá umožňuje počítaču úložisko všetkých postáv 254 00:15:06,020 --> 00:15:07,750 že používateľ zadá do klávesnice. 255 00:15:07,750 --> 00:15:11,590 A predpokladať užívateľ mal veľa voľného času a napísal viac, napríklad, 256 00:15:11,590 --> 00:15:16,160 ako 2 miliardy znakov, viac znakov ako v počítači, má dokonca aj RAM. 257 00:15:16,160 --> 00:15:19,250 GetString musí byť schopný znamenať, že na vás. 258 00:15:19,250 --> 00:15:22,560 Aj keď je to super, super nezvyčajné roh prípad, 259 00:15:22,560 --> 00:15:24,340 musí nejako byť schopné zvládnuť, 260 00:15:24,340 --> 00:15:28,750 a tak GetString, keby sme sa vrátili a prečítať si jeho dokumentáciu, sa v NULL skutočnosti návrate. 261 00:15:28,750 --> 00:15:34,460 Takže teraz, keď GetString zlyhá vrátením NULL, GetInt bude zlyhanie vrátením INT_MAX 262 00:15:34,460 --> 00:15:37,690 rovnako ako hliadka. To sú len ľudské konvencie. 263 00:15:37,690 --> 00:15:41,450 Jediný spôsob, ako by vedieť, že to je prípad od čítania dokumentácie. 264 00:15:41,450 --> 00:15:45,040 >> Poďme prejdite na miesto, kde je int skutočne dostal. 265 00:15:45,040 --> 00:15:51,160 Keby som posunúť nadol o kúsok ďalej, v súlade 170, máme komentár nad týmito riadkami. 266 00:15:51,160 --> 00:15:55,100 Prehlasujeme v 172 int, n, a char, c, a potom sa toto nové funkcie, 267 00:15:55,100 --> 00:15:58,930 ktoré niektorí z vás narazil skôr, sscanf. 268 00:15:58,930 --> 00:16:00,870 To je skratka pre reťazce scanf. 269 00:16:00,870 --> 00:16:05,700 Inými slovami, daj mi reťazec a budem testovať to na kusy informácií záujmu. 270 00:16:05,700 --> 00:16:07,360 Čo to znamená? 271 00:16:07,360 --> 00:16:11,800 Predpokladajme, že som typ v doslova, 123 na klávesnici a potom stlačte kláves Enter. 272 00:16:11,800 --> 00:16:16,470 Aký je dátový typ 123, keď sa vrátil od GetString? >> [Študent] String. 273 00:16:16,470 --> 00:16:18,380 Je to samozrejme string, nie? Mám reťazec. 274 00:16:18,380 --> 00:16:23,220 Takže 123 je naozaj, citujem-koniec citátu, 123 s \ 0 na konci. 275 00:16:23,220 --> 00:16:27,110 To nie je int. To nie je číslo. Vyzerá to ako číslo, ale nie je to vlastne. 276 00:16:27,110 --> 00:16:29,080 Takže to, čo sa GetInt urobiť? 277 00:16:29,080 --> 00:16:35,750 To má skenovať, že reťazec zľava doprava - 123 \ 0 - a nejako previesť na skutočné číslo. 278 00:16:35,750 --> 00:16:37,850 Dalo by sa zistiť, ako to urobiť. 279 00:16:37,850 --> 00:16:41,450 Ak si myslíte, že späť do pset2, môžete pravdepodobne sa trochu pohodlné s Caesarom 280 00:16:41,450 --> 00:16:44,820 alebo Vigenere, takže môžete iterácii reťazec, môžete previesť znaky na ints. 281 00:16:44,820 --> 00:16:46,710 Ale sakra, to je veľa práce. 282 00:16:46,710 --> 00:16:49,860 Prečo nie volať funkciu ako sscanf, ktorý robí to pre vás? 283 00:16:49,860 --> 00:16:54,230 Takže sscanf očakáva argument - v tomto prípade nazýva linka, ktorá je reťazec. 284 00:16:54,230 --> 00:17:01,840 Tie potom zadať v úvodzovkách, veľmi podobný printf, čo očakávať, že v tomto reťazci. 285 00:17:01,840 --> 00:17:09,000 A to, čo tu hovorím je, že som očakávať, že desatinné číslo a možno aj charakter. 286 00:17:09,000 --> 00:17:12,000 A uvidíme, prečo tomu tak je za chvíľu. 287 00:17:12,000 --> 00:17:15,869 A ukázalo sa, že tento záznam je teraz pripomína, čo sme začali hovoriť o 288 00:17:15,869 --> 00:17:17,619 len niečo málo cez týždeň pred. 289 00:17:17,619 --> 00:17:21,740 Čo je a n a a c robí pre nás? >> [Študent] Adresa n a adresa c. 290 00:17:21,740 --> 00:17:25,400 Jo. Je to, že mi dal adresu n a adresu c Prečo je to tak dôležité? 291 00:17:25,400 --> 00:17:30,220 Viete, že s funkciou v C, môžete produkt vždy vrátiť hodnotu alebo žiadnu hodnotu. 292 00:17:30,220 --> 00:17:34,530 Môžete sa vrátiť int, je reťazec, float, char, bez ohľadu na, alebo sa môžete vrátiť neplatné, 293 00:17:34,530 --> 00:17:38,030 ale môžete vrátiť iba jednu vec maximálne. 294 00:17:38,030 --> 00:17:42,760 Ale tu chceme sscanf vrátiť mi možno int, desatinné číslo, 295 00:17:42,760 --> 00:17:46,220 a tiež char, a ja ti to vysvetlím, prečo char za chvíľu. 296 00:17:46,220 --> 00:17:51,460 Tie účinne Chcete sscanf vrátiť dve veci, ale to jednoducho nie je možné v C. 297 00:17:51,460 --> 00:17:55,200 Môžete obísť, že odovzdaním dvoma adresami 298 00:17:55,200 --> 00:17:57,370 pretože akonáhle podáš funkciu, dve adresy, 299 00:17:57,370 --> 00:18:00,470 čo môže, že funkcia s nimi robiť? >> [Študent] Napíšte týchto adries. 300 00:18:00,470 --> 00:18:02,010 To môže napísať na tieto adresy. 301 00:18:02,010 --> 00:18:05,770 Môžete použiť hviezdu operáciu a tam, aby sa každý z týchto adries. 302 00:18:05,770 --> 00:18:11,260 Je to niečo tohto typu back-mechanizmu dverí, ale veľmi bežné pre zmenu hodnôt premenných 303 00:18:11,260 --> 00:18:14,870 viac než len jedno miesto - v tomto prípade dva. 304 00:18:14,870 --> 00:18:21,340 Teraz všimnete som kontrola == 1 a potom sa vracať n prípade, že sa v skutočnosti, vyhodnotí na true. 305 00:18:21,340 --> 00:18:26,170 Tak čo sa deje? Technicky, všetci chceme skutočne stalo v GetInt je tento. 306 00:18:26,170 --> 00:18:30,740 Chceme analyzovať, aby som tak povedal, chceme čítať reťazec - quote-koniec citátu 123 - 307 00:18:30,740 --> 00:18:34,560 a ak to vyzerá, že to číslo tam, čo hovoríme sscanf robiť 308 00:18:34,560 --> 00:18:38,190 je kladený na toto číslo - 123 - v tejto premennej n pre mňa. 309 00:18:38,190 --> 00:18:42,090 Tak prečo potom som vlastne majú to rovnako? 310 00:18:42,090 --> 00:18:48,220 Aká je úloha sscanf povedať, že si môže tiež dostať charakter sem? 311 00:18:48,220 --> 00:18:53,470 [Nepočuteľné Študent reakcie] >> desatinná čiarka skutočne mohol fungovať. 312 00:18:53,470 --> 00:18:56,330 Poďme si myslia, že sa na chvíľu zamyslel. Čo ešte? 313 00:18:56,330 --> 00:18:59,270 [Študent] Mohlo by to byť NULL. >> Dobrá myšlienka. Mohlo by to byť null znak. 314 00:18:59,270 --> 00:19:01,660 Je to vlastne nie je v tomto prípade. Jo. >> [Študent] ASCII. 315 00:19:01,660 --> 00:19:04,340 ASCII. Alebo mi dovoľte upresniť ešte ďalej. 316 00:19:04,340 --> 00:19:06,640 Znak% c je len pre kontrolu chýb. 317 00:19:06,640 --> 00:19:09,300 Nechceme tam byť znak za číslo, 318 00:19:09,300 --> 00:19:11,870 ale čo to mi umožňuje urobiť, je nasledujúci. 319 00:19:11,870 --> 00:19:18,210 Ukazuje sa, že sscanf, okrem ukladanie hodnôt v N a C v tomto príklade tu, 320 00:19:18,210 --> 00:19:24,890 čo to tiež robí, je, že vracia počet premenných je kladený hodnoty palcov 321 00:19:24,890 --> 00:19:30,260 Takže ak ste len zadajte 123, potom len% d bude odpovedať, 322 00:19:30,260 --> 00:19:33,880 a len n je uložená s hodnotou, ako je 123, 323 00:19:33,880 --> 00:19:35,640 a nič dostane dať do c 324 00:19:35,640 --> 00:19:37,620 C zostáva odpadky hodnotu, aby som tak povedal - 325 00:19:37,620 --> 00:19:40,730 smetiarske, pretože je to nikdy nebola inicializovaná na ľubovoľnú hodnotu. 326 00:19:40,730 --> 00:19:45,520 Takže v tomto prípade, sscanf vráti 1, pretože som naplnený 1 týchto ukazovateľov, 327 00:19:45,520 --> 00:19:50,190 v takom prípade skvelý, mám int, takže som uvoľniť linku uvoľniť pamäť 328 00:19:50,190 --> 00:19:54,000 že GetString skutočne pridelené, a potom som sa vrátiť n, 329 00:19:54,000 --> 00:19:58,500 else ak ste niekedy nad tým, kde to opakovať vyhlásenie prichádza z toho pochádza priamo odtiaľto. 330 00:19:58,500 --> 00:20:04,390 Takže ak naopak, píšem v 123foo - len nejaký náhodný sled textu - 331 00:20:04,390 --> 00:20:08,490 sscanf uvidí číslo, číslo, číslo, f, 332 00:20:08,490 --> 00:20:16,410 a to bude dať 123 do n; to dám F v C a potom sa vrátiť 2. 333 00:20:16,410 --> 00:20:20,640 Takže máme, len pomocou základnej definícii správanie sscanf je, veľmi jednoduchý spôsob - 334 00:20:20,640 --> 00:20:23,900 dobre, komplex na prvý pohľad, ale na konci dňa pomerne jednoduchý mechanizmus - 335 00:20:23,900 --> 00:20:28,320 povedať je, že int, a ak áno, je to, že jediná vec, ktorú som našiel? 336 00:20:28,320 --> 00:20:29,860 A medzery tu je úmyselné. 337 00:20:29,860 --> 00:20:34,000 Ak budete čítať dokumentáciu k sscanf, to vám povie, že ak sú kúsok medzerou 338 00:20:34,000 --> 00:20:38,810 na začiatku alebo na konci, sscanf príliš umožní užívateľovi, z akéhokoľvek dôvodu, 339 00:20:38,810 --> 00:20:41,860 zasiahnuť medzerník 123 a to bude legitímne. 340 00:20:41,860 --> 00:20:44,150 Nebudete kričať na užívateľa len preto, že narazia na medzerník 341 00:20:44,150 --> 00:20:48,640 na začiatku alebo na konci, čo je len o málo viac užívateľsky príjemný. 342 00:20:48,640 --> 00:20:52,300 >> Akékoľvek otázky, potom na GetInt? Jo. >> [Študent] Čo keď len dať do char? 343 00:20:52,300 --> 00:20:54,030 Dobrá otázka. 344 00:20:54,030 --> 00:20:59,890 Čo keď ste práve zadali v char ako f a stlačte klávesu Enter, bez kedy písanie 123? 345 00:20:59,890 --> 00:21:02,420 Čo si myslíte správanie tomto riadku kódu by potom? 346 00:21:02,420 --> 00:21:04,730 [Nepočuteľné Študent odpoveď] 347 00:21:04,730 --> 00:21:08,790 Jo, takže sscanf môže pokrývať, že aj preto, že v takom prípade, že to nebude na vyplnenie n alebo c. 348 00:21:08,790 --> 00:21:15,310 Bude to miesto vrátiť 0, v tom prípade som tiež chytí, že scenár 349 00:21:15,310 --> 00:21:18,750 pretože očakávaná hodnota chcem je 1. 350 00:21:18,750 --> 00:21:22,000 Chcem len jeden a len jedna vec, ktorú treba zaplniť. Dobrá otázka. 351 00:21:22,000 --> 00:21:24,290 >> Ostatné? Dobrá. 352 00:21:24,290 --> 00:21:26,250 >> Poďme sa prejsť všetky funkcie v tu, 353 00:21:26,250 --> 00:21:29,500 ale ten, ktorý sa zdá byť snáď zostávajúce záujmu je GetString 354 00:21:29,500 --> 00:21:32,790 pretože sa ukázalo, že GetFloat, GetInt, GetDouble, GetLongLong 355 00:21:32,790 --> 00:21:36,260 všetky punt veľa z ich funkčnosti na GetString. 356 00:21:36,260 --> 00:21:39,750 Takže poďme sa pozrieť na to, ako on je realizovaný tu. 357 00:21:39,750 --> 00:21:43,630 Tohle vyzerá trochu zložitejšie, ale používa rovnaké základy 358 00:21:43,630 --> 00:21:45,670 že sme začali hovoriť o minulý týždeň. 359 00:21:45,670 --> 00:21:49,490 V GetString, ktorý neberie argument, podľa prázdna sem 360 00:21:49,490 --> 00:21:53,730 a vráti reťazec, som zrejme som sa prehlasuje, že reťazec s názvom vyrovnávacia pamäť. 361 00:21:53,730 --> 00:21:56,270 Ja naozaj neviem, čo že sa to využiť na ešte, ale uvidíme. 362 00:21:56,270 --> 00:21:58,390 Vyzerá to, že kapacita je v predvolenom nastavení 0. 363 00:21:58,390 --> 00:22:01,350 Nie tak celkom istí, kde to bude, nie je si istý, čo n sa bude používať pre ešte, 364 00:22:01,350 --> 00:22:03,590 ale teraz je to stále trochu zaujímavejšie. 365 00:22:03,590 --> 00:22:06,520 V súlade 243, vyhlasujeme int, c 366 00:22:06,520 --> 00:22:08,800 To je niečo ako hlúpe detailu. 367 00:22:08,800 --> 00:22:15,820 Char je 8 bitov, a 8 bitov možno uložiť, koľko rôznych hodnôt? >> [Študent] 256. >> 256. 368 00:22:15,820 --> 00:22:20,730 Problém je, ak chcete mať 256 rôznych ASCII znakmi, ktoré existujú 369 00:22:20,730 --> 00:22:23,340 ak si myslíte, že späť - a to nie je niečo, čo pamätať. 370 00:22:23,340 --> 00:22:25,710 Ale ak si myslíte, že späť do tej veľkej ASCII tabuľky sme mali pred niekoľkými týždňami, 371 00:22:25,710 --> 00:22:30,600 bolo v tomto prípade 128 alebo 256 znakov ASCII. 372 00:22:30,600 --> 00:22:32,940 Použili sme všetky vzory 0s a 1s hore. 373 00:22:32,940 --> 00:22:36,210 To je problém, ak chcete byť schopný detekovať chybu 374 00:22:36,210 --> 00:22:40,190 pretože ak ste už používate 256 hodnôt pre svoje postavy, 375 00:22:40,190 --> 00:22:43,050 ste naozaj plánovať dopredu, pretože teraz nemáte žiadny spôsob, ako hovoriť, 376 00:22:43,050 --> 00:22:46,270 to nie je legitímna charakter, to je nejaký chybný správu. 377 00:22:46,270 --> 00:22:50,270 Takže to, čo svet skutočne je, že používajú ďalšie najväčšiu hodnotu, niečo ako int, 378 00:22:50,270 --> 00:22:54,720 tak, že máte šialený počet bitov, 32, pre 4 miliardy možných hodnôt 379 00:22:54,720 --> 00:22:58,860 takže môžete jednoducho skončiť s použitím v podstate 257 z nich, 380 00:22:58,860 --> 00:23:01,720 1 z nich má nejaký zvláštny význam ako chyba. 381 00:23:01,720 --> 00:23:03,120 >> Tak uvidíme, ako to funguje. 382 00:23:03,120 --> 00:23:07,760 V súlade 246, mám veľkú slučky while, ktorá volá fgetc, 383 00:23:07,760 --> 00:23:11,090 f znamená súbor, takže getc, a potom sa stdin. 384 00:23:11,090 --> 00:23:15,520 Ukázalo sa, že to je len presnejšie spôsob, ako hovoriť číta vstup z klávesnice. 385 00:23:15,520 --> 00:23:19,300 Štandardná vstupná prostriedky klávesnica, štandardný výkon znamená obrazovku, 386 00:23:19,300 --> 00:23:23,310 a štandardná chyba, ktorú uvidíme v pset4, znamená obrazovku 387 00:23:23,310 --> 00:23:27,490 ale osobitná časť obrazovky tak, aby to nie je zjednotený s skutočnému výstupu 388 00:23:27,490 --> 00:23:30,750 ktorý určená pre tlač. Ale o tom viac v budúcnosti. 389 00:23:30,750 --> 00:23:34,440 Takže fgetc len znamená prečítať jeden znak z klávesnice a uložiť ho tam, kde? 390 00:23:34,440 --> 00:23:37,350 Uložte ho do cca. 391 00:23:37,350 --> 00:23:41,360 A potom skontrolovať -, takže som len pomocou pár logických konjunkcia tu - 392 00:23:41,360 --> 00:23:46,000 uistite sa, že nie je rovno - \ n, takže užívateľ Enter, chceme zastaviť v tomto bode, 393 00:23:46,000 --> 00:23:49,850 koniec slučky - a tiež chceme, aby zistili, či pre zvláštne konštantný OSZ, 394 00:23:49,850 --> 00:23:53,610 ktorá, ak viete alebo tušíte, čo to znamená? >> [Študent] Koniec súboru. >> Koniec súboru. 395 00:23:53,610 --> 00:23:56,560 To je druh nezmyselný, pretože keď píšem na klávesnici, 396 00:23:56,560 --> 00:23:58,870 je to naozaj žiadny súbor sa na tomto, 397 00:23:58,870 --> 00:24:01,150 ale to je len trochu generický termín použitý znamenať 398 00:24:01,150 --> 00:24:04,220 že nič iné sa blíži z ľudského prsty. 399 00:24:04,220 --> 00:24:06,460 EOF - koniec súboru. 400 00:24:06,460 --> 00:24:09,920 Ako stranou, ak ste niekedy hit Ovládacie D na vašej klávesnici, nie že by ste ešte - 401 00:24:09,920 --> 00:24:15,230 ste hit Control C - Control D pošle tento špeciálny konštanta tzv EOF. 402 00:24:15,230 --> 00:24:19,850 Takže teraz máme len nejaké dynamické prideľovanie pamäte. 403 00:24:19,850 --> 00:24:23,440 >> Takže ak (n + 1> kapacita). Teraz budem vysvetľovať n 404 00:24:23,440 --> 00:24:26,100 N je len, koľko bytov je v súčasnej dobe vo vyrovnávacej pamäti, 405 00:24:26,100 --> 00:24:28,620 reťazec, ktorý ste v súčasnej dobe buduje od užívateľa. 406 00:24:28,620 --> 00:24:33,450 Ak máte viac znakov vo vašom vyrovnávacej pamäte, než budete mať kapacitu vyrovnávacej pamäte, 407 00:24:33,450 --> 00:24:37,410 intuitívne, čo musíme urobiť, a potom je prideliť väčšiu kapacitu. 408 00:24:37,410 --> 00:24:43,330 Takže budem zbierať v priebehu niektorej z aritmetického tu a sústrediť sa iba na túto funkciu tu. 409 00:24:43,330 --> 00:24:46,070 Viete, čo malloc je alebo sú aspoň rámcovo oboznámený. 410 00:24:46,070 --> 00:24:48,970 Hádať, čo realloc robí. >> [Študent] Pridá pamäte. 411 00:24:48,970 --> 00:24:52,920 To nie je úplne pridanie pamäte. To prerozdeľuje pamäť takto. 412 00:24:52,920 --> 00:24:57,220 Ak je ešte stále priestor na konci reťazca, aby vám viac, že ​​pamäť 413 00:24:57,220 --> 00:25:00,000 ako pôvodne vám dáva, potom budete môcť dať ďalšie pamäť. 414 00:25:00,000 --> 00:25:03,460 Takže si môžete len držať uvedenie reťazec, postavy chrbtom k sebe, aby sa chrbtom k sebe. 415 00:25:03,460 --> 00:25:05,830 Ale ak to nie je prípad, pretože ste čakali príliš dlho 416 00:25:05,830 --> 00:25:07,940 a niečo náhodne dostal zvalil do pamäte tam 417 00:25:07,940 --> 00:25:10,290 ale je tu ďalší pamäti tu, to je v poriadku. 418 00:25:10,290 --> 00:25:13,100 Realloc bude robiť všetko ťažkú ​​prácu za vás, 419 00:25:13,100 --> 00:25:16,750 presunúť reťazec čo ste si prečítali v tak ďaleko odtiaľ, dal ju tam, 420 00:25:16,750 --> 00:25:19,460 a potom vám ešte trochu dráhu v tomto bode. 421 00:25:19,460 --> 00:25:22,550 >> Takže s mávnutím ruky, dovoľte mi povedať, že to, čo robí GetString 422 00:25:22,550 --> 00:25:26,330 je to začína s malým pufra, možno jediný znak, 423 00:25:26,330 --> 00:25:30,820 a pokiaľ užívateľ zadá do dvoch postáv, GetString skončí volanie realloc a hovorí, že 424 00:25:30,820 --> 00:25:33,150 jeden znak nebolo dosť, daj mi dve postavy. 425 00:25:33,150 --> 00:25:35,950 Potom, ak budete čítať cez logiky slučky, bude to povedať 426 00:25:35,950 --> 00:25:39,600 Užívateľ napísal do 3 znaky, daj mi teraz nie je 2, ale 4 znaky, 427 00:25:39,600 --> 00:25:42,320 tak mi daj 8, tak mi daj 16 a 32. 428 00:25:42,320 --> 00:25:45,000 Skutočnosť, že som Zdvojnásobenie kapacity zakaždým 429 00:25:45,000 --> 00:25:48,570 Znamená to, že vyrovnávacia pamäť je nebude rastú pomaly, že to bude rast veľmi rýchly. 430 00:25:48,570 --> 00:25:51,380 A čo by mohlo byť výhodou, že? 431 00:25:51,380 --> 00:25:54,600 Prečo som zdvojnásobenie veľkosti vyrovnávacej pamäte 432 00:25:54,600 --> 00:25:58,020 aj keď užívateľ mohol stačí jedno extra znak z klávesnice? 433 00:25:58,020 --> 00:26:01,750 [Nepočuteľné Študent odpoveď] >> Čo je to? >> [Študent] Nemusíte pestovať to, ako často. 434 00:26:01,750 --> 00:26:03,300 Presne tak. Nemusíte pestovať to, ako často. 435 00:26:03,300 --> 00:26:05,510 A to je len trochu, že si zabezpečenie svojej stávky tu, 436 00:26:05,510 --> 00:26:10,850 Myšlienka je, že nechcete volať realloc veľa, pretože to má tendenciu byť pomalé. 437 00:26:10,850 --> 00:26:12,910 Kedykoľvek môžete požiadať operačný systém pre pamäte, 438 00:26:12,910 --> 00:26:16,990 ako skoro uvidíte v budúcnosti problém sade, má tendenciu trvať nejaký čas. 439 00:26:16,990 --> 00:26:20,010 Takže je minimalizovať množstvo času, aj keď strácame nejaké miesto, 440 00:26:20,010 --> 00:26:21,900 tendenciu byť dobré. 441 00:26:21,900 --> 00:26:24,060 >> Ale ak budeme čítať prostredníctvom záverečnej časti GetString tu - 442 00:26:24,060 --> 00:26:27,950 a znovu pochopenie každý riadok tu nie je tak dôležitá aj dnes - 443 00:26:27,950 --> 00:26:30,530 Všimnite si, že to nakoniec zavolá malloc znova 444 00:26:30,530 --> 00:26:33,880 a prideľuje presne toľko bajtov, ako je potrebné pre reťazec 445 00:26:33,880 --> 00:26:38,060 a potom vyhodí volaním zadarmo prílišné veľkú vyrovnávaciu pamäť 446 00:26:38,060 --> 00:26:40,080 ak to naozaj dostal dvojnásobok príliš mnohokrát. 447 00:26:40,080 --> 00:26:42,730 Takže v skratke, je to, ako GetString pôsobí celú tú dobu. 448 00:26:42,730 --> 00:26:47,060 Všetko to je čítať jeden znak v čase, znova a znova a znova, 449 00:26:47,060 --> 00:26:50,750 a zakaždým, keď potrebuje nejaký ďalší pamäť, požiada operačný systém pre neho 450 00:26:50,750 --> 00:26:53,670 volaním realloc. 451 00:26:53,670 --> 00:26:57,890 >> Nejaké otázky? Dobrá. 452 00:26:57,890 --> 00:26:59,270 >> Útok. 453 00:26:59,270 --> 00:27:04,060 Teraz, keď sme pochopili ukazovatele alebo aspoň sú stále oboznámení s ukazovateľmi, 454 00:27:04,060 --> 00:27:06,700 Poďme zvážiť, ako celý svet začne rúcať 455 00:27:06,700 --> 00:27:10,030 ak nemáte dosť brániť sporných užívateľov, 456 00:27:10,030 --> 00:27:11,850 ľudia, ktorí sa snažia preniknúť do vášho systému, 457 00:27:11,850 --> 00:27:16,890 ľudia, ktorí sa snažia ukradnúť vaše softvér a tým obísť nejaký registračný kód 458 00:27:16,890 --> 00:27:19,090 že by inak mohla písať palcov 459 00:27:19,090 --> 00:27:22,990 >> Pozrite sa na tento príklad tu, čo je len C kód, ktorý má funkciu hlavnej v dolnej časti 460 00:27:22,990 --> 00:27:26,380 , Ktorý volá funkciu foo. A čo je okolo, aby foo? 461 00:27:26,380 --> 00:27:29,680 [Študent] jediný argument. >> [Malan] jediný argument. 462 00:27:29,680 --> 00:27:33,450 Takže ArGV [1], čo znamená, že prvé slovo, ktoré užívateľ zadané na príkazovom riadku 463 00:27:33,450 --> 00:27:36,360 po a.out alebo čokoľvek sa nazýva program. 464 00:27:36,360 --> 00:27:41,680 Tak foo hore sa v char *. Ale char * je presne to, čo? >> [Študent] string. 465 00:27:41,680 --> 00:27:43,350 [Malan] reťazec, takže nič nové. 466 00:27:43,350 --> 00:27:45,420 To je reťazec ľubovoľne sa nazýva bar. 467 00:27:45,420 --> 00:27:51,430 V tomto riadku tu, char c [12], v akejsi polo-technickej angličtiny, čo sa tento riadok robí? 468 00:27:51,430 --> 00:27:55,220 [Študent] Pole - >> Array of? >> [Študent] znaky. Postavy >>. 469 00:27:55,220 --> 00:27:58,870 Daj mi rad 12 znakov. Tak by sme mohli nazvať tento vyrovnávacej pamäte. 470 00:27:58,870 --> 00:28:02,920 Je to odborne nazýva c, ale vyrovnávaciu pamäť v programovaní znamená len veľa priestoru 471 00:28:02,920 --> 00:28:04,800 ktoré si môžete dať nejaké veci dovnútra 472 00:28:04,800 --> 00:28:07,940 Potom konečne, memcpy sme nepoužíva skôr, ale asi tušíte, čo to robí. 473 00:28:07,940 --> 00:28:10,480 Je to kópia pamäte. Čo to robí? 474 00:28:10,480 --> 00:28:19,270 Je zrejme kopíruje bar, jeho vstupné, do C, ale len do dĺžky pruhu. 475 00:28:19,270 --> 00:28:24,930 Ale je tu chyba tu. >> [Študent] Potrebuješ sizeof charakter. Dobre >>. 476 00:28:24,930 --> 00:28:30,860 Technicky, mali sme naozaj strlen (bar) * sizeof (char)). To je správne. 477 00:28:30,860 --> 00:28:33,930 Ale v najhoršom prípade tu, poďme predpokladať, že to je - 478 00:28:33,930 --> 00:28:35,950 Dobre. Potom je tu dve chyby. 479 00:28:35,950 --> 00:28:39,160 Takže sizeof (char)); 480 00:28:39,160 --> 00:28:41,290 Poďme urobiť to trochu širšie. 481 00:28:41,290 --> 00:28:44,910 Takže teraz je tu stále chyba, ktorá je čo? >> [Nepočuteľné Študent odpoveď] 482 00:28:44,910 --> 00:28:46,990 Skontrolujte, čo? >> [Študent] Skontrolujte NULL. 483 00:28:46,990 --> 00:28:50,270 Mali by sme byť všeobecne kontrola NULL, pretože zlé veci sa stávajú 484 00:28:50,270 --> 00:28:53,200 keď váš ukazovateľ je NULL, pretože by ste mohli skončiť ísť tam, 485 00:28:53,200 --> 00:28:57,630 a nemali by ste nikdy ísť na NULL dereferencing s hviezdy operátora. 486 00:28:57,630 --> 00:29:01,050 Tak to je dobre. A čo iného robíme? Logicky, je tu chyba tu taky. 487 00:29:01,050 --> 00:29:04,450 [Študent] Skontrolujte, či argc je> = až 2. 488 00:29:04,450 --> 00:29:10,550 Tak sa pozrite, ak argc je> = 2. Dobre, takže tam tri chyby v tomto programe tu. 489 00:29:10,550 --> 00:29:16,630 Sme teraz kontroluje, pokiaľ užívateľ skutočne zadali niečo do ArGV [1]. Dobré. 490 00:29:16,630 --> 00:29:20,950 Takže to, čo je tretia chyba? Jo. >> [Študent] C nemusí byť dostatočne veľká. 491 00:29:20,950 --> 00:29:23,320 Dobré. Skontrolovali sme jeden scenár. 492 00:29:23,320 --> 00:29:29,520 My implicitne kontrolovať nekopírujte viac pamäte, než by sa prekročil dĺžky tyče. 493 00:29:29,520 --> 00:29:32,510 Takže ak reťazec užívateľ zadali, je 10 znakov, 494 00:29:32,510 --> 00:29:36,020 to hovorí kopírovať len 10 znakov. A to je v poriadku. 495 00:29:36,020 --> 00:29:39,940 Ale čo keď užívateľ napísal v slove na riadku ako 20-znakové slovo? 496 00:29:39,940 --> 00:29:44,900 Toto hovorí kópiu 20 znakov z baru do čoho? 497 00:29:44,900 --> 00:29:49,750 C, inak známa ako náš pufra, čo znamená, že práve napísal dát 498 00:29:49,750 --> 00:29:52,540 na 8 byte miesta, ktoré ste nevlastníte, 499 00:29:52,540 --> 00:29:54,870 a nemáte vlastný je v tom zmysle, že ste nikdy pridelené im. 500 00:29:54,870 --> 00:30:00,370 Tak toto je to, čo je všeobecne známe ako útok pretečeniu vyrovnávacej pamäte alebo pretečeniu vyrovnávacej pamäte útoku. 501 00:30:00,370 --> 00:30:05,580 A je to útok v tom zmysle, že v prípade, že používateľ alebo program, ktorý volá svoje funkcie 502 00:30:05,580 --> 00:30:10,490 robí to v zlom úmysle, čo sa vlastne bude diať ďalej, by mohli byť docela zlé. 503 00:30:10,490 --> 00:30:12,450 >> Takže poďme sa pozrieť na obrázku tu. 504 00:30:12,450 --> 00:30:16,060 Tento obrázok predstavuje svoj stack pamäte. 505 00:30:16,060 --> 00:30:19,580 Pripomeňme si, že zakaždým, keď volanie funkcie vám tento malý rámček na zásobníku 506 00:30:19,580 --> 00:30:21,520 a potom ďalšie a potom ďalšie a ďalšie. 507 00:30:21,520 --> 00:30:24,300 A tak ďaleko, máme to jednoducho odobraté nich ako obdĺžniky 508 00:30:24,300 --> 00:30:26,290 buď na palube alebo na obrazovke tu. 509 00:30:26,290 --> 00:30:30,580 Ale keď sa priblížite na jednom z týchto obdĺžnikov, keď voláte funkciu foo, 510 00:30:30,580 --> 00:30:35,880 ukazuje sa, že je toho viac na zásobníku vo vnútri tohto rámca v tomto obdĺžniku 511 00:30:35,880 --> 00:30:40,060 ako len x a y a a b, rovnako ako sme sa hovoriť o swapu. 512 00:30:40,060 --> 00:30:44,410 Ukazuje sa, že je tu nejaké nižšej úrovni podrobnosti, medzi nimi Return Address. 513 00:30:44,410 --> 00:30:49,550 Tak to dopadá, keď hlavné volá foo, hlavné je informovať foo 514 00:30:49,550 --> 00:30:53,520 Aké hlavné je adresa v pamäti počítača 515 00:30:53,520 --> 00:30:57,770 pretože inak, akonáhle foo sa vykonáva prevedení, ako je v tomto prípade tu, 516 00:30:57,770 --> 00:31:00,830 akonáhle sa dostanete tento uzavretý zložená zátvorka na konci foo, 517 00:31:00,830 --> 00:31:05,310 Ako sakra sa foo vedieť, kde je ovládanie programu má ísť? 518 00:31:05,310 --> 00:31:08,970 Ukazuje sa, že odpoveď na túto otázku, je v tomto červenom obdĺžniku tu. 519 00:31:08,970 --> 00:31:12,670 To predstavuje ukazovateľ, a to až do počítača, aby dočasne uskladniť 520 00:31:12,670 --> 00:31:17,030 na tzv zásobníka je adresa hlavnej tak, že akonáhle foo urobiť vykonávania, 521 00:31:17,030 --> 00:31:21,120 počítač vie, kde a čo riadok v hlavnom ísť späť. 522 00:31:21,120 --> 00:31:23,940 Uložené Frame ukazovateľ sa týka podobne to. 523 00:31:23,940 --> 00:31:26,310 Char * bar tu predstavuje, čo? 524 00:31:26,310 --> 00:31:31,350 Teraz je táto modrá segmentu je tu foo je rám. Čo je to bar? 525 00:31:31,570 --> 00:31:35,010 Bar je len argument k funkcii foo. 526 00:31:35,010 --> 00:31:37,500 Takže teraz sme späť u hornín známeho obrazu. 527 00:31:37,500 --> 00:31:39,850 Je tu ďalšie veci, a ďalšie rozptýlenie na obrazovke, 528 00:31:39,850 --> 00:31:43,380 ale to svetlo modrá segmente len je to, čo sme boli kreslenie na tabuľu 529 00:31:43,380 --> 00:31:45,790 niečo ako swap. To je rámec pre foo. 530 00:31:45,790 --> 00:31:51,490 A jediná vec v tom teraz je bar, ktorý je tento parameter. 531 00:31:51,490 --> 00:31:55,220 Ale čo iné by malo byť v zásobníku podľa tohto kódu tu? 532 00:31:55,220 --> 00:31:57,760 [Študent] char c [12]. >> [Malan] char c [12]. 533 00:31:57,760 --> 00:32:02,810 Mali by sme tiež vidieť 12 štvorcov pamäte pridelené do premennej s názvom c, 534 00:32:02,810 --> 00:32:04,970 a naozaj máme, že na obrazovke. 535 00:32:04,970 --> 00:32:08,480 Samom vrchole je c [0], a potom autor tejto schémy 536 00:32:08,480 --> 00:32:11,850 neobťažoval čerpanie všetkých štvorcov, ale skutočne existujú 12 tam 537 00:32:11,850 --> 00:32:16,590 pretože keď sa pozriete na pravom dolnom rohu, c [11], ak budete počítať od 0, je 12. such byte. 538 00:32:16,590 --> 00:32:18,400 Ale tu je ten problém. 539 00:32:18,400 --> 00:32:22,390 V akom smere je c rastie? 540 00:32:22,390 --> 00:32:27,080 Druh zhora dole, keď to začína na vrchole a rastie na dno. 541 00:32:27,080 --> 00:32:30,110 To nevyzerá ako sme odišli sami moc dráhu tu vôbec. 542 00:32:30,110 --> 00:32:32,090 Sme trochu maľoval seba do kúta, 543 00:32:32,090 --> 00:32:36,940 a že c [11] je správna proti baru, ktorý je priamo proti Uložené frame pointer, 544 00:32:36,940 --> 00:32:39,960 ktorá je priamo proti spiatočná adresa. Tam to nie je miesto. 545 00:32:39,960 --> 00:32:42,810 Takže to, čo je dôsledkom potom, ak ste zpackat 546 00:32:42,810 --> 00:32:46,500 a skúste si prečítať 20 bajtov do 12-byte pamäti? 547 00:32:46,500 --> 00:32:50,060 Ak sú tieto 8 ďalších bytov ísť? >> [Študent] Inside - 548 00:32:50,060 --> 00:32:53,200 Vnútri všetko ostatné, z ktorých niektoré sú super dôležité. 549 00:32:53,200 --> 00:32:57,260 A to najdôležitejšie, potenciálne, je červený rámček tam, Return Address, 550 00:32:57,260 --> 00:33:03,560 pretože predpokladám, že ste buď náhodne, alebo adversarially prepíšte tieto 4 byty, 551 00:33:03,560 --> 00:33:07,260 že ukazovateľ adresa, a to nielen u odpadu, ale s radom 552 00:33:07,260 --> 00:33:09,810 , Ktorý sa stane predstavujú skutočnú adresu v pamäti. 553 00:33:09,810 --> 00:33:13,880 Čo je to dôsledok, logicky? >> [Študent] Funkcia sa chystá vrátiť na iné miesto. 554 00:33:13,880 --> 00:33:15,250 Presne tak. 555 00:33:15,250 --> 00:33:19,170 Keď foo vráti a hity, ktoré rovnátka kučeravé, program bude pokračovať 556 00:33:19,170 --> 00:33:25,060 aby sa nevracali k hlavnej, že to bude návrat na čokoľvek adresa je v tomto červenom poli. 557 00:33:25,060 --> 00:33:28,600 >> V prípade obišli softvéru registráciu, 558 00:33:28,600 --> 00:33:32,260 čo keď adresa, ktorá je momentálne vrátil, je funkcia, ktorá obvykle volaná 559 00:33:32,260 --> 00:33:35,690 potom, čo ste zaplatili za softvér a zadali vaše registračný kód? 560 00:33:35,690 --> 00:33:39,870 Môžete triediť trik počítača do nebudete tu, ale bude tu. 561 00:33:39,870 --> 00:33:45,100 Alebo ak ste naozaj šikovný, môže protivník skutočne zadajte na klávesnici, napríklad, 562 00:33:45,100 --> 00:33:50,690 nie je aktuálne slovo, nie 20 znakov, ale predpokladám, on alebo ona skutočne Typy 563 00:33:50,690 --> 00:33:52,770 niektoré znaky, ktoré predstavujú kód. 564 00:33:52,770 --> 00:33:55,320 A to nebude C kód, je to vlastne bude znaky 565 00:33:55,320 --> 00:33:59,290 ktoré predstavujú binárne strojový kód, 0s a 1s. 566 00:33:59,290 --> 00:34:01,290 Ale predpokladám, že to dosť šikovný, aby to, že, 567 00:34:01,290 --> 00:34:06,500 nejako vložiť do GetString riadku niečo, čo je v podstate skompilovaný kód, 568 00:34:06,500 --> 00:34:09,980 a posledné 4 bajty prepísať návratovú adresu. 569 00:34:09,980 --> 00:34:13,360 A čo to, že adresa vstup robiť? 570 00:34:13,360 --> 00:34:18,630 V skutočnosti sa ukladá v tomto červenom obdĺžniku adresu prvého bajtu pufra. 571 00:34:18,630 --> 00:34:23,070 Takže budete musieť byť naozaj šikovný, a to je veľa pokusov a omylov pre zlé ľudí tam, 572 00:34:23,070 --> 00:34:25,639 ale ak môžete zistiť, aké veľké je toto vyrovnávacia pamäť je 573 00:34:25,639 --> 00:34:28,820 tak, že v posledných niekoľkých bajtov na vstupe zadať do programu 574 00:34:28,820 --> 00:34:33,540 stalo, že sa rovná adresu začiatku svojho vyrovnávacej pamäte, môžete to urobiť. 575 00:34:33,540 --> 00:34:39,320 Ak hovoríme normálne pozdraviť a \ 0, to je to, čo skončí vo vyrovnávacej pamäti. 576 00:34:39,320 --> 00:34:44,420 Ale keď sme múdrejší a naplníme, že vyrovnávacia pamäť s tým, čo budeme všeobecne hovoriť útoku kódu - 577 00:34:44,420 --> 00:34:48,860 AAA, útok, útok, útok - ak je to proste niečo, čo urobí niečo zlé, 578 00:34:48,860 --> 00:34:51,820 čo sa stane, ak ste naozaj chytrí, môžete to urobiť. 579 00:34:51,820 --> 00:34:58,610 V červenom poli tu je sekvencia čísel - 80, C0, 35, 08. 580 00:34:58,610 --> 00:35:01,610 Všimnite si, že zodpovedá číslo, ktoré je tu. 581 00:35:01,610 --> 00:35:04,430 Je to v obrátenom poradí, ale o tom až niekedy inokedy. 582 00:35:04,430 --> 00:35:08,140 Všimnite si, že táto spiatočná adresa bola úmyselne zmenený 583 00:35:08,140 --> 00:35:12,020 rovnať adresu sem, nie je adresa main. 584 00:35:12,020 --> 00:35:17,500 Takže ak ten zlý je super šikovný, on alebo ona bude zahŕňať v tomto útoku kódu 585 00:35:17,500 --> 00:35:20,930 niečo ako odstrániť všetky súbory používateľa, alebo skopírovať hesla 586 00:35:20,930 --> 00:35:24,680 alebo vytvoriť používateľský účet, ktorý potom môžem prihlásiť do - vôbec nič. 587 00:35:24,680 --> 00:35:26,950 >> A to je ako nebezpečenstvo a sila C. 588 00:35:26,950 --> 00:35:29,840 Vzhľadom k tomu, že máte prístup k pamäti prostredníctvom ukazovateľa 589 00:35:29,840 --> 00:35:32,520 a môžete teda napísať čokoľvek, čo chcete do pamäte počítača, 590 00:35:32,520 --> 00:35:35,080 si môžete urobiť počítač robiť, čo chcete 591 00:35:35,080 --> 00:35:39,550 jednoducho tým, že sa skákať okolo vnútri svojej vlastnej pamäte. 592 00:35:39,550 --> 00:35:44,650 A tak k tomuto dňu toľko programov a toľko internetové stránky, ktoré sú ohrozené 593 00:35:44,650 --> 00:35:46,200 redukuje na ľudí, ktorí sa výhody tejto. 594 00:35:46,200 --> 00:35:50,760 A to môže zdať ako super sofistikované útoku, ale to nie je vždy začať takhle. 595 00:35:50,760 --> 00:35:53,560 Skutočnosťou je, že to, čo zlí ľudia zvyčajne urobiť, je, 596 00:35:53,560 --> 00:35:58,200 či už je to program v príkazovom riadku alebo program, GUI alebo webové stránky, 597 00:35:58,200 --> 00:35:59,940 stačí začať poskytovať nezmysly. 598 00:35:59,940 --> 00:36:03,980 Zadáte v naozaj veľkom slovo do vyhľadávacieho poľa a stlačte kláves ENTER, 599 00:36:03,980 --> 00:36:05,780 a budete čakať, či webová stránka zrúti 600 00:36:05,780 --> 00:36:09,990 alebo počkať, či sa program prejaví nejakú chybovú správu 601 00:36:09,990 --> 00:36:14,330 pretože ak budete mať šťastie ako zloduch a poskytnúť nejaké šialené vstup 602 00:36:14,330 --> 00:36:18,980 že narazí na program, ktorý znamená, programátor nepredpokladal svoje zlé správanie, 603 00:36:18,980 --> 00:36:23,630 čo znamená, že môžete pravdepodobne dostatok úsilia, dosť pokusov a omylov, 604 00:36:23,630 --> 00:36:26,650 prísť na to, ako viesť presnejšie útok. 605 00:36:26,650 --> 00:36:31,410 Tak ako tak súčasťou zabezpečenia nie je len vyhnúť týmto útokom úplne 606 00:36:31,410 --> 00:36:34,100 ale zachytí je a vlastne sa pozerať na polená 607 00:36:34,100 --> 00:36:36,780 a vidieť, čo bláznivé vstupy majú ľudia zadali do svojich webových stránok, 608 00:36:36,780 --> 00:36:38,960 Čo vyhľadávacie termíny sú ľudia napísali na svoj web 609 00:36:38,960 --> 00:36:42,870 v nádeji, že preteká nejakú vyrovnávacej pamäte. 610 00:36:42,870 --> 00:36:45,500 A to všetko sa scvrkáva na jednoduchých základoch toho, čo je pole 611 00:36:45,500 --> 00:36:49,080 a čo to znamená pre prideľovanie a využívanie pamäte. 612 00:36:49,080 --> 00:36:51,710 >> S tým súvisí potom aj to je. 613 00:36:51,710 --> 00:36:54,280 Povedzme, pozrel sa vo vnútri pevného disku ešte raz. 614 00:36:54,280 --> 00:36:58,440 Spomínate si z týždeň či dva pred, že keď pretiahnete súbory na váš recycle bin, alebo trash can, 615 00:36:58,440 --> 00:37:03,710 čo sa stane? >> [Študent] Nothing. >> Vôbec nič, že jo? 616 00:37:03,710 --> 00:37:05,740 Nakoniec, ak sa dostanete nedostatok miesta na disku, 617 00:37:05,740 --> 00:37:08,190 Windows alebo Mac OS začne mazať súbory pre vás. 618 00:37:08,190 --> 00:37:10,390 Ale ak pretiahnete niečo tam, že nie je vôbec bezpečné. 619 00:37:10,390 --> 00:37:13,800 Všetky vaše spolubývajúci alebo priateľ alebo člen rodiny musí urobiť, je dvakrát kliknite a voila, 620 00:37:13,800 --> 00:37:16,310 tu všetky útržkovité súbory, ktoré ste sa pokúsili odstrániť. 621 00:37:16,310 --> 00:37:19,590 Väčšina z nás aspoň vedieť, že budete musieť pravým tlačidlom myši alebo regulácia kliknutím 622 00:37:19,590 --> 00:37:22,310 a prázdne popolnice alebo niečo také. 623 00:37:22,310 --> 00:37:25,000 Ale aj potom to nie je úplne stačiť 624 00:37:25,000 --> 00:37:28,010 pretože to, čo sa stane, keď máte súbor na pevnom disku 625 00:37:28,010 --> 00:37:32,770 že reprezentuje nejaký dokument, alebo nejaký JPEG, a to predstavuje pevný disk, 626 00:37:32,770 --> 00:37:35,350 a povedzme, že tento kúsok tu predstavuje tento súbor, 627 00:37:35,350 --> 00:37:38,390 a to je zložené z celej veľa 0s a 1s. 628 00:37:38,390 --> 00:37:42,470 Čo sa stane, keď sa nielen pretiahnuť tento súbor do koša alebo koša 629 00:37:42,470 --> 00:37:48,020 ale aj vyprázdniť? Zoradiť z ničoho. 630 00:37:48,020 --> 00:37:49,640 Nie je to vôbec nič teraz. 631 00:37:49,640 --> 00:37:54,290 Teraz je to len preto, že nič trochu niečo stane v podobe tejto tabuľky. 632 00:37:54,290 --> 00:37:58,370 Takže tam je nejaký druh databázy alebo tabuľky vnútri pamäti počítača 633 00:37:58,370 --> 00:38:03,850 že v podstate má jeden stĺpec pre súbory mien a jeden stĺpec pre súbory "miesto, 634 00:38:03,850 --> 00:38:07,720 , Čo by mohlo byť zaradenie 123, len náhodné číslo. 635 00:38:07,720 --> 00:38:14,560 Takže by sme mohli mať niečo ako x.jpeg a umiestnenie 123. 636 00:38:14,560 --> 00:38:18,800 Čo sa stane potom, keď vyprázdniť svoje odpadky? 637 00:38:18,800 --> 00:38:20,330 To zmizne. 638 00:38:20,330 --> 00:38:23,610 Ale čo nezmizne, je 0s a 1s. 639 00:38:23,610 --> 00:38:26,270 >> Takže to, čo je potom pripojenie k pset4? 640 00:38:26,270 --> 00:38:31,240 No, s pset4, len preto, že sme omylom vymazal karty Compact Flash 641 00:38:31,240 --> 00:38:35,750 že mal všetky tieto fotky, alebo len preto, že smola stal poškodený 642 00:38:35,750 --> 00:38:38,000 neznamená, že 0s a 1s nie sú tam stále. 643 00:38:38,000 --> 00:38:40,410 Možno niektoré z nich sú stratené, pretože niečo dostal poškodený 644 00:38:40,410 --> 00:38:43,320 v tom zmysle, že niektoré 0s stal 1s a 1s stal 0s. 645 00:38:43,320 --> 00:38:47,240 Zlé veci sa môže stať, pretože buggy softvér alebo chybný hardware. 646 00:38:47,240 --> 00:38:50,370 Ale mnohí z tých kúskov, možno aj 100% z nich, sú tam stále. 647 00:38:50,370 --> 00:38:55,050 Je to len, že počítač alebo fotoaparát nevie, kde JPEG1 začala 648 00:38:55,050 --> 00:38:56,910 a kde JPEG2 začal. 649 00:38:56,910 --> 00:39:01,070 Ale ak, programátor, viem, s trochou znalosťami, pokiaľ tieto JPEG sú 650 00:39:01,070 --> 00:39:06,010 alebo ako vyzerajú, takže môžete analyzovať 0s a 1s a povedať JPEG, JPEG, 651 00:39:06,010 --> 00:39:09,440 môžete napísať program s v podstate len pre alebo while 652 00:39:09,440 --> 00:39:12,820 , Ktorý využíva každý z týchto súborov. 653 00:39:12,820 --> 00:39:16,030 Takže lekcie potom je začať bezpečne mazanie súborov 654 00:39:16,030 --> 00:39:18,340 ak by ste chceli, aby sa zabránilo to úplne. Áno. 655 00:39:18,340 --> 00:39:21,010 >> [Študent] Ako to, hovorí o vašom počítači 656 00:39:21,010 --> 00:39:23,550 že máte viac pamäte, ako ste robili predtým? 657 00:39:23,550 --> 00:39:27,820 Majú viac pamäte, než predtým a - >> [Študent] Viac dostupnej pamäte. 658 00:39:27,820 --> 00:39:29,630 Oh. Dobrá otázka. 659 00:39:29,630 --> 00:39:32,360 Tak prečo potom po vyprázdnení koša sa počítač povedať 660 00:39:32,360 --> 00:39:34,910 že máte viac voľného miesta, ako ste robili predtým? 661 00:39:34,910 --> 00:39:36,770 Stručne povedané, pretože klame. 662 00:39:36,770 --> 00:39:40,740 Viac technicky, máte viac priestoru, pretože teraz ste povedal 663 00:39:40,740 --> 00:39:43,680 si môžete dať ďalšie veci, kde tento súbor raz bolo. 664 00:39:43,680 --> 00:39:45,450 Ale to neznamená, že bity idú preč, 665 00:39:45,450 --> 00:39:48,590 a že neznamená bity sú zmenená na všetkých 0s, napríklad, 666 00:39:48,590 --> 00:39:50,150 pre vašu ochranu. 667 00:39:50,150 --> 00:39:54,640 Takže naopak, ak si bezpečne zmazať súbory alebo fyzicky zničiť zariadenia, 668 00:39:54,640 --> 00:39:57,300 to je naozaj jediný spôsob, ako sa niekedy okolo toho. 669 00:39:57,300 --> 00:40:02,020 >> Tak prečo by sme odísť na tomto semi-strašidelné poznámky, a uvidíme sa v pondelok. 670 00:40:02,020 --> 00:40:07,000 [Potlesk] 671 00:40:07,780 --> 00:40:10,000 >> [CS50.TV]