[Powered by Google Translate] [Teden 5]
[David J. Malan - Harvard University]
[To je CS50. - CS50.TV]
>> To je CS50, Teden 5.
Danes in ta teden bomo predstavili malo sveta forenzike
v okviru problema Set 4.
Danes bo skrajšano predavanje zato, ker je poseben dogodek, sem kasneje.
Torej bomo pokukajmo in draži tako študentom kot tudi njihovi starši danes
z nekaterimi stvarmi, ki so na obzorju.
>> Med njimi, kot v ponedeljek, boste imeli še nekaj sošolci.
EDX, Harvard in MIT novo spletno pobuda za OpenCourseWare in več,
začenja na univerzi Harvard v ponedeljek, kar pomeni, da prihaja ponedeljek
boste imeli, kot v zadnjem štetju 86.000 dodatnih sošolci
Kdo bo po skupaj s predavanji CS50 in odsekov
in walkthroughs in problemov sklopov.
In v okviru tega, boste postali člani ustanovni razred CS50 in zdaj CS50x.
Kot del tega zdaj zavedajo, da se bodo nekatere upsides kot dobro.
Pri pripravah na to, za veliko število študentov,
zadošča reči, da čeprav imamo 108 TFS in CAS,
to ni čisto najboljši učenec-učitelj razmerje, ko bomo zadeli na 80.000 študentov.
Ne bomo se razvrščanje toliko problem postavlja ročno,
Tako je predstavil ta teden v problemski sklop bo CS50 Preverite,
, ki se bo pripomoček ukazne vrstice v aparatu
da boste dobili, ko jo boste osvežili kasneje ta teden.
Boste mogli zagnati ukaz, check50, na svojem pset,
in boste dobili takojšnjo povratno informacijo o tem, ali je vaš program, pravilno ali nepravilno
glede na različne tehnične zahteve za obliko, ki smo poskrbeli.
Več o tem v opredelitvi težave set.
The CS50x sošolci bodo uporabili tudi to.
>> Problem Set 4 je vse o forenziki,
in je ta pset res zgleduje po nekaterih resničnih stvari
pri čemer, ko sem bil v šoli sem nekaj časa interniran
z okrožnim tožilcem Middlesex County pisarni delaš forenzično delo
z njihovo vodilno forenzični preiskovalec.
Kaj je ta znašala, kot mislim, da sem že pred nekaj tedni mimo,
se bodo policijski državni Masa ali drugi pridejo,
, ki bi jih odložite stvari, kot so trdi diski in CD-jev in disket in podobno,
in potem je cilj urada forenzike je bil ugotoviti
ali je bila ali ni bila dokaz neke vrste.
To je bila posebna enota Preiskave, tako da je bilo beli ovratnik kriminalu.
To je bolj zaskrbljujoče vrste kaznivih dejanj, ki vključuje vse, kar neke vrste digitalnih medijev.
Izkazalo se je, da ni veliko ljudi, ki pišejo e-poštno sporočilo, "mi je uspelo."
Tako pogosto ti forenzične iskanja ni obrnila navzgor vse, da je veliko sadja,
ampak včasih bi ljudje pišejo take e-pošte.
Torej, včasih so bili nagrajeni prizadevanja.
>> Vendar pa vodi do tega forenzično pset, bomo uvedbo v pset4 malo grafiko.
Verjetno se da te stvari za samoumevne - JPEG, GIF, in podobno - v teh dneh.
Ampak, če si res misliš o tem, slika, podobno kot obraz Rob je,
lahko obravnavamo kot zaporedje pik ali pik.
V primeru obrazu Rob je, tam je vse vrste barv,
in smo začeli videti posamezne pike, sicer znan kot pik,
ko smo začeli, da povečate palca
Ampak, če bomo poenostavili svet malo in samo rečem, da je to tukaj, je Rob v črno-beli tehniki,
da predstavlja črno-belo, lahko pa uporabite binary.
In če bomo uporabiti binarno, 1 ali 0, lahko izrazimo to isto sliko
z nasmejanim obrazom Rob je s tem vzorcu bitov.
11000011 pomeni bela, bela, črna, črna, črna, črna, bela, bela.
In tako to ni velik korak nato začeli govoriti o pisanimi fotografijami,
stvari, ki bi jih vidite na Facebooku ali pa z digitalnim fotoaparatom.
Ampak seveda, ko gre za barve, za ogled potrebujete več bitov.
In zelo pogosto v svetu fotografije je uporaba ne 1-bitne barve
kot to kaže, pa 24-bitno barvno, če ste dejansko dobili milijone barv.
Tako kot v primeru, ko povečujete na očeh Rob je,
da bi bila katera številka milijonov različnih barvnih možnosti.
Torej bomo uvesti to Set 4 Problem je tudi v walkthrough,
, ki bo danes ob 3:30 namesto običajnega 2:30 zaradi petkovega predavanja tukaj.
Vendar pa bo video na spletu običajnega jutri.
>> Prav tako vam bomo predstavili drugi obliki zapisa.
To je pomenilo, da si namerno zastrašujoče na prvi,
ampak to je le nekaj dokumentacije za struct C.
Izkazalo se je, da je Microsoft pred leti pomagal popularizirati ta format
imenuje bitna format, bmp, in to je super preprost barvit grafični format
ki je bila uporabljena za kar nekaj časa in včasih še za ozadja na namiznih računalnikov.
Če menite, da nazaj na Windows XP in gričev in modro nebo,
da je običajno bmp ali bitna slika.
Bitne slike so zabavne za nas, saj imajo malo več kompleksnosti.
To ni tako preprosto, kot to mrežo 0s in 1s.
Namesto, da imate stvari, kot glavo na začetku datoteke.
Torej, z drugimi besedami, znotraj ene datoteke. BMP je cel kup 0s in 1s,
vendar pa je nekaj dodatnih 0s in 1s tam.
In izkazalo se je, da tisto, kar smo verjetno samoumevno let -
datotek, kot so. doc. ali xls ali. mp3, mp4,. ne glede na oblike datotek
da ste seznanjeni s - kaj to sploh pomeni, da je datotečni format,
saj na koncu dneva vse te datoteke, ki jih uporabljamo so le 0s in 1s.
In morda so 0s in 1s predstavljajo ABC preko ASCII ali podobno,
ampak na koncu dneva, je še vedno samo 0 in 1s.
Torej, ljudje le občasno odloči, da izumiti novo obliko datoteke
kjer so standardizacija, kaj se bo vzorce bitov pravzaprav pomeni.
In v tem primeru tudi tu ljudje, ki so namenjeni bitno obliko datoteke
je dejal, da je že na prvi bajt v datoteke bitnih, kot je označena z odmikom 0 tam,
da se bo nekaj cryptically imenom spremenljivke se imenuje bfType,
ki samo stoji za vrsto datoteke bitne slike, kakšne datoteke bitnih je to.
Lahko sklepamo, morda v drugi vrstici, ki izravna 2, bajt številko 2,
ima vzorec 0s in 1s, ki predstavlja kaj? Velikost nečesa.
In gre od tam.
Torej, Set 4 Problem, boste šli skozi nekatere od teh stvari.
Mi ne bo končalo skrbeti za vse.
Ampak opazite, da se začne, da bi dobili zanimive okoli bajt 54: rgbtBlue, zelena in rdeča.
Če ste kdaj slišali kratico RGB - rdeča, zelena, modra - to je, da je sklicevanje na
ker se je izkazalo, lahko slikate vse barve mavrice
z nekaterimi kombinacijo rdeče in modre in zelene.
In v resnici, lahko starši v sobi spomniti na nekatere izmed prvih projektorjev.
Te dni, boste videli ena svetla svetloba, ki prihaja iz leče,
pa nazaj v dan si imel rdečo lečo, modro lečo in zeleno lečo,
in skupaj sta usmerjena na zaslon in oblikovali barvito sliko.
In zelo pogosto, bi srednje šole in srednje šole so tiste leče
vedno tako malo Nakrivo, tako da si nekako vidi dvojno ali trojno slik.
Ampak to je bila ideja. Imeli ste rdečo in zeleno in modro svetlobo, slikarstvo sliko.
In ta ista načela se uporabljajo v računalnikih.
>> Tako med drugim izzivom, potem za vas pri reševanju Set 4 se bo nekaj stvari.
Ena je, da dejansko velikost slike, da bi se v vzorcu 0s in 1s,
ugotovimo, katere kose 0s in 1s predstavlja tisto, kar v strukturi, kot je ta,
in nato ugotovimo, kako se podvajajo pik - The Reds, blues, zelenice -
notranjost tako, da ko slika izgleda tako na začetku,
je morda videti, kot je ta, namesto po tem.
Med drugimi izzivi, preveč se bo, da boste predali forenzično sliko
z dejansko datoteko iz digitalnega fotoaparata.
In na to kamero, nekoč, je bilo cel kup fotografij.
Problem je čisto slučajno izbrišejo ali se je slika poškodovana nekako.
Slabe stvari se dogajajo z digitalnimi fotoaparati.
In tako smo se hitro kopirajo vse 0s in 1s off te kartice za vas,
shrani vse v eno veliko datoteko, nato pa jih bomo predali prikazana v Problem Set 4
tako da boste lahko napisali program v C, s katerimi si opomore vse te JPEGs, v najboljšem primeru.
In izkazalo se je, da so JPEG, čeprav je to nekoliko zapleteno datotečnem formatu -
oni so veliko bolj zapleten kot to nasmejan obraz tukaj -
Izkazalo se je, da ima vsak JPEG začne z istimi vzorci 0s in 1s.
Torej z uporabo, na koncu, medtem ko zanke ali za zanke in podobno,
lahko izbirate čez vse 0s in 1s v tem forenzične slike
in vsakič, ko vidiš poseben vzorec, ki je opredeljen v specifikaciji problem set,
si lahko ogledate tukaj prevzeti, je z veliko verjetnostjo, začetek JPEG.
In takoj, ko je bil isti vzorec nekaj več bajtov
ali kilobajtov megabajtov ali pozneje, lahko prevzamejo tukaj je 2. JPEG,
foto sem po prvi.
Naj nehate brati, da je prvo datoteko, da začnete pisati to novo,
in izhod vašega programa za pset4 se bo kar 50 JPEG.
In če to ni 50 JPEG, imate malo zanko.
Če imate nešteto JPEG, imate neskončno zanko.
Tako, da bodo tudi precej pogost primer.
Torej, to je tisto, kar je na obzorju.
>> Kviz 0 nami, spoznali na moj email, da vedno obstajajo ljudje, ki so tako srečni,
nekako nevtralen, in žalosten okoli 0 kvizu čas.
In vas prosimo, da stik z mano, vodja TF Zamyla, svoje TF,
ali eden od CA, da boste vedeli, če bi želeli, da bi razpravljali, kako je šlo.
>> Torej, da bi naredil vtis na starše tukaj v prostoru, kar je CS50 knjižnica?
[Smeh] Dobro delo.
Kaj CS50 knjižnica? Ja. >> [Študent] je vnaprej pisno niz oznako [neslišno]
Dobro, dobro.
To je predhodno pisno niz kode, ki jih je napisal osebje, nudimo vam,
ki določa nekatere skupne funkcije,
Stvari, kot se mi je niz, me int - vse funkcije, ki so tukaj naštete.
>> Že sedaj smo začeli res, da te usposabljanje kolesa off.
Bomo začeli vzeti niz od tebe,
Odpoklic, ki je bil le sinonim za tisto, kar dejansko podatkovni tip? >> [Več študentov] Char *.
Char *. Za starše, ki je bila verjetno [whooshing naredi zvok]. To je dobro.
Char * bomo začeli videti na zaslonu toliko več, kot smo odstranili iz našega niz besedišča,
vsaj ko gre za dejansko pisanje kode.
Prav tako bomo prenehali uporabljati nekatere od teh funkcij, kar
ker naši programi bodo dobili bolj zapletene.
In ne samo pisati programe, ki sedijo tam s hitro utripa,
čaka, da uporabnik vnesti nekaj, boste dobili svoje vložke od drugod.
Na primer, jih boste dobili od več bitov na lokalni trdi disk.
Boste namesto njih priti v prihodnosti od omrežne povezave,
nekatere spletne strani nekje.
>> Torej, kaj je Odlepite tej plasti so prvič in potegnite do CS50 aparata
in ta datoteka imenuje cs50.h, ki ste bili # vključno tednih
ampak kaj je dejansko videti, kaj je notri tega.
Začetek datoteke v modrem je samo cel kup komentarjev:
informacije o garanciji in izdajanja dovoljenj.
To je neke vrste skupne paradigme v programski opremi
ker je veliko programske opreme v teh dneh je, kaj se ti open source,
kar pomeni, da je nekdo napisal kodo, zato je bilo na voljo brezplačno
ne samo za vožnjo in uporabo, ampak dejansko prebral in spremeniti in vključiti v svoje delo.
Torej, to je tisto, kar ste bili z uporabo, odprtokodno programsko opremo, vendar v zelo majhni obliki.
Če bi se pomaknite navzdol mimo pripomb, čeprav bomo začeli videti nekaj bolj znanih stvari.
Obvestilo na vrhu sem, da je dokumentacija cs50.h vsebuje cel kup glavi datoteke.
Večina od njih še nismo videli, vendar je znano.
Katera od teh smo videli, čeprav na kratko, tako daleč? >> [Študent] Standard knjižnica.
Ja, standardna knjižnica. stdlib.h je malloc.
Ko smo začeli govoriti o dinamično dodeljevanje pomnilnika,
ki jih bomo vrnili naslednji teden pa smo začeli tudi te datoteke.
Izkazalo se je, da je bool in resnično in lažno dejansko ne obstajajo v C-per
razen če so te datoteke tukaj.
Imamo nekaj tednov je bilo tudi stdbool.h
tako da lahko uporabite pojem bool, resnična ali neresnična.
Brez tega bi morali nekako ponaredek, in uporabite int
in samo samovoljno domnevati, da je 0 false in 1 je res.
Če smo se pomaknite naprej, tu je naša opredelitev niza.
Izkazalo se je, kot smo že povedal, da če je ta zvezda je sploh ni važno.
Lahko celo prostor vsem.
Prav ta semester so bili njeni promociji, kot je to jasno
da je zvezda ima opraviti s tipom,
a se zavedaš, tako pogosta, če ne malo bolj pogosti,
je, da ga ni, ampak funkcionalno je ista stvar.
Toda zdaj, če beremo navzdol naprej, pa si oglejte GetInt
saj smo vajeni, da se morda najprej, preden karkoli drugega v tem polletju.
Tukaj je GetInt. To je tisto? >> [Študent] prototip. >> To je samo prototip.
Pogosto smo pripravili prototipe na vrhovih naših. C datoteke
lahko pa tudi postaviti prototip v glavi datoteke, h. datotek, kot je ta tukaj
tako da, ko pišete nekaj funkcij, ki jih želite, da drugi ljudje lahko uporabljali,
, ki je ravno tako s knjižnico CS50,
ne samo izvaja svoje naloge v nekaj podobnega cs50.c,
si prav tako prototipe ni na vrhu te datoteke, ampak na vrhu glave datoteke.
Potem je glava datoteka je tisto, prijatelji in sodelavci so
z # include v svoji kodi.
Torej vsem tem času, ste bili tudi vsi ti prototipov,
dejansko na vrhu datoteke, ampak s pomočjo tega mehanizma # include,
ki je v bistvu kopije in paste to sliko v svoje.
Tukaj je nekaj precej podrobno dokumentacijo.
Smo precej samoumevno, da GetInt dobi int,
vendar se izkaže, da so nekateri primeri kotiček.
Kaj pa, če uporabnik vnese v številu, ki je tako prevelika, quintillion,
ki preprosto ne morejo fit notranjost notr? Kakšna je pričakovana vedenja?
Idealno bi bilo, da je predvidljiv.
Torej, v tem primeru, če ste dejansko prebrali drobni tisk,
boste dejansko videli, da če proga ne more prebrati, ta vrne INT_MAX.
Nikoli nisva govorila o tem, ampak na podlagi svoje kapitalizacije, kaj je to verjetno?
[Študent] konstantna. >> To je stalnica.
To je nekaj posebnega konstanta, ki je verjetno prijavljena v eni od teh glavi datoteke
To je višje v spisu, in INT_MAX je verjetno nekaj podobnega približno 2 milijardi
Zamisel je, da zato, ker moramo nekako pomenilo, da je nekaj šlo narobe,
smo, da imajo 4000000000 številke so nam na voljo: -2000000000 na do 2 milijard EUR, več ali manj.
No, tisto, kar je pogosto pri načrtovanju je, da kradejo samo eno od teh številk,
Morda 0, morda 2 milijardi morda -2000000000,
Tako boste porabili eno od svojih možnih vrednosti, tako da lahko zavežejo na svetu
da če gre kaj narobe, se bom vrnil to super veliko vrednost.
Ampak vi ne želite, da si tipkanje nekaj Grobni kot 234 ..., res veliko številko.
Ti je posploševati, namesto kot stalnica.
Torej res, če si bil analni zadnjih nekaj tednov, vsakič, ko se imenuje GetInt,
da bi bilo treba preverjanjem, če pogoj naredil si tip v INT_MAX,
oziroma, natančneje, pa GetInt Vračilo INT_MAX, ker če bi bil,
ki dejansko pomeni, da ni treba vnesti. Nekaj ​​je šlo narobe v tej zadevi.
Torej, to je tisto, kar je splošno znano kot divjega vrednosti, kar pomeni samo nekaj posebnega.
>> Pojdimo zdaj spremenila v datoteko. C.
Datoteka C je obstajala v aparatu za nekaj časa.
In v resnici, aparat pa že zbirajo za vas v tej stvari smo ti predmetne kode,
ampak to šele ni pomembno za vas, če je to zato, ker sistem ne ve
V tem primeru, ko gre za: aparat.
Naj se pomaknite navzdol do zdaj GetInt in videli, kako GetInt je delal ves ta čas.
Tukaj imamo podobne pripombe od prej.
Naj približati le tisti del kode.
In kaj imamo za GetInt je naslednja.
To traja nobenega vnosa.
To vrne int, medtem ko je (pravi), tako da imamo namerno neskončno zanko,
najverjetneje pa bomo iztrgajo iz tega tako ali vrniti znotraj tega.
>> Poglejmo, kako to deluje.
Zdi se, da se z uporabo GetString v tej prvi vrstici znotraj zanke 166.
To je zdaj dobra praksa, saj pod kakšnimi pogoji lahko vrne GetString
posebna ključna beseda NULL? >> [Študent] Če gre kaj narobe.
Če gre kaj narobe. In kaj bi lahko šlo narobe, ko pokličete nekaj podobnega GetString?
Ja. >> [Študent] malloc ne mu daš ints.
Ja. Mogoče malloc ne uspe.
Nekje pod pokrovom motorja, GetString kliče malloc, ki dodeljuje pomnilnik
ki omogoča računalniško trgovino vse znake
da uporabnik vnese v tipkovnici.
In predvidevam si imel še celo veliko prostega časa in vnesli več, na primer,
kot 2 milijardi znakov, več znakov, kot računalnik pa ima tudi RAM.
GetString je, da bi lahko pomenilo, da za vas.
Tudi če je to super, super občasni kotiček primeru,
to je nekako bi lahko poskrbel za to,
in tako GetString, če bi šli nazaj in preberite dokumentacijo, v resnici vrnitev NULL.
Torej, zdaj, če ne GetString z vrnitvijo NULL, GetInt se dogaja, da ne z vrnitvijo INT_MAX
tako kot kontrolna. To so samo človeške konvencije.
Edini način, da bi vedel, da je to primer, je z branjem dokumentacije.
>> Naj se pomaknite navzdol, kjer se dejansko gotten int.
Če bi se pomaknite navzdol malo naprej, v skladu 170, imamo pripombo nad temi smernicami.
Izjavljamo v 172 int, N in char, C in potem to novo funkcijo,
ki so se nekateri izmed vas naletel pred, sscanf.
To je kratica za scanf niza.
Z drugimi besedami, daj mi niz in ga bom za skeniranje informacijami interesov.
Kaj to pomeni?
Recimo, da sem tip v dobesedno 123 na tipkovnici in nato pritisnite tipko Enter.
Kaj je podatkovni tip 123, ko se vrne z GetString? >> [Študent] String.
Očitno niz, kajne? Imam niz.
Torej je res 123, citiram, konec citata, 123 s \ 0 na koncu.
To ni int. To ni več. Izgleda kot nekaj, vendar to ni dejansko.
Torej, kaj GetInt narediti?
Treba je pregledati, da se niz leve proti desni - 123 \ 0 - in nekako spremeniti v dejanske celo število.
Lahko ugotovimo, kako to storiti.
Če menite, da nazaj na pset2, si verjetno dobil malo všeč Cezarju
ali Vigenere, tako da lahko izbirate v nizu, lahko pretvorite znakov, da ints.
Ampak vraga, to je cel kup dela.
Zakaj ne pokličete funkcijo kot sscanf, da stori za vas?
Torej sscanf pričakuje argument - v tem primeru se imenuje linija, ki je niz.
Nato določite v narekovajih, zelo podoben printf, kaj pričakujete, da boste videli v tem nizu.
In tisto, kar sem rekel, je tukaj pričakujem, da decimalno številko in morda tudi značaj.
In bomo videli, zakaj je temu tako, v trenutku.
In izkazalo se je, da je ta zapis je zdaj spominja stvari smo začeli govoriti o
nekaj več kot tednom dni.
Kaj je & n & c in delaš za nas? >> [Študent] Naslov n in naslov c.
Ja. To mi dali naslov in naslov n c. Zakaj je to pomembno?
Saj veš, da je s funkcijami v C, lahko vedno vrne vrednost ali nobene vrednosti.
Lahko vrne int, niz, float, char, ne glede, ali ga lahko vrnete praznino,
vendar lahko vrne le eno stvar maksimalno.
Ampak tukaj želimo sscanf, da mi vrnejo morda int, decimalno številko,
in tudi char, in bom razložiti, zakaj zna v trenutku.
Vi dejansko želijo vrniti sscanf dve stvari, ampak to enostavno ni mogoče v C.
Temu se lahko izognete tako, da spustimo, da v dveh naslovih
ker takoj, ko se z roko v odvisnosti 2 naslove,
kaj lahko to funkcijo naredili z njimi? >> [Študent] Pisanje teh naslovov.
Lahko pišete na te naslove.
Lahko uporabite zvezdico delovanje in tja, za vsako od teh naslovov.
To je neke vrste te nazaj vrat mehanizma, vendar zelo pogosta za spreminjanje vrednosti spremenljivk
več kot le enem mestu - v tem primeru 2.
Zdaj sem opazil, preverjanje == 1 in se nato vrnejo n če to ne v resnici, ocenjuje, da res.
Torej, kaj se dogaja? Tehnično vse resnično želimo, da se zgodi v GetInt je to.
Želimo, da razčleniti, če se tako izrazim, želimo prebrati niz - quote-konec citata 123 -
in če izgleda kot, da je tam več, kaj govoriš sscanf storiti
je dal to številko - 123 - v ta spremenljivka n zame.
Torej, zakaj potem ni pravzaprav imam, da je to dobro?
Kakšna je vloga sscanf pravim, da bi lahko dobili tudi znak tukaj?
[Neslišno odgovor študentski] >> decimalno vejico lahko dejansko delajo.
Naj presodilo, da je za trenutek pomislil. Kaj še?
[Študent] bi moralo biti NULL. Dobro >> misel. To je lahko znak null.
To je pravzaprav v tem primeru ni. Ja. >> [Študent] ASCII.
ASCII. Ali mi posploševati še dlje.
% C je le za preverjanje napak.
Ne želimo, da bi znak za številko,
ampak kaj mi to omogoča, da storiti, je naslednje.
Izkazalo se je, da sscanf, poleg shranjevanje vrednosti v n in C v tem primeru tukaj,
kar je prav tako je vrne število spremenljivk je dal noter vrednosti
Torej, če ste le tip v 123, potem pa samo% d se dogaja, da se ujemajo,
in šele gets n shranjen v vrednosti kot 123,
in dobi ničesar dal v c.
C ostaja smeti vrednost, če se tako izrazim -
Smetarsko zato, ker nikoli ni bil inicializiran do neke vrednosti.
Torej, v tem primeru sscanf vrne 1, ker sem poseljena 1 teh kazalcev,
v tem primeru super, jaz imam int, zato sem osvoboditi linijo sprostiti pomnilnik
da GetString dejansko dodeljena, in potem se vrnem n,
drugje, če ste se kdaj spraševali, če ta izjava Ponovi prihaja, prihaja od tukaj.
Torej, če je, nasprotno, sem tip v 123foo - samo nekaj naključno zaporedje besedila -
sscanf bo videl številko, številko, številko, f,
in to bo dal 123 na n, da se bo dal v f c in se nato vrne 2.
Torej imamo, samo z osnovno definicijo vedenja sscanf je, zelo preprost način -
No, na prvi pogled zapleteno, vendar na koncu dneva precej preprost mehanizem -
bi rekel da je int, in če je tako, je to edina stvar, ki sem našel?
In tukaj je presledek namerno.
Če ste prebrali dokumentacijo za sscanf, da vam pove, da če so kos prostorom
na začetku ali na koncu, bo sscanf tudi omogoča uporabniku, iz katerega koli razloga,
zadeti 123 preslednico in da bo zakonito.
Ne boste vpij uporabnika samo zato, ker so hit preslednico
na začetku ali na koncu, kar je le malo več uporabniku prijazen.
>> Vsa vprašanja v zvezi GetInt potem? Ja. >> [Študent] Kaj pa, če si dal v znak?
Dobro vprašanje.
Kaj pa, če si jo vnesli v char kot f in pritisnite tipko Enter, ne da bi kdaj tipkanje 123?
Kaj misliš, da je ravnanje te vrstice kode bi se potem lahko?
[Neslišno študentski odziv]
Ja, tako da lahko sscanf zajema tudi to, ker v tem primeru ne gre za zapolnitev n ali c.
To se dogaja, namesto da se vrnete 0, v tem primeru pa sem tudi, da lov scenarij
ker je pričakovana vrednost je 1 želim.
Hočem samo eno in samo eno stvar je treba zapolniti. Dobro vprašanje.
>> Drugo? V redu.
>> Ne smemo iti skozi vse druge funkcije tukaj,
ampak tisti, ki se zdi, da morda za preostale obresti GetString
ker se je izkazalo, da GetFloat, GetInt, GetDouble, GetLongLong
Vse punt veliko funkcionalnostjo na GetString.
Torej si oglejte, kako se je izvajal tukaj.
Tole izgleda malo kompleks, temveč ga uporablja enake osnove
da smo začeli govoriti o zadnjem tednu.
V GetString, ki ne prevzema nobene navedbe kot na praznino tukaj
in vrne niz, jaz sem očitno razglasitvi niz imenovano buffer.
Res ne vem, kaj se dogaja, da se uporabljajo za še, ampak bomo videli.
Izgleda, da je zmogljivost privzeto 0.
Ni povsem prepričan, kam to pelje, ne vem, kaj se dogaja n, ki se uporabljajo za še
ampak zdaj je že malo bolj zanimivo.
V skladu 243 izjavljamo, int, c.
To je neke vrste neumna podrobnosti.
Char je 8 bitov, 8 bitov lahko shranite, koliko različnih vrednosti? >> [Študent] 256. 256 >>.
Problem je, če hočeš imeti 256 različnih ASCII znakov, ki obstajajo
Če mislite, da nazaj - in to ni nekaj, kar na pamet.
Ampak, če mislite, da nazaj v ta velik ASCII tabeli smo imeli pred tedni,
je bilo v tem primeru 128 ali 256 znakov ASCII.
Uporabili smo vse vzorce 0s in 1s up.
To je problem, če želite, da bi bili sposobni odkriti napako
ker če že uporabljate za vaše vrednosti 256 znakov
nisi zares načrtovati vnaprej, ker imate zdaj nikakor ne pravim,
to ni zakonit znakov, to pa je napačno sporočilo.
Torej, kakšen je svet pa je, da uporabite naslednjo največjo vrednost, nekaj takega notr,
tako da boste imeli noro število bitov, 32 za 4000000000 možnih vrednosti
tako da lahko preprosto na koncu z bistveno 257 izmed njih,
1, ki je nekaj posebnega pomena kot napaka.
>> Torej, poglejmo, kako to deluje.
V skladu 246, imam veliko while zanko, ki kliče fgetc,
f pomeni datoteko, tako getc, nato pa stdin.
Izkazalo se je, da je to le bolj natančen način rekel, beri vhod s tipkovnice.
Standardni vhod pomeni, tipkovnica, standardni izhod pomeni zaslon,
in standardna napaka, ki jih bomo videli v pset4 pomeni zaslon
ampak poseben del zaslona, ​​tako da to ni združevali s dejanske proizvodnje
ki ste jo nameravali natisniti. Ampak več o tem v prihodnosti.
Torej fgetc pomeni le prebral en znak s tipkovnice in ga shranite kje?
Shranite jo v c.
In potem preverite, - tako da sem samo z nekaj logičnih veznikov tukaj -
preverite, da ni enak -, \ n, tako da je uporabnik pritisnite tipko Enter, želimo ustaviti na tej točki,
konec zanke - in smo tudi želeli preveriti za posebno stalno EOF,
ki je, če veš, ali veš, kaj to stati? >> [Študent] na konec datoteke. >> Konec datoteke.
To je nekako nesmiselno, ker če sem tipkanje na tipkovnici,
pa je res ni vpleten v to sliko,
ampak to je samo nekako splošen izraz pomeni
da nič ne prihaja od prstov The Human je.
EOF - konec datoteke.
Kot prahi, če ste že kdaj udaril Nadzorna D na tipkovnici, ne da bi imeli še -
ste zadeti Nadzorna C - Nadzor D pošlje ta posebna konstanta se imenuje znak za konec.
Torej, zdaj imamo samo nekaj dinamično dodeljevanje pomnilnika.
>> Torej, če (n + 1> zmogljivosti). Zdaj vam bom razložil n.
N je le, koliko bajtov je trenutno v varovalnem,
Niz, ki ga trenutno gradnjo od uporabnika.
Če imate več znakov v vašem pufru, kot ga imajo zmogljivosti v pufru,
Intuitivno, kaj moramo storiti, je, potem nameniti več zmogljivosti.
Torej bom prelistati čez nekaj aritmetične tukaj in se osredotočiti samo na to funkcijo tukaj.
Veš, kaj je malloc ali pa vsaj splošno znano.
Ugani, kaj realloc ne. >> [Študent] Doda spomin.
To ni čisto dodajanjem pomnilnika. To prerazporeja spomin, kot sledi.
Če je še dovolj prostora ob koncu niza, da bi vam več tega pomnilnika
kot je bilo prvotno vam, potem boste dobili, da dodatnega pomnilnika.
Torej si lahko samo vztrajati dajanje v nizu znakov v back to back to back to back.
Ampak, če to ni tako, ker ste čakali predolgo
in nekaj naključno dobil plopped v spomin tam
vendar pa je dodatno pomnilniško sem, da je v redu.
Realloc bo naredil vse težko delo za vas,
premakniti niz, ki ste jih prebral v tem daleč od tukaj, ga tam doli,
in potem dal nekaj več vzletno-pristajalne steze na tej točki.
>> Torej, zamahnil z roko, naj povem, da to, kar počne GetString
se začenja z malo pomnilnika, morda en znak,
in če uporabnik vnese v dveh znakov, GetString konča kliče realloc in reče:
en znak ne bi bilo dovolj, dajte mi dva znaka.
Potem, če ste prebrali logiki zanke, da se bo torej
Vtipkali v 3 znake, dajte mi zdaj ne pa 2 4 znaki,
potem mi 8, potem mi 16 in 32.
Dejstvo, da sem podvoji zmogljivost vsakič
pomeni, da se buffer ne bo povečevala, zato bo rast izredno hitro.
In morda, kaj je prednost tega?
Zakaj sem podvojitev medpomnilnik
čeprav bi si morali samo še en znak iz tipkovnice?
[Neslišno študentski odziv] >> Kaj je to? >> [Študent] Saj ni treba, da raste tako pogosto.
Točno tako. Saj ni treba, da raste tako pogosto.
In to je samo lepo od vas ste varovanje vaše stave tukaj,
Ideja je, da ne želite, da pokličete realloc veliko, saj kaže, da je počasen.
Vsakič, ko zaprosi za operacijski sistem za spomin,
kot boste kmalu videli v prihodnje opredeli problem, pa kaže, da traja nekaj časa.
Torej čim bolj zmanjšati tako veliko časa, tudi če ste zapravljaš nekaj prostora,
kaže, da je dobra stvar.
>> Ampak, če bomo prebrali v zadnjem delu GetString tukaj -
in spet razumeti vsako posamezno vrstico tu ni tako pomembno danes -
opazili, da je na koncu spet poziva malloc
in razdeli natanko toliko bajtov, kot jo potrebuje za niz
in nato odvrže s klicem na brezplačno preveliko rezervo
če je dobil celo podvojila prevečkrat.
Torej na kratko, to je, kako GetString je delal ves ta čas.
Vse to je pa prebral en znak naenkrat spet in spet in spet,
in vsakič, ko jo potrebuje nekaj dodatnega pomnilnika, da zahteva operacijski sistem za to
s pozivom realloc.
>> Kakšno vprašanje? V redu.
>> Napad.
Zdaj, ko razumemo napotke ali vsaj vedno bolj seznanjeni s kazalci,
kaj menijo, kako je cel svet začne na propad
če se ne znajdete brani pred kontradiktornem uporabnikov,
ljudje, ki poskušajo vdreti v sistem,
ljudje, ki poskušajo ukrasti vaše programske opreme za izogibanje nekaj registracijsko kodo
ki bi jih sicer morali vnesti noter
>> Oglejte si ta primer tukaj, ki je samo C kodo, ki ima funkcijo glavnega na dnu
da pokliče funkcijo foo. In kaj je prehod na foo?
[Študent] en argument. >> [Malan] en argument.
Torej, argv [1], ki pomeni prvo besedo, ki si jo vnesli v ukazni vrstici
Po a.out ali kakorkoli se imenuje program.
Torej foo na vrhu se v char *. Ampak char * je samo, kaj? >> [Študent] niz.
[Malan] niz, tako da ni nič novega.
Ta niz se pa samovoljno imenuje bar.
V skladu s tem tukaj, char c [12], v nekakšno pol-tehnične angleščine, kaj je ta linija dela?
[Študent] array - >> Array? >> [Študent] Liki. >> Glasba.
Daj mi niz 12 znakov. Torej bi temu lahko rekli buffer.
To je strokovno imenujemo c, vendar varovalni pri načrtovanju programov pomeni le kup prostora
da lahko dajo nekaj stvari noter
Potem končno, memcpy smo ne uporabljajo prej, vendar boste verjetno lahko uganiti, kaj počne.
To kopije pomnilnika. Kaj počne?
To očitno kopira bar, vložek, v C, vendar le do dolžine traku.
Ampak tam je napaka tukaj. >> [Študent] Potrebuješ sizeof karakter. >> Redu.
Tehnično, bi morali res strlen (bar) * sizeof (char)). To je pravilno.
Vendar pa v najslabšem primeru v tej zadevi, predpostavimo, da je that -
Ok. Potem je tu še 2 bugs.
Torej, sizeof (char));
Naj bo to malo širše.
Torej, zdaj je še napako, ki je kaj? >> [Neslišno študentski odziv]
Preverite, za kaj? >> [Študent] Preverite NULL.
Mi se na splošno preverjanje za NULL, ker se slabe stvari zgodijo
ko je kazalec NULL, ker boste morda na koncu dogaja tam,
in si ne bi nikoli šli na NULL da ga Dereferenciranje z zvezdicami operaterja.
Torej, to je dobro. In kaj počnemo? Logično je, da je napaka tukaj.
[Študent] Preverite, če je argc> = do 2.
Torej, preverite, ali je argc> = 2. Ok, tako da so tri napake v tem programu tukaj.
Zdaj smo to preverjanje, če si dejansko vnesli v ničemer v argv [1]. Dobro.
Torej, kaj je 3. napako? Ja. >> [Študent] C morda ne bo dovolj velika.
Dobro. Preverili smo en scenarij.
Mi implicitno preveriti ne kopirajte več pomnilnika, kot bi presegla dolžino bar.
Torej, če si niz vnesli, je 10 znakov,
to se pravi samo kopirate 10 znakov. In to je v redu.
Toda kaj, če si jo vnesli v besedo na poziv kot 20 znakov besedo?
To se pravi kopijo 20 znakov iz bara v kaj?
C, sicer znan kot naš buffer, kar pomeni, da si napisal podatke
do 8 bajtov lokacijah, ki ni v vaši lasti,
in ne njihov lastnik v smislu, da jih nikoli ne dodelijo.
Torej, to je tisto, kar je splošno znano kot napad buffer overflow ali napada medpomnilnika.
In to je napad v smislu, da če uporabnik ali program, ki kliče svojo funkcijo
to počne zlonamerno, kaj se dejansko zgodi potem dejansko lahko zelo slabo.
>> Torej, da pogled na te slike tukaj.
Ta slika predstavlja svoj kup pomnilnika.
Spomnimo se, da vsakič, ko pokličete funkcijo boste dobili tale okvir na kupu
in nato drugo in nato še in še.
In sedaj, smo nekako odvzete kot ti pravokotniki
bodisi na ladji ali na zaslonu tukaj.
Ampak, če povečate na eno od teh pravokotnikov, ko pokličete funkcijo foo,
Izkazalo se je, da je to bolj na dimnik znotraj tega okvira v tem pravokotniku
kot samo x in y ter a in b, tako kot nismo govorili o zamenjavi.
Izkazalo se je, da je nekaj nižji ravni podrobnosti, med njimi tudi naslov pošiljatelja.
Tako se izkaže, ko je glavna zahteva foo, glavni obvestiti foo
Kaj je glavni naslov v pomnilniku računalnika
ker v nasprotnem primeru se takoj foo storiti izvršitve, kot v tem primeru tukaj,
ko boste dosegli ta zaprt kodraste oklepaja na koncu foo,
kako za vraga ne ve, kje je foo nadzora programa naj bi šel?
Izkaže se, da je odgovor na to vprašanje je v tem rdečega pravokotnika tukaj.
To predstavlja kazalec, in to je do računalnika za začasno shranjevanje
na tako imenovani dimnik je naslov glavnega tako, da kakor hitro foo storiti izvršitve,
Računalnik ne ve, kje in kaj postavka v glavnem za vrnitev.
Shranjeni okvirja kazalec se nanaša prav na to.
Char * bar tu pomeni kaj?
Zdaj je to modra segmentnih je bla v okvir. Kaj je bar?
Bar je samo argument funkcije foo.
Torej, zdaj smo spet v nekakšno prepoznavno sliko.
Obstaja več stvari in več motenj na zaslonu,
vendar ta svetlo modra odsek samo tisto, kar smo se opira na tabli
nekaj podobnega zamenjave. To je okvir za foo.
In edina stvar, v njej zdaj je bar, ki je ta parameter.
Vendar pa je treba, kaj je v sklad v skladu s tem kodeksom tukaj?
[Študent] char c [12]. >> [Malan] char c [12].
Prav tako bi morali videti 12 kvadratov pomnilnika, dodeljenih spremenljivko imenovano c,
in res imamo, da na zaslonu.
Samem vrhu je c [0], nato pa avtor tega diagrama
ni motilo pripravo vseh trgih, vendar so v resnici obstaja 12
ker če pogledaš na spodnji desni, c [11], če šteješ od 0, je 12. tak bajt.
Ampak tukaj je problem.
V katero smer se c raste?
Nekako od zgoraj navzdol, če se začne na vrhu in raste do dna.
To ne izgleda kot smo odšli sami veliko vzletno-pristajalne steze tu sploh.
Mi smo nekako sebe naslikal v kotu,
in c [11] je prav proti baru, ki je vse do pred Shranjeni Frame kazalcem
, ki je prav proti povratni naslov. Ni več prostora.
Torej, kaj je potem posledice, če zajebeš
in poskusite branje 20 bajtov v 12-Bajt?
Kadar so ti dodatni 8 bajtov šli? >> [Študent] Inside -
Znotraj vsega drugega, nekaj kar je zelo pomembno.
In najbolj pomembna stvar, lahko je rdeča škatla tam Povratni naslov,
Domnevam, da zato, ker pomotoma ali adversarially prepisati tiste 4 bajte
da kazalec naslov, ne samo s smetmi vendar z nekaterimi
se zgodi, da predstavljajo dejanskega naslova v pomnilniku.
Kaj posledice, logično? >> [Študent] Položaj se bo vrnil na drugo mesto.
Točno tako.
Ko se vrne foo in zadetki, ki brace kodrasti, program bo nadaljevanje
ne bo vrnil na glavno, da se dogaja, da se vrnete na kateri koli naslov v tem rdečem polju.
>> V primeru izognilo programske opreme registracije
Kaj pa, če je naslov, ki se je vrnil, je funkcija, ki dobi navadno imenujemo
Ko boste plačali za programsko opremo in vnesejo svojo registracijsko kodo?
Lahko razvrstite trik računalnik v ne dogaja tukaj, temveč gre tukaj.
Ali pa, če si res pameten, lahko nasprotnik dejansko vnesite na tipkovnici, na primer,
Ne dejansko besedo, ne pa 20 znakov, ampak predvidevam mu dejansko vrste v
nekateri znaki, ki predstavljajo kodo.
In to ne bo C kodo, da se dejansko dogaja, da se znaki
ki predstavljajo binarno kodo stroj, 0s in 1s.
Recimo, da si dovolj pameten, da bi to dosegli,
nekako prilepite v GetString hitro nekaj, kar je v bistvu sestavljen koda
in zadnja 4 bajte prepiše tega povratni naslov.
In kaj naj bi to naslov vhod storiti?
To dejansko shrani v tej rdeči pravokotnik naslov prvega bajt pufra.
Torej moraš biti zelo pameten, in to je veliko poskusov in napak za slabe ljudi tam zunaj,
če pa lahko ugotovimo, kako velik je ta varovalni
tako, da je v zadnjih nekaj bajtov na vhodu, ki jih posredujete programa
zgodi, da se enakovredno naslovu začetku vašega pufra, lahko to storite.
Če rečemo, normalno zdravo in \ 0, to je tisto, kar konča v pufru.
Ampak, če smo bolj pameten in se zapolni to rezervo s tem, kar bomo generično klic napad kodo -
AAA, napad, napad, napad - če je to nekaj, kar počne nekaj slabega,
Kaj se zgodi, če si res pameten, lahko to storijo.
V rdečem polju tu je zaporedje številk - 80, C0, 35, 08.
Obvestilo, da se ujema s številko, ki je tu gor.
To je v obratnem vrstnem redu, a več o tem kdaj drugič.
Obvestilo, da je to vaš naslov je bil namerno spremenjen
na enak naslov tukaj, ne naslov glavnega.
Torej, če je slab fant je super pametna, on ali ona se dogaja, da so v tem napadu kodo
nekaj podobnega izbrisati vse datoteke uporabnika ali kopiranje gesel
ali ustvarite uporabniški račun, da bom lahko nato prijavite v - nič.
>> In to je tako nevarnost in moč C.
Ker imate dostop do pomnilnika preko kazalcev
in lahko zato napišete karkoli želite v spomin računalnika,
si lahko računalnik storiti vse, kar hočeš
samo s tem, ko je skok okoli v svojem pomnilnika.
In tako se na ta dan, tako da veliko programov in toliko spletnih strani, ki so ogroženi
omejijo na ljudi, ki izkoriščajo to.
In morda to zdi super prefinjen napad, vendar ne vedno začne na tak način.
Dejstvo je, da tisto, kar slabi ljudje navadno storiti, je,
ali je to program v ukazni vrstici ali program, GUI, ali spletne strani,
ste pravkar začel zagotavljati neumnosti.
Vnesete v res velikem besedo v iskalno polje in pritisnite tipko Enter,
in počakate, da vidim, če je spletna stran sesuje
ali pa čakati, da vidim, če je program kaže nekaj napaki
ker če imate srečo, kot slab človek in si zagotoviti nekaj norega prispevek
da zruši program, potem to pomeni programer ni predvidel vašo slabo vedenje,
kar pomeni, da lahko verjetno z dovolj truda, dovolj poskusov in napak,
ugotoviti, kako plače bolj natančen napad.
Torej toliko del varnosti ni samo preprečevanje te napade v celoti
ampak jih zazna in dejansko si ogleduje dnevniki
in videli, kaj so ljudje nori vhodi vnesli v vašo spletno stran,
kaj iskalni pojmi so ljudje vnesli v vašo spletno stran
v upanju, poplavljenih nekaj pomnilnika.
In to vse izvira na preprostih osnove, kar je matrika
in kaj to pomeni za dodeljevanje in uporabo spomin.
>> V povezavi s tem pa tudi to.
Naj samo pogled notranjost trdega diska še enkrat.
Spomnite iz tednu ali dveh nazaj, ko povlečete datoteke v koš ali koša,
kaj se zgodi? >> [Študent] Nič. >> Popolnoma nič, kajne?
Sčasoma, če zmanjkovati prostora na disku,
Windows ali Mac OS bo začelo brisanje datotek za vas.
Ampak, če vlečete nekaj tam, da sploh ni varno.
Vse vaš sostanovalec ali prijatelja ali družinskega člana mora storiti, je dvojni klik, in voila,
tam je vse skicirana datoteke, ki jih poskušali izbrisati.
Večina od nas vsaj vedeli, da imate na desni klik ali klik Nadzor
in prazne smeti ali kaj podobnega.
Toda tudi potem to ni čisto trik
ker tisto, kar se zgodi, ko imate datoteko na trdem disku
, ki predstavlja nekaj Wordov dokument ali nekaj JPEG, in to je vaš trdi disk,
in recimo, da to pomeni, da je tukaj IVer datoteko
in je bila sestavljena iz cel kup 0s in 1s.
Kaj se zgodi, če ne boste le povlecite datoteko v smeti, ali pa lahko Koš
ampak jo izpraznite? Nekako nič.
To ni popolnoma nič zdaj.
Zdaj je to samo zato, ker nič ne zgodi nekaj malega v obliki te tabele.
Torej je neke vrste podatkovne baze ali tabele znotraj pomnilnika računalnika
da je v bistvu en stolpec za datoteke imen in en stolpec za datoteke 'mesto,
če bi bilo to mesto 123, samo naključno število.
Tako bi imeli nekaj podobnega x.jpeg in lokacijo 123.
Kaj se zgodi potem, ko ste dejansko izprazniti smeti?
Ta izgine.
Toda kaj ne izgine, je 0 in 1s.
>> Torej, kaj je potem povezava pset4?
No, z pset4, samo zato, ker smo pomotoma izbrisal Compact Flash kartice
, ki je imel vse od teh fotografij ali pa samo zato, ker je zaradi smole postal poškodovan
ne pomeni, da 0s in 1s niso vedno tam.
Morda so nekateri od njih izgubljena zaradi dobil nekaj pokvarjenega
v smislu, da je postala del 0s 1s in 0s 1s postal.
Slabe stvari se lahko zgodi zaradi Otroški voziček programske opreme ali napako strojne opreme.
Toda mnogi od teh bitov, morda celo 100% od njih so še vedno tam.
To je samo, da je računalnik ali fotoaparat ne ve, kje JPEG1 vpis
in če JPEG2 začelo.
Ampak, če ste, programer, da se z malo zdrava pamet, če ti JPEG so
ali kaj so izgledali tako da lahko analizira 0s in 1s in reči JPEG, JPEG,
lahko napišete program z bistvu le za ali while zanko
da povrne vsak izmed teh datotek.
Torej nauk pa je, da začnete varno brisanje datotek
če želite, da bi se temu izognili v celoti. Da.
>> [Študent] Kako to, da piše na računalniku
da imate več pomnilnika, kot si prej?
Imajo več pomnilnika, kot si prej - >> [študentski] Več prostega pomnilnika.
Oh. Dobro vprašanje.
Torej, zakaj potem po praznjenju koša ne računalnik vam povem,
da imate več prostora, kot si prej?
Na kratko, ker laže.
Bolj tehnično, imate več prostora, ker zdaj ste rekli
lahko dajo druge stvari, kjer je datoteka nekoč bil.
Toda to ne pomeni bitov odhajam
in da ne pomeni bitov se spremeni v vseh 0s, na primer,
za vašo zaščito.
Torej v nasprotju s tem, če si varno brisanje datotek ali fizično uničiti napravo
je to res edini način, včasih okoli tega.
>> Torej, zakaj ne gremo na ta pol strašno note, mi pa vas bomo videli v ponedeljek.
[Aplavz]
>> [CS50.TV]