[Powered by Google Translate] [Uge 5]
[David J. Malan - Harvard University]
[Dette er CS50. - CS50.TV]
>> Det er CS50, Uge 5.
I dag og i denne uge introducerer vi en lille smule af verden retsvidenskab
i forbindelse med Problem Set 4.
I dag vil være en forkortet foredrag, fordi der er en særlig begivenhed i her bagefter.
Så vil vi tage et kig og drille både elever og forældre i dag
med nogle af de ting, der er i horisonten.
>> Blandt dem, som mandag vil du have nogle flere klassekammerater.
EDX, Harvard og MIT nye online initiativ for OpenCourseWare og mere,
lancerer på Harvards campus på mandag, hvilket betyder kommet mandag
vil du have, som fra sidste optælling, 86.000 ekstra klassekammerater
der vil følge sammen med CS50 forelæsninger og sektioner
og walkthroughs og problemstillinger sæt.
Og som en del af dette, vil du blive medlemmer af det konstituerende klasse af CS50 og nu CS50x.
Som en del af dette nu, indse, at der vil være nogle upsides så godt.
For at blive klar til dette, for det massive antal af studerende,
er det tilstrækkeligt at sige, at selvom vi har 108 TF'er og CA,
det er ikke helt den bedste elev-lærer ratio, når vi rammer 80.000 af de studerende.
Vi vil ikke være sortering så mange problem sætter manuelt,
så introduceret i denne uge i det problem sæt vil være CS50 Check,
der vil være en kommando-linje værktøj i apparatet
at du får, når du opdatere det senere i denne weekend.
Du vil være i stand til at køre en kommando, check50, på din egen Pset,
og du får øjeblikkelig feedback om, hvorvidt dit program er rigtig eller forkert
ifølge forskellige design specifikationer, som vi har leveret.
Mere om det i det problem indstillede specifikation.
De CS50x klassekammerater vil bruge det så godt.
>> Problem sæt 4 handler om retsvidenskab,
og denne Pset var virkelig inspireret af nogle virkelige liv stuff
hvorved da jeg var i forskerskolen jeg interneret i et stykke tid
med Middlesex Amts District Attorney kontor laver retsmedicinsk arbejde
med deres bly retsmedicinske efterforsker.
Hvad dette beløb sig til, da jeg tror, ​​jeg nævnte et par uger tidligere,
er massen State Police eller andre ville komme i,
de ville slippe væk fra ting som harddiske og cd'er og disketter og lignende,
og derefter målet for retsvidenskab kontor var at fastslå
om der var eller ikke var tegn på en slags.
Det var den særlige Undersøgelser Unit, så det var white collar kriminalitet.
Det var mere bekymrende slags kriminalitet, noget der involverer en form for digitale medier.
Det viser sig, at ikke så mange mennesker skriver en e-mail at sige, "jeg gjorde det."
Så ofte har disse retsmedicinske søgninger ikke slå op så meget frugt,
men nogle gange folk ville skrive sådanne e-mails.
Så nogle gange, blev indsatsen belønnet.
>> Men at lede op til dette retsmedicinsk Pset, vil vi introducere i pset4 en smule af grafik.
Du har sandsynligvis tage disse ting for givet - JPEG, GIF og lignende - i disse dage.
Men hvis du virkelig tænker over det, et billede, ligesom Rob ansigt,
kunne modelleres som en sekvens af punkter eller pixels.
I tilfælde af Rob ansigt, er der alle mulige farver,
og vi begyndte at se de enkelte prikker, ellers kendt som pixels,
når vi begyndte at zoome ind
Men hvis vi forenkler verden lidt og bare sige, at dette her er Rob i sort og hvid,
at repræsentere sort og hvid, kan vi bare bruge binær.
Og hvis vi kommer til at bruge binær, 1 eller 0, kan vi udtrykke dette samme billede
af Robs smilende ansigt med dette mønster af bits.
11000011 repræsenterer hvid, hvid, sort, sort, sort, sort, hvid, hvid.
Og så det er ikke et stort spring derefter at begynde at tale om farverige fotografier,
ting, som du ville se på Facebook eller tage med et digitalt kamera.
Men netop når det kommer til farver, du har brug for flere bits.
Og ganske almindeligt i verden af ​​billeder er at bruge ikke 1-bit farver,
som dette antyder, men 24-bit farver, hvor du faktisk få millioner af farver.
Således som det er tilfældet, når vi zoomet ind på Rob øje,
det var helst antal millioner af forskellige farverige muligheder.
Så vi vil indføre dette i Problem sæt 4 samt i walkthrough,
som vil være i dag kl 3:30 i stedet for de sædvanlige 2:30 på grund af fredagens foredrag her.
Men video vil være online som sædvanlig i morgen.
>> Vi vil også introducere dig til et andet filformat.
Dette er bevidst ment til at se skræmmende i starten,
men dette er blot nogle dokumentation for en C struct.
Det viser sig, at Microsoft år siden hjalp popularisere dette format
kaldet bitmap filformat, bmp, og dette var en super enkel, farverig grafisk filformat
der blev brugt i temmelig lang tid og til tider stadig for wallpapers på desktops.
Hvis du tænker tilbage til Windows XP og de bølgende bakker og den blå himmel,
det var typisk et BMP eller bitmapbillede.
Bitmaps er sjovt for os, fordi de har en smule mere kompliceret.
Det er ikke helt så simpelt som dette net af 0'er og 1'ere.
I stedet har du ting som en header i starten af ​​en fil.
Så med andre ord, inde i en. Bmp fil er en hel bunke af 0'er og 1-taller,
men der er nogle ekstra 0'er og 1'ere derinde.
Og det viser sig, at det vi har nok taget for givet i årevis -
filformater som. doc eller. xls eller. mp3,. mp4, uanset hvilke filformater
at du er fortrolig med - hvad betyder det overhovedet sige at være et filformat,
fordi det i sidste ende alle disse filer bruger vi har bare 0'er og 1'ere.
Og måske de 0'er og 1-taller repræsenterer ABC gennem ASCII eller lignende,
men i slutningen af ​​dagen, er det stadig bare 0'er og 1'ere.
Så mennesker bare lejlighedsvis beslutte at opfinde et nyt filformat
hvor de standardisere hvilke mønstre af bits rent faktisk vil betyde.
Og i dette tilfælde her, de folk, der har designet bitmap filformat
sagde, at i det første byte i en bitmap-fil, som angivet ved offset 0 dér,
Der vil være nogle kryptisk navngivne variabel kaldet bfType,
der bare står for bitmap filtype, hvilken type bitmapfil er dette.
Du kan udlede måske fra den anden række, at offset 2, byte nummer 2,
har et mønster af 0'er og 1-taller, der repræsenterer hvad? Størrelsen af ​​noget.
Og det går videre derfra.
Så i Problem sæt 4, vil du blive ført gennem nogle af disse ting.
Vi vil ikke ende op bekymre sig om dem alle.
Men bemærk det begynder at blive interessant omkring byte 54: rgbtBlue, grøn og rød.
Hvis du nogensinde har hørt akronymet RGB - rød, grøn, blå - det er en henvisning til, at
fordi det viser sig, du kan male alle regnbuens farver
med en kombination af rød og blå og grøn.
Og i virkeligheden, kan forældre i værelset minde om nogle af de tidligste projektorer.
Disse dage, du bare se en lys der kommer ud af en linse,
men tilbage i dag du havde den røde linse, den blå linse, og den grønne linse,
og sammen med henblik på en skærm og dannede et farverigt billede.
Og ganske ofte, vil mellemledere skoler og gymnasier har disse linser
nogensinde så lidt skævt, så du var slags at se dobbelt eller tredobbelt billeder.
Men det var idéen. Du havde rødt og grønt og blåt lys maler et billede.
Og det samme princip bruges i computere.
>> Så blandt de udfordringer derefter for dig i Problem sæt 4 kommer til at være et par ting.
Den ene er rent faktisk at ændre størrelsen på et billede, for at tage i et mønster af 0'er og 1-taller,
finde ud af hvilken bidder af 0'er og 1-taller repræsenterer hvad i en struktur som denne,
og derefter finde ud af at kopiere de pixels - de røde, blues, De Grønne -
inde, så at når et billede ser sådan ud i første omgang,
det kunne se sådan ud i stedet efter det.
Blandt de andre udfordringer også vil være at du vil blive udleveret en retsmedicinsk billede
en aktuel fil fra et digitalt kamera.
Og på det kamera, engang var en hel bunke af fotos.
Problemet er, at vi ved et uheld slettet eller havde det billede ødelagt eller anden måde.
Dårlige ting sker med digitale kameraer.
Og så vi hurtigt kopieret alle de 0'er og 1-taller ud af kortet for dig,
reddede dem alle i én stor fil, og så vil vi udlevere dem til dig i Problem Set 4
så du kan skrive et program i C med til at inddrive alle disse JPEG, ideelt.
Og det viser sig, at JPEG, selvom de er lidt af en kompleks filformat -
de er meget mere kompleks end denne smilende ansigt her -
Det viser sig, at hver JPEG starter med det samme mønstre af 0'er og 1'ere.
Så bruger i sidste ende en while-løkke eller en for-løkke eller lignende,
du kan gentage over alle de 0'er og 1-taller i denne retsmedicinsk billede,
og hver gang du ser det specielle mønster, der er defineret i det problem indstillede specifikation,
du kan påtage her er, med meget stor sandsynlighed, starten på en JPEG.
Og så snart du finder det samme mønster nogle antallet af bytes
eller kilobyte eller megabyte senere, kan du antage her er en anden JPEG,
fotoet jeg tog efter det første.
Lad mig stoppe læse, at første fil, begynder at skrive denne nye,
og outputtet af dit program for pset4 vil være så mange som 50 JPEG.
Og hvis det ikke er 50 JPEG-billeder, du har lidt af en løkke.
Hvis du har et uendeligt antal JPEG, har du en uendelig løkke.
Så det vil også være en ganske almindelig sag.
Så det er hvad der er i horisonten.
>> Quiz 0 bag os, indser per min e-mail, der uvægerligt er der folk, der er både glade,
slags neutral, og trist omkring quiz 0 tid.
Og er du nå ud til mig, hovedet TF Zamyla, din egen TF,
eller et af de nøglecentre, som du ved, hvis du gerne vil diskutere, hvordan det gik.
>> Så for at imponere forældrene her i rummet, hvad er det CS50 biblioteket?
[Latter] Godt arbejde.
Hvad er det CS50 biblioteket? Yeah. >> [Studerende] Det er en præ-skrevet sæt kode [uhørlig]
Okay, godt.
Det er en præ-skrevet sæt kode, som vi personalet skrev, vi leverer til dig,
der giver nogle fælles funktionalitet,
Ting som får mig en streng, få mig en int - alle de funktioner, der er angivet her.
>> Start nu, begynder vi virkelig at tage disse støttehjul off.
Vi vil begynde at tage væk en streng fra dig,
som tilbagekaldelse var blot et synonym for, hvad egentlige datatype? >> [Flere studerende] Char *.
Char *. For forældre, var der formentlig [gør susen lyd]. Det er godt.
Char * vi vil begynde at se på skærmen, desto mere som vi fjerner strengen fra vores ordforråd,
i hvert fald når det kommer til faktisk at skrive kode.
Ligeledes vil vi stoppe med at bruge nogle af disse funktioner så meget
fordi vores programmer kommer til at blive mere sofistikerede.
Snarere end blot at skrive programmer, der sidder der med en prompt blinker,
venter for brugeren at skrive noget ind, vil du få dine input fra andre steder.
For eksempel, vil du få dem fra en række af bits på den lokale harddisk.
Du vil i stedet få dem i fremtiden fra en netværksforbindelse,
nogle hjemmeside eller andet sted.
>> Så lad os skrælle dette lag for første gang og trække op CS50 Appliance
og denne fil kaldet cs50.h, som du har været # herunder for uger,
men lad os nu se, hvad der er inde i dette.
Den øverste del af filen i blå er bare en hel masse kommentarer:
oplysninger om garanti og licensering.
Det er en slags fælles paradigme i software
fordi en masse software i disse dage er, hvad der kaldes open source,
hvilket betyder, at nogen har skrevet koden og gjorde det frit tilgængelige
ikke bare at køre og at bruge, men rent faktisk at læse og ændre og integrere i dit eget arbejde.
Så det er, hvad du har brugt, open source software, omend i en meget lille form.
Hvis jeg rulle ned forbi de bemærkninger, dog vil vi begynde at se nogle mere velkendte ting.
Meddelelse øverst her, at cs50.h-fil indeholder en hel masse header-filer.
De fleste af disse har vi ikke set før, men man kender.
Hvilke af disse har vi set, om end kortvarigt, indtil videre? >> [Studerende] Standard bibliotek.
Ja, standard bibliotek. stdlib.h har malloc.
Når vi begyndte at tale om dynamisk allokering af hukommelse,
som vi vil komme tilbage til i næste uge så godt, vi begyndte herunder at fil.
Det viser sig, at bool og sandt og falsk faktisk ikke findes i C per se
medmindre du medtage denne fil her.
Vi har for uger blevet inklusive stdbool.h
så du kan bruge begrebet en bool, sand eller falsk.
Uden dette, ville du nødt til at sortere i fake det og bruge en int
og bare vilkårligt antage, at 0 er falsk og 1 er sandt.
Hvis vi rulle ned yderligere, her er vores definition af en streng.
Det viser sig, som vi har sagt før, at når denne stjerne er ikke rigtig noget.
Du kan endda have plads hele vejen rundt.
Vi dette semester har været fremme det som dette at gøre det klart,
at stjernen har at gøre med den type,
men indse lige så almindeligt, hvis ikke lidt mere almindeligt,
er at sætte det der, men funktionelt er det samme.
Men nu, hvis vi læser yderligere ned, lad os tage et kig på GetInt
fordi vi brugte den måske først, før noget andet i dette semester.
Her er GetInt. Dette er, hvad? >> [Studerende] En prototype. >> Dette er blot en prototype.
Ofte har vi lagt prototyper på toppen af ​​vores. C-filer,
men du kan også sætte prototyper i header-filer,. H filer, som denne her
så når du skriver nogle funktioner, som du ønsker andre mennesker til at kunne bruge,
hvilket netop er tilfældet med CS50 bibliotek,
du ikke kun implementere dine funktioner i noget lignende cs50.c,
man også sætte prototyperne ikke øverst i denne fil, men øverst på en header-fil.
Så at header filen er hvad venner og kolleger omfatter
med # include i deres egen kode.
Så al den tid, du har, herunder alle disse prototyper,
effektivt på toppen af ​​din fil, men ved hjælp af denne # include mekanisme,
som i det væsentlige kopier og pastaer denne fil ind i din egen.
Her er nogle temmelig detaljeret dokumentation.
Vi har stort set taget for givet, at GetInt får en int,
men det viser sig der er nogle hjørne tilfælde.
Hvad hvis brugeren skriver i et nummer, der er alt for stor, en quintillion,
der bare ikke kan passe inde i en int? Hvad er den forventede adfærd?
Ideelt set er det forudsigeligt.
Så i dette tilfælde, hvis du rent faktisk læser det med småt,
du faktisk se, at hvis den linje ikke kan læses, dette afkast INT_MAX.
Vi har aldrig talt om dette, men baseret på dens kapitalisering, hvad er det sandsynligvis?
[Studerende] En konstant. >> Det er en konstant.
Det er nogle særlige konstant det er nok erklæret i en af ​​disse header-filer
der er højere op i filen, og INT_MAX er nok noget i retning af 2 milliarder groft,
Ideen er, at fordi vi er nødt til en eller anden måde betyde, at noget gik galt,
vi, ja, have 4 milliarder numre til vores rådighed: -2 mia op til 2 mia give eller tage.
Nå, hvad er almindelig i programmering er du stjæler bare en af ​​disse tal,
måske 0, måske 2 mia måske -2.000 millioner,
så du bruger en af ​​dine mulige værdier, så du kan forpligte sig til verden
at hvis noget går galt, vil jeg vende tilbage denne super store værdi.
Men du ikke ønsker, at brugeren skrive noget kryptisk ligesom 234 ..., en virkelig store tal.
Du generalisere det i stedet som en konstant.
Så virkelig, hvis du var anal de sidste par uger, hver gang du kaldte GetInt,
du skulle have været til kontrol med en hvis betingelse gjorde brugeren type i INT_MAX,
eller mere specifikt, gjorde GetInt tilbage INT_MAX, for hvis det gjorde,
der rent faktisk betyder, at de ikke skrive det. Noget gik galt i denne sag.
Så dette er hvad der normalt betegnes som en sentinel værdi, hvilket betyder bare speciel.
>> Lad os nu vende ind. C. filen.
Den C-fil har eksisteret i apparatet i nogen tid.
Og i virkeligheden har apparatet det pre-kompileret for dig ind i den ting vi kaldte objekt kode,
men det bare ikke noget for dig, hvor det er fordi systemet kender
i dette tilfælde, hvor det er: apparatet.
Lad os rulle ned nu for at GetInt og se, hvordan GetInt har arbejdet hele tiden.
Her har vi lignende kommentarer fra før.
Lad mig zoome ind på bare koden portion.
Og hvad vi har for GetInt er følgende.
Det tager ingen input.
Den returnerer en int, mens (sand), så vi har en bevidst uendelig løkke,
men formentlig vil vi bryde ud af dette på en eller vende tilbage fra inden for dette.
>> Lad os se hvordan det virker.
Vi synes at benytte GetString i denne første linje inde i løkken, 166.
Dette er nu god praksis, fordi under hvilke omstændigheder kunne GetString returnere
den særlige søgeord NULL? >> [Studerende] Hvis noget går galt.
Hvis noget går galt. Og hvad der kunne gå galt, når du kalder noget GetString?
Yeah. >> [Studerende] malloc undlader at give den de int'er.
Yeah. Måske malloc mislykkes.
Et eller andet sted under hætten, er GetString kalder malloc, der allokerer hukommelse,
hvilket lader computeren butikken alle de tegn
at brugeren skriver ind i tastaturet.
Og formoder, at brugeren havde en hel masse fritid og skrevet mere, for eksempel,
end 2 milliarder tegn i, flere tegn end computeren har endda RAM.
GetString skal være i stand til at betyde, at for dig.
Selv om dette er en super, super ualmindeligt hjørne sag,
Det skal en eller anden måde kunne håndtere dette,
og så GetString, hvis vi gik tilbage og læse den tilhørende dokumentation, faktisk tilbage NULL.
Så nu hvis GetString fejler ved at returnere NULL er GetInt kommer til at mislykkes ved at returnere INT_MAX
ligesom en skildvagt. Disse er blot menneskelige konventioner.
Den eneste måde du ville vide dette er tilfældet, er ved at læse dokumentationen.
>> Lad os rulle ned til, hvor int faktisk fået.
Hvis jeg rulle ned lidt længere, på linje 170, har vi en kommentar over disse linjer.
Vi erklærer i 172 en int, n, og en char, c, og så er denne nye funktion,
som nogle af jer har snublet over før, sscanf.
Det står for streng scanf.
Med andre ord, giv mig en streng, og jeg vil scanne det for stykker af information af interesse.
Hvad betyder det?
Antag at jeg skriver i, bogstaveligt talt, 123 på tastaturet og derefter trykke Enter.
Hvad er datatypen på 123, når de returneres ved GetString? >> [Studerende] String.
Det er naturligvis en streng, ikke? Jeg fik en streng.
Så 123 er virkelig, citat-citat slut, 123 med \ 0 ved udgangen af ​​det.
Det er ikke en int. Det er ikke et tal. Det ligner et nummer, men det er faktisk ikke.
Så hvad gør GetInt nødt til at gøre?
Det har at scanne denne streng venstre til højre - 123 \ 0 - og på en måde konvertere til en egentlig heltal.
Du kan finde ud af at gøre dette.
Hvis du tænker tilbage til pset2, du formentlig fik en lille komfortable med Cæsar
eller Vigenere, så du kan gentage over en streng, kan du konvertere tegn til int'er.
Men heck, det er en hel masse arbejde.
Hvorfor ikke kalde en funktion som sscanf der gør det for dig?
Så sscanf forventer et argument - i dette tilfælde kaldet linje, der er en streng.
Du derefter angive citater, meget lig printf, hvad du forventer at se i denne streng.
Og hvad jeg siger her er jeg forventer at se et decimaltal og måske et tegn.
Og vi vil se, hvorfor dette er tilfældet i bare et øjeblik.
Og det viser sig, at denne notation er nu minder om ting, vi begyndte at snakke om
lidt over en uge siden.
Hvad er & n og & c gør for os her? >> [Elev] Adresse på n og adresse på ca.
Yeah. Det giver mig adressen på n og adresse på ca. Hvorfor er det vigtigt?
Du ved, at med funktioner i C, kan du altid returnere en værdi eller ingen værdi overhovedet.
Du kan returnere en int, en streng, en float, en char, uanset hvad, eller du kan returnere ugyldige,
men du kan kun returnere én ting maksimalt.
Men her ønsker vi sscanf at returnere mig måske en int, et decimaltal,
og også en char, og jeg vil forklare hvorfor den char i et øjeblik.
Du faktisk ønsker sscanf at returnere to ting, men det er bare ikke muligt i C.
Du kan omgå det ved at passere i to adresser
fordi så snart du afleverer en funktion to adresser,
hvad kan denne funktion gøre med dem? >> [Studerende] Skriv til disse adresser.
Det kan skrive til disse adresser.
Du kan bruge stjerne operation og gå der, til hver af disse adresser.
Det er en slags denne bagdøren mekanisme, men meget almindeligt for at ændre værdierne af variabler
mere end blot ét sted - i dette tilfælde to.
Bemærk nu Jeg tjekker for == 1 og derefter returnere n hvis det betyder i virkeligheden evaluere til true.
Så hvad sker der? Teknisk set alt, hvad vi virkelig ønsker at ske i GetInt er dette.
Vi ønsker at parse, så at sige, vi ønsker at læse strengen - quote-citat slut 123 -
og hvis det ser ud som om der er et tal der, hvad vi fortæller sscanf at gøre
sættes, at antallet - 123 - i denne variabel n for mig.
Så hvorfor så havde jeg faktisk har det så godt?
Hvilken rolle sscanf siger du måske også få et tegn her?
[Uhørlig student svar] >> et komma faktisk kunne arbejde.
Lad os holde det tænkte sig om et øjeblik. Hvad ellers?
[Studerende] Det kunne være NULL. >> God tanke. Det kunne være den null-tegn.
Det er faktisk ikke i dette tilfælde. Yeah. >> [Studerende] ASCII.
ASCII. Eller lad mig generalisere yderligere.
Den% c der er bare for fejlkontrol.
Vi ønsker ikke, at der er et tegn efter tallet,
men hvad dette giver mig mulighed for at gøre, er følgende.
Det viser sig, at sscanf foruden lagring af værdier i n og c i dette eksempel her,
hvad den også gør, er det returnerer antallet af variabler det sætte værdier i.
Så hvis du kun skrive i 123, er det kun% d kommer til at matche,
og kun n bliver gemt med en værdi som 123,
og intet bliver sat i ca.
C er stadig en garbage værdi, så at sige -
skrald fordi det er aldrig blevet initialiseret til en vis værdi.
Så i dette tilfælde returnerer sscanf 1, fordi jeg befolkede 1 i disse pejlemærker,
i hvilket tilfælde store, har jeg en int, så jeg frigøre den linje for at frigøre hukommelse
at GetString faktisk allokeret, og så vender jeg tilbage n,
ellers hvis du nogensinde spekuleret over, hvor der Retry erklæring kommer fra, det kommer fra lige her.
Så hvis derimod skriver jeg i 123foo - bare nogle tilfældige sekvens af tekst -
sscanf vil se, antal, nummer, f,
og det kommer til at sætte 123 i n; det kommer til at sætte f i c og derefter vende tilbage 2.
Så vi har, bare ved hjælp af grundlæggende definition af sscanf adfærd, en meget enkel måde -
godt, kompleks ved første øjekast, men ved slutningen af ​​dagen forholdsvis enkel mekanisme -
at sige er der en int og hvis ja, er at det eneste, jeg fandt?
Og mellemrum her er bevidst.
Hvis du læser dokumentationen til sscanf, det fortæller dig, at hvis du inkluderer et stykke af blanke tegn
ved begyndelsen eller slutningen også sscanf kan brugeren, uanset årsagen,
at ramme space bar 123, og det vil være legitimt.
Du vil ikke råbe på brugeren, bare fordi de ramte mellemrumstasten
i starten eller slutningen, er der bare lidt mere brugervenlig.
>> Eventuelle spørgsmål derefter på GetInt? Yeah. >> [Studerende] Hvad hvis du bare sætte i en char?
Godt spørgsmål.
Hvad hvis du lige har skrevet i en char som f og tryk på Enter uden nogensinde at skrive 123?
Hvad tror du opførslen af ​​denne linje kode vil så være?
[Uhørlig student svar]
Ja, så sscanf kan dække det også fordi der i så fald er det ikke kommer til at fylde N eller C.
Det kommer til stedet returnere 0, i hvilket tilfælde jeg også at fange dette scenario
fordi den forventede værdi jeg ønsker, er 1.
Jeg ønsker kun én og kun én ting, der skal besættes. Godt spørgsmål.
>> Andre? Ok.
>> Lad os ikke gå igennem alle de funktioner i her,
men den ene, der synes at være måske af resterende renter er GetString
fordi det viser sig, at GetFloat, GetInt, GetDouble, GetLongLong
alle punt en masse af deres funktionalitet til GetString.
Så lad os tage et kig på, hvordan han er implementeret her.
Denne ene ser lidt kompliceret, men det bruger de samme fundamentale
at vi begyndte at tale om i sidste uge.
I GetString tager som noget argument som pr tomrum op her
og det returnerer en streng, jeg åbenbart er om en streng kaldet buffer.
Jeg ved ikke rigtig, hvad der kommer til at blive brugt til endnu, men vi vil se.
Det ligner kapacitet er som standard 0.
Ikke helt sikker på hvor dette foregår, ikke sikker på hvad n vil blive brugt til endnu,
men nu er det at blive lidt mere interessant.
I tråd 243, erklære vi en int, ca.
Det er en slags dum detalje.
En char er 8 bit, og 8 bit kan gemme hvor mange forskellige værdier? >> [Studerende] 256. >> 256.
Problemet er, hvis du ønsker at have 256 forskellige ASCII-tegn, som der er
hvis du tænker tilbage - og det er ikke noget at huske.
Men hvis du tænker tilbage på den store ASCII diagram havde vi uger siden,
Der var i dette tilfælde 128 eller 256 ASCII-tegn.
Vi brugte alle de mønstre af 0'er og 1'ere op.
Det er et problem, hvis du ønsker at være i stand til at opdage en fejl
fordi hvis du allerede bruger 256 værdier for dine karakterer,
du ikke rigtig planlægge fordi nu har du ingen måde at sige,
dette er ikke en legit karakter, er dette en fejlagtig meddelelse.
Så hvad verden gør, er de bruger den næststørste værdi, noget i retning af en int,
så du har et vanvittigt antal bit, 32, for 4 milliarder mulige værdier
så du bare kan ende med at bruge det væsentlige 257 af dem,
1, som har en særlig betydning som en fejl.
>> Så lad os se hvordan det virker.
I tråd 246, har jeg denne store while-løkke, der ringer fgetc,
f mening fil, så getc, og derefter stdin.
Det viser sig, det er bare den mere præcis måde at sige læse input fra tastaturet.
Standard input betyder tastatur, standard output betyder skærm,
og standardfejlen, som vi vil se i pset4 betyder skærmen
men en særlig del af skærmen, så det er ikke smelter sammen med den faktiske produktion
at du ville udskrive. Men mere om det i fremtiden.
Så fgetc betyder blot læse et tegn fra tastaturet og gemme det, hvor?
Opbevar det i ca.
Og så tjek - så jeg bare bruge nogle Boolean konjunktioner her -
kontrollere, at det ikke lige - \ n, så brugeren har ramt Enter, vi ønsker at stoppe på det tidspunkt,
slutningen af ​​løkken - og vi ønsker også at kontrollere for den særlige konstant EOF,
som hvis du kender eller gætte, hvad det står for? >> [Elev] Slut på fil. >> End of file.
Det er lidt meningsløst, fordi hvis jeg skriver på tastaturet,
der er virkelig ingen fil involveret i dette,
men dette er blot sortere af artsbetegnelsen bruges til at betyde
at intet andet kommer fra de menneskelige fingre.
EOF - slutningen af ​​filen.
Som en sidebemærkning, hvis du nogensinde har ramt Kontrol D på dit tastatur, ikke at du ville have endnu -
du har ramt Kontrol C - Control D sender denne særlige konstant kaldet EOF.
Så nu har vi bare have nogle dynamisk allokering af hukommelse.
>> Så hvis (n + 1> kapacitet). Nu vil jeg forklare n.
N er bare hvor mange bytes er i øjeblikket i bufferen,
den streng, du i øjeblikket er ved at bygge op fra brugeren.
Hvis du har flere karakterer i din buffer, end du har kapacitet i bufferen,
intuitivt, hvad vi skal gøre derefter allokere mere kapacitet.
Så jeg har tænkt mig at skimme over nogle af de aritmetiske her og kun fokusere på denne funktion her.
Du ved, hvad malloc er eller i det mindste generelt velkendt.
Tag et gæt hvad realloc gør. >> [Studerende] Tilføjer hukommelse.
Det er ikke helt tilføjelse af hukommelse. Det omfordeler hukommelse som følger.
Hvis der stadig er plads i slutningen af ​​strengen for at give dig mere af denne hukommelse
end det oprindeligt giver dig, så vil du få det ekstra hukommelse.
Så du kan bare holde lægge strengens tegn tilbage til back to back to back.
Men hvis det ikke er tilfældet, fordi du ventede for længe
og noget tilfældigt fik plopped i hukommelsen der
men der er ekstra hukommelse hernede, det er okay.
Realloc vil gøre alt det tunge arbejde for dig,
flytte den streng, du har læst i hidtil herfra, sætte den ned der,
og derefter give dig nogle flere landingsbane på dette punkt.
>> Så med en bølge af hånden, lad mig sige, hvad GetString gør
Det er begyndt med en lille puffer, måske en enkelt karakter,
og hvis brugeren skriver i to tegn, ender GetString op at ringe realloc og siger
et tegn var ikke nok, giv mig to tegn.
Så hvis du læser gennem logikken i løkken, det vil sige
brugeren har indtastet i 3 tegn, giv mig nu ikke 2, men 4 tegn,
derefter give mig 8, så giv mig 16 og 32.
Det faktum, at jeg fordobler kapaciteten hver gang
betyder, at bufferen ikke kommer til at vokse langsomt, går det at vokse super hurtigt.
Og hvad kunne være den fordel det?
Hvorfor er jeg en fordobling af størrelsen af ​​bufferen
selvom brugeren måske bare brug for en ekstra tegn fra tastaturet?
[Uhørlig student svar] >> Hvad er det? >> [Studerende] Du behøver ikke at dyrke det så ofte.
Præcis. Du behøver ikke at dyrke det så ofte.
Og det er lige slags du afdækning dine indsatser her,
Ideen er, at du ikke ønsker at kalde realloc et parti, fordi det har en tendens til at være langsom.
Hver gang du beder operativsystemet for hukommelse,
som du snart vil se i et fremtidigt problem sæt, det har en tendens til at tage lidt tid.
Så minimere den mængde af tid, selvom du spilder noget plads,
tendens til at være en god ting.
>> Men hvis vi læser igennem den sidste del af GetString her -
og igen forstå hver enkelt linie her er ikke så vigtigt i dag -
bemærke, at det i sidste ende kalder malloc igen
og det afsætter lige så mange bytes som den har brug for streng
og derefter smider ved at ringe gratis til alt for store buffer
hvis det virkelig blev fordoblet for mange gange.
Så kort sagt, er, at hvordan GetString har arbejdet hele tiden.
Alt det gør læses ét tegn ad gangen igen og igen og igen,
og hver gang den har brug for nogle ekstra hukommelse, spørger operativsystemet for det
ved at kalde realloc.
>> Eventuelle spørgsmål? Ok.
>> Et angreb.
Nu, hvor vi forstår pegepinde eller i det mindste bliver stadig mere fortrolige med pegepinde,
lad os overveje, hvordan hele verden begynder at kollapse
hvis du ikke helt forsvare sig mod kontradiktorisk brugere,
mennesker, der forsøger at hacke ind i dit system,
mennesker, der forsøger at stjæle din software ved at omgå nogle registreringskode
som de ellers måtte have til at skrive i.
>> Tag et kig på dette eksempel her, som er lige C-kode, der har en funktion main nederst
der kalder en funktion foo. Og hvad er det passerer til Foo?
[Studerende] Et enkelt argument. >> [Malan] Et enkelt argument.
Så argv [1], hvilket betyder, det første ord, brugeren har indtastet på kommandolinjen
efter a.out eller hvad programmet hedder.
Så Foo øverst tager i en char *. Men char * er bare hvad? >> [Studerende] En streng.
[Malan] En streng, så der er intet nyt her.
Denne streng vilkårligt blive kaldt bar.
I denne linje her, c char [12] i en slags semi-teknisk engelsk, er hvad denne linie gør?
[Studerende] En række af - >> Array af? >> [Studerende] Tegn. >> Tegn.
Giv mig en vifte af 12 tegn. Så vi kan kalde dette en buffer.
Det er teknisk kaldes c, men en buffer i programmeringen betyder bare en flok plads
at du kan sætte nogle ting i.
Så endelig memcpy vi har ikke brugt før, men du kan sikkert gætte hvad det gør.
Den kopierer hukommelse. Hvad gør det?
Det tilsyneladende kopierer bar, dens input, til c men kun op til længden af ​​baren.
Men der er en fejl her. >> [Studerende] Du skal bruge sizeof karakter. >> Okay.
Teknisk set skal vi virkelig gøre strlen (bar) * sizeof (char)). Det er korrekt.
Men i værste fald her, lad os antage, at that's -
Okay. Så er der to fejl.
Så sizeof (char));
Lad os gøre dette til en lidt bredere.
Så nu er der stadig en fejl, hvilket er hvad? >> [Uhørlig student svar]
Check for hvad? >> [Studerende] Check for NULL.
Vi bør generelt kontrollere for NULL fordi dårlige ting ske
når markøren er NULL fordi du måske ender med at gå der,
og du bør aldrig gå til NULL ved dereferere den med stjernen operatør.
Så det er godt. Og hvad skal vi ellers gøre? Logisk, der er en brist her også.
[Studerende] Tjek om argc er> = til 2.
Så tjek hvis argc er> = 2. Okay, så der er tre fejl i dette program her.
Vi overvåger nu kontrollere, om brugeren rent faktisk har skrevet i noget i argv [1]. Godt.
Så hvad er den tredje bug? Yeah. >> [Studerende] C muligvis ikke stor nok.
Godt. Vi kontrolleres ene scenarie.
Vi implicit kontrolleres ikke kopiere mere hukommelse end det ville overstige længden af ​​baren.
Så hvis strengen brugeren har indtastet i er 10 tegn lang,
dette siger kun kopiere 10 tegn. Og det er okay.
Men hvad nu, hvis brugeren har indtastet et ord ved prompten ligesom en 20-tegn ord?
Dette siger eksemplar 20 karakterer fra bar til hvad?
C, også kendt som vores buffer, hvilket betyder, at du lige har skrevet data
til 8 byte steder, du ikke ejer,
og du ikke ejer dem i den forstand, at du aldrig tildelt dem.
Så dette er hvad der almindeligvis kendt som buffer overflow angreb eller bufferoverløb angreb.
Og det er et angreb i den forstand, at hvis brugeren eller det program, der kalder din funktion
gør dette skadeligt, hvad der rent faktisk sker næste kunne faktisk være temmelig dårlig.
>> Så lad os tage et kig på dette billede her.
Dette billede repræsenterer din stak af hukommelse.
Husk på, at hver gang du kalder en funktion, du får denne lille ramme på stakken
og derefter en anden og derefter en anden og en anden.
Og hidtil, vi har bare lidt indvindes disse som rektangler
enten på tavlen eller på skærmen her.
Men hvis vi zoome ind på en af ​​disse rektangler, når du kalder en funktion foo,
viser det sig, at der er mere på stakken indersiden af ​​rammen i dette rektangel
end blot x og y og a og b, ligesom vi gjorde tale om swap.
Det viser sig, at der er nogle laverestående detaljer, blandt dem returadressen.
Så det viser sig, når main kalder foo, main skal underrette Foo
hvad main adresse er i computerens hukommelse
fordi ellers så snart Foo gjort udføre, som i dette tilfælde her,
når du når denne lukkede klammeparentes i slutningen af ​​foo,
hvordan dælen gør Foo vide, hvor kontrol af programmet er meningen at gå?
Det viser sig, at svaret på det spørgsmål er i denne røde rektangel her.
Dette er en pointer, og det er op til computeren til midlertidig opbevaring
på den såkaldte stak adressen på main således at så snart Foo sker udførelse,
computeren ved, hvor og hvilken linje i main at gå tilbage til.
Gemte Frame pointer angår ligeledes til dette.
Char * bar her repræsenterer hvad?
Nu er denne blå segment her er Foo ramme. Hvad er bar?
Bar er bare det argument til Foo funktionen.
Så nu er vi tilbage ved slags det velkendte billede.
Der er flere ting og flere distraktioner på skærmen,
men dette lys blå segment er bare hvad vi har at trække på tavlen
for noget som swap. Det er rammen for foo.
Og det eneste i det lige nu er bar, som er denne parameter.
Men hvad der ellers burde være i stakken i henhold til denne kode?
[Studerende] char c [12]. >> [Malan] char c [12].
Vi bør også se 12 kvadrater af hukommelse tildelt en variabel kaldet c,
og faktisk vi har det på skærmen.
Den meget toppen er der c [0], og derefter forfatteren af ​​dette diagram
gider ikke at tegne alle de firkanter, men der er faktisk 12 er der
for hvis man ser nederst til højre, c [11] hvis man tæller fra 0 er den 12. sådan byte.
Men her er problemet.
I hvilken retning c vokser?
Sorter af top-down, hvis den begynder ved toppen og vokser til bunden.
Det ser ikke ud som vi forlod os meget landingsbane her overhovedet.
Vi har slags malet os op i et hjørne,
og at c [11] er ret op imod bar, som er lige op imod Gemt Frame pointer,
som er lige op imod returadressen. Der er ikke mere plads.
Så hvad er konsekvenserne så hvis du skruer op
og du prøver at læse 20 bytes i en 12-byte buffer?
Hvor er disse 8 yderligere byte kommer til at gå? >> [Studerende] Inside -
Inde alt andet, er hvoraf nogle super vigtigt.
Og det vigtigste, potentielt er den røde boks der, afsenderadresse,
fordi formoder, at du enten ved et uheld eller adversarially overskrive disse 4 bytes,
denne pegepind adresse, ikke bare med skrald, men med en række
der sker for at repræsentere en egentlig adresse i hukommelsen.
Hvad er konsekvenserne, logisk? >> [Studerende] Funktion vil vende tilbage til et andet sted.
Præcis.
Når foo afkast og hits som klammeparentes er programmet kommer til at fortsætte
ikke at vende tilbage til main, det vil vende tilbage til, hvad adressen er på denne røde kasse.
>> I forbindelse med omgåelse software registrering,
hvad nu hvis den adresse, der bliver returneret til er den funktion, der normalt bliver kaldt
efter du har betalt for softwaren og indtastet dit registreringskode?
Du kan sortere i trick computeren i ikke går her, men i stedet går op her.
Eller hvis du er virkelig dygtig, kan en modstander faktisk skrive på tastaturet, for eksempel,
ikke en egentlig ord, ikke 20 tegn, men formoder han eller hun faktisk typer i
nogle tegn, der repræsenterer kode.
Og det kommer ikke til at være C-kode, er det faktisk kommer til at være de tegn
der repræsenterer binær maskinkode, 0'er og 1'ere.
Men formoder, at de er kloge nok til at gøre det,
en eller anden måde indsætte i GetString prompt noget, der er det væsentlige kompileret kode,
og de sidste 4 bytes overskrive at returadresse.
Og hvad adressen betyder det input gøre?
Det faktisk gemmer i denne røde rektangel adressen på den første byte af bufferen.
Så du er nødt til at være virkelig klog, og det er en masse trial and error for dårlige mennesker derude,
men hvis du kan finde ud af hvor stor denne buffer er
sådan, at de sidste par bytes i input, du giver til programmet
tilfældigvis svarer til adressen på starten af ​​din buffer, kan du gøre det her.
Hvis vi siger normalt goddag og \ 0, det er, hvad ender i bufferen.
Men hvis vi er klogere, og vi fylder denne buffer med, hvad vi vil generisk kalde angreb kode -
AAA, angreb, angreb, angreb - hvor det er bare noget, der gør noget slemt,
hvad sker der hvis du er virkelig dygtig, kan du gøre det her.
I det røde felt her er en sekvens af tal - 80, C0, 35, 08.
Bemærk, at der matcher det nummer, der er heroppe.
Det er i omvendt rækkefølge, men mere om det en anden gang.
Bemærk, at denne returadresse er blevet modificeret
at svare til den adresse op her, ikke adressen på main.
Så hvis den dårlige fyr er super smart, er han eller hun kommer til at omfatte i angrebet kode
noget lignende slette alle brugerens filer eller kopiere adgangskoderne
eller opret en brugerkonto, som jeg så kan logge på - noget som helst.
>> Og det er både faren og magt C.
Fordi du har adgang til hukommelse via pegepinde
og du kan derfor skrive noget, du ønsker i en computers hukommelse,
du kan gøre en computer gøre noget, du ønsker
blot ved at have den hoppe rundt i sin egen hukommelse.
Og så den dag i dag så mange programmer og så mange websteder, som er kompromitteret
koges ned til mennesker, der tager fordel af dette.
Og det kan synes som en super sofistikeret angreb, men det behøver ikke altid starte på den måde.
Virkeligheden er, at hvad onde mennesker vil typisk gøre, er,
uanset om det er et program på en kommandolinje eller en GUI program eller en hjemmeside,
du bare begynde at tilbyde noget vrøvl.
Du skriver i en rigtig stor ord i søgefeltet og tryk på Enter,
og du vente at se, om hjemmesiden går ned
eller du vente med at se, om programmet manifesterer nogle fejlmeddelelse
fordi hvis du får heldige som bad guy, og du giver nogle vanvittige input
der går ned programmet, det betyder, at programmøren ikke havde forudset din dårlige opførsel,
hvilket betyder, at du kan sandsynligvis med nok indsats, nok trial and error,
finde ud af at føre en mere præcis angreb.
Så lige så meget en del af sikkerheden ikke bare at undgå disse angreb helt
men afsløre dem, og faktisk ser på logs
og se, hvad skøre input har folk skrevet ind på din hjemmeside,
hvilke søgeord har folk skrevet ind på din hjemmeside
i håb om overfyldte nogle buffer.
Og alt dette kan koges ned til de enkle grundlæggende i, hvad er et array
og hvad betyder det at allokere og bruge hukommelsen.
>> Relateret til det så også er det.
Lad os bare kigge inde i en harddisk endnu en gang.
Du husker fra en uge eller to siden, at når du trækker filer til din papirkurven eller papirkurven,
hvad sker der? >> [Studerende] Ingenting. >> Absolut intet, right?
Til sidst, hvis du løber tør for diskplads,
Windows eller Mac OS vil begynde at slette filer for dig.
Men hvis du trækker noget derinde, der er slet ikke sikkert.
Alle dine roommate eller ven eller et familiemedlem har at gøre, er dobbelt klikke og, voila,
Der er alle de magre filer, som du forsøgte at slette.
De fleste af os i det mindste vide, at du er nødt til at højreklikke eller kontrol klik
og tømme papirkurven eller noget i den stil.
Men selv da, der ikke helt gøre det trick
fordi hvad der sker, når du har en fil på din harddisk
, som repræsenterer nogle Word-dokument eller nogle JPEG, og dette repræsenterer din harddisk,
og lad os sige dette splint her repræsenterer den pågældende fil,
og det er sammensat af en hel bunke af 0'er og 1'ere.
Hvad sker der, når du ikke kun trække filen til papirkurven kan eller genbruge bin
men også tømme den? Sorter af ingenting.
Det er ikke absolut intet nu.
Nu er det bare noget, fordi en lille ting der sker i form af denne tabel.
Så der er en slags database eller tabel inde i en computers hukommelse
der hovedsagelig har en kolonne for filer navne og en kolonne for filer 'placering,
hvor det kan blive placering 123, bare et tilfældigt tal.
Så vi kunne have noget lignende x.jpeg og placering 123.
Hvad sker der så når du rent faktisk tømme din papirkurv?
Det går væk.
Men hvad der ikke går væk er den 0'er og 1'ere.
>> Så hvad er så forbindelsen til pset4?
Nå, med pset4, bare fordi vi ved et uheld har slettet den compact flash card
der havde alle disse billeder, eller bare fordi det ved uheld blev ødelagt
betyder ikke, at den 0'er og 1-taller ikke er der stadig.
Måske et par af dem går tabt, fordi noget fik ødelagt
i den forstand, at nogle 0'er blev 1s og 1s blev 0'erne.
Dårlige ting kan ske på grund af buggy software eller defekt hardware.
Men mange af disse bits, måske endda 100% af dem, er der stadig.
Det er bare at computeren eller kameraet ikke ved, hvor JPEG1 startede
og hvor JPEG2 startede.
Men hvis du, programmøren, vide med en smule af kyndige, når disse JPEG er
eller hvordan de ser ud, så du kan analysere den 0'er og 1-taller og sige JPEG, JPEG,
du kan skrive et program med væsentlige blot et for eller while-løkke
der genvinder hver af disse filer.
Så den lektie så er at starte sikkert slette dine filer
Hvis du gerne vil undgå dette helt. Ja.
>> [Studerende] Hvordan kommer det siger om din computer
at du har mere hukommelse end du gjorde før?
Har mere hukommelse end du gjorde før - >> [studerende] Mere tilgængelig hukommelse.
Oh. Godt spørgsmål.
Så hvorfor så efter tømning af skrald har computeren fortælle dig
at du har mere ledig plads end du gjorde før?
I en nøddeskal, fordi lyver.
Mere teknisk, har du mere plads, fordi du nu har sagt
du kan sætte andre ting, hvor den pågældende fil var engang.
Men det betyder ikke, at de bits går væk,
og det betyder ikke bittene bliver ændret til 0'er, for eksempel
for din beskyttelse.
Så ved Derimod, hvis du sikkert slette filer eller fysisk ødelægge enheden
der virkelig er den eneste måde til tider omkring dette.
>> Så hvorfor gør vi ikke forlade på at semi-skræmmende note, og vi vil se dig på mandag.
[Bifald]
>> [CS50.TV]