[Powered by Google Translate] [5. týždeň] [David J. Malan - Harvard University] [To je CS50. - CS50.TV] To je CS50, 5. týždeň. Dnes a tento týždeň, predstavíme trochu svete forenznú v kontexte problému Set 4. Dnes bude skrátený prednáška, pretože tam je zvláštne udalosť v tú potom. Takže budeme sa pozrieť a dráždiť obaja študentov aj ich rodičia dnes s niektorými z vecí, ktoré sú na obzore. Medzi nimi, v pondelok, budete mať niekoľko ďalších spolužiakov. EDX, Harvard a MIT nových on-line iniciatíva pre OpenCourseWare a viac, začína na akademickej pôde Harvarde v pondelok, čo znamená, že príde pondelok budete mať, ako posledné sčítanie, 86000 ďalšie spolužiakmi ktorí budú sledovať spolu s prednáškami CS50 tieto a profilov a návody a problémové súbory. A ako súčasť tohto, stanete sa členmi inauguračnej triedy CS50 a teraz CS50x. Ako súčasť teraz si uvedomiť, že tam budú nejaké upsides rovnako. Ak chcete získať pripravený na to, pre masívne počet študentov, stačí povedať, že aj keď máme 108 TFS a CAS, to nie je tak celkom najlepší študent-učiteľ pomer, akonáhle sa dostaneme 80.000 študentov. Nebudeme sa triedenie toľko problém nastaví ručne, tak predstavil tento týždeň v problémovej sady budú CS50 Check, ktorá sa bude nástroj príkazového riadku vnútri umývačky že budete mať po aktualizácii neskôr tento víkend. Budete môcť spustiť príkaz, check50, na vlastné PSet, a budete mať okamžitú spätnú väzbu o tom, či je váš program je správne alebo nesprávne podľa rôznych konštrukčných špecifikácií, ktoré sme poskytli. Viac na ktoré v špecifikácii problému set. The CS50x spolužiaci budú používať to rovnako. Problém Set 4 je všetko o kriminalistike, a to Pset naozaj inšpirovaný nejakým real-life veci pričom, keď som bol v postgraduálnom štúdiu som internovaný na chvíľu s Middlesex County je okresné zastupiteľstvo robí forenznej prácu s ich hlavnou forenznú vyšetrovateľ. Čo to robil, ako myslím, že som spomenul niekoľko týždňov minulosti, je polícia Mass štát alebo iní by prísť, by odísť veci ako pevné disky a CD a diskiet a podobne, a potom cieľom forenznej kancelárie bolo zistiť či bol alebo nebol dôkaz nejakého druhu. To bolo zvláštne Oddelenie pre vyšetrovanie, tak to bolo úradnícky zločin. Bolo to viac znepokojujúce druh trestných činov, nič zahŕňajúce nejakú digitálnych médií. Ukazuje sa, že nie, že mnoho ľudí napísať e-mail hovoriť, "ja to urobil." Takže docela často, tieto forenznú vyhľadávanie neobjavil všade toľko ovocia, ale niekedy ľudia by písať také e-maily. Takže niekedy, boli odmenení úsilie. Ale viesť až k tomuto forenznú PSet, budeme zavádzať na pset4 trochu grafiky. Pravdepodobne ste sa tieto veci ako samozrejmosť - JPEG, GIF, a podobne - v týchto dňoch. Ale ak si naozaj myslíte, že o tom, obraz, podobne ako tvár Rob, môže byť modelovaný ako sled bodiek alebo pixelov. V prípade tváre Robertov, je tu všetky druhy farieb, a začali sme vidieť jednotlivé body, inak známy ako pixely, akonáhle sme začali pre priblíženie Ale ak budeme zjednodušovať svet o trochu a len povedať, že toto je Rob v čiernej a bielej, k reprezentácii čiernej a bielej, môžeme jednoducho použiť binárne. A ak budeme používať binárne, 1 alebo 0, môžeme vyjadriť rovnaký obrázok usmievavá tvár Robertov s týmto vzorom bitov. 11000011 predstavuje biela, biela, čierna, čierna, čierna, čierna, biela, biela. A tak to nie je obrovský skok a potom začať hovoriť o farebných fotografiách, veci, ktoré by ste vidieť na Facebooku, alebo sa s digitálnym fotoaparátom. Ale iste, pokiaľ ide o farby, budete potrebovať viac bitov. A celkom bežné vo svete fotografií je použiť nie 1-bitové farby, , Pretože to naznačuje, ale 24-bitové farby, kam vlastne získať milióny farieb. Tak ako v prípade, keď sme sa priblížili na oko Rob, , Ktorý bol ľubovoľný počet miliónov rôznych farebných možností. Takže budeme zavádzať to v probléme Set 4 rovnako ako v návode, ktorá bude dnes v 03:30 namiesto obvyklých 02:30, pretože prednášky piatkovom tu. Ale video bude on-line ako obvykle zajtra. Budeme tiež predstaví vám do iného formátu. Toto je zámerne chcel pozrieť zastrašujúce na prvý, ale to je len nejaká dokumentácia pre struct C. Ukazuje sa, že Microsoft pred rokmi pomohol popularizovať tento formát volal bitmapový formát súboru, bmp, a to bolo super jednoduché, farebné grafické formát súboru , Ktorá bola použitá pre docela nejaký čas, a niekedy ešte pre tapety na stolné počítače. Ak si myslíte, že späť na systém Windows XP a zvlnené kopce a modrú oblohu, to bolo typicky bmp alebo bitmapový obraz. Bitmapy sú zábavné pre nás, pretože majú trochu väčšiu komplexnosť. Nie je to tak jednoduché, ako tento mriežka 0s a 1s. Namiesto toho máte veci ako hlavičky na začiatku súboru. Takže inými slovami, vo vnútri. Súbor BMP je celá partia 0s a 1s, ale tam je nejaký ďalší 0s a 1s tam. A ukázalo sa, že to, čo sme pravdepodobne zaujatý za samozrejmosť rokov - formáty súborov, ako. doc alebo. xls alebo. mp3, mp4., bez ohľadu na formáty súborov že ste sa zoznámili s - čo to vôbec znamená byť formát súboru, pretože na konci dňa všetky tieto súbory používame majú len 0 a 1. A možno ti 0s a 1s predstavujú ABC cez ASCII alebo ako, ale na konci dňa, je to ešte len 0 a 1. Takže ľudia len občas rozhodnú vymyslieť nový formát súborov kde štandardizovať čo vzory bitov bude skutočne znamenať. A v tomto prípade tu, že ľudia, ktorí navrhli bitmapový formát súboru povedal, že pri prvom bajtu v rastrového súboru, ako ich označil ofsetových 0 tam, tam bude nejaký nezrozumiteľné názvy premenné volal bfType, ktorý práve skratka pre bitmapový typ súboru, aký typ rastrového súboru je to. Môžete vyvodiť snáď z druhej rady, ktorá ofsetovou 2, byte číslo 2, má vzor 0s a 1s, ktorý predstavuje to, čo? Veľkosť niečo. A to ide o odtiaľ. Takže v problému Set 4, budete prešiel niektoré z týchto vecí. Nebudeme skončiť starať o všetky z nich. Všimnime si ale, že začína byť zaujímavé okolie bytu 54: rgbtBlue, zelená, červená a Ak ste niekedy počuli skratka RGB - červená, zelená, modrá - to je odkaz na ktorý pretože sa ukázalo, môžete maľovať všetky farby dúhy s nejakou kombináciu červenej a modrej a zelenej. A v skutočnosti, môže rodičia v izbe pripomenúť niektoré z prvých projektorov. V týchto dňoch, stačí vidieť jeden jasne svetlo prichádzajúce z objektívu, ale späť v deň, kedy mal červenú šošovicu, modré šošovky, a zelené objektív, a spoločne sa snažili na obrazovku a tvoril farebné fotografie. A docela často, by stredné školy a vysoké školy majú tieto šošovky niekedy tak trochu nakrivo, takže si trochu vidieť dvojlôžkových a trojlôžkových obrázkov. Ale to bol nápad. Vy ste mali červené a zelené a modré svetlo maľovanie obrazu. A to rovnaký princíp je použitý v počítačoch. Takže medzi úlohami potom pre vás v probléme Set 4 sa bude pár vecí. Jedným z nich je skutočne zmeniť veľkosť obrázka, aby sa vo vzore 0s a 1s, zistiť, ktoré kúsky 0s a 1s predstavujú to, čo do štruktúry ako je tento, a potom zistiť, ako replikovať pixelov - Reds, blues, Zelení - vnútri tak, že keď obraz vyzerá spočiatku, by to mohlo vyzerať toto miesto po tom. Medzi ďalšie problémy príliš sa bude, že budete podal súdne obrázok o skutočnom súboru z digitálneho fotoaparátu. A na tomto fotoaparáte, kedysi, boli celá partia fotografií. Problém je, že sme náhodnému zmazanie alebo mal obraz poškodený nejako. Zlé veci sa stávajú digitálnymi fotoaparátmi. A tak sme sa rýchlo kopírovať všetky 0s a 1s vypnutie tejto karty pre Vás, zachránil všetko v jednom veľkom súbore, a potom budeme odovzdať vám je v probléme Set 4 takže môžete napísať program v C, s ktorými sa obnoviť všetky tieto JPEG, ideálne. A ukázalo sa, že JPEG, aj keď sú trochu zložité formáte - sú oveľa zložitejšie, než tento úsmevom na tvári tu - ukazuje sa, že každý JPEG začína rovnakými vzormi 0s a 1s. Takže pomocou, nakoniec, while alebo pre slučku alebo podobné, môžete určiť iteráciou cez všetky 0s a 1s v tomto súdnom obrazu, a zakaždým, keď vidíte špeciálny vzor, ​​ktorý je definovaný v špecifikácii problému set, môžete predpokladať, tu je, s veľmi vysokou pravdepodobnosťou, začiatok JPEG. A akonáhle zistíte, rovnaký vzor určitý počet bajtov alebo kilobytoch alebo megabytoch neskôr, môžete predpokladať, tu je druhá JPEG, foto som vzal po prvom. Dovoľte mi, aby som prestať čítať, že prvý súbor, začnite písať tento nový, a výstup programu pre pset4 bude toľko ako 50 JPEG. A ak to nie je 50 JPEG záberov, budete mať trochu slučky. Ak máte nekonečný počet JPEG, máte nekonečnú slučku. Takže aj bude celkom bežný prípad. Takže to je to, čo je na obzore. Kvíz 0 za nami, si uvedomiť, za môj e-mail, že vždy existujú ľudia, ktorí sú obaja šťastní, druh neutrálne a smutný okolo kvíz 0 času. A prosím, dostať sa ku mne, hlava TF Zamyla, vlastné TF, alebo jeden z úradov, ktoré budete vedieť, či by ste chceli diskutovať o tom, ako to šlo. Takže zapôsobiť na rodičov tu v izbe, čo je CS50 knižnica? [Smiech] Dobrá práce. Čo je to CS50 knižnica? Jo. >> [Študent] Je to pre-písaný súbor kódu [nepočuteľné] Dobre, dobre. Je to pre-písaný súbor kódu, ktorý pracovníci napísali, ktoré vám poskytneme, , Ktorá poskytuje niektoré spoločné funkcie, Veci ako sa mi reťazec, aby som int - všetky funkcie, ktoré sú tu uvedené. Od teraz, začneme skutočne brať tieto vzdelávacie kolesá off. Budeme začať vziať reťazec od vás, ktoré pripomínajú bol len synonymom pre aký skutočný dátový typ? [Viac >> študenti] Char *. Char *. Pre rodičov, to bolo asi [je whooshing zvuk]. To je dobre. Char * začneme vidieť na obrazovke všetky viac ako odstrániť reťazec z nášho slovníka, aspoň pokiaľ ide o skutočnosti písania kódu. Podobne, prestaneme s použitím niektorej z týchto funkcií až pretože naše programy sa dostať sofistikovanejšie. Skôr než len písať programy, ktoré sedí tam s riadku bliká, čaká na užívateľa, aby niečo písať v, dostanete vaše vstupy odinakiaľ. Napríklad, budete si ich z radu bitov na lokálny pevný disk. Budete miesto si v budúcnosti od pripojenia k sieti, Niektoré webové stránky niekde. Takže poďme Zlúpnite tejto vrstvy prvýkrát a zdvihnite CS50 Appliance a tento súbor s názvom cs50.h, ktoré ste # vrátane týždňov, ale poďme skutočne vidieť, čo je vo vnútri toho. V hornej časti súboru v modrej farbe je len celá partia komentárov: Informácie o záruke a licencovania. To je druh spoločného paradigmy v softvéru pretože veľa softvér v týchto dňoch je to, čo sa nazýva open source, čo znamená, že niekto napísal kód a robil to voľne k dispozícii nielen spustiť a používať, ale skutočne čítať a meniť a integrovať do svojej vlastnej práce. Takže to je to, čo ste doteraz používali, open source softvér, aj keď vo veľmi malom formulára. Keby som posunúť dole okolo pripomienky, keď začneme sa pozrieť na nejaké ďalšie známe veci. Upozornenie na vrchole tu súbor cs50.h obsahuje veľa hlavičkových súborov. Väčšina z nich, sme ešte nevideli, ale jeden je oboznámený. Ktorý z nich sme videli, hoci krátko, tak ďaleko? >> [Študent] Štandardná knižnica. Jo, štandardné knižnice. stdlib.h má malloc. Akonáhle sme začali hovoriť o dynamické prideľovanie pamäti, ktoré sa vrátime na budúci týždeň, rovnako, sme začali vrátane tohto súboru. Ukazuje sa, že bool a pravdivé a falošné robiť nie vlastne existovať v C samo o sebe ak tento súbor zahrnúť tu. Sme celé týždne boli, vrátane stdbool.h takže môžete použiť pojem bool, true alebo false. Bez toho, mali by ste sa trochu falošné neho a použiť int a len svojvoľne predpokladať, že 0 je false a 1 je pravda. Ak by sme posunúť nadol ďalej, tu je naša definícia reťazca. Ukázalo sa, ako sme povedali skôr, že ak táto hviezda je naozaj nezáleží. Môžete dokonca mať priestor všade okolo. Sme tento semester boli jej reklamu, pretože to aby bolo jasné, že hviezda má čo do činenia s typom, ale uvedomte si, rovnako bežné, ak nie o niečo častejšie, je to tam dal, ale funkčne je to to isté. Ale teraz, keď čítame stanovuje ďalšie, poďme sa pozrieť na GetInt pretože sme použili, že možno skôr, ako čokoľvek iného tento semester. Tu je GetInt. To je to, čo? >> [Študent] prototyp. >> To je len prototyp. Často, dali sme prototypy na vrcholky našich. C súbory, ale môžete tiež dať prototypy v hlavičkových súboroch,. h súbory, ako je tento tu takže keď budete písať nejaké funkcie, ktoré chcete, aby ostatní ľudia mohli používať, čo je presne prípad knižnice CS50, môžete nielen realizovať svoje funkcie v niečo ako cs50.c, si tiež dať prototypy nie sú v hornej časti tohto súboru, ale v hornej časti hlavičky súboru. Potom, že hlavičkový súbor je to, čo priatelia a kolegovia patrí s # include vo svojom vlastnom kódu. Takže celú tú dobu, čo ste boli, vrátane všetkých týchto prototypov, účinne na začiatok súboru, ale prostredníctvom tohto # zahŕňa mechanizmus, ktoré v podstate kópia a pasty tento súbor do svojej vlastnej. Tu je niekoľko pomerne podrobná dokumentácia. Sme skoro za samozrejmé, že GetInt dostane int, ale to dopadá tam sú niektoré rohové prípady. Čo keď používateľ zadá do položky, ktorá je príliš veľké, quintillion, že jednoducho nemôže vojsť z int? Čo je to očakávané správanie? V ideálnom prípade, je to predvídateľné. Takže v tomto prípade, ak si skutočne prečítať drobným písmom, budete skutočne vidieť, že v prípade, že linka nemôže byť prečítať, vráti INT_MAX. Nikdy sme o tom hovorili, ale na základe jeho kapitalizácie, čo je to asi? [Študent] konštantný. >> Je to konštanta. Je to nejaký zvláštny konštanta, ktorá je pravdepodobne vyhlásený v jednom z týchto hlavičkových súborov to vyššie v súbore, a INT_MAX je asi niečo ako zhruba 2 mld Sk, Myšlienka je, že preto, že musíme nejako znamenať, že niečo sa pokazilo, sme, áno, majú 4000000000 čísla máme k dispozícii: -2000000000 až na 2 miliardy, dávať alebo brať. No, to, čo je bežné v programovaní je budete kradnúť len jedno z týchto čísel, Možno 0, možno 2 miliardy, možno -2000000000, takže strávite jednu zo svojich možných hodnôt, takže môžete zaviazať k svetu že keď sa niečo pokazí, vrátim to super veľkú hodnotu. Ale nechcete užívateľ zadaním niečo mystické ako 234 ..., naozaj veľké číslo. Môžete upresniť to miesto ako konštanta. Takže naozaj, ak ste boli análny posledných pár týždňov, kedykoľvek si zavolala GetInt, mali by ste byť kontrola s, ak podmienka urobil typ užívateľa v INT_MAX, alebo, presnejšie, urobil GetInt spiatočnej INT_MAX, pretože keby to urobil, to vlastne znamená, že ani písať. Niečo sa pokazilo v tomto prípade. Tak toto je to, čo je všeobecne známe ako sentinelovej hodnota, čo vyžaduje zvláštne. Poďme sa teraz do súboru. C. Súbor C existuje v zariadení nejakú dobu. A v skutočnosti, prístroj má to predkompilované pre vás do tejto veci sme nazvali objektový kód, ale to jednoducho nie je jedno, kde to je, pretože systém vie, v tomto prípade, kedy je: zariadenie. Poďme prejdite teraz GetInt a uvidíte, ako GetInt pôsobí celú tú dobu. Tu máme podobné poznámky z obdobia pred. Dovoľte mi, aby som priblížiť len na kóde časti. A čo máme pre GetInt je nasledujúci. Trvá žiadny vstup. Vracia int, while (true), takže máme úmyselné nekonečnú slučku, ale pravdepodobne budeme vypuknúť to nejako alebo sa vrátiť v rámci tohto. Poďme sa pozrieť, ako to funguje. Zdá sa, že pomocou GetString v tomto prvom riadku vnútri slučky, 166. To je teraz dobré praxe, pretože, za akých okolností by GetString vrátiť špeciálny kľúčové slovo NULL? >> [Študent] Ak sa niečo pokazí. Ak sa niečo pokazí. A čo by sa mohlo pokaziť, keď budete volať niečo ako GetString? Jo. >> [Študent] malloc nedokáže dať na ints. Jo. Možno malloc zlyhá. Niekde pod pokrievku, GetString volá malloc, ktorý by určoval pamäť, ktorá umožňuje počítaču úložisko všetkých postáv že používateľ zadá do klávesnice. A predpokladať užívateľ mal veľa voľného času a napísal viac, napríklad, ako 2 miliardy znakov, viac znakov ako v počítači, má dokonca aj RAM. GetString musí byť schopný znamenať, že na vás. Aj keď je to super, super nezvyčajné roh prípad, musí nejako byť schopné zvládnuť, a tak GetString, keby sme sa vrátili a prečítať si jeho dokumentáciu, sa v NULL skutočnosti návrate. Takže teraz, keď GetString zlyhá vrátením NULL, GetInt bude zlyhanie vrátením INT_MAX rovnako ako hliadka. To sú len ľudské konvencie. Jediný spôsob, ako by vedieť, že to je prípad od čítania dokumentácie. Poďme prejdite na miesto, kde je int skutočne dostal. Keby som posunúť nadol o kúsok ďalej, v súlade 170, máme komentár nad týmito riadkami. Prehlasujeme v 172 int, n, a char, c, a potom sa toto nové funkcie, ktoré niektorí z vás narazil skôr, sscanf. To je skratka pre reťazce scanf. Inými slovami, daj mi reťazec a budem testovať to na kusy informácií záujmu. Čo to znamená? Predpokladajme, že som typ v doslova, 123 na klávesnici a potom stlačte kláves Enter. Aký je dátový typ 123, keď sa vrátil od GetString? >> [Študent] String. Je to samozrejme string, nie? Mám reťazec. Takže 123 je naozaj, citujem-koniec citátu, 123 s \ 0 na konci. To nie je int. To nie je číslo. Vyzerá to ako číslo, ale nie je to vlastne. Takže to, čo sa GetInt urobiť? To má skenovať, že reťazec zľava doprava - 123 \ 0 - a nejako previesť na skutočné číslo. Dalo by sa zistiť, ako to urobiť. Ak si myslíte, že späť do pset2, môžete pravdepodobne sa trochu pohodlné s Caesarom alebo Vigenere, takže môžete iterácii reťazec, môžete previesť znaky na ints. Ale sakra, to je veľa práce. Prečo nie volať funkciu ako sscanf, ktorý robí to pre vás? Takže sscanf očakáva argument - v tomto prípade nazýva linka, ktorá je reťazec. Tie potom zadať v úvodzovkách, veľmi podobný printf, čo očakávať, že v tomto reťazci. A to, čo tu hovorím je, že som očakávať, že desatinné číslo a možno aj charakter. A uvidíme, prečo tomu tak je za chvíľu. A ukázalo sa, že tento záznam je teraz pripomína, čo sme začali hovoriť o len niečo málo cez týždeň pred. Čo je a n a a c robí pre nás? >> [Študent] Adresa n a adresa c. Jo. Je to, že mi dal adresu n a adresu c Prečo je to tak dôležité? Viete, že s funkciou v C, môžete produkt vždy vrátiť hodnotu alebo žiadnu hodnotu. Môžete sa vrátiť int, je reťazec, float, char, bez ohľadu na, alebo sa môžete vrátiť neplatné, ale môžete vrátiť iba jednu vec maximálne. Ale tu chceme sscanf vrátiť mi možno int, desatinné číslo, a tiež char, a ja ti to vysvetlím, prečo char za chvíľu. Tie účinne Chcete sscanf vrátiť dve veci, ale to jednoducho nie je možné v C. Môžete obísť, že odovzdaním dvoma adresami pretože akonáhle podáš funkciu, dve adresy, čo môže, že funkcia s nimi robiť? >> [Študent] Napíšte týchto adries. To môže napísať na tieto adresy. Môžete použiť hviezdu operáciu a tam, aby sa každý z týchto adries. Je to niečo tohto typu back-mechanizmu dverí, ale veľmi bežné pre zmenu hodnôt premenných viac než len jedno miesto - v tomto prípade dva. Teraz všimnete som kontrola == 1 a potom sa vracať n prípade, že sa v skutočnosti, vyhodnotí na true. Tak čo sa deje? Technicky, všetci chceme skutočne stalo v GetInt je tento. Chceme analyzovať, aby som tak povedal, chceme čítať reťazec - quote-koniec citátu 123 - a ak to vyzerá, že to číslo tam, čo hovoríme sscanf robiť je kladený na toto číslo - 123 - v tejto premennej n pre mňa. Tak prečo potom som vlastne majú to rovnako? Aká je úloha sscanf povedať, že si môže tiež dostať charakter sem? [Nepočuteľné Študent reakcie] >> desatinná čiarka skutočne mohol fungovať. Poďme si myslia, že sa na chvíľu zamyslel. Čo ešte? [Študent] Mohlo by to byť NULL. >> Dobrá myšlienka. Mohlo by to byť null znak. Je to vlastne nie je v tomto prípade. Jo. >> [Študent] ASCII. ASCII. Alebo mi dovoľte upresniť ešte ďalej. Znak% c je len pre kontrolu chýb. Nechceme tam byť znak za číslo, ale čo to mi umožňuje urobiť, je nasledujúci. Ukazuje sa, že sscanf, okrem ukladanie hodnôt v N a C v tomto príklade tu, čo to tiež robí, je, že vracia počet premenných je kladený hodnoty palcov Takže ak ste len zadajte 123, potom len% d bude odpovedať, a len n je uložená s hodnotou, ako je 123, a nič dostane dať do c C zostáva odpadky hodnotu, aby som tak povedal - smetiarske, pretože je to nikdy nebola inicializovaná na ľubovoľnú hodnotu. Takže v tomto prípade, sscanf vráti 1, pretože som naplnený 1 týchto ukazovateľov, v takom prípade skvelý, mám int, takže som uvoľniť linku uvoľniť pamäť že GetString skutočne pridelené, a potom som sa vrátiť n, else ak ste niekedy nad tým, kde to opakovať vyhlásenie prichádza z toho pochádza priamo odtiaľto. Takže ak naopak, píšem v 123foo - len nejaký náhodný sled textu - sscanf uvidí číslo, číslo, číslo, f, a to bude dať 123 do n; to dám F v C a potom sa vrátiť 2. Takže máme, len pomocou základnej definícii správanie sscanf je, veľmi jednoduchý spôsob - dobre, komplex na prvý pohľad, ale na konci dňa pomerne jednoduchý mechanizmus - povedať je, že int, a ak áno, je to, že jediná vec, ktorú som našiel? A medzery tu je úmyselné. Ak budete čítať dokumentáciu k sscanf, to vám povie, že ak sú kúsok medzerou na začiatku alebo na konci, sscanf príliš umožní užívateľovi, z akéhokoľvek dôvodu, zasiahnuť medzerník 123 a to bude legitímne. Nebudete kričať na užívateľa len preto, že narazia na medzerník na začiatku alebo na konci, čo je len o málo viac užívateľsky príjemný. Akékoľvek otázky, potom na GetInt? Jo. >> [Študent] Čo keď len dať do char? Dobrá otázka. Čo keď ste práve zadali v char ako f a stlačte klávesu Enter, bez kedy písanie 123? Čo si myslíte správanie tomto riadku kódu by potom? [Nepočuteľné Študent odpoveď] Jo, takže sscanf môže pokrývať, že aj preto, že v takom prípade, že to nebude na vyplnenie n alebo c. Bude to miesto vrátiť 0, v tom prípade som tiež chytí, že scenár pretože očakávaná hodnota chcem je 1. Chcem len jeden a len jedna vec, ktorú treba zaplniť. Dobrá otázka. Ostatné? Dobrá. Poďme sa prejsť všetky funkcie v tu, ale ten, ktorý sa zdá byť snáď zostávajúce záujmu je GetString pretože sa ukázalo, že GetFloat, GetInt, GetDouble, GetLongLong všetky punt veľa z ich funkčnosti na GetString. Takže poďme sa pozrieť na to, ako on je realizovaný tu. Tohle vyzerá trochu zložitejšie, ale používa rovnaké základy že sme začali hovoriť o minulý týždeň. V GetString, ktorý neberie argument, podľa prázdna sem a vráti reťazec, som zrejme som sa prehlasuje, že reťazec s názvom vyrovnávacia pamäť. Ja naozaj neviem, čo že sa to využiť na ešte, ale uvidíme. Vyzerá to, že kapacita je v predvolenom nastavení 0. Nie tak celkom istí, kde to bude, nie je si istý, čo n sa bude používať pre ešte, ale teraz je to stále trochu zaujímavejšie. V súlade 243, vyhlasujeme int, c To je niečo ako hlúpe detailu. Char je 8 bitov, a 8 bitov možno uložiť, koľko rôznych hodnôt? >> [Študent] 256. >> 256. Problém je, ak chcete mať 256 rôznych ASCII znakmi, ktoré existujú ak si myslíte, že späť - a to nie je niečo, čo pamätať. Ale ak si myslíte, že späť do tej veľkej ASCII tabuľky sme mali pred niekoľkými týždňami, bolo v tomto prípade 128 alebo 256 znakov ASCII. Použili sme všetky vzory 0s a 1s hore. To je problém, ak chcete byť schopný detekovať chybu pretože ak ste už používate 256 hodnôt pre svoje postavy, ste naozaj plánovať dopredu, pretože teraz nemáte žiadny spôsob, ako hovoriť, to nie je legitímna charakter, to je nejaký chybný správu. Takže to, čo svet skutočne je, že používajú ďalšie najväčšiu hodnotu, niečo ako int, tak, že máte šialený počet bitov, 32, pre 4 miliardy možných hodnôt takže môžete jednoducho skončiť s použitím v podstate 257 z nich, 1 z nich má nejaký zvláštny význam ako chyba. Tak uvidíme, ako to funguje. V súlade 246, mám veľkú slučky while, ktorá volá fgetc, f znamená súbor, takže getc, a potom sa stdin. Ukázalo sa, že to je len presnejšie spôsob, ako hovoriť číta vstup z klávesnice. Štandardná vstupná prostriedky klávesnica, štandardný výkon znamená obrazovku, a štandardná chyba, ktorú uvidíme v pset4, znamená obrazovku ale osobitná časť obrazovky tak, aby to nie je zjednotený s skutočnému výstupu ktorý určená pre tlač. Ale o tom viac v budúcnosti. Takže fgetc len znamená prečítať jeden znak z klávesnice a uložiť ho tam, kde? Uložte ho do cca. A potom skontrolovať -, takže som len pomocou pár logických konjunkcia tu - uistite sa, že nie je rovno - \ n, takže užívateľ Enter, chceme zastaviť v tomto bode, koniec slučky - a tiež chceme, aby zistili, či pre zvláštne konštantný OSZ, ktorá, ak viete alebo tušíte, čo to znamená? >> [Študent] Koniec súboru. >> Koniec súboru. To je druh nezmyselný, pretože keď píšem na klávesnici, je to naozaj žiadny súbor sa na tomto, ale to je len trochu generický termín použitý znamenať že nič iné sa blíži z ľudského prsty. EOF - koniec súboru. Ako stranou, ak ste niekedy hit Ovládacie D na vašej klávesnici, nie že by ste ešte - ste hit Control C - Control D pošle tento špeciálny konštanta tzv EOF. Takže teraz máme len nejaké dynamické prideľovanie pamäte. Takže ak (n + 1> kapacita). Teraz budem vysvetľovať n N je len, koľko bytov je v súčasnej dobe vo vyrovnávacej pamäti, reťazec, ktorý ste v súčasnej dobe buduje od užívateľa. Ak máte viac znakov vo vašom vyrovnávacej pamäte, než budete mať kapacitu vyrovnávacej pamäte, intuitívne, čo musíme urobiť, a potom je prideliť väčšiu kapacitu. Takže budem zbierať v priebehu niektorej z aritmetického tu a sústrediť sa iba na túto funkciu tu. Viete, čo malloc je alebo sú aspoň rámcovo oboznámený. Hádať, čo realloc robí. >> [Študent] Pridá pamäte. To nie je úplne pridanie pamäte. To prerozdeľuje pamäť takto. Ak je ešte stále priestor na konci reťazca, aby vám viac, že ​​pamäť ako pôvodne vám dáva, potom budete môcť dať ďalšie pamäť. Takže si môžete len držať uvedenie reťazec, postavy chrbtom k sebe, aby sa chrbtom k sebe. Ale ak to nie je prípad, pretože ste čakali príliš dlho a niečo náhodne dostal zvalil do pamäte tam ale je tu ďalší pamäti tu, to je v poriadku. Realloc bude robiť všetko ťažkú ​​prácu za vás, presunúť reťazec čo ste si prečítali v tak ďaleko odtiaľ, dal ju tam, a potom vám ešte trochu dráhu v tomto bode. Takže s mávnutím ruky, dovoľte mi povedať, že to, čo robí GetString je to začína s malým pufra, možno jediný znak, a pokiaľ užívateľ zadá do dvoch postáv, GetString skončí volanie realloc a hovorí, že jeden znak nebolo dosť, daj mi dve postavy. Potom, ak budete čítať cez logiky slučky, bude to povedať Užívateľ napísal do 3 znaky, daj mi teraz nie je 2, ale 4 znaky, tak mi daj 8, tak mi daj 16 a 32. Skutočnosť, že som Zdvojnásobenie kapacity zakaždým Znamená to, že vyrovnávacia pamäť je nebude rastú pomaly, že to bude rast veľmi rýchly. A čo by mohlo byť výhodou, že? Prečo som zdvojnásobenie veľkosti vyrovnávacej pamäte aj keď užívateľ mohol stačí jedno extra znak z klávesnice? [Nepočuteľné Študent odpoveď] >> Čo je to? >> [Študent] Nemusíte pestovať to, ako často. Presne tak. Nemusíte pestovať to, ako často. A to je len trochu, že si zabezpečenie svojej stávky tu, Myšlienka je, že nechcete volať realloc veľa, pretože to má tendenciu byť pomalé. Kedykoľvek môžete požiadať operačný systém pre pamäte, ako skoro uvidíte v budúcnosti problém sade, má tendenciu trvať nejaký čas. Takže je minimalizovať množstvo času, aj keď strácame nejaké miesto, tendenciu byť dobré. Ale ak budeme čítať prostredníctvom záverečnej časti GetString tu - a znovu pochopenie každý riadok tu nie je tak dôležitá aj dnes - Všimnite si, že to nakoniec zavolá malloc znova a prideľuje presne toľko bajtov, ako je potrebné pre reťazec a potom vyhodí volaním zadarmo prílišné veľkú vyrovnávaciu pamäť ak to naozaj dostal dvojnásobok príliš mnohokrát. Takže v skratke, je to, ako GetString pôsobí celú tú dobu. Všetko to je čítať jeden znak v čase, znova a znova a znova, a zakaždým, keď potrebuje nejaký ďalší pamäť, požiada operačný systém pre neho volaním realloc. Nejaké otázky? Dobrá. Útok. Teraz, keď sme pochopili ukazovatele alebo aspoň sú stále oboznámení s ukazovateľmi, Poďme zvážiť, ako celý svet začne rúcať ak nemáte dosť brániť sporných užívateľov, ľudia, ktorí sa snažia preniknúť do vášho systému, ľudia, ktorí sa snažia ukradnúť vaše softvér a tým obísť nejaký registračný kód že by inak mohla písať palcov Pozrite sa na tento príklad tu, čo je len C kód, ktorý má funkciu hlavnej v dolnej časti , Ktorý volá funkciu foo. A čo je okolo, aby foo? [Študent] jediný argument. >> [Malan] jediný argument. Takže ArGV [1], čo znamená, že prvé slovo, ktoré užívateľ zadané na príkazovom riadku po a.out alebo čokoľvek sa nazýva program. Tak foo hore sa v char *. Ale char * je presne to, čo? >> [Študent] string. [Malan] reťazec, takže nič nové. To je reťazec ľubovoľne sa nazýva bar. V tomto riadku tu, char c [12], v akejsi polo-technickej angličtiny, čo sa tento riadok robí? [Študent] Pole - >> Array of? >> [Študent] znaky. Postavy >>. Daj mi rad 12 znakov. Tak by sme mohli nazvať tento vyrovnávacej pamäte. Je to odborne nazýva c, ale vyrovnávaciu pamäť v programovaní znamená len veľa priestoru ktoré si môžete dať nejaké veci dovnútra Potom konečne, memcpy sme nepoužíva skôr, ale asi tušíte, čo to robí. Je to kópia pamäte. Čo to robí? Je zrejme kopíruje bar, jeho vstupné, do C, ale len do dĺžky pruhu. Ale je tu chyba tu. >> [Študent] Potrebuješ sizeof charakter. Dobre >>. Technicky, mali sme naozaj strlen (bar) * sizeof (char)). To je správne. Ale v najhoršom prípade tu, poďme predpokladať, že to je - Dobre. Potom je tu dve chyby. Takže sizeof (char)); Poďme urobiť to trochu širšie. Takže teraz je tu stále chyba, ktorá je čo? >> [Nepočuteľné Študent odpoveď] Skontrolujte, čo? >> [Študent] Skontrolujte NULL. Mali by sme byť všeobecne kontrola NULL, pretože zlé veci sa stávajú keď váš ukazovateľ je NULL, pretože by ste mohli skončiť ísť tam, a nemali by ste nikdy ísť na NULL dereferencing s hviezdy operátora. Tak to je dobre. A čo iného robíme? Logicky, je tu chyba tu taky. [Študent] Skontrolujte, či argc je> = až 2. Tak sa pozrite, ak argc je> = 2. Dobre, takže tam tri chyby v tomto programe tu. Sme teraz kontroluje, pokiaľ užívateľ skutočne zadali niečo do ArGV [1]. Dobré. Takže to, čo je tretia chyba? Jo. >> [Študent] C nemusí byť dostatočne veľká. Dobré. Skontrolovali sme jeden scenár. My implicitne kontrolovať nekopírujte viac pamäte, než by sa prekročil dĺžky tyče. Takže ak reťazec užívateľ zadali, je 10 znakov, to hovorí kopírovať len 10 znakov. A to je v poriadku. Ale čo keď užívateľ napísal v slove na riadku ako 20-znakové slovo? Toto hovorí kópiu 20 znakov z baru do čoho? C, inak známa ako náš pufra, čo znamená, že práve napísal dát na 8 byte miesta, ktoré ste nevlastníte, a nemáte vlastný je v tom zmysle, že ste nikdy pridelené im. 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. A je to útok v tom zmysle, že v prípade, že používateľ alebo program, ktorý volá svoje funkcie robí to v zlom úmysle, čo sa vlastne bude diať ďalej, by mohli byť docela zlé. Takže poďme sa pozrieť na obrázku tu. Tento obrázok predstavuje svoj stack pamäte. Pripomeňme si, že zakaždým, keď volanie funkcie vám tento malý rámček na zásobníku a potom ďalšie a potom ďalšie a ďalšie. A tak ďaleko, máme to jednoducho odobraté nich ako obdĺžniky buď na palube alebo na obrazovke tu. Ale keď sa priblížite na jednom z týchto obdĺžnikov, keď voláte funkciu foo, ukazuje sa, že je toho viac na zásobníku vo vnútri tohto rámca v tomto obdĺžniku ako len x a y a a b, rovnako ako sme sa hovoriť o swapu. Ukazuje sa, že je tu nejaké nižšej úrovni podrobnosti, medzi nimi Return Address. Tak to dopadá, keď hlavné volá foo, hlavné je informovať foo Aké hlavné je adresa v pamäti počítača pretože inak, akonáhle foo sa vykonáva prevedení, ako je v tomto prípade tu, akonáhle sa dostanete tento uzavretý zložená zátvorka na konci foo, Ako sakra sa foo vedieť, kde je ovládanie programu má ísť? Ukazuje sa, že odpoveď na túto otázku, je v tomto červenom obdĺžniku tu. To predstavuje ukazovateľ, a to až do počítača, aby dočasne uskladniť na tzv zásobníka je adresa hlavnej tak, že akonáhle foo urobiť vykonávania, počítač vie, kde a čo riadok v hlavnom ísť späť. Uložené Frame ukazovateľ sa týka podobne to. Char * bar tu predstavuje, čo? Teraz je táto modrá segmentu je tu foo je rám. Čo je to bar? Bar je len argument k funkcii foo. Takže teraz sme späť u hornín známeho obrazu. Je tu ďalšie veci, a ďalšie rozptýlenie na obrazovke, ale to svetlo modrá segmente len je to, čo sme boli kreslenie na tabuľu niečo ako swap. To je rámec pre foo. A jediná vec v tom teraz je bar, ktorý je tento parameter. Ale čo iné by malo byť v zásobníku podľa tohto kódu tu? [Študent] char c [12]. >> [Malan] char c [12]. Mali by sme tiež vidieť 12 štvorcov pamäte pridelené do premennej s názvom c, a naozaj máme, že na obrazovke. Samom vrchole je c [0], a potom autor tejto schémy neobťažoval čerpanie všetkých štvorcov, ale skutočne existujú 12 tam pretože keď sa pozriete na pravom dolnom rohu, c [11], ak budete počítať od 0, je 12. such byte. Ale tu je ten problém. V akom smere je c rastie? Druh zhora dole, keď to začína na vrchole a rastie na dno. To nevyzerá ako sme odišli sami moc dráhu tu vôbec. Sme trochu maľoval seba do kúta, a že c [11] je správna proti baru, ktorý je priamo proti Uložené frame pointer, ktorá je priamo proti spiatočná adresa. Tam to nie je miesto. Takže to, čo je dôsledkom potom, ak ste zpackat a skúste si prečítať 20 bajtov do 12-byte pamäti? Ak sú tieto 8 ďalších bytov ísť? >> [Študent] Inside - Vnútri všetko ostatné, z ktorých niektoré sú super dôležité. A to najdôležitejšie, potenciálne, je červený rámček tam, Return Address, pretože predpokladám, že ste buď náhodne, alebo adversarially prepíšte tieto 4 byty, že ukazovateľ adresa, a to nielen u odpadu, ale s radom , Ktorý sa stane predstavujú skutočnú adresu v pamäti. Čo je to dôsledok, logicky? >> [Študent] Funkcia sa chystá vrátiť na iné miesto. Presne tak. Keď foo vráti a hity, ktoré rovnátka kučeravé, program bude pokračovať aby sa nevracali k hlavnej, že to bude návrat na čokoľvek adresa je v tomto červenom poli. V prípade obišli softvéru registráciu, čo keď adresa, ktorá je momentálne vrátil, je funkcia, ktorá obvykle volaná potom, čo ste zaplatili za softvér a zadali vaše registračný kód? Môžete triediť trik počítača do nebudete tu, ale bude tu. Alebo ak ste naozaj šikovný, môže protivník skutočne zadajte na klávesnici, napríklad, nie je aktuálne slovo, nie 20 znakov, ale predpokladám, on alebo ona skutočne Typy niektoré znaky, ktoré predstavujú kód. A to nebude C kód, je to vlastne bude znaky ktoré predstavujú binárne strojový kód, 0s a 1s. Ale predpokladám, že to dosť šikovný, aby to, že, nejako vložiť do GetString riadku niečo, čo je v podstate skompilovaný kód, a posledné 4 bajty prepísať návratovú adresu. A čo to, že adresa vstup robiť? V skutočnosti sa ukladá v tomto červenom obdĺžniku adresu prvého bajtu pufra. Takže budete musieť byť naozaj šikovný, a to je veľa pokusov a omylov pre zlé ľudí tam, ale ak môžete zistiť, aké veľké je toto vyrovnávacia pamäť je tak, že v posledných niekoľkých bajtov na vstupe zadať do programu stalo, že sa rovná adresu začiatku svojho vyrovnávacej pamäte, môžete to urobiť. Ak hovoríme normálne pozdraviť a \ 0, to je to, čo skončí vo vyrovnávacej pamäti. Ale keď sme múdrejší a naplníme, že vyrovnávacia pamäť s tým, čo budeme všeobecne hovoriť útoku kódu - AAA, útok, útok, útok - ak je to proste niečo, čo urobí niečo zlé, čo sa stane, ak ste naozaj chytrí, môžete to urobiť. V červenom poli tu je sekvencia čísel - 80, C0, 35, 08. Všimnite si, že zodpovedá číslo, ktoré je tu. Je to v obrátenom poradí, ale o tom až niekedy inokedy. Všimnite si, že táto spiatočná adresa bola úmyselne zmenený rovnať adresu sem, nie je adresa main. Takže ak ten zlý je super šikovný, on alebo ona bude zahŕňať v tomto útoku kódu niečo ako odstrániť všetky súbory používateľa, alebo skopírovať hesla alebo vytvoriť používateľský účet, ktorý potom môžem prihlásiť do - vôbec nič. A to je ako nebezpečenstvo a sila C. Vzhľadom k tomu, že máte prístup k pamäti prostredníctvom ukazovateľa a môžete teda napísať čokoľvek, čo chcete do pamäte počítača, si môžete urobiť počítač robiť, čo chcete jednoducho tým, že sa skákať okolo vnútri svojej vlastnej pamäte. A tak k tomuto dňu toľko programov a toľko internetové stránky, ktoré sú ohrozené redukuje na ľudí, ktorí sa výhody tejto. A to môže zdať ako super sofistikované útoku, ale to nie je vždy začať takhle. Skutočnosťou je, že to, čo zlí ľudia zvyčajne urobiť, je, či už je to program v príkazovom riadku alebo program, GUI alebo webové stránky, stačí začať poskytovať nezmysly. Zadáte v naozaj veľkom slovo do vyhľadávacieho poľa a stlačte kláves ENTER, a budete čakať, či webová stránka zrúti alebo počkať, či sa program prejaví nejakú chybovú správu pretože ak budete mať šťastie ako zloduch a poskytnúť nejaké šialené vstup že narazí na program, ktorý znamená, programátor nepredpokladal svoje zlé správanie, čo znamená, že môžete pravdepodobne dostatok úsilia, dosť pokusov a omylov, prísť na to, ako viesť presnejšie útok. Tak ako tak súčasťou zabezpečenia nie je len vyhnúť týmto útokom úplne ale zachytí je a vlastne sa pozerať na polená a vidieť, čo bláznivé vstupy majú ľudia zadali do svojich webových stránok, Čo vyhľadávacie termíny sú ľudia napísali na svoj web v nádeji, že preteká nejakú vyrovnávacej pamäte. A to všetko sa scvrkáva na jednoduchých základoch toho, čo je pole a čo to znamená pre prideľovanie a využívanie pamäte. S tým súvisí potom aj to je. Povedzme, pozrel sa vo vnútri pevného disku ešte raz. Spomínate si z týždeň či dva pred, že keď pretiahnete súbory na váš recycle bin, alebo trash can, čo sa stane? >> [Študent] Nothing. >> Vôbec nič, že jo? Nakoniec, ak sa dostanete nedostatok miesta na disku, Windows alebo Mac OS začne mazať súbory pre vás. Ale ak pretiahnete niečo tam, že nie je vôbec bezpečné. Všetky vaše spolubývajúci alebo priateľ alebo člen rodiny musí urobiť, je dvakrát kliknite a voila, tu všetky útržkovité súbory, ktoré ste sa pokúsili odstrániť. Väčšina z nás aspoň vedieť, že budete musieť pravým tlačidlom myši alebo regulácia kliknutím a prázdne popolnice alebo niečo také. Ale aj potom to nie je úplne stačiť pretože to, čo sa stane, keď máte súbor na pevnom disku že reprezentuje nejaký dokument, alebo nejaký JPEG, a to predstavuje pevný disk, a povedzme, že tento kúsok tu predstavuje tento súbor, a to je zložené z celej veľa 0s a 1s. Čo sa stane, keď sa nielen pretiahnuť tento súbor do koša alebo koša ale aj vyprázdniť? Zoradiť z ničoho. Nie je to vôbec nič teraz. Teraz je to len preto, že nič trochu niečo stane v podobe tejto tabuľky. Takže tam je nejaký druh databázy alebo tabuľky vnútri pamäti počítača že v podstate má jeden stĺpec pre súbory mien a jeden stĺpec pre súbory "miesto, , Čo by mohlo byť zaradenie 123, len náhodné číslo. Takže by sme mohli mať niečo ako x.jpeg a umiestnenie 123. Čo sa stane potom, keď vyprázdniť svoje odpadky? To zmizne. Ale čo nezmizne, je 0s a 1s. Takže to, čo je potom pripojenie k pset4? No, s pset4, len preto, že sme omylom vymazal karty Compact Flash že mal všetky tieto fotky, alebo len preto, že smola stal poškodený neznamená, že 0s a 1s nie sú tam stále. Možno niektoré z nich sú stratené, pretože niečo dostal poškodený v tom zmysle, že niektoré 0s stal 1s a 1s stal 0s. Zlé veci sa môže stať, pretože buggy softvér alebo chybný hardware. Ale mnohí z tých kúskov, možno aj 100% z nich, sú tam stále. Je to len, že počítač alebo fotoaparát nevie, kde JPEG1 začala a kde JPEG2 začal. Ale ak, programátor, viem, s trochou znalosťami, pokiaľ tieto JPEG sú alebo ako vyzerajú, takže môžete analyzovať 0s a 1s a povedať JPEG, JPEG, môžete napísať program s v podstate len pre alebo while , Ktorý využíva každý z týchto súborov. Takže lekcie potom je začať bezpečne mazanie súborov ak by ste chceli, aby sa zabránilo to úplne. Áno. [Študent] Ako to, hovorí o vašom počítači že máte viac pamäte, ako ste robili predtým? Majú viac pamäte, než predtým a - >> [Študent] Viac dostupnej pamäte. Oh. Dobrá otázka. Tak prečo potom po vyprázdnení koša sa počítač povedať že máte viac voľného miesta, ako ste robili predtým? Stručne povedané, pretože klame. Viac technicky, máte viac priestoru, pretože teraz ste povedal si môžete dať ďalšie veci, kde tento súbor raz bolo. Ale to neznamená, že bity idú preč, a že neznamená bity sú zmenená na všetkých 0s, napríklad, pre vašu ochranu. Takže naopak, ak si bezpečne zmazať súbory alebo fyzicky zničiť zariadenia, to je naozaj jediný spôsob, ako sa niekedy okolo toho. Tak prečo by sme odísť na tomto semi-strašidelné poznámky, a uvidíme sa v pondelok. [Potlesk] [CS50.TV]