[Powered by Google Translate] [UGE 5] [David J. Malan, Harvard University] [Dette er CS50.] [CS50.TV] [Kvinde] Han lyver, om hvad, ved jeg ikke. [Man] Så hvad ved vi? [Kvinde] At kl 9:15, var Ray Santoya på ATM. [Man] Så spørgsmålet er, hvordan var han laver på 9:16? [Kvinde] Optagelse af 9 mm på noget. Måske så han snigskytte. [Man] Eller han arbejdede sammen med ham. [Kvinde] Vent. Gå tilbage én. [Man] Hvad ser du? [♫ spændingsfyldt musik ♫] [Kvinde] Bring hans ansigt op. Fuld skærm. [Man] hans briller. >> Der er en refleksion. [♫ spændingsfyldt musik ♫] [Man] Det er Nuevita baseball hold. Det er deres logo. [Kvinde] Og han taler til hvem er iført denne jakke. [David Malan] Så det er CS50 uge 5, og i dag har vi ødelægge lidt af tv og film for dig. Så når du ser et show som denne her, og politiet siger "Kan du rense det op?" eller "Enhance" der ikke er nogen forbedring i den virkelige verden. I virkeligheden er det, du virkelig får en lille ting som dette. Jeg har trukket op en af ​​de ansatte fotos fra siden. Dette er et program kaldet Photoshop. Dette er 1 af 2 Bowdens, 1 af 3 Bowdens faktisk i dag, fordi vi har fru Bowden her så godt, med Rob og Paul. Men her er Rob på skærmen, og hvis vi zoome ind på den glimt han altid havde i øjet, hvad du faktisk se, er, at hvad du ser, er hvad du får. Dette er "forbedret", så "CSI" har det en smule forkert. Der er en anden klip, hvis vi kan samle på "CSI" bare en lille smule længere. Denne ene er en dejlig sætning at sige fremover, hvis du vil en god teknisk med dine venner, når, virkelig, du siger absolut ingenting. [Man] For uger, jeg har været at undersøge de Cabby Killer mord med en vis morbid fascination. [Woman # 1] Dette er i realtid. [Kvinde # 2] Jeg vil lave en GUI interface ved hjælp af Visual Basic, se om jeg kan spore en IP-adresse. [Malan] Så audio ude af sync til side, hvilket skaber en GUI interface ved hjælp af Visual Basic at spore en IP-adresse er komplet nonsens. Disse dage ville du ikke bruge Visual Basic, der er ikke behov for en GUI, og IP-adressen var en teknisk præcise ord. Så hold øje med disse, og en af ​​mine favoritter: Denne ene er lidt mere mystisk, fordi du har brug for at vide et andet sprog. Der er et sprog kaldet Objective-C, som er en overordnet C. Hvilket betyder, at det er C plus nogle ekstra funktioner, blandt dem objektorienteret programmering. Og det er det sprog, at Apple har populariseret til iOS programmering. Og så her er et klip fra en anden vis helt fra "Numbers", at hvis du rent faktisk ser nøje på din TiVo og pause på det rigtige tidspunkt, vil du se, at det, de søger på, er ikke helt, hvad der bliver beskrevet. Og lad mig prøve en anden lydstik her og se om vi ikke kan holde lyden i sync denne gang. Jeg giver dig "Numbers". [Man # 1] Det er en 32-bit IPv4-adresse. [Man # 2] IP, det er internettet. >> Privat netværk. Det er Anita private netværk. [Malan] Okay. Dette er Objective-C, og det er for nogle barns farve program, som du måske kan udlede af navnet på den variabel der. Så det var altså "Numbers". Så i dag, og i denne uge har vi introducere en lille smule af den verden af ​​retsvidenskab og den sammenhæng, de problemer, derfor. I dag vil være en forkortet foredrag, fordi der er en særlig begivenhed i her bagefter, så vi vil 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 MITs nye online initiativ for åben kursusmateriale og mere, lancerer på Harvards campus på mandag. Hvilket betyder kommer mandag vil du have - som i sidste optælling, 86.000 ekstra klassekammerater vil følge sammen med CS50 foredrag og sektioner og walkthroughs og problemstillinger sæt. Og som en del af dette, vil du blive medlemmer af det konstituerende klasse 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, ikke helt den bedste elev / lærer ratio, når vi rammer 80.000 andre studerende. Så 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 kommandolinje utility inden apparatet at du får, når du opdatere det senere i denne weekend, og du vil være i stand til at køre en kommando, kontrol 50, på din egen Pset, du og får nogle tilbagemeldinger om, hvorvidt dit program er korrekt eller ukorrekt ifølge forskellige design specifikationer, som vi har leveret. Så mere om det og problemet indstillede specifikation og de CS50x klassekammerater vil bruge det så godt. Så problem set 4 handler om retsvidenskab. Og dette stykke er inspireret af nogle virkelige liv stuff, hvorved da jeg var i graduate skole, jeg interneret i et stykke tid med Den Middlesex Amts District Attorney kontor laver retsmedicinsk arbejde med deres bly retsmedicinske efterforsker, hvad og dette beløb sig til er, tror jeg, jeg nævnte et par uges fortid, er massen statslige politi eller andre ville komme i, ville de slippe væk fra ting som harddiske og cd'er og disketter og lignende, og derefter målet for retsvidenskab office var at undersøge 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 forbrydelser noget der involverer en form for digitale medier, viser sig, at ikke så mange mennesker skrive en e-mail at sige "jeg gjorde det." Så ganske ofte disse retsvidenskab søgninger dukkede ikke op så meget frugt, men nogle gange folk ville skrive sådanne e-mails. Så nogle gange indsatsen blev belønnet. Men at lede op til dette retsmedicinsk Pset, vil vi introducere i Pset 4 en smule af grafik. Så du sandsynligvis tage disse ting for givet, JPEG, GIF og lignende disse dage, men hvis du virkelig tænker over det, et billede, ligesom Rob ansigt, kunne modelleres som en sekvens af punkter eller pixels. Nu, i tilfælde af Rob ansigt, er der alle mulige farver, og vi begyndte at se de enkelte prikker, otherwide kendt som pixels, når vi begyndte at zoome ind Men hvis vi forenkler verden en smule, og bare sige, at det her er Rob i sort og hvid, godt, til 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å er det ikke et stort spring, så at begynde at tale om farverige fotografier. Ting, som du ville se på Facebook eller tage med et digitalt kamera, men helt sikkert, 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 set 4 såvel som 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 videoen vil være online, som sædvanlig, i morgen. Vi vil også introducere dig til et andet filformat. Så dette er bevidst beregnet 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-simpel, farverige grafisk format, 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 blå himmel, Det var typisk en BMP, eller bitmapbillede, og bitmaps er sjovt for os, fordi de har en smule mere kompliceret. Det er ikke helt så simpelt som dette net af 0 s og 1 s; i stedet, du har ting som en header i starten af ​​en fil. Så med andre ord, er inde i en. Bmp fil en hel bunke af 0 s og 1 s, men der er nogle ekstra 0 s og 1-taller der. Og det viser sig, at det vi har nok taget for givet i årevis, filformater som. doc eller. xls eller. mp3 eller. mp4, uanset hvilke filformater, som du er fortrolig med. Nå, hvad betyder det endda sige at være et filformat? Fordi ved slutningen af ​​dagen, har alle disse filer bruger vi bare 0 s og 1 s og måske dem 0'er og 1'er repræsenterer a, b, c, gennem ASCII eller lignende, men gennem slutningen af ​​dagen, er det bare 0 s og 1-taller. 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, der, der kommer til at være nogle kryptisk navngivne variabel kaldet bfType, der bare står for bitmap filtype, hvilken type bitmapfil dette er. Du kan udlede, måske, fra anden række, offset 2, byte nummer 2, har et mønster af 0 s og 1 s, der repræsenterer hvad? Størrelsen af ​​noget, og det går videre derfra. Så i problemet 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ærker det begynder at blive interessant omkring linje eller byte 54, rgbtBlue, grøn og rød. Hvis du nogensinde har hørt forkortelsen RGB, rød grøn blå, dette er en reference til det. 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ældrene i rummet minde om nogle af de tidligste projektorer. Disse dage, du bare se 1 lys der kommer ud af en linse. Men tilbage i dag, havde du den røde linse, den blå linse, og den grønne linse og sammen med henblik på skærmen, og dannede et farverigt billede. Og ganske ofte midt skoler og gymnasier vil have disse linser nogensinde-så-lidt skævt, så du var slags at se dobbelt eller tredobbelt billeder, men det var tanken. 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, så for dig i problemer sæt 4 vil være et par ting, den ene er til rent faktisk at ændre størrelsen på et billede. At tage i et mønster af 0 s og 1 s, finde ud af hvilken bidder af 0 s og 1 s 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, 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 af en egentlig fil fra et digitalt kamera og på dette kamera, engang var en hel bunke af fotos. Problemet er, at vi ved et uheld slettet eller haft det image beskadiget eller anden måde. Dårlige ting sker med digitale kameraer, og så vi hurtigt kopieret alle 0 s og 1 s off af kortet for dig, gemte dem alle i 1 stor fil, og så vil vi udlevere dem til dig i problem indstille 4, således at du kan skrive et program i C med til at inddrive alle disse JPEG, ideelt. Og det viser sig, at JPEG, selvom det er noget af en kompleks filformat, de er meget mere kompleks end denne smilende ansigt her. Det viser sig, at hver JPEG starter med de samme mønstre af 0 s og 1-taller. Så ved hjælp af en while-løkke eller en for-løkke eller lignende, du kan gentage over alle 0-og 1-taller i denne retsmedicinsk billede og hver gang du ser det specielle mønster, der er defineret i det problem sæt specifikationer, du kan antage, 'Åh, her er, med meget stor sandsynlighed, starten på en JPEG ', og så snart du finder det samme mønster, et antal byte eller kilobyte eller megabyte senere, du kan antage, 'Ooh! 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 ny. ' Og udgangen på din program for Pset 4 kommer til at 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. Det er hvad der er i horisonten. Quiz 0, bag os. Indse, pr 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 TFS, 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 CS50 biblioteket? Godt arbejde. Hvad er det CS50 biblioteket? Ja? [Student svar, uforståelig] >> Okay, godt. Så det er en skrevet sæt kode, som vi, personalet, skrev, vi leverer til dig, at give nogle fælles funktioner. 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. Så vi vil til at begynde at tage væk et "streng" fra dig, der, tilbagekaldelse, var blot et synonym for, hvad egentlige datatype? char *. Så for forældre, der var sandsynligvis - det er godt, så char * vi vil begynde at se på skærmen desto mere som vi fjerner "streng" 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 vil få mere sofistikerede snarere end blot at skrive programmer, der sidder der med en prompt blinker, venter på brugeren at skrive noget i. Du får 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æk op CS50 apparatet og denne fil kaldet CS50.h, som du har været skarp, herunder i ugevis. Men lad os nu se, hvad der er inde i dette. Så toppen af ​​filen i blå er bare en hel masse kommentarer, oplysninger om garanti og licensering. Det er en slags fælles paradigme i software, en masse software disse dage, fordi er, hvad der kaldes "open source", hvilket betyder, at nogen har skrevet koden og gjorde det frit tilgængelige, ikke kun i drift og anvende, men faktisk 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. Så mærke øverst her, at CS50.h-fil indeholder en hel masse header-filer. Nu er de fleste af dem vi ikke har set før, men man er velkendt, hvilke af disse har vi set, om end kortvarigt, indtil videre? Ja, standard biblioteker. Stdlib.h har malloc, så når vi begyndte at snakke 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. Så vi har, for uger, herunder blevet standard bool.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 nu rulle ned yderligere, her er vores definition af en streng. Det viser sig, som vi har sagt før, at hvis dette * 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 den * har at gøre med den type. Men indse, lige så almindeligt, hvis ikke lidt mere almindelig, er at sætte det der men funktionelt er det det samme. Men nu, hvis vi læser yderligere ned, lad os tage et kig på sige, GetInt, fordi vi brugte det måske, før noget andet i dette semester. Og her er GetInt. Dette er, hvad? Dette er prototypen. Så 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 at du vil have andre mennesker til at være i stand til at bruge, hvilket er præcis tilfældet med CS50 bibliotek, du ikke kun implementere dine funktioner i noget lignende CS50.c, man også sætte prototyperne ikke på toppen af ​​filen, men i toppen af ​​en header-fil, så at header filen er hvad venner og kolleger omfatter, med skarpe i deres egen kode. Så al den tid du har, herunder alle disse prototyper effektivt i toppen af ​​din fil, men ved hjælp af denne skarpe omfatte mechanism at stort set kopier og pastaer denne fil ind i din egen. Nu, 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, right? 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? Nå, ideelt, det er forudsigeligt. Så i dette tilfælde, hvis du rent faktisk læser det med småt, vil du 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? Det er en konstant, så det er nogle særlige konstant, er sandsynligvis erklæret i en af ​​disse header-filer, der er højere op i filen, og INT_MAX er nok noget lignende, groft, 2 mia. 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, negativ 2 mia op til 2 mia give eller tage. Nå, hvad er almindelig i programmering er du stjæler bare en af ​​disse numre. Måske 0, måske 2 mia måske negativ 2 mia. 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-big værdi. Men du ikke ønsker, at brugeren skrive noget kryptisk som "2, 3, 4 ..." af virkelig store nummer, hvor du generaliserer i stedet som en konstant. Så virkelig, hvis du var anal de sidste par uger, når som helst du kalder GetInt, bør du 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. Nå, lad os nu vende ind på. C-filer. Den C-fil har eksisteret i apparatet i nogen tid, og faktisk har apparatet det forkompileret for dig ind i den ting, vi kaldte "objektkode" men det bare ikke noget for dig, hvor det er fordi systemet ved, i dette tilfælde, hvor det er, apparatet. Men lad os rulle ned nu at GetInt, og se, hvordan GetInt har arbejdet hele tiden. Så her har vi lignende kommentarer fra før. Lad mig zoome ind på netop den kode portion, og hvad vi har for GetInt er følgende. Det tager ingen input og den returnerer en int, mens (sand), så vi har en bevidst uendelig løkke men formentlig vil vi bryde ud af denne eller anden måde, eller vende tilbage fra inden for dette. Så lad os se hvordan det virker. Nå, vi synes at benytte GetString i denne første linie inde i løkken, 166. Dette er nu god praksis, fordi under hvilke omstændigheder kunne GetString returnere denne særlige søgeord, NULL? Hvis noget går galt. Hvad kunne gå galt, når du kalder noget GetString? Ja? [Student svar, uforståelig] >> Yeah. Så måske malloc mislykkes. Et eller andet sted under hætten GetString ringer malloc, som tildeler hukommelse, hvilket lader computeren butik alle de tegn, som bruger skriver i tastaturet. Og formoder, at brugeren havde en hel masse fritid og skrives mere, f.eks end 2000 millioner karakterer. Flere tegn end computer, selv har RAM. Nå, 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 det, og så GetString, hvis vi går tilbage og læse sin dokumentation, er i virkeligheden returnere NULL. Nu, hvis GetString mislykkes ved at returnere NULL er GetInt vil 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. Så lad os rulle ned til hvor int er faktisk GotInt. Så hvis jeg rulle ned lidt længere, på linje 170 har vi en kommentar over disse linjer. Så vi erklære, i 172, en int n og en char c, og så er denne nye funktion som nogle af jer har snublet over før, men sscanf. Det står for streng scan f.. Med andre ord, giv mig en streng, og jeg vil scanne det for stykker af information af interesse. Så hvad betyder det? Nå, antage, at jeg skriver i, bogstaveligt talt, 1 2 3 ved tastaturet, og derefter tryk enter. Hvad er datatypen for 1 2 3 når returneres af GetString? Det er naturligvis en streng, ikke? Jeg fik en snor, så 1 2 3 er virkelig "1 2 3" 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 skal scanne, at strengen venstre mod højre, 1 2 3 \ 0, og en eller anden måde konvertere det til et virkeligt heltal. Nu kan du finde ud af, hvordan du gør dette. Hvis du tænker tilbage til Pset 2, du formentlig fik en lille behagelig med Cæsar eller vigenere, så du kan gentage over en snor, du kan konvertere tegn til int'er med pick. 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 kan derefter angive, i citationstegn, meget lig printf, hvad forventer du at se i denne streng? 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. Det viser sig, at denne notation er nu minder om ting vi begyndte at tale om lidt over en uge siden. Hvad er & n og & c gør for os her? [Student svar, uforståelig] >> Yeah. Det giver mig adressen på n og adresse på ca. Nu, hvorfor er det vigtigt? Tja, du ved, at med funktioner i C du kan 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 1 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. Så du faktisk ønsker f for at vende tilbage 2 ting, det er bare ikke muligt i C. Så du kan arbejde omkring, ved at passere i 2 adresser, fordi så snart du afleverer en funktion 2 adresser, hvad kan denne funktion gøre med dem? Det kan skrive til disse adresser. Du kan bruge * operation og "derned" til hver af disse adresser. Det er en slags denne bagdør mekanisme, men meget almindeligt for at ændre værdierne af variabler i mere end blot 1 plads, i dette tilfælde 2. Nu, bemærker jeg kontrollerer for == til1, og derefter vende tilbage n hvis det betyder i virkeligheden evaluere til true. Så hvad sker der? Nå, teknisk, alle vi virkelig ønsker skal ske i GetInt er dette. Vi ønsker at parse, så at sige, vi ønsker at læse strengen "1 2 3", og hvis det ser ud som om der er et tal der, hvad vi fortæller sscanf gøre er at sætte det tal, 1 2 3, i denne variable n for mig. Hvorfor havde jeg det så godt? Hvilken rolle også sige, sscanf, kan du også få en karakter her. [Student set uforståelig] >> ikke - et komma kunne virke. Lad os holde det tænkte sig om et øjeblik. Hvad ellers? [Studerende, uforståelig] >> Så god tanke, kunne det være NULL karakter. Det er faktisk ikke i dette tilfælde. Ja? [Studerende, uforståelig] >> ASCII. Eller lad mig generalisere yderligere. Den% c der er bare for fejlkontrol. Vi ønsker ikke, at der er tegnet efter det antal, 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 1 2 3, er det kun% d kommer til at matche og kun n bliver gemt med en værdi som 1 2 3 og intet bliver sat i c; c fortsat en garbage værdi, så at sige. Garbage fordi det er aldrig blevet initialiseret som en vis værdi. Så i dette tilfælde returnerer sscanf 1, fordi jeg befolkede en af ​​disse markører, i hvilket tilfælde. great Jeg har en int, så jeg befri den linje for at frigøre hukommelse at GetString faktisk allokeret, og så vender jeg tilbage n.. Else, hvis du nogensinde spekuleret over, hvor der retry erklæring kommer fra, kommer fra højre her. Hvis det derimod, skriver jeg i 1 2 3 foo, bare nogle tilfældige sekvens af tekst, sscanf kommer til at se, ooh, nummer, ooh, nummer, ooh, nummer, ooh - f. Og det kommer til at sætte 1 2 3 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 scanf adfærd, en meget enkel måde - ja, kompleks ved første øjekast, men i slutningen af ​​dagen, forholdsvis enkel mekanisme at sige, er der en int, og hvis ja, er at det eneste, jeg fandt? Og det hvide rum her er bevidst. Hvis du læser dokumentationen til sscanf, det fortæller dig, at hvis du inkluderer et stykke hvidt plads i starten eller slutningen, sscanf også vil gøre det muligt for brugeren, uanset årsagen, at ramme mellemrumstasten 1 2 3, og det vil være legitimt. Det vil ikke råbe på brugeren, bare fordi de ramte mellemrumstasten ved begyndelsen eller slutningen, der er bare en smule mere brugervenlig. Eventuelle spørgsmål, derefter på GetInts? Ja? [Student spørgsmål, uforståelig] >> Godt spørgsmål. Hvad hvis du lige har skrevet i en char, ligesom f, og tryk enter uden nogensinde at skrive 1 2 3, hvad tror du opførslen af ​​denne linje kode vil så være? Så sscanf kan dække det også, fordi der i så fald det kommer ikke til at fylde N eller C, det vil i stedet returnere 0. I så fald, er jeg også at fange det scenarie, fordi den forventede værdi jeg ønsker, er 1. Jeg ønsker kun 1, og kun 1 ting, der skal besættes. Godt spørgsmål. Andre? Okay, så 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 al 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. Så i GetString, der tager noget argument som pr tomrum op her, og det returnerer en streng, så jeg om en streng kaldet buffer. Jeg ved ikke rigtig, hvad der kommer til at blive brugt til endnu, men vi vil se. Ligner kapacitet er, som standard, 0; ikke helt sikker på, hvor dette foregår. Ikke sikker på hvad n kommer til at blive brugt til endnu. Men nu er det bliver lidt mere interessant, så i linje 243, vi erklærer en int c, dette er en slags dum detalje. En char er 8 bit, og 8 bit kan gemme hvor mange forskellige værdier? 256. Problemet er, hvis du vil 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 s og 1 er 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, dette er nogle fejlagtige budskab." Så hvad verden gør, er, de bruger den næststørste værdi, noget som en int, så du har et vanvittigt antal bit, 32 for 4 milliarder mulige værdier, så du bare kan ende med at bruge, væsentlige 257 af dem, 1 som har nogle særlige 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, getc, og derefter stdin. Sving ud dette er blot 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 Pset 4, betyder skærmen, men en særlig del af skærmen, så det er ikke smelter sammen med faktiske produktion, du ville udskrive, men mere om det i fremtiden. Så fgetc betyder blot læse et tegn fra tastaturet, og gem den hvor? Opbevar det i c, og derefter kontrollere, så jeg bare bruge nogle boolean konjunktioner her, kontrollere, at det ikke er lig \ n, så brugeren har tryk 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 står det for? Slut på filen. Så dette 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. Slut på 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. Men kontrol 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 så allokere mere kapacitet. 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. [Student svar, uforståelig] >> Yeah. Og det er ikke helt tilføjelse af hukommelse, det omfordeler hukommelse på følgende måde: 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 sætte strenge 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 2 tegn, ender GetString op ringer realloc og siger, "Ooh, 1 karakter var ikke nok. Giv mig 2 tegn. ' Så hvis du læser gennem logikken i løkken, det kommer til at sige: 'Ooh, brugeren har indtastet i 3 karakterer. Giv mig nu ikke 2 men 4 tegn, så giv mig 8, så giv mig 16 og 32 «. Det faktum, at jeg fordobler kapaciteten hver gang betyder, at pufferen ikke vil vokse langsomt. Det kommer til at vokse super hurtigt, og hvad der kan være den fordel det? Hvorfor er jeg fordobling af størrelsen af ​​bufferen, selvom brugeren måske bare brug for 1 ekstra tegn fra tastaturet? [Student svar, uforståelig]. >> Hvad er det? Præcis. Du behøver ikke at dyrke det så ofte. Og det er bare sådan en - du afdækning dine indsatser her. Ideen er, at du ikke ønsker at kalde realloc en masse, fordi det har tendens til at være langsom. Hver gang du beder operativsystemet for hukommelse, som du snart vil se i et fremtidigt problem sæt, har den tendens til at tage lidt tid. Så minimere den mængde af tid, selvom du spilder nogle rum, har tendens til at være en god ting. Men hvis vi læser igennem den sidste del af GetString her, og igen, at forstå hver enkelt linje her er ikke så vigtigt i dag. Men bemærk, at det i sidste ende kalder malloc igen, og det tildeler præcis som mange bytes som den har brug for streng og derefter smider ved at ringe gratis, den alt for store buffer, hvis det virkelig blev fordoblet for mange gange. Kort sagt, er, at hvordan GetString har arbejdet hele tiden. Alt det gør, er læst é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. Folk, 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 i bunden, der kalder en funktion foo, og hvad det går til Foo? [Student] Et enkelt argument. >> Single argument. Så argv [1], hvilket betyder, det første ord brugeren har indtastet på kommandolinjen efter a.out eller hvad programmet hedder. Så foo, på toppen tager i en char *, men char * er bare hvad? String. Der er ikke noget nyt her, og at strengen er vilkårligt at blive kaldt bar. I denne linje her, c char [12], i en slags semi-teknisk engelsk, er hvad denne linie gør? Array af -? Tegn. Giv mig en vifte af 12 tegn. Så vi kan kalde dette en buffer. Det er teknisk kaldes c, men en buffer i programmering betyder blot en masse plads, som du kan sætte nogle ting i. Så endelig memcpy har vi ikke brugt før. Men du kan sikkert gætte hvad det gør. Den kopierer hukommelse. Hvad gør det? Tja, det tilsyneladende kopierer bar, dens input, til c, men kun op til længden af ​​baren. Men der er en fejl her. Okay, så teknisk set bør vi virkelig gøre strlen (bar) x sizeof (char), det er korrekt. Men i værste fald her, lad os antage, at that's - så, okay. Så er der 2 bugs. Så sizeof (char), okay, lad os gøre dette til en lidt bredere. Så nu er der stadig en fejl, hvilket er hvad? [Student svar, uforståelig] >> Check for hvad? Okay, så vi skal 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 at dereferere det med * operatør. Så det er godt, og hvad der ellers gør vi? Logisk er der en fejl her. [Student svar, uforståelig] >> Så tjek hvis argc ≥ 2? Okay, så der er 3 fejl i dette program her. Vi er ikke at kontrollere, om brugeren rent faktisk har skrevet i noget i argv [1], godt. Så hvad er den tredje bug? Ja? [Student svar, uforståelig] >> Godt. Så vi tjekket en scenario. 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 er at sige, 'Only kopierer 10 tegn.' Og det er okay, men hvad nu hvis brugeren har indtastet i et ord ved prompten ligesom en 20 tegn ord, det er, siger kopi 20 karakterer fra bar til hvad? c, ellers 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 angreb i den forstand, at hvis brugeren eller det program, der kalder din funktion gør dette skadeligt, hvad der faktisk sker næste kunne være helt slemt. Lad os tage et kig på dette billede her. Dette billede repræsenterer din stak af hukommelse. Og huske, at hver gang du kalder en funktion, du får denne lille ramme på stakken og derefter en anden og derefter en anden og derefter en anden. Og hidtil vi har bare lidt indvindes disse væk som rektangler enten der på tavlen eller på skærmen her. Men hvis vi zoomer ind på en af ​​disse rektangler, når du kalder en funktion foo, viser det sig, at der er mere på stakken indersiden af ​​denne ramme, og dette rektangel end blot x og y og a og b, ligesom vi gjorde tale om swap. Det viser sig, at der er nogle lavere niveauer detaljer, blandt dem returadresse. 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 dette tæt 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 den røde rektangel her. Dette er en pointer, og det er op til computeren til at gemme, midlertidigt, 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 rammehenvisning angår ligeledes til dette. Char * bar her repræsenterer hvad? Nå, nu er denne blå segment her er Foo er ramme, hvad er bar? Okay, så bar er bare det argument til Foo funktionen. Så nu er vi tilbage ved det velkendte billede. Der er flere ting og flere distraktioner på skærmen men dette lys blå segment er, 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, der er denne parameter. Men hvad der ellers burde være i stakken, ifølge denne kode? Char c [12]. Så vi bør også se 12 pladser i hukommelsen, tildelt en variabel kaldet c. Og faktisk vi har at 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 de 12 sådanne bytes. Men her er problemet: I hvilken retning c vokser? Sorter af top down, right? Hvis det begynder ved toppen og vokser til bunden, ligner ikke 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 stakramme pointer, der er ret op mod returadresse, og der er ikke mere plads. Så hvad er konsekvenserne, da, 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å? Inde alt andet, er hvoraf nogle super vigtigt. Og det vigtigste, potentielt er den røde boks der, returadresse. Fordi antage, at du er enten ved et uheld eller adversarially overskrive disse 4 bytes, at pointer adresse, ikke bare med skrald, men med et nummer, der sker for at repræsentere en egentlig adresse i hukommelsen? Hvad er implicaiton, logisk? [Student svar, uforståelig] >> Præcis. Når Foo returnerer og hits som klammeparentes er programmet kommer til at fortsætte ikke at vende tilbage til main, det kommer til at vende tilbage til, hvad adressen er på denne røde kasse. Nu, i tilfælde af at omgå software registrering, hvad er adressen, der bliver returneret til er funktionen der normalt bliver kaldt, når du har betalt for softwaren og indtastet dit registreringskode? Du kan sortere på trick computeren i ikke går her, men i stedet går op her. Eller hvis du er rigtig dygtig, kan en modstander faktisk skrive på tastaturet, for eksempel antage ikke en egentlig ord, ikke 20 tegn, men han eller hun typer i nogle tegn, der repræsenterer kode? Og det kommer ikke til at være C-kode, det vil være de tegn der repræsenterer binære maskine koder, 0 s og 1 s. Men formoder, de er kloge nok til at gøre det, at en eller anden måde indsætte i GetString prompt noget, der i det væsentlige kompilerede kode, og de sidste 4 bytes overskrive at returadresse, og hvilken adresse betyder det input gøre? Den 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, som du giver til programmet tilfældigvis svare til adressen på starten af ​​din buffer, du kan gøre dette. Hvis vi siger, normalt, hallo, 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, A, A, A, A: Angreb, angreb, angreb, angreb, hvor dette er bare noget, der gør noget slemt. Tja, hvad sker der hvis du er virkelig dygtig, kan du gøre følgende: I det røde felt her er en sekvens af tal: 80, CO, 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, 'Slet alle brugerens filer.' Eller 'Kopier de passwords,' eller 'Opret en brugerkonto, som jeg kan logge ind.' Hvad 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 lave en computer gøre noget, du ønsker blot ved har det hoppe rundt i sin egen hukommelse. Og ja, den dag i dag, så mange programmer og så mange hjemmesider, der er kompromitteret koges ned til mennesker, der tager fordel af dette. Og det kan synes som en super-sofistikerede 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, er du bare begynde at tilbyde noget vrøvl. Du skriver i en rigtig stor ord i søgefeltet og trykker på enter, og du vente med at se, om hjemmesiden går ned. Eller du vente med at se, om programmet manifesterer nogle fejlmeddelelse. Fordi hvis du får heldig, da den dårlige fyr, og du giver nogle skøre input, der går ned i 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 fuldstændigt, men opdage dem og faktisk ser på logs og se, hvad skøre input har folk skrevet 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 hukommelse? Og i forbindelse med det, også er det. Så lad os bare kigge inde i en harddisk endnu en gang. Så du husker fra en uge eller to siden, at når du trækker filer til din papirkurven eller papirkurven, hvad sker der? [Student] Ingenting. >> Ja, absolut ingenting. Til sidst, hvis du kører lav på diskplads, vil Windows eller Mac OS begynde at slette filer for dig. Men hvis du trækker noget derinde, så er det slet ikke sikkert. Al din roomate, ven eller et familiemedlem har at gøre, er dobbelt klik, og voila. Der er alle de magre filer, som du forsøgte at slette. Så de fleste af os i det mindste vide, at du er nødt til at højreklikke eller kontrollere klik og tømme papirkurven, eller noget lignende. Men selv da, betyder det ikke helt gøre det trick. For hvad sker der, når du har en fil på din harddisk , som repræsenterer nogle word-dokument eller nogle JPEG? Og det er 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 s og 1-taller. Hvad sker der, når du ikke kun trække filen til papirkurven eller papirkurven, men også tømme den? Sorter af ingenting. Det er ikke absolut intet nu. Nu er det bare ingenting, 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 1 kolonnen for filer navne, og 1 kolonne for filens placering, hvor dette kan være placering 123, bare et tilfældigt tal. Så vi kunne have noget lignende x.jpg og placering 123. Og hvad sker der så, når du tømmer din papirkurv? Det går væk. Men hvad der ikke går væk er 0 s og 1-taller. Så hvad er da, at forbindelsen Pset 4? Nå, med Pset 4, bare fordi vi har et uheld slettet compact flash-kort, der havde alle disse billeder, eller bare fordi det ved uheld blev beskadiget, betyder ikke, at 0 s og 1 os 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 1'er og 1'er blev 0'er. 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 JPEG 1 startede og hvor JPEG 2 startede, men hvis du er programmør, vide, med en smule kyndige, når disse JPEG er, eller hvordan de ser ud, du kan analysere 0 s og 1 s og sige, 'Ooh. JPEG. Ooh, JPEG. ' Du kan skrive et program med væsentlige blot et for eller while-løkke der gendanner hver og en af ​​disse filer. Så lektionen er altså at starte "sikkert" at slette dine filer Hvis du gerne vil undgå dette helt. Ja? [Student spørgsmål, uforståelig] >> Har mere hukommelse end du gjorde før - Oh! Godt spørgsmål. Så hvorfor da, efter at tømme papirkurven, 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, kan du sætte andre ting, når denne fil engang var, men det betyder ikke, de bits går væk, og det betyder ikke de bits bliver ændret alt 0 s, for eksempel til din beskyttelse. Derimod, hvis du "sikkert" Slet filer eller fysisk ødelægge enheden der virkelig er den eneste måde, til tider, omkring det. Så hvorfor gør vi ikke forlade på at semi-skræmmende note, og vi vil se dig på mandag. CS50.TV