[Powered by Google Translate] [5. týden]
[David J. Malan - Harvard University]
[To je CS50. - CS50.TV]
>> To je CS50, 5. týden.
Dnes a tento týden, představíme trochu světě forenzní
v kontextu problému Set 4.
Dnes bude zkrácen přednáška, protože tam je zvláštní událost v tu poté.
Takže budeme se podívat a dráždit oba studenty i jejich rodiče dnes
s některými z věcí, které jsou na obzoru.
>> Mezi nimi, v pondělí, budete mít několik dalších spolužáků.
EDX, Harvard a MIT nových on-line iniciativa pro OpenCourseWare a více,
zahajuje na akademické půdě Harvardu v pondělí, což znamená, že přijde pondělí
budete mít, jak poslední sčítání, 86000 další spolužáky
kteří budou sledovat spolu s přednáškami CS50 tyto a profilů
a návody a problémové soubory.
A jako součást tohoto, stanete se členy inaugurační třídy CS50 a teď CS50x.
Jako součást teď si uvědomit, že tam budou nějaké upsides stejně.
Chcete-li získat připraven na to, pro masivní počet studentů,
stačí říct, že i když máme 108 TFS a CAS,
to není tak docela nejlepší student-učitel poměr, jakmile se dostaneme 80.000 studentů.
Nebudeme se třídění tolik problém nastaví ručně,
tak představil tento týden v problémové sady budou CS50 Check,
která se bude nástroj příkazového řádku uvnitř myčky
že budete mít po aktualizaci později tento víkend.
Budete moci spustit příkaz, check50, na vlastní PSet,
a budete mít okamžitou zpětnou vazbu o tom, zda je váš program je správné nebo nesprávné
podle různých konstrukčních specifikací, které jsme poskytli.
Více na které v specifikaci problému set.
V CS50x spolužáci budou používat to stejně.
>> Problém Set 4 je všechno o kriminalistice,
a to Pset opravdu inspirován nějakým real-life věci
přičemž, když jsem byl v postgraduálním studiu jsem internován na chvíli
s Middlesex County je okresní zastupitelství dělá forenzní práci
s jejich hlavní forenzní vyšetřovatel.
Co to činil, jak myslím, že jsem zmínil několik týdnů minulosti,
je policie Mass stát nebo jiní by přijít,
by odjet věci jako pevné disky a CD a disket a podobně,
a pak cílem forenzní kanceláře bylo zjistit
zda byl či nebyl důkaz nějakého druhu.
To bylo zvláštní Oddělení pro vyšetřování, tak to bylo úřednický zločin.
Bylo to více znepokojující druh trestných činů, nic zahrnující nějakou digitálních médií.
Ukazuje se, že ne, že mnoho lidí napsat e-mail říkat, "já to udělal."
Takže docela často, tyto forenzní vyhledávání neobjevil všude tolik ovoce,
ale někdy lidé by psát takové e-maily.
Takže někdy, byli odměněni úsilí.
>> Ale vést až k tomuto forenzní PSet, budeme zavádět na pset4 trochu grafiky.
Pravděpodobně jste se tyto věci jako samozřejmost - JPEG, GIF, a podobně - v těchto dnech.
Ale pokud si opravdu myslíte, že o tom, obraz, podobně jako obličej Rob,
může být modelován jako sled teček nebo pixelů.
V případě obličeje Robertův, je tu všechny druhy barev,
a začali jsme vidět jednotlivé body, jinak známý jako pixely,
jakmile jsme začali pro přiblížení
Ale pokud budeme zjednodušovat svět o trochu a jen říct, že tohle je Rob v černé a bílé,
k reprezentaci černé a bílé, můžeme prostě použít binární.
A pokud budeme používat binární, 1 nebo 0, můžeme vyjádřit stejný obrázek
usmívající se tvář Robertův s tímto vzorem bitů.
11000011 představuje bílá, bílá, černá, černá, černá, černá, bílá, bílá.
A tak to není obrovský skok a pak začít mluvit o barevných fotografiích,
věci, které byste vidět na Facebooku, nebo se s digitálním fotoaparátem.
Ale jistě, pokud jde o barvy, budete potřebovat více bitů.
A docela běžné ve světě fotografií je použít ne 1-bitové barvy,
, protože to naznačuje, ale 24-bitové barvy, kam vlastně získat miliony barev.
Tak jako v případě, kdy jsme se přiblížili na oko Rob,
, který byl libovolný počet milionů různých barevných možností.
Takže budeme zavádět to v problému Set 4 stejně jako v návodu,
která bude dnes v 03:30 místo obvyklých 02:30, protože přednášky pátečním zde.
Ale video bude on-line jako obvykle zítra.
>> Budeme také představí vám do jiného formátu.
Toto je záměrně chtěl podívat zastrašující na první,
ale to je jen nějaká dokumentace pro struct C.
Ukazuje se, že Microsoft před lety pomohl popularizovat tento formát
volal bitmapový formát souboru, bmp, a to bylo super jednoduché, barevné grafické formát souboru
, která byla použita pro docela nějaký čas, a někdy ještě pro tapety na stolní počítače.
Pokud si myslíte, že zpět na systém Windows XP a zvlněné kopce a modrou oblohu,
to bylo typicky bmp nebo bitmapový obraz.
Bitmapy jsou zábavné pro nás, protože mají trochu větší komplexnost.
Není to tak jednoduché, jak tento mřížka 0s a 1s.
Místo toho máte věci jako záhlaví na začátku souboru.
Takže jinými slovy, uvnitř. Soubor BMP je celá parta 0s a 1s,
ale tam je nějaký další 0s a 1s tam.
A ukázalo se, že to, co jsme pravděpodobně zaujatý za samozřejmost let -
formáty souborů, jako. doc nebo. xls nebo. mp3, mp4., bez ohledu na formáty souborů
že jste se seznámili s - co to vůbec znamená být formát souboru,
protože na konci dne všechny tyto soubory používáme mají jen 0 a 1.
A možná ti 0s a 1s představují ABC přes ASCII nebo jako,
ale na konci dne, je to ještě jen 0 a 1.
Takže lidé jen občas rozhodnou vymyslet nový formát souborů
kde standardizovat co vzory bitů bude skutečně znamenat.
A v tomto případě zde, že lidé, kteří navrhli bitmapový formát souboru
řekl, že při prvním bajtu v rastrového souboru, jak je označil ofsetových 0 tam,
tam bude nějaký nesrozumitelné názvy proměnné volal bfType,
který právě zkratka pro bitmapový typ souboru, jaký typ rastrového souboru je to.
Můžete vyvodit snad z druhé řady, která ofsetovou 2, byte číslo 2,
má vzor 0s a 1s, který představuje to, co? Velikost něco.
A to jde o odtud.
Takže v problému Set 4, budete prošel některé z těchto věcí.
Nebudeme skončit starat o všechny z nich.
Povšimněme si ale, že začíná být zajímavé okolí bytu 54: rgbtBlue, zelená, červená a.
Pokud jste někdy slyšeli zkratka RGB - červená, zelená, modrá - to je odkaz na který
protože se ukázalo, můžete malovat všechny barvy duhy
s nějakou kombinaci červené a modré a zelené.
A ve skutečnosti, může rodiče v pokoji připomenout některé z prvních projektorů.
V těchto dnech, stačí vidět jeden jasně světlo přicházející z objektivu,
ale zpět v den, kdy měl červenou čočku, modré čočky, a zelené objektiv,
a společně se snažily na obrazovku a tvořil barevné fotografie.
A docela často, by střední školy a vysoké školy mají tyto čočky
někdy tak trochu nakřivo, takže jsi trochu vidět dvoulůžkových a třílůžkových obrázků.
Ale to byl nápad. Vy jste měli červené a zelené a modré světlo malování obrazu.
A to stejný princip je použit v počítačích.
>> Takže mezi úkoly pak pro vás v problému Set 4 se bude pár věcí.
Jedním z nich je skutečně změnit velikost obrázku, aby se ve vzoru 0s a 1s,
zjistit, které kousky 0s a 1s představují to, co do struktury jako je tento,
a pak zjistit, jak se replikovat pixelů - v červené, blues, Zelení -
uvnitř tak, že když obraz vypadá zpočátku,
by to mohlo vypadat toto místo po tom.
Mezi další problémy příliš se bude, že budete podal soudní obrázek
o skutečném souboru z digitálního fotoaparátu.
A na tomto fotoaparátu, kdysi, byli celá parta fotografií.
Problém je, že jsme náhodnému smazání nebo měl obraz poškozen nějak.
Špatné věci se stávají digitálními fotoaparáty.
A tak jsme se rychle kopírovat všechny 0s a 1s vypnutí této karty pro Vás,
zachránil vše v jednom velkém souboru, a pak budeme předat vám je v problému Set 4
takže můžete napsat program v C, s nimiž se obnovit všechny tyto JPEG, ideálně.
A ukázalo se, že JPEG, i když jsou poněkud složité formátu -
jsou mnohem složitější, než tento úsměvem na tváři zde -
ukazuje se, že každý JPEG začíná stejnými vzory 0s a 1s.
Takže pomocí, nakonec, while nebo pro smyčku nebo podobné,
můžete iterovat přes všechny 0s a 1s v tomto soudním obrazu,
a pokaždé, když vidíte speciální vzor, ​​který je definován ve specifikaci problému set,
můžete předpokládat, tady je, s velmi vysokou pravděpodobností, začátek JPEG.
A jakmile zjistíte, stejný vzor určitý počet bajtů
nebo kilobytech nebo megabytech později, můžete předpokládat, zde je druhá JPEG,
foto jsem vzal po prvním.
Dovolte mi, abych přestat číst, že první soubor, začněte psát tento nový,
a výstup programu pro pset4 bude tolik jako 50 JPEG.
A pokud to není 50 JPEG snímků, budete mít trochu smyčky.
Pokud máte nekonečný počet JPEG, máte nekonečnou smyčku.
Takže i bude docela běžný případ.
Takže to je to, co je na obzoru.
>> Kvíz 0 za námi, si uvědomit, za můj e-mail, že vždy existují lidé, kteří jsou oba šťastní,
druh neutrální a smutný kolem kvíz 0 času.
A prosím, dostat se ke mně, hlavu TF Zamyla, vlastní TF,
nebo jeden z úřadů, které budete vědět, jestli byste chtěli diskutovat o tom, jak to šlo.
>> Takže zapůsobit na rodiče tady v pokoji, co je CS50 knihovna?
[Smích] Dobrá práce.
Co je to CS50 knihovna? Jo. >> [Student] Je to pre-psaný soubor kódu [neslyšitelné]
Dobře, dobře.
Je to pre-psaný soubor kódu, který pracovníci napsali, které vám poskytneme,
, která poskytuje některé společné funkce,
Věci jako se mi řetězec, abych int - všechny funkce, které jsou zde uvedeny.
>> Od teď, začneme skutečně brát tyto vzdělávací kola off.
Budeme začít vzít řetězec od vás,
které připomínají byl jen synonymem pro jaký skutečný datový typ? [Více >> studenti] Char *.
Char *. Pro rodiče, to bylo asi [je whooshing zvuk]. To je dobře.
Char * začneme vidět na obrazovce všechny více jak odstranit řetězec z našeho slovníku,
alespoň pokud jde o skutečnosti psaní kódu.
Podobně, přestaneme s použitím některé z těchto funkcí až
protože naše programy se dostat sofistikovanější.
Spíše než jen psát programy, které sedí tam s řádku bliká,
čeká na uživatele, aby něco psát v, dostanete vaše vstupy odjinud.
Například, budete si je z řady bitů na místní pevný disk.
Budete místo si v budoucnu od připojení k síti,
Některé webové stránky někde.
>> Takže pojďme Sloupněte této vrstvy poprvé a zvedněte CS50 Appliance
a tento soubor s názvem cs50.h, které jste # včetně týdnů,
ale pojďme skutečně vidět, co je uvnitř toho.
V horní části souboru v modré barvě je jen celá parta komentářů:
Informace o záruce a licencování.
To je druh společného paradigmatu v softwaru
protože spousta software v těchto dnech je to, co se nazývá open source,
což znamená, že někdo napsal kód a dělal to volně k dispozici
nejen spustit a používat, ale skutečně číst a měnit a integrovat do své vlastní práce.
Takže to je to, co jste dosud používali, open source software, i když ve velmi malém formuláře.
Kdybych posunout dolů kolem připomínky, když začneme se podívat na nějaké další známé věci.
Upozornění na vrcholu zde soubor cs50.h obsahuje spoustu hlavičkových souborů.
Většina z nich, jsme ještě neviděli, ale jeden je obeznámen.
Který z nich jsme viděli, byť krátce, tak daleko? >> [Student] Standardní knihovna.
Jo, standardní knihovny. stdlib.h má malloc.
Jakmile jsme začali mluvit o dynamické přidělování paměti,
které se vrátíme na příští týden, stejně, jsme začali včetně tohoto souboru.
Ukazuje se, že bool a pravdivé a falešné dělat ne vlastně existovat v C samo o sobě
pokud tento soubor zahrnout zde.
Jsme celé týdny byly, včetně stdbool.h
takže můžete použít pojem bool, true nebo false.
Bez toho, měli byste se trochu falešné něj a použít int
a jen svévolně předpokládat, že 0 je false a 1 je pravda.
Pokud bychom posunout dolů dál, tady je naše definice řetězce.
Ukázalo se, jak jsme řekli dříve, že pokud tato hvězda je opravdu nezáleží.
Můžete dokonce mít prostor všude kolem.
Jsme tento semestr byly její propagaci, protože to aby bylo jasné,
že hvězda má co do činění s typem,
ale uvědomte si, stejně běžné, ne-li o něco častější,
je to tam dal, ale funkčně je to totéž.
Ale teď, když čteme stanoví další, pojďme se podívat na GetInt
protože jsme použili, že možná dřív, než cokoli jiného tento semestr.
Tady je GetInt. To je to, co? >> [Student] prototyp. >> To je jen prototyp.
Často, dali jsme prototypy na vrcholky našich. C soubory,
ale můžete také dát prototypy v hlavičkových souborech,. h soubory, jako je tento zde
takže když budete psát nějaké funkce, které chcete, aby ostatní lidé mohli používat,
což je přesně případ knihovny CS50,
můžete nejen realizovat své funkce v něco jako cs50.c,
si také dát prototypů není v horní části tohoto souboru, ale v horní části záhlaví souboru.
Pak, že hlavičkový soubor je to, co přátelé a kolegové patří
s # include ve svém vlastním kódu.
Takže celou tu dobu, co jste byli, včetně všech těchto prototypů,
účinně na začátek souboru, ale prostřednictvím tohoto # zahrnují mechanismus,
které v podstatě kopie a pasty tento soubor do své vlastní.
Zde je několik poměrně podrobná dokumentace.
Jsme skoro za samozřejmé, že GetInt dostane int,
ale to dopadá tam jsou některé rohové případy.
Co když uživatel zadá do čísla, které je příliš velké, quintillion,
že prostě nemůže vejít z int? Co je očekávané chování?
V ideálním případě, je to předvídatelné.
Takže v tomto případě, pokud si skutečně přečíst drobným písmem,
budete skutečně vidět, že v případě, že linka nemůže být přečíst, vrátí INT_MAX.
Nikdy jsme o tom mluvili, ale na základě jeho kapitalizace, co je to asi?
[Student] konstantní. >> Je to konstanta.
Je to nějaký zvláštní konstanta, která je pravděpodobně prohlášen v jednom z těchto hlavičkových souborů
to výš v souboru, a INT_MAX je asi něco jako zhruba 2 mld. Kč,
Myšlenka je, že proto, že musíme nějak znamenat, že něco se pokazilo,
jsme, ano, mají 4000000000 čísla máme k dispozici: -2000000000 až na 2 miliardy, dávat nebo brát.
No, to, co je běžné v programování je budete krást jen jedno z těchto čísel,
Možná 0, možná 2 miliardy, možná -2000000000,
takže strávíte jednu ze svých možných hodnot, takže můžete zavázat k světu
že když se něco pokazí, vrátím to super velkou hodnotu.
Ale nechcete uživatel zadáním něco mystické jako 234 ..., opravdu velké číslo.
Můžete zobecnit to místo jako konstanta.
Takže opravdu, pokud jste byli anální posledních pár týdnů, kdykoliv jsi zavolala GetInt,
měli byste být kontrola s, pokud podmínka udělal typ uživatele v INT_MAX,
nebo, přesněji, udělal GetInt zpáteční INT_MAX, protože kdyby to udělal,
to vlastně znamená, že ani psát. Něco se pokazilo v tomto případě.
Tak tohle je to, co je všeobecně známo jako sentinelové hodnota, což vyžaduje zvláštní.
>> Pojďme se nyní do souboru. C.
Soubor C existuje v zařízení nějakou dobu.
A ve skutečnosti, přístroj má to předkompilované pro vás do této věci jsme nazvali objektový kód,
ale to prostě není jedno, kde to je, protože systém ví,
v tomto případě, kdy je: zařízení.
Pojďme přejděte nyní GetInt a uvidíte, jak GetInt působí celou tu dobu.
Zde máme podobné poznámky z období před.
Dovolte mi, abych přiblížit jen na kódu části.
A co máme pro GetInt je následující.
Trvá žádný vstup.
Vrací int, while (true), takže máme úmyslné nekonečnou smyčku,
ale pravděpodobně budeme vypuknout to nějak nebo se vrátit v rámci tohoto.
>> Pojďme se podívat, jak to funguje.
Zdá se, že pomocí GetString v tomto prvním řádku uvnitř smyčky, 166.
To je nyní dobré praxe, protože, za jakých okolností by GetString vrátit
speciální klíčové slovo NULL? >> [Student] Pokud se něco pokazí.
Pokud se něco pokazí. A co by se mohlo pokazit, když budete volat něco jako GetString?
Jo. >> [Student] Malloc nedokáže dát na ints.
Jo. Možná malloc nezdaří.
Někde pod pokličku, GetString volá malloc, který by určoval paměť,
která umožňuje počítači úložiště všech postav
že uživatel zadá do klávesnice.
A předpokládat uživatel měl spoustu volného času a napsal více, například,
než 2 miliardy znaků, více znaků než v počítači, má dokonce i RAM.
GetString musí být schopen znamenat, že na vás.
I když je to super, super neobvyklé roh případ,
musí nějak být schopny zvládnout,
a tak GetString, kdybychom se vrátili a přečíst si jeho dokumentaci, se v NULL skutečnosti návratu.
Takže teď, když GetString selže vrácením NULL, GetInt bude selhání vrácením INT_MAX
stejně jako hlídka. To jsou jen lidské konvence.
Jediný způsob, jak by vědět, že to je případ od čtení dokumentace.
>> Pojďme přejděte na místo, kde je int skutečně dostal.
Kdybych posunout dolů o kousek dál, v souladu 170, máme komentář nad těmito řádky.
Prohlašujeme v 172 int, n, a char, c, a pak se toto nové funkce,
které někteří z vás narazil dříve, sscanf.
To je zkratka pro řetězce scanf.
Jinými slovy, dej mi řetězec a budu testovat to na kusy informací zájmu.
Co to znamená?
Předpokládejme, že jsem typ v doslova, 123 na klávesnici a pak stiskněte klávesu Enter.
Jaký je datový typ 123, když se vrátil od GetString? >> [Student] String.
Je to samozřejmě string, ne? Mám řetězec.
Takže 123 je opravdu, cituji-konec citátu, 123 s \ 0 na konci.
To není int. To není číslo. Vypadá to jako číslo, ale není to vlastně.
Takže to, co se GetInt udělat?
To má skenovat, že řetězec zleva doprava - 123 \ 0 - a nějak převést na skutečné číslo.
Dalo by se zjistit, jak to udělat.
Pokud si myslíte, že zpět do pset2, můžete pravděpodobně se trochu pohodlné s Caesarem
nebo Vigenere, takže můžete iteraci řetězec, můžete převést znaky na ints.
Ale sakra, to je spousta práce.
Proč ne volat funkci jako sscanf, který dělá to pro vás?
Takže sscanf očekává argument - v tomto případě nazývá linka, která je řetězec.
Ty pak zadat v uvozovkách, velmi podobný printf, co očekávat, že v tomto řetězci.
A to, co tu říkám je, že jsem očekávat, že desetinné číslo a možná i charakter.
A uvidíme, proč tomu tak je za chvíli.
A ukázalo se, že tento záznam je nyní připomíná, co jsme začali mluvit o
jen něco málo přes týden před.
Co je a n a a c dělá pro nás? >> [Student] Adresa n a adresa c..
Jo. Je to, že mi dal adresu n a adresu c. Proč je to tak důležité?
Víte, že s funkcí v C, můžete produkt vždy vrátit hodnotu nebo žádnou hodnotu.
Můžete se vrátit int, je řetězec, float, char, bez ohledu na, nebo se můžete vrátit neplatné,
ale můžete vrátit pouze jednu věc maximálně.
Ale tady chceme sscanf vrátit mi možná int, desetinné číslo,
a také char, a já ti to vysvětlím, proč char za chvíli.
Ty účinně Chcete sscanf vrátit dvě věci, ale to prostě není možné v C.
Můžete obejít, že předáním dvěma adresami
protože jakmile podáš funkci, dvě adresy,
co může, že funkce s nimi dělat? >> [Student] Napište těchto adres.
To může napsat na tyto adresy.
Můžete použít hvězdu operaci a tam, aby se každý z těchto adres.
Je to něco tohoto typu back-mechanismu dveří, ale velmi běžné pro změnu hodnot proměnných
více než jen jedno místo - v tomto případě dva.
Teď všimnete jsem kontrola == 1 a pak se vracet n případě, že se ve skutečnosti, vyhodnotí na true.
Tak co se děje? Technicky, všichni chceme skutečně stalo v GetInt je tento.
Chceme analyzovat, abych tak řekl, chceme číst řetězec - quote-konec citátu 123 -
a pokud to vypadá, že to číslo tam, co říkáme sscanf dělat
je kladen na toto číslo - 123 - v této proměnné n pro mě.
Tak proč potom jsem vlastně mají to stejně?
Jaká je role sscanf říct, že si může také dostat charakter sem?
[Neslyšitelné Student reakce] >> desetinná čárka skutečně mohl fungovat.
Pojďme si myslí, že se na chvíli zamyslel. Co ještě?
[Student] Mohlo by to být NULL. >> Dobrá myšlenka. Mohlo by to být null znak.
Je to vlastně není v tomto případě. Jo. >> [Student] ASCII.
ASCII. Nebo mi dovolte zobecnit ještě dále.
% C tam je jen pro kontrolu chyb.
Nechceme tam být znak za číslo,
ale co to mi umožňuje udělat, je následující.
Ukazuje se, že sscanf, kromě ukládání hodnot v N a C v tomto příkladu zde,
co to také dělá, je, že vrací počet proměnných je kladen hodnoty palců
Takže pokud jste jen zadejte 123, pak jen% d bude odpovídat,
a jen n je uložena s hodnotou, jako je 123,
a nic dostane dát do c.
C zůstává odpadky hodnotu, abych tak řekl -
popelářský, protože je to nikdy nebyla inicializována na libovolnou hodnotu.
Takže v tomto případě, sscanf vrátí 1, protože jsem naplněn 1 těchto ukazatelů,
v takovém případě skvělý, mám int, takže jsem uvolnit linku uvolnit paměť
že GetString skutečně přidělené, a pak jsem se vrátit n,
else pokud jste někdy nad tím, kde to opakovat prohlášení přichází z toho pochází přímo odsud.
Takže pokud naopak, píšu v 123foo - jen nějaký náhodný sled textu -
sscanf uvidí číslo, číslo, číslo, f,
a to bude dát 123 do n; to dám F v C a pak se vrátit 2.
Takže máme, jen pomocí základní definici chování sscanf je, velmi jednoduchý způsob -
dobře, komplex na první pohled, ale na konci dne poměrně jednoduchý mechanismus -
říct je, že int, a pokud ano, je to, že jediná věc, kterou jsem našel?
A mezery tady je úmyslné.
Pokud budete číst dokumentaci k sscanf, to vám řekne, že pokud jsou kousek mezerou
na začátku nebo na konci, sscanf příliš umožní uživateli, z jakéhokoli důvodu,
zasáhnout mezerník 123 a to bude legitimní.
Nebudete křičet na uživatele jen proto, že narazí na mezerník
na začátku nebo na konci, což je jen o málo více uživatelsky příjemný.
>> Jakékoli otázky, pak na GetInt? Jo. >> [Student] Co když jen dát do char?
Dobrá otázka.
Co když jste právě zadali v char jako f a stiskněte klávesu Enter, aniž by kdy psaní 123?
Co si myslíte chování tomto řádku kódu by pak?
[Neslyšitelné Student odpověď]
Jo, takže sscanf může pokrývat, že i proto, že v takovém případě, že to nebude k vyplnění n nebo c..
Bude to místo vrátit 0, v tom případě jsem také chytí, že scénář
protože očekávaná hodnota chci je 1.
Chci jen jeden a jen jedna věc, kterou je třeba zaplnit. Dobrá otázka.
>> Ostatní? Dobrá.
>> Pojďme se projít všechny funkce v zde,
ale ten, který se zdá být snad zbývající zájmu je GetString
protože se ukázalo, že GetFloat, GetInt, GetDouble, GetLongLong
všechny punt hodně z jejich funkčnosti na GetString.
Takže pojďme se podívat na to, jak on je realizován zde.
Tohle vypadá trochu složitější, ale používá stejné základy
že jsme začali mluvit o minulý týden.
V GetString, který nebere argument, podle prázdna sem
a vrátí řetězec, jsem zřejmě jsem se prohlašuje, že řetězec s názvem vyrovnávací paměť.
Já opravdu nevím, co že se to využít k ještě, ale uvidíme.
Vypadá to, že kapacita je ve výchozím nastavení 0.
Ne tak docela jisti, kde to bude, není si jistý, co n se bude používat pro ještě,
ale teď je to stále trochu zajímavější.
V souladu 243, prohlašujeme int, c.
To je něco jako hloupé detailu.
Char je 8 bitů, a 8 bitů lze uložit, kolik různých hodnot? >> [Student] 256. >> 256.
Problém je, pokud chcete mít 256 různých ASCII znaky, které existují
pokud si myslíte, že zpět - a to není něco, co pamatovat.
Ale pokud si myslíte, že zpět do té velké ASCII tabulky jsme měli před několika týdny,
bylo v tomto případě 128 nebo 256 znaků ASCII.
Použili jsme všechny vzory 0s a 1s nahoru.
To je problém, pokud chcete být schopen detekovat chybu
protože pokud jste již používáte 256 hodnot pro své postavy,
jste opravdu plánovat dopředu, protože teď nemáte žádný způsob, jak říkat,
to není legitimní charakter, to je nějaký chybný zprávu.
Takže to, co svět skutečně je, že používají další největší hodnotu, něco jako int,
tak, že máte šílený počet bitů, 32, pro 4 miliardy možných hodnot
takže můžete jednoduše skončit s použitím v podstatě 257 z nich,
1 z nich má nějaký zvláštní význam jako chyba.
>> Tak uvidíme, jak to funguje.
V souladu 246, mám velkou smyčky while, která volá fgetc,
f znamená soubor, takže getc, a pak se stdin.
Ukázalo se, že to je jen přesnější způsob, jak říkat čte vstup z klávesnice.
Standardní vstupní prostředky klávesnice, standardní výkon znamená obrazovku,
a standardní chyba, kterou uvidíme v pset4, znamená obrazovku
ale zvláštní část obrazovky tak, aby to není sjednocen s skutečnému výstupu
který určena pro tisk. Ale o tom více v budoucnu.
Takže fgetc jen znamená přečíst jeden znak z klávesnice a uložit ho tam, kde?
Uložte jej do cca.
A pak zkontrolovat -, takže jsem jen pomocí pár logických konjunkce zde -
ujistěte se, že není rovno - \ n, takže uživatel Enter, chceme zastavit v tomto bodě,
konec smyčky - a také chceme, aby zjistili, zda pro zvláštní konstantní OSZ,
která, pokud víte nebo tušíte, co to znamená? >> [Student] Konec souboru. >> Konec souboru.
To je druh nesmyslný, protože když píšu na klávesnici,
je to opravdu žádný soubor se na tomto,
ale to je jen trochu generický termín použitý znamenat
že nic jiného se blíží z lidského prsty.
EOF - konec souboru.
Jak stranou, pokud jste někdy hit Ovládací D na vaší klávesnici, ne že byste ještě -
jste hit Control C - Control D pošle tento speciální konstanta tzv. EOF.
Takže teď máme jen nějaké dynamické přidělování paměti.
>> Takže pokud (n + 1> kapacita). Teď budu vysvětlovat n.
N je jen, kolik bytů je v současné době ve vyrovnávací paměti,
řetězec, který jste v současné době buduje od uživatele.
Pokud máte více znaků ve vašem vyrovnávací paměti, než budete mít kapacitu vyrovnávací paměti,
intuitivně, co musíme udělat, a pak je přidělit větší kapacitu.
Takže budu sbírat v průběhu některé z aritmetického zde a soustředit se pouze na tuto funkci zde.
Víte, co malloc je nebo jsou alespoň rámcově obeznámen.
Hádat, co realloc dělá. >> [Student] Přidá paměti.
To není úplně přidání paměti. To přerozděluje paměť takto.
Pokud je stále ještě prostor na konci řetězce, aby vám více, že paměť
než původně vám dává, pak budete moci dát další paměť.
Takže si můžete jen držet uvedení řetězec, postavy zády k sobě, aby se zády k sobě.
Ale pokud to není případ, protože jste čekali příliš dlouho
a něco náhodně dostal svalil do paměti tam
ale je tu další paměti tady, to je v pořádku.
Realloc bude dělat vše těžkou práci za vás,
přesunout řetězec co jste si přečetli v tak daleko odtud, dal ji tam,
a pak vám ještě trochu dráhu v tomto bodě.
>> Takže s mávnutím ruky, dovolte mi říci, že to, co dělá GetString
je to začíná s malým pufru, možná jediný znak,
a pokud uživatel zadá do dvou postav, GetString skončí volání realloc a říká, že
jeden znak nebylo dost, dej mi dvě postavy.
Pak, pokud budete číst přes logiky smyčky, bude to říct
Uživatel napsal do 3 znaky, dej mi teď není 2, ale 4 znaky,
tak mi dej 8, tak mi dej 16 a 32.
Skutečnost, že jsem Zdvojnásobení kapacity pokaždé
Znamená to, že vyrovnávací paměť je nebude rostou pomalu, že to bude růst velmi rychlý.
A co by mohlo být výhodou, že?
Proč jsem zdvojnásobení velikosti vyrovnávací paměti
i když uživatel mohl stačí jedno extra znak z klávesnice?
[Neslyšitelné Student odpověď] >> Co je to? >> [Student] Nemusíte pěstovat to, jak často.
Přesně tak. Nemusíte pěstovat to, jak často.
A to je jen trochu, že jsi zajištění své sázky zde,
Myšlenka je, že nechcete volat realloc hodně, protože to má tendenci být pomalé.
Kdykoliv můžete požádat operační systém pro paměti,
jak brzy uvidíte v budoucnu problém sadě, má tendenci trvat nějaký čas.
Takže je minimalizovat množství času, i když ztrácíme nějaké místo,
tendenci být dobré.
>> Ale pokud budeme číst prostřednictvím závěrečné části GetString zde -
a znovu pochopení každý řádek zde není tak důležitá i dnes -
Všimněte si, že to nakonec zavolá malloc znovu
a přiděluje přesně tolik bajtů, jak je třeba pro řetězec
a pak vyhodí voláním zdarma přílišné velkou vyrovnávací paměť
pokud to opravdu dostal dvojnásobek příliš mnohokrát.
Takže ve zkratce, je to, jak GetString působí celou tu dobu.
Vše to je číst jeden znak v době, znovu a znovu a znovu,
a pokaždé, když potřebuje nějaký další paměť, požádá operační systém pro něj
voláním realloc.
>> Nějaké otázky? Dobrá.
>> Útok.
Nyní, když jsme pochopili ukazatele nebo alespoň jsou stále obeznámeni s ukazateli,
Pojďme zvážit, jak celý svět začne hroutit
pokud nemáte dost bránit sporných uživatelů,
lidé, kteří se snaží proniknout do vašeho systému,
lidé, kteří se snaží ukrást vaše software a tím obejít nějaký registrační kód
že by jinak mohla psát palců
>> Podívejte se na tento příklad zde, což je jen C kód, který má funkci hlavní v dolní části
, který volá funkci foo. A co je kolem, aby foo?
[Student] jediný argument. >> [Malan] jediný argument.
Takže argv [1], což znamená, že první slovo, které uživatel zadané na příkazovém řádku
po a.out nebo cokoliv se nazývá program.
Tak foo nahoře se v char *. Ale char * je přesně to, co? >> [Student] string.
[Malan] řetězec, takže nic nového.
To je řetězec libovolně se nazývá bar.
V tomto řádku zde, char c [12], v jakési polo-technické angličtiny, co se tento řádek dělá?
[Student] Pole - >> Array of? >> [Student] znaky. Postavy >>.
Dej mi řadu 12 znaků. Tak bychom mohli nazvat tento vyrovnávací paměti.
Je to odborně nazývá c, ale vyrovnávací paměť v programování znamená jen spoustu prostoru
které si můžete dát nějaké věci dovnitř
Pak konečně, memcpy jsme nepoužívá dříve, ale asi tušíte, co to dělá.
Je to kopie paměti. Co to dělá?
Je zřejmě kopíruje bar, jeho vstupní, do C, ale pouze do délky pruhu.
Ale je tu chyba tady. >> [Student] Potřebuješ sizeof charakter. Dobře >>.
Technicky, měli jsme opravdu strlen (bar) * sizeof (char)). To je správné.
Ale v nejhorším případě tady, pojďme předpokládat, že to je -
Dobře. Pak je tu dvě chyby.
Takže sizeof (char));
Pojďme udělat to trochu širší.
Takže teď je tu stále chyba, která je co? >> [Neslyšitelné Student odpověď]
Zkontrolujte, co? >> [Student] Zkontrolujte, zda NULL.
Měli bychom být obecně kontrola NULL, protože špatné věci se stávají
když váš ukazatel je NULL, protože byste mohli skončit jít tam,
a neměli byste nikdy jít na NULL dereferencing s hvězdy operátora.
Tak to je dobře. A co jiného děláme? Logicky, je tu chyba tady taky.
[Student] Zkontrolujte, zda argc je> = až 2.
Tak se podívejte, pokud argc je> = 2. Dobře, takže tam tři chyby v tomto programu zde.
Jsme nyní kontroluje, pokud uživatel skutečně zadali něco do argv [1]. Dobré.
Takže to, co je třetí chyba? Jo. >> [Student] C nemusí být dostatečně velká.
Dobré. Zkontrolovali jsme jeden scénář.
My implicitně kontrolovat nekopírujte více paměti, než by došlo k překroční délky tyče.
Takže pokud řetězec uživatel zadali, je 10 znaků,
to říká kopírovat pouze 10 znaků. A to je v pořádku.
Ale co když uživatel napsal ve slově na řádku jako 20-znakové slovo?
Toto říká kopii 20 znaků z baru do čeho?
C, jinak známá jako náš pufru, což znamená, že právě napsal dat
na 8 byte místa, která jste nevlastníte,
a nemáte vlastní je v tom smyslu, že jste nikdy přidělené jim.
Tak tohle je to, co je všeobecně známo jako útok přetečení vyrovnávací paměti nebo přetečení vyrovnávací paměti útoku.
A je to útok v tom smyslu, že v případě, že uživatel nebo program, který volá své funkce
dělá to ve zlém úmyslu, co se vlastně bude dít dál, by mohli být docela špatné.
>> Takže pojďme se podívat na obrázku zde.
Tento obrázek představuje svůj stack paměti.
Připomeňme si, že pokaždé, když volání funkce vám tento malý rámeček na zásobníku
a pak další a pak další a další.
A tak daleko, máme to prostě odebrané nich jako obdélníky
buď na palubě nebo na obrazovce zde.
Ale když se přiblížíte na jednom z těchto obdélníků, když voláte funkci foo,
ukazuje se, že je toho víc na zásobníku uvnitř tohoto rámce v tomto obdélníku
než jen x a y a a b, stejně jako jsme se mluvit o swapu.
Ukazuje se, že je tu nějaké nižší úrovni podrobnosti, mezi nimi Return Address.
Tak to dopadá, když hlavní volá foo, hlavní je informovat foo
Jaké hlavní je adresa v paměti počítače
protože jinak, jakmile foo se provádí provedení, jak je v tomto případě zde,
jakmile se dostanete tento uzavřený složená závorka na konci foo,
jak sakra se foo vědět, kde je ovládání programu má jít?
Ukazuje se, že odpověď na tuto otázku, je v tomto červeném obdélníku zde.
To představuje ukazatel, a to až do počítače k ​​uložení dočasně
na tzv. zásobníku je adresa hlavní tak, že jakmile foo udělat provádění,
počítač ví, kde a co řádek v hlavní vrátit do.
Uloženo Frame ukazatel se týká podobně to.
Char * bar zde představuje, co?
Nyní je tato modrá segmentu je zde foo je rám. Co je to bar?
Bar je jen argument k funkci foo.
Takže teď jsme zpátky u hornin známého obrazu.
Je tu další věci, a další rozptýlení na obrazovce,
ale to světle modrá segmentu jen je to, co jsme byli kreslení na tabuli
něco jako swap. To je rámec pro foo.
A jediná věc v tom teď je bar, který je tento parametr.
Ale co jiného by mělo být v zásobníku podle tohoto kódu zde?
[Student] char c [12]. >> [Malan] char c [12].
Měli bychom také vidět 12 čtverců paměti přidělené do proměnné s názvem c,
a opravdu máme, že na obrazovce.
Samém vrcholu je c [0], a poté autor tohoto schématu
neobtěžoval čerpání všech čtverců, ale skutečně existují 12 tam
protože když se podíváte na pravém dolním rohu, c [11], pokud budete počítat od 0, je 12. jako byte.
Ale tady je ten problém.
V jakém směru je c roste?
Druh shora dolů, když to začíná na vrcholu a roste na dno.
To nevypadá jako jsme odešli sami moc dráhu tady vůbec.
Jsme trochu maloval sebe do kouta,
a že c [11] je správná proti baru, který je přímo proti Uložené frame pointer,
která je přímo proti zpáteční adresa. Tam to není místo.
Takže to, co je důsledkem pak, pokud jste zpackat
a zkuste si přečíst 20 bajtů do 12-byte paměti?
Pokud jsou tyto 8 dalších bytů jít? >> [Student] Inside -
Uvnitř všechno ostatní, z nichž některé jsou super důležité.
A to nejdůležitější, potenciálně, je červený rámeček tam, Return Address,
protože předpokládám, že jste buď náhodně, nebo adversarially přepište tyto 4 byty,
že ukazatel adresa, a to nejen u odpadu, ale s řadou
, který se stane představují skutečnou adresu v paměti.
Co je to důsledek, logicky? >> [Student] Funkce se chystá vrátit na jiné místo.
Přesně tak.
Když foo vrátí a hity, které rovnátka kudrnaté, program bude pokračovat
aby se nevraceli k hlavní, že to bude návrat na cokoliv adresa je v tomto červeném poli.
>> V případě obešly softwaru registraci,
co když adresa, která je momentálně se vrátil k je funkce, která obvykle volána
poté, co jste zaplatili za software a zadali vaše registrační kód?
Můžete třídit trik počítače do nebudete zde, nýbrž bude tady.
Nebo pokud jste opravdu chytrý, může protivník skutečně zadejte na klávesnici, například,
není aktuální slovo, ne 20 znaků, ale předpokládám, on nebo ona skutečně Typy
některé znaky, které představují kód.
A to nebude C kód, je to vlastně bude znaky
které představují binární strojový kód, 0s a 1s.
Ale předpokládám, že to dost chytrý, aby to, že,
nějak vložit do GetString řádku něco, co je v podstatě zkompilovaný kód,
a poslední 4 bajty přepsat návratovou adresu.
A co to, že adresa vstup dělat?
Ve skutečnosti se ukládá v tomto červeném obdélníku adresu prvního bajtu pufru.
Takže budete muset být opravdu chytrý, a to je hodně pokusů a omylů pro špatné lidi tam,
ale pokud můžete zjistit, jak velké je toto vyrovnávací paměť je
tak, že v posledních několika bajtů na vstupu zadat do programu
stalo, že se rovná adresu začátku svého vyrovnávací paměti, můžete to udělat.
Pokud říkáme normálně pozdravit a \ 0, to je to, co skončí ve vyrovnávací paměti.
Ale když jsme chytřejší a naplníme, že vyrovnávací paměť s tím, co budeme obecně říkat útoku kódu -
AAA, útok, útok, útok - pokud je to prostě něco, co udělá něco špatného,
co se stane, pokud jste opravdu chytří, můžete to provést.
V červeném poli zde je sekvence čísel - 80, C0, 35, 08.
Všimněte si, že odpovídá číslo, které je tady.
Je to v obráceném pořadí, ale o tom až někdy jindy.
Všimněte si, že tato zpáteční adresa byla úmyslně změněn
rovnat adresu sem, není adresa main.
Takže pokud ten špatný je super chytrý, on nebo ona bude zahrnovat v tomto útoku kódu
něco jako odstranit všechny soubory uživatele, nebo zkopírovat hesla
nebo vytvořit uživatelský účet, který pak mohu přihlásit do - vůbec nic.
>> A to je jak nebezpečí a síla C.
Vzhledem k tomu, že máte přístup k paměti prostřednictvím ukazatele
a můžete tedy napsat cokoliv, co chcete do paměti počítače,
si můžete udělat počítač dělat, co chcete
jednoduše tím, že se skákat kolem uvnitř své vlastní paměti.
A tak k tomuto dni tolik programů a tolik internetové stránky, které jsou ohroženy
redukuje na lidi, kteří se výhody této.
A to může zdát jako super sofistikované útoku, ale to není vždy začít takhle.
Skutečností je, že to, co špatní lidé obvykle udělat, je,
ať už je to program v příkazovém řádku nebo program, GUI nebo webové stránky,
stačí začít poskytovat nesmysly.
Zadáte v opravdu velkém slovo do vyhledávacího pole a stiskněte klávesu ENTER,
a budete čekat, zda webová stránka zhroutí
nebo počkat, zda se program projeví nějakou chybovou zprávu
protože pokud budete mít štěstí jako padouch a poskytnout nějaké šílené vstup
že pády programu, znamená to, že programátor nepředpokládal své špatné chování,
což znamená, že můžete pravděpodobně dostatek úsilí, dost pokusů a omylů,
přijít na to, jak vést přesnější útok.
Tak jako tak součástí zabezpečení není jen vyhnout těmto útokům úplně
ale zachytí je a vlastně se dívat na polena
a vidět, co bláznivé vstupy mají lidé zadali do svých webových stránek,
Co vyhledávací termíny jsou lidi napsali na svůj web
v naději, že přetéká nějakou vyrovnávací paměti.
A to všechno se scvrkává na jednoduchých základech toho, co je pole
a co to znamená pro přidělování a využívání paměti.
>> S tím souvisí pak i to je.
Řekněme, podíval se uvnitř pevného disku ještě jednou.
Vzpomínáte si z týden či dva před, že když přetáhnete soubory na váš recycle bin, nebo trash can,
co se stane? >> [Student] Nothing. >> Vůbec nic, že ​​jo?
Nakonec, pokud se dostanete nedostatek místa na disku,
Windows nebo Mac OS začne mazat soubory pro vás.
Ale pokud přetáhnete něco tam, že není vůbec bezpečné.
Všechny vaše spolubydlící nebo přítel nebo člen rodiny musí udělat, je dvakrát klikněte a voila,
tu všechny útržkovité soubory, které jste se pokusili odstranit.
Většina z nás alespoň vím, že máte pravým tlačítkem myši nebo regulace kliknutím
a prázdné popelnice nebo něco takového.
Ale i pak to není úplně stačit
protože to, co se stane, když máte soubor na pevném disku
že reprezentuje nějaký dokument, nebo nějaký JPEG, a to představuje pevný disk,
a řekněme, že tento kousek zde představuje tento soubor,
a to je složeno z celé spoustu 0s a 1s.
Co se stane, když se nejen přetáhnout tento soubor do koše nebo koše
ale také vyprázdnit? Seřadit z ničeho.
Není to vůbec nic teď.
Teď je to jen proto, že nic trochu něco stane v podobě této tabulky.
Takže tam je nějaký druh databáze nebo tabulky uvnitř paměti počítače
že v podstatě má jeden sloupec pro soubory jmen a jeden sloupec pro soubory "místo,
, což by mohlo být zařazení 123, jen náhodné číslo.
Takže bychom mohli mít něco jako x.jpeg a umístění 123.
Co se stane pak, když vyprázdnit své odpadky?
To zmizí.
Ale co nezmizí, je 0s a 1s.
>> Takže to, co je pak připojení k pset4?
No, s pset4, jen proto, že jsme omylem vymazal karty Compact Flash
že měl všechny tyhle fotky, nebo jen proto, že smůla stal poškozen
neznamená, že 0s a 1s nejsou tam pořád.
Možná některé z nich jsou ztraceny, protože něco dostal poškozen
v tom smyslu, že některé 0s stal 1s a 1s stal 0s.
Špatné věci se může stát, protože buggy software nebo vadný hardware.
Ale mnozí z těch kousků, možná i 100% z nich, jsou tam stále.
Je to jen, že je počítač nebo fotoaparát neví, kde JPEG1 začala
a kde JPEG2 začal.
Ale pokud, programátor, vím, s trochou znalostmi, pokud tyto JPEG jsou
nebo jak vypadají, takže můžete analyzovat 0s a 1s a říct JPEG, JPEG,
můžete napsat program s v podstatě jen pro nebo while
, který využívá každý z těchto souborů.
Takže lekce pak je začít bezpečně mazání souborů
pokud byste chtěli, aby se zabránilo to úplně. Ano.
>> [Student] Jak to, říká o vašem počítači
že máte více paměti, než jste dělali předtím?
Mají více paměti, než dřív a - >> [Student] Více dostupné paměti.
Oh. Dobrá otázka.
Tak proč potom po vyprázdnění koše se počítač říct
že máte více volného místa, než jste dělali předtím?
Stručně řečeno, protože lže.
Více technicky, máte více prostoru, protože teď jste řekl
si můžete dát další věci, kde tento soubor jednou bylo.
Ale to neznamená, že bity jdou pryč,
a že neznamená bity jsou změněna na všech 0s, například,
pro vaši ochranu.
Takže naopak, pokud si bezpečně smazat soubory nebo fyzicky zničit zařízení,
to je opravdu jediný způsob, jak se někdy kolem toho.
>> Tak proč bychom odjet na tomto semi-strašidelné poznámky, a uvidíme se v pondělí.
[Potlesk]
>> [CS50.TV]