[Powered by Google Translate] [WEEK 5] [David J. Malan, Harvard University] [Dit is CS50.] [CS50.TV] [Vrouw] Hij liegt, wat, ik weet het niet. [Man] Dus wat weten we? [Vrouw] Dat om 9:15, Ray Santoya was bij de geldautomaat. [Man] Dus de vraag is, is wat hij doet op 9:16? [Vrouw] Schieten de 9 mm in iets. Misschien zag hij de sluipschutter. [Man] Of hij werkte met hem. [Vrouw] Wacht. Ga terug een. [Man] Wat zie je? [♫ Spannende muziek ♫] [Vrouw] Breng zijn gezicht. Volledig scherm. [Man] Zijn bril. >> Er is een reflectie. [♫ Spannende muziek ♫] [Man] Dat is de Nuevita het honkbalteam. Dat is hun logo. [Vrouw] En hij praat met wie draagt ​​die jas. [David Malan] Dus, dit is CS50 week 5, en vandaag hebben we een beetje van televisie en film voor je verpesten. Dus wanneer je kijkt een show zoals deze hier, en de politie zeggen: "Kun je dat opruimen? ' of "verbeteren," geen verbetering in de echte wereld. In feite, wat je echt krijgt is een beetje zoiets als dit. Ik heb trok een van de medewerkers foto's van de pagina. Dit is een programma genaamd Photoshop. Dit is 1 van 2 Bowdens, 1 van 3 Bowdens eigenlijk, vandaag, want we hebben mevrouw Bowden hier ook, met Rob en Paul. Maar hier is Rob op het scherm, en als we inzoomen op die glinstering hij altijd in zijn ogen, wat je eigenlijk ziet is dat wat je ziet is wat je krijgt. Dit is "enhanced," dus "CSI" hebben het een beetje verkeerd. Er is nog een andere clip, als we kunnen ingaan op "CSI" gewoon een beetje langer. Dit is een mooie uitdrukking om voortaan te spreken als je wilt een gedegen technische met je vrienden als, echt, je zegt helemaal niets. [Man] Voor weken heb ik onderzoek gedaan naar de Cabby Killer moorden met een zekere morbide fascinatie. [Vrouw # 1] Dit is in real-time. [Vrouw # 2] Ik zal een GUI-interface met behulp van Visual Basic, kijken of ik kan een IP-adres traceren. [Malan] Dus audio uit sync terzijde, het creëren van een GUI-interface met behulp van Visual Basic op te sporen een IP-adres is complete onzin. Deze dagen zou je geen gebruik maken van Visual Basic, er is geen behoefte aan een GUI, en het IP-adres is een technisch nauwkeurig termijn. Dus hou een oogje op deze, en een van mijn favorieten: Deze is een beetje meer mysterieuze, want je moet een andere taal te leren kennen. Er is een taal genaamd Objective-C, dat is een superset van C. Wat betekent dat de C plus een aantal extra functies, waaronder object-georiënteerd programmeren. En dit is de taal die Apple heeft gepopulariseerd voor iOS programmering. En dus hier is een clip van een andere show helemaal, van "Numbers" dat als je echt goed kijkt op je TiVo en pauzeren op het juiste moment, je zult zien dat wat ze zoeken naar is niet helemaal wat er wordt beschreven. En laat me hier proberen een andere audio-aansluiting en zien of we niet kunnen Houd de audio in sync deze tijd. Ik geef je "Numbers". [Man # 1] Het is een 32-bit IPv4-adres. [Man # 2] IP, dat is het internet. >> Prive-netwerk. Het is prive-netwerk Anita's. [Malan] Oke. Dit is Objective-C, en het is voor het kleuren sommige kid's programma, zoals je kunt misschien wel afleiden uit de naam van de variabele daar. Dus dat was dan "Numbers". Dus vandaag en deze week introduceren we een beetje van de wereld van de forensische en de context in de problemen dan ook. Vandaag zal een verkorte lezing zijn omdat er een bijzondere gebeurtenis in hier daarna, dus we zullen een kijkje nemen, en plagen zowel leerlingen en ouders vandaag de dag met een aantal van de dingen die aan de horizon. Onder hen, vanaf maandag, heb je nog een paar klasgenoten. EDX, Harvard en MIT's nieuwe online initiatief voor open courseware en nog veel meer, is de lancering van op de campus van Harvard op maandag. Dat betekent dat komende maandag heb je - als van de laatste telling, 86.000 extra klasgenoten zullen volgen samen met CS50's lezingen en secties en walkthroughs en probleem sets. En als onderdeel van dit, zult u lid worden van de inaugurele klasse van CS50 en nu CS50x. Als onderdeel van deze, nu beseffen dat er zullen een aantal positieve kanten ook. Om klaar te zijn voor dit, voor de massale aantal studenten, volstaat het om te zeggen dat ook al hebben we 108 TFS en CA's, niet helemaal de beste leerling / leraar ratio zodra we raken 80.000 andere studenten. Dus we gaan niet te sorteren zo veel probleem stelt handmatig. Dus introduceerde deze week in het probleem set CS50 Controleer zijn, die zal een command line utility binnen het apparaat dat krijg je als je eenmaal vervolgens bijwerken dit weekend, en je zult in staat zijn om een ​​opdracht uit te voeren, te controleren 50, op uw eigen PSET, en je krijgt wat feedback over de vraag of uw programma is juist of onjuist volgens verschillende specificaties van het ontwerp dat we hebben. Dus meer op dat en het probleem set specificatie en de CS50x klasgenoten zullen worden met behulp van deze ook. Dus probleem set 4 is alles over forensisch onderzoek. En dit stuk werd geïnspireerd door een aantal real-life stuff, waarbij toen ik in graduate school, ik geïnterneerd voor een tijdje met de Middlesex County District Attorney's Office doet forensisch werk met hun lood forensisch onderzoeker, en wat dit bedroeg is, ik denk dat ik een paar week voorbij, is de mis staat politie of anderen zou komen, dan zouden ze drop off dingen zoals harde schijven en cd's en diskettes en dergelijke, en dan het doel van de forensische kantoor was na te gaan of er was of niet het bewijs van een soort. Dit was de Special Investigations Unit, dus het was witteboordencriminaliteit, het was meer verontrustend soort misdaden, alles wat met een soort van digitale media; blijkt dat niet dat veel mensen schrijf een e-mail te zeggen "ik het heb gedaan." Dus heel vaak deze forensische zoekacties kwam niet opdagen heel veel fruit, maar soms mensen zouden schrijven dergelijke e-mails. Dus soms de inspanningen werden beloond. Maar om leidt naar dit forensisch PSET, zullen we introduceren in PSET 4 een beetje graphics. Dus u waarschijnlijk deze dingen voor verleend, JPEG, GIF en dergelijke van deze dag, maar als je echt goed over nadenkt, een beeld, net als het gezicht van Rob, kan worden gemodelleerd als een reeks dots of pixels. Nu bij gezicht Rob, er allerlei kleuren, en zijn we begonnen met de afzonderlijke punten, otherwide bekend als pixels te zien, als we eenmaal begonnen om in te zoomen Maar als we vereenvoudigen de wereld een beetje, en gewoon zeggen dat dit hier is Rob in zwart-wit, goed, te vertegenwoordigen in zwart-wit kunnen we gewoon gebruik maken van binaire. En als we gaan binary, 1 of 0, kunnen spreken we dit hetzelfde beeld van lachende gezicht van Rob met dit patroon van bits: 11000011 vertegenwoordigt wit, wit, zwart, zwart, zwart, zwart, wit wit. En dus het is niet een enorme sprong, dan, om te beginnen met praten over kleurrijke foto's. Dingen die je zou zien op Facebook of neem met een digitale camera, maar, zeker, als het gaat om kleuren, moet je meer bits. En heel gebruikelijk in de wereld van de foto's is het gebruik van niet 1-bits kleur, als dit al doet vermoeden, maar 24-bits kleuren, waar je eigenlijk miljoenen kleuren te krijgen. Zodat in het geval dat we ingezoomd oog Rob, dat was van een aantal miljoenen verschillende kleurrijke mogelijkheden. Dus we zullen introduceren dit in probleem set 4 als in de walkthrough, die zal vandaag om 3:30 in plaats van de gebruikelijke 02:30 door lezing van vrijdag hier. Maar de video zal worden online, zoals gebruikelijk, morgen. We zullen ook kennis maken met een ander bestandsformaat. Dus dit is met opzet bedoeld om intimiderend op het eerste, maar dit is slechts enkele documentatie voor een C struct. Het blijkt dat Microsoft, jaren geleden, hielp populariseren dit formaat, riep de bitmap bestandsformaat, BMP, en dit was een super-eenvoudige, kleurrijke grafische bestandsformaat dat gebruikt werd voor geruime tijd en soms nog steeds voor wallpapers op desktops. Als je terugdenkt aan Windows XP en de glooiende heuvels en de blauwe hemel, die typisch was een BMP of bitmapafbeelding, en bitmaps zijn leuk voor ons, omdat ze een beetje meer complexiteit. Het is niet zo simpel als dit raster van 0's en 1's; in plaats daarvan, heb je dingen zoals een header aan het begin van een bestand. Dus met andere woorden, in een. Bmp-bestand is een hele hoop van 0's en 1's, maar er is een aantal extra 0's en 1's daar. En het blijkt dat wat we waarschijnlijk al vanzelfsprekend voor de jaren, bestandsformaten zoals. doc of. xls of. mp3 of. mp4, ongeacht de bestandsindelingen die u bekend bent met. Nou, dat doet wat het zelfs betekenen naar een bestandsformaat zijn? Omdat aan het eind van de dag, al deze bestanden we hebben slechts 0 en 1's en misschien de 0 en 1 vertegenwoordigen a, b, c, door ASCII of dergelijke, maar door het einde van de dag, het is gewoon 0's en 1's. Dus mensen gewoon af en toe besluiten om een ​​nieuw bestandsformaat uitvinden waar ze standaardiseren welke patronen van bits eigenlijk betekent. En in dit geval hier, de mensen die het ontwerp van de bitmapbestand zei dat bij de eerste byte in een bitmap-bestand als, aangegeven met offset 0, daar, Er zal wat cryptisch benoemde variabele genaamd bfType zijn, dat staat gewoon voor bitmap-bestand type; wat voor type bitmap-bestand dit is. U kunt misschien afleiden, uit de tweede rij dat offset 2, byte nummer 2, een patroon van 0 en 1, dat wat vertegenwoordigt? De grootte van iets, en het gaat van daaruit verder. Dus in probleem set 4, zult u worden gelopen door een aantal van deze dingen. We zullen niet eindigen zorgen te maken over hen allen, merken maar het interessant begint te worden rond regel of byte 54, rgbtBlue, groen en rood. Als je ooit gehoord van de afkorting RGB, rood, groen, blauw, dit is een verwijzing naar die. Omdat het blijkt dat je kunt schilderen alle kleuren van de regenboog met een combinatie van rood en blauw en groen. En in feite zou de ouders in de kamer verwijzen naar enkele eerste projectoren. Deze dagen, zie je gewoon een helder licht dat uit een lens. Maar terug in de dag, je had de rode lens, de blauwe lens, en de groene lens en samen vormen ze gericht zijn op het scherm en vormden een kleurrijk beeld. En heel vaak middelbare scholen en middelbare scholen zou hebben deze lenzen ooit-zo licht-scheef, zodat je soort van het zien van dubbele of driedubbele beelden, maar dat was het idee. Je had rood en groen en blauw licht het schilderen van een beeld. En dat hetzelfde principe wordt gebruikt in computers. Dus onder de uitdagingen, dan, voor u in probleem set 4 gaan worden een paar dingen, een is om daadwerkelijk formaat van een beeld. Te nemen in een patroon van 0 en 1's, erachter te komen welke brokken van 0's en 1's geven weer wat in een structuur als deze, en dan erachter te komen hoe de pixels te repliceren: de rode wijnen, de blues, de greens binnen zodat wanneer een foto eruit aanvankelijk zo kan in plaats uitzien daarna. Onder de andere uitdagingen, ook zal zijn dat u zult worden overhandigd een forensisch beeld van een werkelijke bestand van een digitale camera en op die camera, Once upon a time, waren een hele hoop foto's. Het probleem is, dat we per ongeluk worden gewist of had het beeld een of andere manier beschadigd. Slechte dingen gebeuren met digitale camera's, en dus hebben we snel gekopieerd alle 0's en 1's off van die kaart voor u, gered ze allemaal in 1 groot bestand, en dan zullen we ze overhandigen aan u in probleem set 4, zodat u kunt een programma in C, waarmee om te herstellen schrijven al die JPEG's, ideaal. En het blijkt dat JPEG's, ook al zijn ze iets van een complex bestandsformaat, ze zijn veel complexer dan dit lachend gezicht hier. Het blijkt dat elke JPEG begint met dezelfde patronen van 0 en 1's. Dus met behulp van een while-lus of een for-lus of iets dergelijks, u kunt itereren over alle 0's en 1's in deze forensische afbeelding en elke keer zie je de speciale patroon dat is gedefinieerd in de specificatie van het probleem set's, je kunt, 'Oh, hier is, nemen met een zeer hoge waarschijnlijkheid, het begin van een JPEG-, 'en zodra je hetzelfde patroon, een aantal bytes of kilobytes of megabytes later, kun je ervan uitgaan, 'Ooh! Hier is een tweede JPEG, de foto nam ik na de eerste. Laat me stoppen met lezen, dat eerste bestand, start het schrijven van dit nieuwe. ' En de uitvoer van je programma voor PSET 4 gaat worden maar liefst 50 JPEG's. En als het niet 50 JPEG's, heb je een beetje een lus. Als u een oneindig aantal JPEG-bestanden, heb je een oneindige lus. Zodat, zal ook een veel voorkomend geval te zijn. Dat is wat er aan de horizon. Quiz 0, achter ons. Realiseer, per e-mail mijn, die steevast er mensen die zijn allebei gelukkig, een soort van neutrale, en verdrietig rond quiz 0 tijd. En dan kunt u uit te reiken naar mij, het hoofd TFS, Zamyla, je eigen TF of een van de CA's waarvan je weet als je zou willen om te bespreken hoe het ging. Dus om hier indruk maken op de ouders in de kamer, wat is de CS50 bibliotheek? Goed gedaan. Wat is de CS50 bibliotheek? Ja? [Student antwoorden, onverstaanbaar] >> Oke, goed. Dus het is een vooraf geschreven verzameling code die wij, het personeel, schreef, wij aan u, om een ​​aantal gemeenschappelijke functionaliteiten. Dingen als je me een string; me een int, alle functies die hier worden vermeld. Vanaf nu beginnen we echt met deze zijwieltjes eraf. Dus we gaan beginnen weg te nemen van een "string" van u, die, recall, was gewoon een synoniem voor wat feitelijke gegevens type? char *. Dus voor de ouders, dat was waarschijnlijk - dat is goed, dus char * we beginnen te zien op het scherm des te meer als we "string" uit onze woordenschat, in ieder geval als het gaat om daadwerkelijk schrijven van code. Ook zullen we stoppen met het gebruik van sommige van deze functies zo veel, omdat onze programma's gaat krijgen meer geavanceerde in plaats van alleen programma's schrijven die daar te zitten met een prompt knippert, wachten tot de gebruiker iets typen in Je krijgt je input van elders. Zo krijg je ze uit een reeks van bits op de lokale vaste schijf. Je zult in plaats daarvan krijgen ze in de toekomst van een netwerkverbinding, sommige website ergens. Dus laten we schil terug deze laag voor de eerste keer, en trek de CS50 apparaat en dit bestand genaamd CS50.h, die je hebt scherp geweest ook voor weken. Maar laten we echt zien wat er in deze. Zodat de bovenkant van het bestand in het blauw is gewoon een hele hoop reacties, informatie over de garantie en licenties. Dit is een soort van een gemeenschappelijk paradigma in software, omdat veel software deze dagen is de zogenaamde "open source" Dit betekent dat iemand de code die geschreven en maakte het vrij beschikbaar, niet alleen te lopen en te gebruiken, maar eigenlijk lezen en te veranderen en te integreren in je eigen werk. Dus dat is wat je hebt gebruikt, open source software, zij het in zeer kleine vorm. Als ik scroll naar beneden langs de opmerkingen, hoewel, beginnen we wat meer bekende dingen te zien. Dus merken aan de top hier, dat het CS50.h bestand een hele hoop van header-bestanden bevat. Nu de meeste van deze we nog niet eerder gezien, maar men vertrouwde, welke van deze hebben we gezien, zij het kort, tot nu toe? Ja, standaard bibliotheken. Stdlib.h heeft malloc, dus zodra we begonnen te praten over dynamisch geheugen toewijzing, die we zullen terugkomen om volgende week ook, we begonnen met inbegrip van dat bestand. Het blijkt dat bool en waar en onwaar niet werkelijk bestaan ​​in C, per se, tenzij u onder meer dit bestand hier. Dus we hebben, wekenlang, is inclusief standaard bool.h zodat u kunt gebruik maken van de notie van een bool, waar of onwaar. Zonder deze, zou je moeten sorteren van faken en een int gebruiken en gewoon willekeurig aannemen dat 0 false is en 1 is waar. Nu, als we naar beneden scrollen verder, hier is onze definitie van een string. Het blijkt, zoals we al eerder heb gezegd, dat waar dit * is niet echt belangrijk. U kunt zelfs ruimte rondom. Wij, dit semester, zijn het bevorderen van het, omdat dit duidelijk te maken dat de * te maken heeft met het type. Maar realiseren, net zo gewoon, zo niet een beetje meer gemeen hebben, is er gezegd maar functioneel is het hetzelfde. Maar nu, als we lezen verder omlaag, laten we eens een kijkje op zeggen, GetInt, omdat we dat, misschien, voordat er iets anders dit semester. En hier is GetInt. Dit is wat? Dit is het prototype. Zo vaak hebben we prototypes op de toppen van onze. C-bestanden, maar u kunt er ook prototypes in header-bestanden,. h-bestanden, zoals deze hier, zodat wanneer je schrijft een aantal functies dat u wilt dat andere mensen om te kunnen gebruiken, en dat is precies het geval met de CS50 bibliotheek, u niet alleen het implementeren van uw functies in iets als CS50.c, ook de prototypes maken niet bovenaan dat bestand, maar boven een headerbestand dan is dat header-bestand is wat vrienden en collega's omvatten, met scherpe in hun eigen code. Dus al die tijd je hebt, inclusief alle van deze prototypes effectief aan de bovenkant van uw bestand, maar door middel van deze scherpe omvatten mechanisme dat in wezen kopieert en plakt dit bestand in uw eigen. Nu, hier is een aantal tamelijk gedetailleerde documentatie. We hebben vrij veel vanzelfsprekend dat GetInt een int krijgt, maar het blijkt dat er een hoekje gevallen, toch? Wat als de gebruiker een nummer dat is veel te groot? Een triljoen, dat kan gewoon niet passen binnen van een int? Wat is het verwachte gedrag? Nou, idealiter, het is voorspelbaar. Dus in dit geval, als u daadwerkelijk de kleine lettertjes gelezen, je zult zien dat als de lijn niet kan worden gelezen, dit rendement INT_MAX. We hebben nog nooit over gehad, maar op basis van de kapitalisatie, wat is het, waarschijnlijk? Het is een constante, dus het is een aantal speciale constante die waarschijnlijk is verklaard in een van die header files die tot hogere is in het bestand, en INT_MAX is waarschijnlijk iets als, ruwweg, 2 miljard. Het idee is dat omdat we moeten een of andere manier aan te geven dat er iets mis ging, wij, ja, hebben 4 miljard nummers tot onze beschikking, negatieve 2 miljard tot 2 miljard, geven of te nemen. Nou, wat gebruikelijk is in de programmering is dat je steelt gewoon een van die nummers. Misschien 0, misschien 2 miljard, misschien negatief 2 miljard. Dus je besteedt een van uw mogelijke waarden, zodat u kunt inzetten voor de wereld dat als er iets mis gaat, zal ik terug deze super-grote waarde. Maar u niet wilt dat de gebruiker typt iets cryptisch als "2, 3, 4 ..." van echt grote aantal, waar u in plaats daarvan generaliseren als een constante. Dus echt, als je dat anale de afgelopen weken, wanneer je belt GetInt, moet je zijn controle met een if-conditie. Heeft de gebruiker typt INT_MAX, of meer specifiek, deed GetInt terugkeer INT_MAX? Want als dat zo was, dat betekent dat ze eigenlijk niet typ het; er iets mis ging in dit geval. Dus dit is wat algemeen bekend staat als een "schildwacht" waarde, wat gewoon betekent bijzonder. Nou, laten we nu draaien in de. C-bestanden. De C bestand bestaat in het apparaat enige tijd, en in feite het apparaat heeft het gecompileerde u in dat wat we wel "objectcode" maar het werkt gewoon niet relevant zijn voor u waar het is omdat het systeem weet, in dit geval, waar het, het apparaat. Maar laten we schuiven nu aan GetInt, en te zien hoe GetInt is al die tijd te werken. Hier hebben we dus soortgelijke opmerkingen van tevoren. Laat me in te zoomen op alleen de code gedeelte, en wat we hebben voor GetInt is het volgende. Het duurt geen input en retourneert een int, while (true), dus we hebben een bewuste oneindige lus maar, vermoedelijk, zullen we uit een of andere manier doorbreken van deze, of terugkeren vanuit dit. Dus laten we eens kijken hoe dit werkt. Nou, we lijken te zijn met GetString in deze eerste regel in de lus, 166. Dit is nu een goede praktijk, omdat onder welke omstandigheden kan GetString terug deze speciale zoekwoord, NULL? Als er iets mis gaat. Wat kan er mis gaan als u belt iets als GetString? Ja? [Student antwoord, onverstaanbaar] >> Ja. Dus misschien malloc mislukt. Ergens onder de kap GetString roept malloc, die geheugen toewijst, waarmee de computer op te slaan alle tekens die de gebruiker typt in het toetsenbord. En stel dat de gebruiker had een heleboel vrije tijd en getypt bijvoorbeeld dan 2 miljard tekens. Meer tekens dan de computer heeft zelfs RAM. Nou, GetString moet in staat zijn om dat voor u, ook al is dit een super, super ongewoon hoek geval. Het moet een of andere manier in staat zijn om dit te verwerken, en zo GetString, Als we terug te gaan en lees de documentatie, gaat in feite terug NULL. Nu als GetString niet door terug te keren NULL, wordt GetInt ploft door terug te keren INT_MAX, net als een schildwacht. Dit zijn slechts menselijke conventies. De enige manier waarop je zou weten dat dit het geval is is door het lezen van de documentatie. Dus laten we naar beneden scrollen naar de plaats waar de int is eigenlijk GotInt. Dus als ik naar beneden scrollen een beetje verder, in lijn 170 hebben we een reactie boven deze lijnen. Dus we verklaren in 172, een int n en een char c, en dan is deze nieuwe functie die sommige van jullie hebben struikelde over geweest, maar sscanf. Dit staat voor snaar scan f. Met andere woorden, geef me een string en ik zal het scannen op stukjes informatie van belang. Dus wat betekent dat? Nou, stel dat ik typ in, letterlijk, 1 2 3 op het toetsenbord, en dan druk op enter. Wat is het gegevenstype van 1 2 3 wanneer geretourneerd door GetString? Het is natuurlijk een string, toch? Ik heb een string, dus 1 2 3 is echt "1 2 3" met \ 0 eind ervan. Dat is geen int. Dat is niet een nummer. Het lijkt erop dat een aantal, maar het is niet echt. Dus wat doet GetInt hoeft te doen? Het moet scannen die string links naar rechts, 1 2 3 \ 0 en ergens converteren naar een effectief integer. Nu, zou je erachter te komen hoe dit te doen. Als je terugdenkt aan PSET 2, u waarschijnlijk kreeg een beetje comfortabel met Caesar of vigenere, zodat u kunt itereren over een string, u kunt omzetten chars naar ints met pick. Dat is een hele hoop werk. Waarom niet bellen een functie als sscanf dat voor je doet? Dus sscanf verwacht een argument, in dit geval de naam lijn, dat is een string. Vervolgens geeft u tussen aanhalingstekens, zeer vergelijkbaar met printf, wat verwacht je te zien in deze string? Wat ik hier zeg is, verwacht ik een decimaal getal en misschien een teken te zien. En we zullen zien waarom dit het geval is in slechts een moment. Het blijkt dat deze notatie nu doet denken aan dingen We begonnen te praten over iets meer dan een week geleden. Wat is & n en & c doen voor ons hier? [Student antwoorden, onverstaanbaar] >> Ja. Het geeft me het adres van n en het adres van c. Nu, waarom is dat belangrijk? Nou, je weet dat met functies in C U kunt altijd terugkeren een waarde of geen waarde. U kunt terugkeren een int, een string, een vlotter, een char, wat dan ook. Of u kunt ledig terugkeren, maar je kunt alleen maximaal return 1 ding. Maar hier willen we sscanf om misschien terug te keren me een int, een decimaal getal, en ook een char, en ik zal de reden waarom de char uit te leggen in een moment. Dus u effectief wilt f om 2 dingen terug te keren; dat is gewoon niet mogelijk is in C. Zo kunt u rond die werken door het passeren in 2 adressen, want zodra je met de hand een functie 2 adressen, wat kan die functie doen met hen? Het kan schrijven die adressen. U kunt gebruik maken van de * werking en "go there" voor elk van deze adressen. Het is dit soort backdoor mechanisme, maar zeer gebruikelijk de waarden van variabelen in meer dan een plaats, in dit geval 2. Nu, let op Ik controleer voor == tot1, en vervolgens terug te keren n als dat in feite de waarde true. Dus wat is er aan de hand? Nou, technisch, alles wat we echt willen dat er gebeurt in GetInt is dit. We willen ontleden, om zo te zeggen, we willen de string te lezen "1 2 3" en als het lijkt alsof er een aantal daar, wat we te vertellen sscanf te doen is dat aantal, 1 2 3, in deze variabele n voor mij. Waarom dan, had ik dit ook? Wat is de rol van de ook zeggen: sscanf, u misschien ook een teken hier te komen. [Student spreken, onverstaanbaar] >> Niet - een decimale punt zou kunnen werken. Laten we stellen dat dacht even na. En verder? [Student, onverstaanbaar] >> Dus, een goede gedachte, kan het de NULL-teken. Het is eigenlijk niet in dit geval. Ja? [Student, onverstaanbaar] >> ASCII. Of, laat ik generaliseren nog verder. De% c is er alleen voor foutcontrole. We daar niet willen karakter na het nummer, maar wat dit stelt me ​​in staat om te doen is het volgende: Het blijkt dat sscanf naast het opslaan van waarden in n en c, in dit voorbeeld, wat het ook doet is het geeft het aantal variabelen zet het waarden binnen Dus als je alleen typen in 1 2 3, dan wordt alleen de% d zal overeenkomen met en alleen n wordt opgeslagen met een waarde als 1 2 3 en niets wordt gezet in c; c blijft een vuilnis waarde, om zo te zeggen. Garbage omdat het nooit is geïnitialiseerd als een bepaalde waarde. Zodat in dat geval sscanf retourneert 1, omdat ik bevolkt zo'n pointers, in welk geval, geweldig. Ik heb een int, dus ik vrij van de lijn vrij te maken het geheugen dat GetString daadwerkelijk toegewezen, en dan keer ik terug n. Anders, als je je ooit afgevraagd waar dat probeer het opnieuw uitspraak vandaan komt, komt van hier. Indien daarentegen typen I 1 2 3 foo, slechts enkele willekeurige volgorde van de tekst, wordt sscanf gaan zien, ooh, nummer, ooh, nummer, ooh, nummer, ooh - f. En het gaat om de 1 2 3 gezet in n. Het gaat om de f in c te zetten, en dan 2 terug te keren. We hebben dus, alleen met behulp van de basisdefinitie van het gedrag van scanf's, een zeer eenvoudige manier - goed complex op het eerste gezicht, maar aan het eind van de dag, vrij eenvoudig mechanisme om te zeggen, is er een int, en zo ja, is dat het enige wat ik heb gevonden? En de witte ruimte hier is opzettelijk. Als je leest de documentatie voor sscanf, het vertelt je dat als je een stuk van witte ruimte aan het begin of het einde, sscanf Ook kan de gebruiker, om welke reden dan ook, op de spatiebalk 1 2 3 hit, en dat zal legitiem zijn. Het zal niet schreeuwen tegen de gebruiker alleen maar omdat ze op de spatiebalk aan het begin of het einde, dat is gewoon een beetje meer gebruikersvriendelijk. Hebt u vragen, dan, op GetInts? Ja? [Student vraag, onverstaanbaar] >> Goede vraag. Wat als je zojuist hebt getypt in een char, zoals f, en druk op enter zonder ooit te typen 1 2 3, wat denk je dat het gedrag van deze regel code zou dan kunnen zijn? Zo kan sscanf kunnen vallen, want in dat geval het is niet van plan om n of c te vullen, het gaat in plaats daarvan terug te keren 0. In dat geval, ben ik ook het vangen van dat scenario, omdat de verwachte waarde ik wil: 1. Ik wil alleen 1 en slechts 1 ding in te vullen. Goede vraag. Anderen? Oke, dus laten we niet door alle functies hier, maar degene die lijkt te misschien,, van de resterende rente is GetString omdat blijkt dat GetFloat, GetInt, GetDouble, GetLongLong alle punter een groot deel van hun functionaliteit GetString. Dus laten we eens een kijkje op hoe hij is hier te vinden. Deze ziet er een beetje complex, maar het maakt gebruik van dezelfde fundamenten dat we begonnen te praten over vorige week. Dus in GetString, die neemt geen argument volgens de leegte hier, en het geeft een string, dus ik ben verklaren een string genaamd buffer. Ik weet niet echt wat dat gaat worden gebruikt voor nog niet, maar we zullen zien. Het lijkt erop dat de capaciteit is standaard, 0, niet helemaal zeker waar dit heen gaat. Niet zeker wat n gaat gebruikt worden voor nog niet. Maar nu is het een beetje interessanter, dus in de lijn 243, verklaren we een int c, dit is een soort van een domme detail. Een char is 8 bits, en 8 bits kan opslaan hoeveel verschillende waarden? 256. Het probleem is, als je wilt 256 verschillende ASCII-tekens hebben, die er zijn, als je denkt terug, en dit is niet iets om te onthouden. Maar als je terugdenkt aan die grote ASCII grafiek hadden we weken geleden, er in dat geval, 128 of 256 ASCII karakters. We gebruikten alle patronen van 0's en 1's up. Dat is een probleem als je wilt in staat zijn om een ​​fout op te sporen. Want als je al met 256 waarden voor je personages, je niet echt vooruit te plannen, want nu heb je geen manier om te zeggen, "Dit is niet een legit karakter, dit is wat verkeerde boodschap." Dus wat de wereld doet is, gebruiken ze de volgende grootste waarde, iets als een int, zodat u een gekke aantal bits, 32 voor 4 miljard mogelijke waarden, zodat u kunt gewoon uiteindelijk met behulp van, wezen 257 daarvan, waarvan 1 heeft een speciale betekenis als een fout. Dus laten we eens kijken hoe dit werkt. In lijn 246, ik heb deze grote while loop dat roept fgetc, f betekenis bestand, getc, en dan stdin. Blijkt dat dit nog maar het nauwkeuriger manier om te zeggen "lees de input van het toetsenbord." Standaard invoermiddelen toetsenbord, standaard uitvoer betekent scherm, en standaard fout, die we zullen zien in PSET 4, betekent dat het scherm, maar een speciaal deel van het scherm, zodat het niet vermengd met de werkelijke output die je van plan was om af te drukken, maar meer op dat in de toekomst. Dus fgetc betekent gewoon las een teken van het toetsenbord, en bewaar het waar? Bewaar het in c, en dan te controleren, dus ik ben gewoon met behulp van enkele boolean voegwoorden hier, controleren dat het niet gelijk \ n, dus de gebruiker heeft op enter. We willen op dit punt stoppen, einde van de lus, en wij ook willen controleren voor de speciale constante, EOF, dat als u weet of denk - wat doet het er voor? End of file. Dus dit is een soort van onzinnig, want als ik het typen op het toetsenbord, er is echt geen bestand bij deze, maar dit is gewoon soort van de generieke term die wordt gebruikt in de betekenis dat er niets anders is afkomstig van de vingers van de mens. EOF. End of file. Even terzijde, als je ooit geraakt controle d op je toetsenbord, niet dat je zou nog, je hebt geraakt controle c. Maar controle d stuurt deze speciale constante genoemd EOF. Dus nu hebben we gewoon wat dynamisch geheugen toewijzing. Dus als n + 1> capaciteit, nu zal ik uitleggen n. n is alleen hoeveel bytes zijn op dit moment in de buffer, de string dat u momenteel opbouwen van de gebruiker. Als u meer tekens in je buffer dan je capaciteit in de buffer te hebben, intuïtief, is wat we moeten doen dan toe te wijzen meer capaciteit. Ik ga scheren over een aantal van de rekenkundige hier en hier alleen richten op deze functie. Je wat malloc is, althans algemeen bekend. Raad eens wat realloc doet. [Student antwoord, onverstaanbaar] >> Ja. En het is niet helemaal het toevoegen van geheugen, het geheugen bijstuurt als volgt: Als er nog ruimte aan het einde van de string, zodat u meer van dat geheugen dan het oorspronkelijk geeft je, dan krijg je dat er extra geheugen. Zo kunt u zomaar de snaren tekens rug aan rug aan rug aan rug. Maar als dat niet het geval is, omdat je te lang gewacht en iets willekeurig kreeg plofte in het geheugen, maar er is een extra geheugen hier beneden, dat is oke. Realloc gaat al het zware werk voor u doen, verplaatst u de tekenreeks die u hebt gelezen in zo ver van hier, zet het daar beneden, en dan geef je wat meer start-en landingsbaan op dat punt. Dus met een golf van de hand, wil ik zeggen dat wat GetString doet wordt het begint met een kleine buffer, misschien 1 enkel karakter, en als de gebruiker in 2 tekens, GetString eindigt bellen realloc en zegt: 'Ooh, 1 karakter was niet genoeg. Geef me 2 karakters. ' Als je dan lezen via de logica van de lus, het gaat om te zeggen, "Ooh, de gebruiker heeft ingevoerd in 3 karakters. Geef me nu niet 2 maar 4 letters, geef me dan 8, dan geef me 16 en 32. " Het feit dat ik een verdubbeling van de capaciteit telkens betekent dat de buffer niet zal langzaam groeien. Het gaat super snel groeien, en wat zou het voordeel van dat zijn? Waarom ben ik een verdubbeling van de grootte van de buffer, ook al is de gebruiker misschien gewoon behoefte 1 extra teken van het toetsenbord? [Student antwoord, onverstaanbaar]. >> Wat is dat? Precies. Je hoeft het niet te laten groeien zo vaak. En dit is gewoon een soort van een - je bent afdekken van uw weddenschappen hier. Het idee is dat je niet wilt realloc veel noemen, omdat het de neiging om traag. Elke keer dat je het vraagt ​​het besturingssysteem voor het geheugen, zoals u zult zien in een toekomstig probleem set, het de neiging om enige tijd duren. Dus het minimaliseren van dat bedrag van de tijd, zelfs als je verspilt wat ruimte, heeft de neiging om een ​​goede zaak. Maar als we hier door te lezen het laatste deel van GetString, en nogmaals, het begrijpen van elke regel is hier niet zo belangrijk vandaag. Maar let erop dat het uiteindelijk dringt er nogmaals malloc, en het wijst precies zoveel bytes als het nodig heeft voor de string en dan gooit door te bellen gratis, de te grote buffer, als het inderdaad werd verdubbeld te vaak. In het kort, dat is hoe GetString is al die tijd te werken. Alles wat het doet is lezen een karakter per keer opnieuw en opnieuw en opnieuw en elke keer dat het heeft wat extra geheugen, vraagt ​​het besturingssysteem voor het door te bellen realloc. Nog vragen? Oke. Een aanval. Nu we pointers begrijpen, althans zijn steeds beter bekend met pointers, laten we eens kijken hoe de hele wereld begint in te storten als je het niet helemaal te verdedigen tegen vijandige gebruikers, mensen die proberen te hacken in uw systeem. Mensen die proberen om uw software te stelen door het omzeilen sommige registratiecode dat ze anders moeten typen inch Neem hier een kijkje naar dit voorbeeld, dat is gewoon C-code dat een functie belangrijkste onderaan dat roept een functie foo, en waarvoor wordt het doorgeven aan foo? [Student] Een enkel argument. >> Single argument. Dus argv [1], wat betekent dat het eerste woord de gebruiker heeft ingevoerd op de opdrachtregel na a.out of wat dan ook het programma wordt aangeroepen. Dus foo, bovenaan neemt in een char *, maar char * precies wat? String. Er is niets nieuw hier, en die string wordt willekeurig wordt genoemd bar. In deze lijn hier, char c [12], in een soort van semi-technisch Engels, is wat deze lijn aan het doen? Array of -? Personages. Geef me een array van 12 tekens. Dus we zouden kunnen noemen dit een buffer. Het is technisch heet c, maar een buffer in de programmering betekent gewoon een stelletje van de ruimte die u kunt wat spullen erin stopt Dan tot slot, memcpy, hebben we niet eerder gebruikt. Maar je kunt waarschijnlijk wel raden wat het doet. Het kopieert het geheugen. Wat doet het? Nou, het schijnt kopieert bar, de invoer, in c, maar slechts tot de lengte van de bar. Maar er is een bug hier. Oke, dus technisch gezien moeten we echt doen strlen (bar) x sizeof (char), dat klopt. Maar in het ergste geval hier, laten we aannemen dat Dat is - zo, oke. Dan is er nog 2 bugs. Dus sizeof (char), oke, laten we dit een beetje breder. Dus nu is er nog een bug, dat is wat? [Student antwoord, onverstaanbaar] >> Controleer voor wat? Oke, dus we moeten het controleren van voor NULL, want slechte dingen gebeuren als de aanwijzer NULL is, Omdat je zou kunnen eindigen gaan er, en je moet nooit gaan op NULL door dereferentie met de * operator. Dus dat is goed, en wat doen we? Logisch dat er een fout hier ook. [Student antwoord, onverstaanbaar] >> Dus controleren of argc ≥ 2? Oke, dus er is hier 3 bugs in dit programma. We zijn niet te controleren of de gebruiker daadwerkelijk getypt in iets in argv [1], goed. Dus wat is de derde bug? Ja? [Student antwoord, onverstaanbaar] >> Goed. We checkten een scenario. We impliciet gecontroleerd niet meer geheugen te kopiëren dan zou groter zijn dan de lengte van de bar. Dus als de string de gebruiker heeft ingevoerd in is 10 tekens lang, deze zegt: 'Kopieer alleen 10 tekens.' En dat is niet erg, maar wat als de gebruiker heeft ingevoerd in een woord de prompt zoals een 20 karakters woord, dit is te zeggen kopie 20 tekens van bar naar wat? c, ook wel bekend als onze buffer, wat betekent dat je alleen gegevens geschreven tot 8 byte locaties die u niet bezit, en u niet de eigenaar hen in de zin dat je ze nooit toegewezen. Dus dit is wat algemeen bekend staat als de buffer overflow aanval, of bufferoverloop aanval, en het is aanval in de zin dat als de gebruiker of het programma dat er belt uw functie doet dit kwaadwillig, wat gebeurt er eigenlijk naast kan heel slecht. Laten we hier een kijkje nemen op deze foto. Deze foto vertegenwoordigt uw stapel van het geheugen. En herinneren dat elke keer als je een functie aanroept, krijg je dit kleine frame op de stapel en dan nog een en toen nog een en toen nog een. En tot nu toe hebben we gewoon een soort van geabstraheerd deze weg als rechthoeken Of er op het bord of op het scherm hier. Maar als we inzoomen op een van die rechthoeken, Wanneer u een functie foo noemen, blijkt dat er meer op de stapel binnenkant van dat frame en die rechthoek dan alleen x en y en a en b, zoals we hebben het over swap. Het blijkt dat er een aantal op een lager niveau details, onder hen terug te keren adres. Zo blijkt bij het belangrijkste noemt foo, de belangrijkste te informeren foo wat de belangrijkste zijn adres in het geheugen van de computer. Want anders zodra foo gedaan uitgevoerd, zoals in casu, als je eenmaal zo dicht accolade aan het einde van foo, hoe de heck is foo weet waar controle van het programma wordt verondersteld om te gaan? Het blijkt dat het antwoord op die vraag is in dat rode rechthoek hier. Dit is een pointer, en het is de computer tijdelijk opslaan,, de zogenaamde stack het adres van algemeen omdat zodra foo gebeurt uitgevoerd, de computer weet waar en wat lijn in de belangrijkste om terug te gaan naar. Opgeslagen framepointer betrekking op dezelfde wijze als deze. Char * bar hier staat voor wat? Nou, nu deze blauwe segment is hier foo het frame, wat is bar? Oke, dus bar is gewoon het argument om de foo functie. Dus nu zijn we terug op het vertrouwde beeld. Er is meer spullen en meer afleiding op het scherm maar dit licht blauwe segment is wat we hebben al getekend op het bord voor iets als swap. Dat is het frame voor foo en het enige wat in het nu is bar, dat deze parameter. Maar wat moet in de stapel volgens deze code hier? Char c [12]. Dus we moeten ook zie 12 vierkantjes van het geheugen, toegewezen aan een variabele met de naam c. En inderdaad we hebben dat op het scherm. De top is er c [0] en de auteur van dit schema nam niet de moeite het tekenen van alle van de pleinen, maar er zijn inderdaad 12 er want als je kijkt naar de onderkant rechts, c [11], als je telt vanaf 0, is de 12 dergelijke bytes. Maar hier is het probleem: In welke richting wordt c groeit? Soort van boven naar beneden, toch? Als het begint aan de bovenkant en groeit naar beneden, ziet er niet uit alsof we vertrokken ons veel start-en landingsbaan hier helemaal. We hebben soort van geschilderd onszelf in een hoek, en dat c [11] is goed tegen bar, die recht omhoog tegen stack frame pointer, die recht tegen het retouradres, er is geen plaats meer. Dus wat is de implicatie, dan, als je verpesten, en je probeert te lezen 20 bytes in een 12-byte buffer? Waar zijn die 8 extra bytes ga? In alles, waarvan sommige super belangrijk. En het allerbelangrijkste, potentieel, is de rode doos daar retouradres. Want stel dat je per ongeluk of adversarially overschrijven die 4 bytes, die pointer adres, niet alleen met afval, maar met een nummer dat toevallig een effectief adres vertegenwoordigen in geheugen? Wat is het implicaiton, logisch? [Student antwoorden, onverstaanbaar] >> Precies. Wanneer foo terug en hits die accolade, wordt het programma gaat verder niet om terug te keren naar de belangrijkste, het gaat om terug te keren naar wat adres is in die rode doos. Nu, in het geval van te omzeilen software registratie, wat is het adres dat wordt teruggegeven aan wordt de functie die normaal gesproken wordt aangeroepen nadat je hebt betaald voor de software en ingevoerd uw registratie code? Je kon sorteren van truc de computer in de niet hier te gaan, maar in plaats daarvan, gaan hier. Of, als je echt slim, kan een tegenstander daadwerkelijk in te typen op het toetsenbord, bijvoorbeeld, geen echte woord, niet 20 tekens, maar stel dat hij of zij soorten in een aantal karakters die code voor? En het niet gaat om C-code te zijn, het gaat om de tekens dat vertegenwoordigen binaire machine codes, 0's en 1's. Maar stel dat ze slim genoeg om dat te doen, om een ​​of andere manier te plakken in de GetString prompt zich wezenlijk gecompileerde code, en de laatste 4 bytes te overschrijven dat retouradres, en welk adres doet die ingang te doen? Het slaat in deze rode rechthoek het adres van de eerste byte van de buffer. Dus je moet echt slim, en dit is een veel vallen en opstaan voor slechte mensen die er zijn, maar als je kunt achterhalen hoe groot deze buffer is, zodanig dat de laatste paar bytes in de ingang die u verstrekt aan het programma toevallig gelijk aan het adres van de start van de buffer, U kunt dit doen. Als we zeggen, normaal gesproken, hallo, en \ 0, dat is wat uiteindelijk in de buffer. Maar als we slimmer, en vullen we die buffer met wat we generiek noemen aanval code, A, A, A, A: Attack, aanval, aanval, aanval, waar dit is gewoon iets dat er iets ergs doet. Nou, wat gebeurt er als je echt slim, u dit kunt doen: In het rode vak hier is een reeks getallen: 80, CO, 35, 08. Merk op dat het aantal dat is hier past. Het is in omgekeerde volgorde, maar daarover een andere keer. Merk op dat deze terugkeer-adres opzettelijk is gewijzigd naar het adres hier gelijk op, niet het adres van de belangrijkste. Dus als de bad guy is super slim, wordt hij of zij gaat nemen in die aanval code iets als, 'Verwijder alle bestanden van de gebruiker. " Of 'Kopieer de wachtwoorden' of 'Maak een gebruikersaccount die ik kan inloggen op.' Wat dan ook, en dit is zowel het gevaar en de kracht van C. Omdat u toegang heeft tot het geheugen via de pointers en je kan ook schrijven wat je wilt in het geheugen van een computer. U kunt een computer doen wat je wilt gewoon door hebben het rond te springen binnen zijn eigen geheugenruimte. En zo, tot op de dag, zo veel programma's en zo veel websites die in het gedrang neer op mensen gebruik maken van deze. En dit lijkt misschien een super-geavanceerde aanval, maar het hoeft niet altijd te beginnen op die manier. De realiteit is dat wat slechte mensen zullen doorgaans doen is, of het nu een programma op een opdrachtregel of een GUI programma of een website, wordt je gewoon beginnen met het verstrekken onzin. U typt in een echt groot woord in het zoekveld en druk op enter, en je wacht om te zien of de website crasht. Of je wacht om te zien of het programma manifesteert een foutmelding. Want als je geluk hebt krijg, als de bad guy, en u te voorzien wat gekke ingang dat het programma crasht, dat betekent dat de programmeur niet anticiperen op uw slecht gedrag wat betekent dat u kunt waarschijnlijk, met genoeg inspanning, genoeg trial and error, erachter te komen hoe je een meer precieze aanval voeren. Dus net zo goed een onderdeel van de veiligheid is niet alleen het vermijden van deze aanvallen helemaal, maar ze op te sporen en eigenlijk op zoek naar logs en te zien wat gekke inputs mensen getypt in uw website. Welke zoektermen zijn getypt mensen in uw website in de hoop overlopen een aantal buffer? En dit komt allemaal neer op de eenvoudige basis van wat is een array, en wat betekent het toe te wijzen en te gebruiken geheugen? En met betrekking tot dat ook, is het volgende. Dus laten we gewoon binnen blik van een harde schijf nog maar eens. Dus u herinneren van een week of twee geleden dat wanneer je bestanden slepen naar de prullenbak of prullenmand, wat gebeurt er? [Student] Niets. >> Ja, absoluut niets. Uiteindelijk als je lage op de harde schijf ruimte, zal Windows of Mac OS te starten verwijderen van bestanden voor je. Maar als u sleept iets in, dan is het helemaal niet veilig. Al uw kamergenoot, vriend of familielid hoeft te doen is dubbel klikken, en voila. Er is alle schetsmatig bestanden die u probeerde te verwijderen. Dus de meesten van ons in ieder geval weten dat je naar rechts te klikken of klik op en leeg de prullenbak, of iets dergelijks. Maar zelfs dan, is dat niet helemaal doen de truc. Want wat gebeurt er als je een bestand op uw harde schijf dat vertegenwoordigt ongeveer Word-document of een JPEG? En dit is je harde schijf, en laten we zeggen dat dit stukje hier is dat bestand, en het is samengesteld uit een hele hoop van 0's en 1's. Wat gebeurt er als je niet alleen dat bestand slepen naar de prullenbak of prullenmand, maar ook deze legen? Soort van niets. Het is niet helemaal niets nu. Nu is het gewoon niets, want een beetje iets gebeurt in de vorm van deze tabel. Dus er is een soort van database of tabel binnenkant van een computer het geheugen dat in essentie een kolom voor bestandsnamen, en 1 kolom voor de locatie-bestand, wanneer die kan plaats 123, maar een willekeurig getal te zijn. Dus we zouden kunnen hebben iets als x.jpg, en de locatie 123. En wat gebeurt er dan, als je leeg je prullenbak? Dat weg gaat. Maar wat gaat niet weg is de 0's en 1's. Dus wat is dan de verbinding PSET 4? Nou, met PSET 4, alleen maar omdat we per ongeluk worden verwijderd de compact flash kaart die al deze foto's had, of gewoon omdat het door pech werd beschadigd, betekent niet dat de 0's en 1's niet zijn er nog steeds. Misschien een paar van hen verloren gaan omdat er iets heb beschadigd in de zin dat sommige van 0 werd 1 en 1's werden 0's. Slechte dingen kunnen gebeuren als gevolg van buggy software of defecte hardware. Maar veel van die stukjes, misschien zelfs 100% van hen zijn er nog steeds, het is gewoon dat de computer of de camera niet weet waar JPEG 1 gestart en waar JPEG 2 begonnen, maar als je, de programmeur, weet, met een beetje savvy, waar die JPEG-bestanden zijn of hoe ze er uitzien, kunt u het analyseren van de 0's en 1's en zeggen: "Ooh. JPEG. Ooh, JPEG. ' U kunt een programma met voornamelijk alleen een voor-of while loop dat herstelt elk een van die bestanden in. De les is dus om te beginnen met "veilig" uw bestanden wissen Als u wilt helemaal te vermijden dit. Ja? [Student vraag, onverstaanbaar] >> Heeft u meer geheugen dan je voorheen deed - Oh! Goede vraag. Dus waarom, dan, na het legen van de prullenbak, heeft uw computer vertellen dat je meer vrije ruimte dan je voorheen deed hebben? In een notendop, omdat hij of zij ligt. Meer technisch, heb je meer ruimte. Want nu u hebt gezegd, kun je andere dingen waar het filesysteem ooit was, maar dat betekent niet dat de bits gaan weg, en dat betekent niet dat de bits worden allemaal 0 veranderd, bijvoorbeeld, voor uw bescherming. Daarentegen, als je "veilig" erase bestanden, of fysiek te vernietigen het apparaat, dat is echt de enige manier, soms, rond dat. Dus waarom niet laten we op die semi-eng noot, en we zullen u op maandag. CS50.TV