[Powered by Google Translate] [Tjedan 5] [David J. Malan - Sveučilište Harvard] [Ovo je CS50. - CS50.TV] Ovo je CS50, Tjedan 5. Danas i ovaj tjedan, uvodimo malo svijeta forenzike u kontekstu problema Set 4. Danas će biti skraćeno predavanje jer je poseban događaj u ovdje poslije. Tako ćemo zaviriti i zafrkavati oba učenicima i roditeljima podjednako danas s neke od stvari koje su na horizontu. Među njima, od ponedjeljka, imat ćete još nekoliko kolega iz razreda. EDX, Harvard i MIT novi online inicijativa za OpenCourseWare i više, stiže Harvarda kampusu u ponedjeljak, što znači da dolaze ponedjeljak imat ćete, kao prošle računati, 86.000 dodatnih razredu Tko će biti slijedeći zajedno s CS50 predavanja i sekcije i Walkthroughs i problem setovima. I kao dio toga, vi ćete postati članovi nastupni klasi CS50 i sada CS50x. Kao dio toga sada, shvatiti da će biti nekih upsides kao dobro. Da biste dobili spreman za to, za veliki broj studenata, dovoljno je reći da iako imamo 108 TFS i CAS, to nije sasvim najbolji student-nastavnik omjer jednom smo pogodak 80.000 učenika. Nećemo se ocjenjivanje toliko problema postavlja ručno, tako uveo ovaj tjedan u problematiku skupa će biti CS50 Ček, koja će biti naredbenog retka uslužni unutar aparata da ćete dobiti nakon što ga ažurirati kasnije ovaj vikend. Vi ćete biti u mogućnosti pokrenuti naredbu, check50, na svoj pset, a vi ćete dobiti instant povratne informacije o tome je li vaš program je točna ili netočna prema raznim dizajna specifikacijama koje smo dostavili. Više o tome u specifikaciji problema set. U CS50x kolege će koristiti to kao dobro. Problem Set 4 je sve o forenzici, i to pset stvarno bio inspiriran nekom stvarnom životu stvari čemu kad sam bio u dodiplomskoj školi sam interniran za vrijeme s Middlesex County je Županijsko državno odvjetništvo radi forenzička rad sa svojim olovnim forenzičkih istražitelja. Što to iznosi, kao što mislim da sam spomenuo prije nekoliko tjedana prošlosti, je masa državne policije ili drugih će doći u, oni će spadati stvari poput tvrdih diskova i CD-a i diskete i slično, i onda cilj forenzike uredu je da se utvrdi postoji li ili nije bio dokaz neke vrste. To je bio Posebna Istrage jedinica, tako da je bijelo-okovratnik kriminala. To je više zabrinjavajuća vrsta zločina, uključujući sve nekakav digitalnih medija. Ispada da nije da su mnogi ljudi pisati e-mail govoreći, "Ja sam to učinio." Dakle, vrlo često, te forenzički pretražuje nije pojavio sve to puno voća, ali ponekad ljudi će pisati takve poruke. Dakle, ponekad, napori bili nagrađeni. Ali da će dovesti do ovog forenzičkih pset, mi ćemo biti uvođenje u pset4 malo grafike. Vi ste vjerojatno uzeti ove stvari zdravo za gotovo - JPEG GIF, i kao - ovih dana. Ali ako zaista misle o tome, slika, baš kao i Rob lice, mogao biti modeliran kao niz točkica ili piksela. U slučaju Rob lice, tu je sve vrste boja, i počeli smo vidjeti pojedine točke, inače poznat kao piksela, kad smo počeli uvećanje u. Ali ako ćemo pojednostaviti svijet malo i samo reći da je ovo ovdje je Rob u crnoj i bijeloj boji, za zastupanje crna i bijela, možemo samo koristiti binarni. A ako ćemo koristiti binarni, 1 ili 0, možemo izraziti tu istu sliku od Rob je nasmijano lice s ovim uzorkom bitova. 11000011 predstavlja bijela, bijela, crna, crna, crna, crna, bijela, bijela. I tako da to nije veliki skok onda početi govoriti o šarenim fotografijama, stvari koje želite vidjeti na Facebooku ili uzeti s digitalnom kamerom. No, svakako, kada je riječ o bojama, trebate više bitova. I sasvim uobičajeno u svijetu fotografije je koristiti ne 1-bitnu boju, jer to sugerira, ali 24-bitna boja, gdje ste zapravo dobiti milijune boja. Dakle, kao u slučaju kad smo zumirani na Rob oku, da je bilo nekoliko milijuna različitih boja mogućnosti. Dakle, mi ćemo uvesti to Problem Set 4 kao u prohod, što će biti danas u 03:30 umjesto uobičajenog 02:30 jer petak predavanje ovdje. No, video će biti online kao i obično sutra. Također ćemo vas upoznati s drugom formatu. To namjerno je značilo da izgleda zastrašujuće na prvi, ali to je samo neka dokumentacija za C struct. Ispada da je Microsoft godina pomogao popularizirati ovaj oblik zove bitmapa format, BMP, i to je super jednostavna, šareni grafički format koji je korišten za neko vrijeme, a ponekad i dalje za pozadine na stolna računala. Ako mislite vratiti na Windows XP i valjanje brežuljcima i plavog neba, to je obično BMP ili bitmap slika. Bitmape su zabavna za nas, jer oni imaju malo više složenosti. To je ne sasvim kao jednostavan kao ovaj mrežu 0S i 1S. Umjesto toga, imate stvari poput zaglavlju na početku datoteke. Dakle, drugim riječima, unutar jedne. Bmp datoteke je cijela hrpa 0S i 1s, ali postoji neki dodatni 0s i 1s tamo. I ispada da ono što smo vjerojatno uzeti zdravo za gotovo već godinama - Formati sviđa. doc ili. xls ili. MP3,. mp4, bez obzira na Formati da ste upoznati sa - što to uopće znači biti format, jer na kraju dana sve te datoteke možemo koristiti imaju samo 0s i 1s. A možda one 0s i 1s predstavljaju ABC kroz ASCII ili slično, ali na kraju dana, to je još uvijek samo 0s i 1s. Dakle ljudi samo povremeno odlučiti da izmisle novi format datoteke gdje su standardizirati ono obrasci bitova će zapravo znači. I u ovom slučaju ovdje, i ljudi koji je dizajnirao bitmap format rekao je da je u prvom bajtu u bitmap datoteku, kao obilježeni pomaknuta 0 tamo, tamo će biti neki šifrirano ime varijabla zove bfType, koja samo stoji za bitmap datoteke tipa, što tip od bitmap datoteku je to. Možete zaključiti možda iz drugog reda koji prebijanje 2, bajt broj 2, ima uzorak 0S i 1S koja predstavlja što? Veličina nešto. I to ide od tamo. Tako je u Problem Set 4, vi ćete biti prošetao kroz neke od tih stvari. Nećemo završiti brinuti o svima njima. Ali primijetite da počne da se zanimljivo oko bajtu 54: rgbtBlue, zelena i crvena. Ako ste ikada čuli akronim RGB - crvena, zelena, plava - ovo je referenca na taj jer ispada da mogu slikati sve dugine boje s nekim kombinacija crvene i plave i zelene. A u stvari, roditelji u sobi mogu podsjetiti na neke od najranijih projektora. Ovih dana, možete vidjeti samo jedan svjetlost izlazi iz objektiva, ali natrag u dan ste imali crvenu leću, plavu leću, i zelenu leću, i zajedno su usmjerene na zaslonu i formirao šarenu sliku. I vrlo često, srednje škole i visoke škole će imati one leće uvijek je tako malo iskosa, tako da su bili svojevrsni vidim dvostruko ili trostruko slike. No, to je bila ideja. Imali ste crvene i zelene i plave svjetlo slikarstvo sliku. A taj isti princip se koristi u računalima. Dakle, među izazovima onda za vas u problemu Set 4 će biti nekoliko stvari. Jedan od njih je da se zapravo veličinu slike, uzeti u uzorak 0S i 1s, shvatiti što komade 0s i 1s predstavljaju ono što u strukturi kao što je ovaj, i onda shvatiti kako replicirati piksela - crvenima, Blues, zeleni - unutar tako da kad slika izgleda ovako početku, to bi moglo izgledati ovako umjesto nakon toga. Među ostalim izazovima previše će biti da ćete se predati forenzičke sliku od stvarne datoteke iz digitalnog fotoaparata. I na tom kamerom, nekada davno, bili su cijela hrpa fotografija. Problem je što slučajno izbrisani ili su slika korumpiran nekako. Loše stvari se dogoditi s digitalnim kamerama. I tako smo brzo kopirati sve 0s i 1s isključen te kartice za vas, spasio ih sve u jednu veliku datoteku, a onda ćemo ih predati tebi u problemu Set 4 tako da možete napisati program u C s kojima se oporavim sve one JPEG, idealno. A što se ispostavilo da je JPEG, iako su oni nešto složenog formatu - oni su puno složeniji nego ove nasmijano lice ovdje - ispada da je svaki JPEG počinje s istim uzorcima 0S i 1S. Dakle, koristeći, u konačnici, while petlja ili za petlje ili slično, možete ponoviti preko svega 0s i 1s u ovom forenzičke sliku, i svaki put kad vidim poseban uzorak koji je definiran u specifikaciji problema set, možete preuzeti ovdje, s vrlo visokom vjerojatnošću, početak JPEG. A čim vam istom obrascu neki broj bajtova ili kilobajta ili megabajta kasnije, možete pretpostaviti ovdje je drugi JPEG, slika Uzeo sam nakon prvog. Dopustite mi prestati čitati tu prvu sliku, počnite pisati ovu novu, i izlaz vašeg programa za pset4 će biti onoliko koliko 50 JPEG. A ako to nije 50 JPEG, imate malo petlje. Ako imate beskonačan broj JPEG, imate beskonačnu petlju. Tako da će također biti vrlo čest slučaj. Tako da je ono što je na horizontu. Kviz 0 iza nas, ostvariti po moju e-mail da uvijek postoje ljudi koji su oboje sretni, vrsta neutralne, i tužno oko kviza 0 vremena. I nemojte doprijeti do mene, glava TF Zamyla, svoj TF, ili jedan od CA da znate ako želite razgovarati o tome kako su stvari išle. Tako da impresionirati roditelje ovdje u sobi, što je CS50 knjižnica? [Smijeh] Dobar posao. Što je CS50 knjižnica? Da. >> [Student] To je unaprijed napisani skup koda [nečujan] Dobro, dobro. To je unaprijed napisani skup koda koji smo osoblje pisao, pružamo vama, koja pruža neke zajedničke funkcije, stvari poput daj mi niz, me int - sve funkcije koje su ovdje navedene. Počevši sada, možemo početi stvarno uzeti ove obuke kotača off. Mi ćemo početi da odnese niz od tebe, koja opoziv bio samo sinonim za ono što stvarni podaci putovanja? >> [Više studenata] Char *. Char *. Za roditelje, koji je vjerojatno bio [čini whooshing zvuk]. To je dobro. Char * počet ćemo vidjeti na ekranu sve više kao što smo uklonili niz od našeg vokabulara, barem kad je u pitanju zapravo pisanje koda. Isto tako, mi ćemo prestati koristiti neke od tih funkcija koliko jer su naši programi će dobiti sofisticiraniji. Umjesto samo pisati programe koji sjede tamo sa brz treperi, čeka korisnika upisati nešto u ćete dobiti svoje inpute od drugdje. Na primjer, da ćete ih dobiti od niza bitova na lokalnom tvrdom disku. Umjesto toga ću ih dobiti u budućnosti iz mrežne veze, neke web stranice negdje. Tako ćemo guliti natrag taj sloj po prvi put i podići CS50 aparati i ovu sliku nazvao cs50.h, koji ste bili # uključujući tjedna, ali budimo zapravo vidjeti što je unutar toga. Na vrhu datoteke u plavom je samo cijela hrpa komentara: Informacije o jamstvu i licenciranje. To je neka vrsta zajedničkog paradigme u softveru jer puno softvera ovih dana je ono što se zove open source, što znači da je netko napisao kod i napravio je slobodno dostupan ne samo pokrenuti i koristiti, ali da se zapravo čitati i mijenjati i integriraju u svoj rad. Dakle, to je ono što ste koristili, open source softvera, iako u vrlo malom obliku. Ako sam se pomaknite prema dolje prošlosti komentarima, iako ćemo početi vidjeti neke više poznate stvari. Obavijest na vrhu ovdje da cs50.h datoteka uključuje hrpu zaglavlja datoteka. Većina od njih, mi nismo vidjeli prije, ali jedan je poznato. Koja od njih smo vidjeli, iako kratko, tako daleko? >> [Student] Standardni knjižnica. Da, standardna biblioteka. stdlib.h ima malloc. Nakon što smo počeli govoriti o dinamičke memorije raspodjele, koje ćemo se vratiti sljedeći tjedan kao dobro, počeli smo uključujući tu datoteku. Ispada da bool i pravi i lažni zapravo ne postoji u C po sebi osim ako su ovu datoteku ovdje. Mi smo tjednima bili uključujući stdbool.h tako da možete koristiti pojam bool, istinita ili lažna. Bez toga, da će morati izdvojiti od lažni njega i koristiti int i samo proizvoljno pretpostaviti da je lažna 0 i 1 je istina. Ako mi se pomaknite prema dolje i dalje, ovdje je naša definicija niza. Ispada, kao što smo već rekli, da kada ova zvijezda je zapravo ne smeta. Možete čak imati prostor sve oko sebe. Mi to semestar su ga promovira kao da je to jasno da zvijezda ima veze s tipom, ali shvatite samo kao zajedničko, ako ne i malo više zajedničkog, je da ga je tamo stavio, ali funkcionalno je ista stvar. Ali sada, ako čitamo dolje dalje, ajmo pogledati GetInt jer mi se da je možda prije nego bilo što drugo ovaj semestar. Ovdje je GetInt. To je ono što? >> [Student] prototip. >> To je samo prototip. Često smo stavili prototipove na vrhovima naših. C datoteke, ali također možete staviti prototipove u zaglavlju datoteke,. h datoteke, kao što je ovaj jedan ovdje tako da kada pišete neke funkcije koje želite ostali ljudi biti u mogućnosti koristiti, koji je upravo slučaj s CS50 knjižnici, ne samo provoditi svoje funkcije u nešto poput cs50.c, također staviti prototipa nije na vrhu tog spisa, ali na vrhu datoteke zaglavlja. Zatim da header datoteka je ono što prijatelji i kolege su s # uključiti u vlastitom kodu. Dakle, sve ovo vrijeme, bio si uključujući sve ove prototipova, učinkovito na vrhu svoje datoteke, ali na način ovo # include mehanizam, koji bitno primjeraka i paste ovu sliku na svoj vlastiti. Ovdje je neke prilično detaljan dokumentacija. Mi smo prilično mnogo uzeti zdravo za gotovo da GetInt dobiva int, ali ispada postoje neki kutak slučajevi. Što ako korisnik upiše u nizu koji je način prevelika, quintillion, samo da se ne može stati unutar int? Što je očekivano ponašanje? U idealnom slučaju, to je predvidljiva. Dakle, u ovom slučaju, ako zapravo pročitate fine print, zapravo ćete vidjeti da li linija ne može pročitati, ovaj vraća INT_MAX. Nikada nismo razgovarali o tome, ali na temelju svoje kapitalizacije, što je to vjerojatno? [Student] konstanta. >> To je konstanta. To je neka posebna konstanta koja je vjerojatno proglasio u jednoj od tih zaglavlja datoteka da je gore veći u spisu, a INT_MAX je vjerojatno nešto poput otprilike dvije milijarde, Ideja je da zato moramo nekako označi da je nešto pošlo po zlu, mi, da, ima četiri milijarde brojeve na raspolaganju: -2000000000 na do 2 milijarde, dati ili uzeti. Pa, ono što je zajedničko u programiranju je li ukrasti samo jednog od tih brojeva, možda 0, možda 2000000000, možda -2000000000, tako što ćete potrošiti jedan od vaših mogućih vrijednosti, tako da možete obvezati na svijetu da, ako nešto pođe po zlu, ja ću se vratiti ovaj super veliku vrijednost. Ali vi ne želite korisnički tipkati nešto grobni kao 234 ..., stvarno velik broj. Možete ga generalizirati, umjesto kao konstanta. Pa stvarno, ako su se analni posljednjih nekoliko tjedana, svaki put kad se zove GetInt, trebali su provjere s ako uvjet nije korisničkog tip u INT_MAX, ili, točnije, učinio GetInt povratnu INT_MAX, jer ako je to učinio, to zapravo znači da to nije tip. Nešto je pošlo po krivu u ovom slučaju. Dakle, to je ono što je općenito poznat kao sentinel vrijednosti, što samo znači posebna. Ajmo sad okrenuti u. C datoteci. C Datoteka je postojala u aparatu za neko vrijeme. A u stvari, aparat ima već sastavio za vas u toj stvari mi se zove objektnog koda, ali to jednostavno nije bitno za vas gdje je to jer sustav ne zna u ovom slučaju gdje je: aparat. Ajmo pomaknite se dolje sada GetInt i vidjeti kako GetInt je radio sve ovo vrijeme. Ovdje imamo slične komentare od prije. Dopustite mi povećali samo kod dijela. A ono što imamo za GetInt je sljedeće. To ne preuzima ulaz. To vraća int, dok je (istina), pa smo namjerno beskonačnu petlju, ali vjerojatno ćemo break out to nekako ili se vratiti u roku od ovoga. Idemo vidjeti kako to funkcionira. Čini se da smo se pomoću GetString u ovoj prvoj liniji unutar petlje, 166. Ovo je sada dobra praksa, jer pod kojim okolnostima mogao vratiti GetString posebna ključna NULL? >> [Student] Ako nešto pođe po zlu. Ako nešto pođe po zlu. A što bi moglo poći po zlu kada nazovete nešto poput GetString? Da. >> [Student] malloc ne dati ga na Ints. Da. Možda malloc ne uspije. Negdje ispod haube, GetString zove malloc, koja alocira memoriju, što omogućuje računala dućan sve znakove da korisnik upiše u tipkovnici. I pretpostavljam korisnik imao puno slobodnog vremena i upisali više, na primjer, od 2 milijarde znakova u, više znakova nego računalo ima čak RAM-a. GetString mora biti u mogućnosti da znači da s vama. Čak i ako je to super, super neuobičajeno kutak slučaj, to mora nekako biti u mogućnosti da obrađuju ovu, i tako GetString, ako smo se vratili i čitati njegovu dokumentaciju, ne zapravo povratak NULL. Pa sad, ako ne uspije GetString po povratku NULL, GetInt će uspjeti po povratku INT_MAX baš kao stražar. Ovo su samo ljudska konvencija. Jedini način da bi znali je to slučaj čitajući dokumentaciju. Ajmo pomaknite se dolje do mjesta gdje int zapravo stečen. Ako sam pomaknite se dolje malo dalje, u skladu 170, imamo komentar iznad ovih redaka. Izjavljujemo 172 int, n, i char, C, a zatim ova nova funkcije, što neki od vas su nabasali prije, sscanf. To je kratica za gudački scanf. Drugim riječima, daj mi niz i ja ću ga skenirati za dijelove informacije interesa. Što to znači? Pretpostavimo da sam upisati, doslovno, 123 na tipkovnici, a zatim pritisnite Enter. Što je tip podataka od 123, kada se vratio po GetString? >> [Student] Gudački. To je očito niz, zar ne? Dobio sam niz. Dakle, 123 je stvarno, citiram-završiti citat, 123 s \ 0 na kraju njega. To nije int. To nije broj. To izgleda kao broj, ali to je zapravo nije. Dakle, ono što ne GetInt morati učiniti? To je skenirati taj niz lijeva na desno - 123 \ 0 - i nekako pretvoriti u stvarni cijeli. Ti bi mogao shvatiti kako to učiniti. Ako mislite natrag pset2, što vjerojatno dobio malo ugodno s Cezarom ili Vigenere, tako da možete ponoviti preko niza, možete pretvoriti znakova da Ints. Ali dovraga, to je puno posla. Zašto ne pozvati funkciju kao sscanf koji radi za vas? Dakle sscanf očekuje argument - u ovom slučaju zove linija, koja je niz. Nakon toga odrediti u navodnike, vrlo slična printf, što očekujete da ćete vidjeti u ovom nizu. I ono što ja govorim ovdje je da očekujem da vidim decimalni broj, a možda i karakter. A vidjet ćemo zašto je to slučaj u samo trenutak. I ispada da je ova notacija je sada podsjeća stvari smo počeli govoriti o nešto više od tjedan dana. Što je & n i c & radiš za nas ovdje? >> [Student] Adresa n i adresa c. Da. To je što su mi dali adresu n i adresa c. Zašto je to važno? Vi znate da je sa funkcije u C, uvijek se možete vratiti vrijednost ili nema vrijednost na sve. Možete se vratiti int, string, float, char, štogod, ili možete vratiti prazninu, ali samo mogu vratiti jednu stvar maksimalno. No, ovdje želimo sscanf me vratiti možda je int, decimalni broj, i char, a ja ću objasniti zašto char u trenutku. Vi učinkovito želite sscanf vratiti dvije stvari, ali to jednostavno nije moguće u C. Možete raditi oko koje prolazi u dvije adrese jer čim predati funkciju dvije adrese, što može da funkcija učiniti s njima? >> [Student] Pišite tim adresama. To može pisati tim adresama. Možete koristiti operaciju zvijezda i otići tamo, da svaki od tih adresa. To je vrsta ovog leđa vrata mehanizam, ali vrlo uobičajena za promjenu vrijednosti varijabli više nego samo na jednom mjestu - u ovom slučaju, dva. Sada primijetite sam provjeru == 1, a zatim se vraćaju n ako to ne, u stvari, ocjenjuje da istinito. Dakle, što se događa? Tehnički, svi smo stvarno želite da se dogodi u GetInt je to. Želimo analizirati, da se tako izrazim, želimo pročitati niz - citat-završiti citat 123 - i ako to izgleda kao da je broj postoji, ono što smo reći sscanf učiniti stavi taj broj - 123 - u ova varijabla n za mene. Pa zašto onda sam zapravo imaju to kao dobro? Što je uloga sscanf rekavši također moglo dobiti karakter ovdje? [Nečujno odgovor učenik] >> decimalna točka zapravo mogao raditi. Ajmo držite da misli na trenutak. Što još? [Student] To bi mogla biti NULL. >> Dobra misao. To bi mogao biti znak praznoga. To je zapravo nije u ovom slučaju. Da. >> [Student] ASCII. ASCII. Ili neka mi generalizirati čak i dalje. % C je samo za provjere pogreške. Mi ne želimo da postoji lik nakon broja, ali što to mi omogućuje da učiniti je sljedeće. Ispada da sscanf, osim pohranjivanja vrijednosti u n i c u ovom primjeru ovdje, ono što također ne je to vraća broj varijabli to staviti vrijednosti u. Dakle, ako ste samo upisati 123, onda samo% d ide na utakmicu, i samo n dobiva pohranjena u vrijednosti poput 123, i ništa ne dobiva staviti u c. C ostaje smeće vrijednost, da se tako izrazim - smeće, jer to nitko nikada nije inicijalizirana na neke vrijednosti. Dakle, u tom slučaju, sscanf vraća jedan jer sam naseljena jedan od tih pokazivača, u kojem slučaju super, imam int pa sam osloboditi liniju osloboditi memoriju da GetString zapravo namijenjen, a onda sam se vratiti n, drugo, ako ste se ikad pitali gdje da Ponoviti izjava dolazi, ona dolazi iz upravo ovdje. Dakle, ako, s druge strane, ja upisati u 123foo - samo su neki slučajni slijed teksta - sscanf će vidjeti broj, broj, broj, F, i to će staviti 123 u n; to će staviti f u c, a zatim se vratiti dva. Dakle, imamo, samo pomoću osnovnu definiciju sscanf ponašanja, vrlo jednostavan način - dobro, kompleks na prvi pogled, ali na kraju dana prilično jednostavan mehanizam - govoreći postoji int i ako je tako, da je jedina stvar koju sam našao? I ovdje je razmak namjerno. Ako ste pročitali dokumentaciju za sscanf, to vam govori da ako su komad razmakom na početku ili na kraju, sscanf će također omogućiti korisniku, iz bilo kojeg razloga, pogoditi 123 razmaknicu i da će biti legitimna. Nećete vikati na korisnika samo zato što su hit razmaknicu na početku ili na kraju, što je samo malo više user-friendly. Sva pitanja onda na GetInt? Da. >> [Student] Što ako samo stavi u char? Dobro pitanje. Što ako samo upisali u char kao f i pritisnite Enter bez tipkanja 123? Što mislite ponašanje ove linije koda će onda biti? [Nečujno učenik odgovor] Da, tako sscanf mogu pokriti previše, jer u tom slučaju, to se neće ispuniti N ili C. To će se, umjesto vratiti 0, u kojem slučaju ja sam također uhvatiti taj scenarij jer očekivana vrijednost želim je jednog. Želim samo jedna i samo jedna stvar biti popunjena. Dobro pitanje. Drugi? U redu. Nemojmo proći kroz sve funkcije u ovdje, ali onaj koji čini se da je možda od preostalih interesa GetString jer ispada da GetFloat, GetInt, GetDouble, GetLongLong sve čamac puno njihove funkcionalnosti na GetString. Dakle, neka je pogledati kako se on provodi ovdje. Ovaj jedan izgleda malo kompleksa, ali koristi iste osnove da smo počeli govoriti o prošlog tjedna. U GetString, koja ne uzima argumente po praznini ovdje i vraća niz, ja sam očito proglašenja niz zove tampon. Ja stvarno ne znam što da će se koristiti za još, ali vidjet ćemo. Izgleda kapacitet je po defaultu 0. Nije sasvim siguran gdje je to ide, ne znam što je n će se koristiti za još, ali sada to je sve malo više zanimljiv. U skladu 243, izjavljujemo int, c. To je neka vrsta glupe detalje. Char je 8 bita, a 8 bita može pohraniti koliko različite vrijednosti? >> [Student] 256. >> 256. Problem je ako želite imati 256 različitih ASCII znakova koji se nalaze ako mislite natrag - i to nije nešto zapamtiti. No, ako se sjetim tog velikog ASCII tablici smo imali tjedana prije, bilo je u tom slučaju 128 ili 256 ASCII znakova. Koristili smo sve obrasce 0s i 1s gore. To je problem, ako želite biti u mogućnosti da otkrije pogrešku jer ako već koristite 256 vrijednosti za svoje likove, nisi stvarno planirati unaprijed jer sada nemate način govoreći, ovo nije čitljiv karakter, ovo je neka pogrešna poruka. Dakle, ono što svijet čini se oni koriste sljedeći najveća vrijednost, nešto poput int, tako da imate ludu broj bita, 32, za četiri milijarde mogućih vrijednosti tako da možete jednostavno završiti koristeći suštini 257 od njih, 1 koji ima neke posebno značenje kao pogreška. Dakle, neka je vidjeti kako se to radi. U skladu 246, imam tu veliku while petlja koja se poziva fgetc, f značenje datoteku, tako getc, a zatim STDIN. Ispada ovo je samo precizniji način govoreći pročitati ulaz s tipkovnice. Standardni ulaz znači tipkovnica, standardni izlaz znači zaslon, i standardna pogreška, što ćemo vidjeti u pset4, znači zaslon ali poseban dio zaslona, ​​tako da to nije conflated sa stvarnim izlaz da li namjerava ispisati. Ali više o tome u budućnosti. Dakle fgetc samo znači pročitati jedan lik iz tipkovnice i pohraniti ga gdje? Čuvajte ga u c. I onda provjeriti - pa ja sam samo pomoću nekih Boolean veznici ovdje - provjerite da nije jednaka - \ n, tako da korisnik pritisnite Enter, želimo zaustaviti u tom trenutku, kraj petlje - i mi također želimo provjeriti za posebne stalnom EOF, što ako znate ili pogoditi, što to stajati? >> [Student] Kraj spisa. >> Kraj spisa. To je vrsta besmisleno, jer ako sam tipkati na tipkovnici, tamo je stvarno nema datoteka su uključeni u to, ali to je samo sortirati od generički termin koji se koristi za reći da ništa drugo ne dolazi iz ljudskog prstima. EOF - kraj datoteke. Kao na stranu, ako ste ikada pogodio Upravljačka D na tipkovnici, a ne da bi tek - ste hit Upravljačka C - Kontrola D šalje ovaj posebni konstanta naziva EOF. Tako sada imamo samo neke dinamičke raspodjele memorije. Dakle, ako (n + 1> kapacitet). Sada ću objasniti n. N je samo koliko bajtova su trenutno u tampon, string koji ste trenutno gradi od korisnika. Ako imate više znakova u svom tampon nego što imamo kapacitet u tampon, intuitivno što trebamo učiniti onda je izdvojiti više kapaciteta. Tako ću kliziti preko neke od aritmetičke ovdje i usredotočiti se samo na ovoj funkciji ovdje. Znate li što je malloc ili su barem općenito poznato. Uzmi pogodak što realloc radi. >> [Student] Dodaje memorije. To nije sasvim dodavanjem memorije. To reallocates memorije kako slijedi. Ako postoji još prostora na kraju niza vam dati više od toga memorije nego je prvotno vam daje, onda ćete dobiti taj dodatnu memoriju. Dakle, možete samo zadržati stavljajući stringa likove natrag na leđa natrag na leđa. No, ako to nije slučaj, jer ste čekali predugo i nešto slučajni dobio plopped u memoriji postoji ali tu je dodatni memorijski ovdje dolje, to je u redu. Realloc će učiniti sve težak za vas, premjestiti niz ste pročitali u tako daleko odavde, stavi ga tamo dolje, i onda vam dati neke više pistu u tom trenutku. Dakle, s valom ruke, dopustite mi da kažem da je ono što GetString radi je to počevši s malom buffer, možda jedan jedini lik, a ako korisnik unese u dva lika, GetString završava pozivom realloc i kaže jedan lik nije bio dovoljno; dajte mi dva lika. Zatim, ako ste pročitali kroz logiku petlje, to će reći korisnik upisao u tri znaka; daj mi sada ne dva, ali četiri znaka, onda mi dati 8, onda daj mi 16 i 32. Činjenica da sam udvostručenje kapaciteta svaki put znači da tampon ne ide sporo rastu, to će rasti superbrzo. A što može biti prednost to? Zašto sam udvostručenje veličine tampon iako korisnik može samo trebate jedan dodatni lik iz tipkovnice? [Nečujno učenik odgovor] >> Što je to? >> [Student] Ne morate ga rasti tako često. Točno. Ne morate ga rasti tako često. A to je samo vrsta ste hedging svoje oklade ovdje, Ideja je da ne želite nazvati realloc puno jer ima tendenciju da se spor. Svaki put kada se pitati operativni sustav za memoriju, kao da ćete uskoro vidjeti u budućem problema setu, ima tendenciju da potrajati neko vrijeme. Dakle umanjuje taj iznos od vrijeme, čak i ako ste gubit neki prostor, teži biti dobra stvar. Ali ako čitamo kroz završni dio GetString ovdje - i opet razumijevanje svaki jednu liniju ovdje nije toliko važno danas - primijetiti da je na kraju poziva malloc opet i to izdvaja točno onoliko bajtova kao što treba za niz i onda baca pozivom na besplatni pretjerano veliki tampon ako je to doista dobio udvostručila previše puta. Dakle, u kratko, to je kako GetString je radio sve ovo vrijeme. Sve to ne se čita jedan znak na vrijeme opet i opet i opet, i svaki put kad to treba neki dodatnu memoriju, ona traži operativni sustav za njega pozivom realloc. Ima li pitanja? U redu. Napad. Sada kada razumijemo naputke ili barem sve su upoznati s pokazivačima, ajmo uzeti u obzir kako je cijeli svijet počinje kolaps ako ne sasvim braniti protiv suparničkih korisnika, ljudi koji pokušavaju upasti u vašem sustavu, ljudi koji pokušavaju ukrasti vaše softver zaobilaženjem neki registracijski kod da bi u protivnom morati upisati u. Pogledajte ovaj primjer ovdje, što je samo C koda koji ima funkciju glavnog na dnu koja poziva funkciju foo. A što je to prolazi na foo? [Student] jedan argument. >> [Malan] jedan argument. Dakle, argv [1], što znači da je prva riječ da korisnik upisali u naredbeni redak nakon a.out ili što god se zove program. Tako foo na vrhu vodi u char *. No, char * je upravo ono? >> [Student] niz. [Malan] string, tako da nema ništa nova ovdje. To niz proizvoljno se zove bar. U ovoj liniji ovdje, char c [12], u svojevrsni polu-tehničkom engleskom jeziku, što je ova linija radi? [Student] niz - >> Array od? >> [Student] Likovi. >> Likovi. Daj mi niz od 12 znakova. Tako bismo mogli nazvati ovu tampon. To se zove tehnički c, ali tampon u programiranju samo znači hrpa prostora da možete staviti neke stvari i. Zatim, na kraju, memcpy nismo ste koristili prije, ali vjerojatno možete pogoditi što radi. Ona kopira memorije. Što to učiniti? To očito kopira bar, njegov ulaz, u c, ali samo do dužine traci. No, tu je bug ovdje. >> [Student] Trebate sizeof karakter. >> Ok. Tehnički, mi stvarno trebali učiniti strlen (bar) * sizeof (char)). To je točno. No, u najgorem slučaju ovdje, hajdemo pretpostaviti da that's - Ok. Zatim tu je dvije greške. Dakle sizeof (char)); Učinimo to malo šire. Dakle, sada ima još bug, to je ono što? >> [Nečujno učenik odgovor] Provjerite za što? >> [Student] Provjerite NULL. Mi općenito treba provjeravati NULL jer loše stvari se dogoditi kada pokazivač je NULL, jer možda ćete završiti ide tamo, i ne bi trebao ikada biti idući na NULL ga dereferencing sa zvijezda operatora. Dakle, to je dobro. A što drugo radimo? Logično, tu je mana ovdje. [Student] Provjerite je li argc je> = do 2. Dakle, provjerite je li argc je> = 2. Ok, tako da je tri bugovi u ovom programu ovdje. Sada provjeravamo je li korisnik zapravo upisali u bilo u argv [1]. Dobro. Dakle, što je treći bug? Da. >> [Student] C ne može biti dovoljno velika. Dobro. Provjerili smo jedan scenarij. Mi implicitno provjeriti ne kopirati više memorije nego što bi premašiti duljinu traci. Dakle, ako string korisnik upisao u je 10 znakova, to govori samo kopirati 10 znakova. I to je u redu. No, što ako korisnik unese u riječi na brz kao 20-znakovni riječi? To govori kopiju 20 znakova iz bara u čemu? C, inače poznat kao naš tampon, što znači da samo piše podatke do 8 byte lokacijama koje nemaju vlastiti, a vi ih ne posjedujete u smislu da ih nikada ne dodjeljuje. Dakle, to je ono što je općenito poznat kao napad tampon preljeva ili prelijevanja spremnika napad. I to je napad u smislu da ako korisnik ili program koji zove svoju funkciju je to zlonamjerno, što se zapravo događa sljedeći zapravo mogao biti prilično loša. Dakle, neka je pogledati ovu sliku ovdje. Ova slika predstavlja svoj stack memorije. Sjetite se da svaki put kad poziv funkciju možete dobiti ovaj malo okvir na stog a zatim još jedan, a zatim drugi i drugo. I do sada, mi smo samo vrsta iscrpljene te kao pravokutnika ili na brodu ili na zaslonu ovdje. No, ako smo povećali na jednom od tih pravokutnika, kada zovete funkciju foo, Ispada da postoji više na stog unutar tog okvira u tom pravokutniku nego samo x i y i i b, kao što nismo govorimo o zamjeni. Ispada da postoji neki niže razine pojedinosti, među njima i povratak Adresa. Tako ispada kada glavni poziva foo, glavni mora obavijestiti foo ono glavnih adresa je u memoriji računala jer inače, čim foo radi izvršenja, kao u ovom slučaju ovdje, kada dođete do ovog zatvorenog kovrčavu braće na kraju foo, kako dovraga foo znam gdje kontrolu programa je trebao ići? Ispada da je odgovor na to pitanje je u ovom crvenom pravokutniku ovdje. To predstavlja pokazivač, a to je do računala za pohranu privremeno na tzv stog adresa glavni, tako da čim foo radi izvršenja, računalo zna gdje i što linija u glavni vratiti. Spremljeno okvir pokazivač odnosi slično tome. Char * bar ovdje predstavlja što? Sada je to plavi segment ovdje je Foo je okvir. Što je traka? Bar je samo argument za foo funkciji. Dakle, sada smo se vratili na kakve poznate slike. Tu je više stvari i više rastresenost na zaslonu, ali to svjetlo plava segment upravo je ono što smo crtež na školsku ploču za nešto poput swapa. To je okvir za foo. A jedina stvar u tome upravo sada je bar, koji je ovaj parametar. No, što je još trebao biti u snopu prema ovom kodeksu ovdje? [Student] char c [12]. >> [Malan] char c [12]. Također, trebali bismo vidjeti 12 kvadrata memorije dodijeljena varijabli zove c, i doista mi imamo da se na zaslonu. Vrlo vrh je c [0], a zatim je autor ovog dijagrama nije smetaju crtanje sve kvadrata, ali zaista postoje 12 postoji jer ako pogledate u donjem desnom kutu, c [11] ako računamo od 0 je 12. bajta. Ali ovdje je problem. U kojem smjeru je c raste? Sortiraj odozgo prema dolje, ako to počinje na vrhu, a raste na dnu. To ne izgleda kao da smo ostavili sebi puno pistu ovdje uopće. Mi smo vrsta sebe naslikao u kutu, i da je c [11] je točno nasuprot baru, koji je upravo protiv Spremljene Frame pokazivač, koji je točno nasuprot povratna adresa. Nema više prostora. Dakle, ono što je implikacija onda ako zajebeš a vi pokušajte čitanja 20 bajtova u 12-byte buffer? Gdje su ti 8 dodatnih bajtova ići? >> [Student] Unutra - Unutra sve ostalo, od kojih su neke je super važno. I najvažnije, potencijalno, je crveni okvir postoji, povratna adresa, jer pretpostavljam da ste slučajno ili adversarially prepisati one 4 bajta, da pokazivač adresu, a ne samo sa smećem, ali s brojem da se događa da predstavlja stvarnu adresu u memoriji. Što je implikacija, logično? >> [Student] Funkcija će se vratiti na drugom mjestu. Točno. Kada foo vraća i hitovi koji kovrčave vitice, program će se nastaviti Ne biste se vratili na glavni, to će se vratiti na ono što je adresa u tom crvenom okviru. U slučaju zaobilazi softvera registracije, što ako je adresa koja je se vratio je funkcija koja normalno gets zove nakon što ste platili za softver i unesene svoj registracijski kod? Možete sortirati trik računala u ne ide ovdje, ali umjesto da ide gore. Ili ako si stvarno pametan, protivnik zapravo može upisati na tipkovnici, na primjer, nije stvarna riječ, a ne 20 znakova, ali pretpostavljam da on ili ona zapravo vrste u neki likovi koji predstavljaju kôd. I to neće biti C koda, to je zapravo će biti likovi koji predstavljaju binarni strojni kod, 0s i 1s. Ali pretpostavimo da su dovoljno pametni da to učinite, nekako zalijepiti u GetString redak nešto što je bitno sastaviti kod, , a zadnja 4 bajta prebrisati tu povratnu adresu. A što adrese to ulaz učiniti? To je zapravo pohranjuje u ovom crvenom pravokutniku adresa prvog bajtu tampon. Dakle, morate biti jako pametan, a to je puno pokušaja i pogrešaka za loših ljudi vani, ali ako možete shvatiti koliko je velika ta tampon je kao da je u posljednjih nekoliko bajtova u ulazu vam daju na programu dogoditi da bude jednaka na adresu početku svog tampon, možete to učiniti. Ako kažemo normalno pozdraviti i \ 0, to je ono što završi u spremniku. No, ako smo više pametan i punimo taj tampon s onim što smo općenito ću nazvati napad kod - AAA, napad, napad, napad - gdje je to samo nešto da učini nešto loše, što se događa ako si stvarno pametan, možda ćete to učiniti. U crvenom okviru ovdje je niz brojeva - 80, C0, 35, 08. Primijetit ćete da to odgovara broju koji je ovdje. To je u obrnutom redoslijedu, ali više na tom nekom drugom vremenu. Primijetit ćete da je ovo povratna adresa je namjerno izmijenjeni jednaka adresu ovdje, a ne adresu glavni. Dakle, ako loš momak je super pametan, on ili ona će se uključiti u taj napad kod nešto poput izbrisati sve korisnikove datoteke ili kopirati lozinke ili stvoriti korisnički račun koji sam tada mogu prijaviti na - ništa at svi. A to je i opasnost i moć C. Budući da imate pristup memoriji putem upućuje i stoga se može pisati što god želite u memoriju računala, možete napraviti računalo učiniti sve što želite jednostavno tako što je skakati unutar vlastitog memorijskog prostora. I tako do današnjeg dana, tako mnogi programi i tako mnoge web stranice koje su ugrožena svode na ljude iskorištavanjem to. A to se može činiti kao super sofisticiranih napada, ali to ne mora uvijek početi na taj način. Realnost je da je ono što loši ljudi će obično učiniti je, da li je program na naredbenog retka ili GUI program ili web stranice, samo početi davati gluposti. Možete upisati u zaista velikom riječ u polje za pretraživanje i pritisnite Enter, i čekati da vidi je li web ruši ili čekate da vidi je li program pokazuje neke poruke o pogrešci jer ako se posreći kao negativca, a vi kažete neki ludi ulaz koji ruši program, to znači da programer nije predvidio svoj loše ponašanje, što znači da možete vjerojatno s dovoljno truda, dovoljno suđenje i pogreške, shvatiti kako voditi preciznije napad. Dakle, koliko dio sigurnosti nije samo izbjegavanje tih napada uopce ali ih pronađu, a zapravo gleda dnevnika i vidjeti što ulazi ludi smo ljudi upisali u vaše web stranice, što uvjete za pretraživanje ljudi su upisali u vaše web stranice u nadi da će prelijevanje neki tampon. I ovo sve se svodi na jednostavne osnove što je niz i što to znači izdvojiti i koristiti memoriju. Vezano uz to onda je to previše. Ajmo pogledati unutar hard disk opet. Možete se prisjetiti od tjedan ili dva prije da kad povucite datoteke na vaš koš za smeće ili kantu za smeće, što se događa? >> [Student] Ništa. >> Apsolutno ništa, zar ne? Na kraju, ako vam ponestane na disku, Windows ili Mac OS će početi brisanjem datoteka za vas. Ali ako povučete nešto tamo, da uopće nije sigurno. Sve tvoj cimer ili prijatelj ili član obitelji ima veze dvostruko kliknite i, voila, tu je sve nedorečena datoteke koje ste pokušali izbrisati. Većina od nas barem znati da morate desni klik ili kontrolirati klik i prazna kanta za smeće ili nešto slično. Ali čak i tada to ne sasvim učiniti trik jer ono što se događa kada imate datoteku na tvrdom disku koji predstavlja neki Word dokument ili neki JPEG, a to predstavlja vaš tvrdi disk, i recimo to luč ovdje predstavlja tu datoteku, i to je sastavljen od cijela hrpa 0S i 1S. Što se događa kada se ne samo povucite tu datoteku na smeće ili koš za smeće ali ga isprazniti? Sortiraj ničega. To nije apsolutno ništa sada. Sada je samo ništa, jer malo se nešto dogodi u obliku ovoj tablici. Dakle, postoji neka vrsta baze podataka ili tablice unutar memoriju računala bitno da ima jedan stupac za datoteke s imenima i jedan stupac za datoteke 'mjesto, gdje bi to moglo biti mjesto 123, samo slučajni broj. Tako bismo mogli imati nešto poput x.jpeg i lokaciji 123. Što se događa onda kada zapravo ispraznili smeće? To ide dalje. No, ono što ne ide daleko je 0s i 1s. Dakle, ono što je tada veza pset4? Pa, s pset4, samo zato što smo slučajno sam izbrisala Compact Flash kartice da je imao sve ove fotografije ili samo zato što je po peh postao korumpiran ne znači da 0s i 1s nisu još uvijek tamo. Možda neki od njih su izgubili, jer nešto dobio korumpiran u smislu da su neki 0s postao 1s i 0s 1s postao. Loše stvari se može dogoditi, jer buggy softvera ili neispravan hardver. No, mnogi od tih bitova, možda čak i 100% od njih su još uvijek tamo. To je samo da računalo ili fotoaparat ne znam gdje JPEG1 započeo i gdje JPEG2 počeo. Ali ako vas, programer, znate s malo pamet gdje ti JPEG su ili ono što oni izgledaju tako da možete analizirati 0s i 1s i reći JPEG, JPEG, možete napisati program s bitno samo za ili while petlja da oporavi svaki od tih datoteka. Dakle, pouka je onda početi sigurno brisanje datoteka ako želite izbjeći uopce. Da. [Student] Kako to kaže na vašem računalu da imate više memorije nego što si učinio prije? Imati više memorije nego što je prije - >> [student] Više raspoložive memorije. Oh. Dobro pitanje. Pa zašto onda nakon pražnjenja otpada ne vaše računalo vam reći da imate više slobodnog prostora nego što si učinio prije? U Ukratko, jer je lagao. Više tehnički, imate više prostora, jer sada ste rekli možete staviti druge stvari gdje je datoteka nekad bio. No, to ne znači da se bitovi ide dalje, i to ne znači da se bitovi se mijenja u svim 0S, na primjer, za vašu zaštitu. Dakle, za razliku od, ako sigurno brisanje datoteka ili fizički uništiti uređaj, da je stvarno jedini način ponekad oko toga. Pa zašto ne odemo na tom polu-zastrašujuće note, a mi ćemo vas vidjeti u ponedjeljak. [Pljesak] [CS50.TV]