[Powered by Google Translate] [WOCHE 5]
[David J. Malan, Harvard University]
[Dies ist CS50.] [CS50.TV]
[Frau] Er lügt, über was, ich weiß es nicht.
[Man] Also, was wissen wir?
[Frau], dass bei 9:15, Ray Santoya am Geldautomaten war.
[Man] Die Frage ist also, was war er denn bei 9:16?
[Frau] Schießen Sie die 9 mm auf etwas.
Vielleicht sah er die Scharfschützen.
[Man] Oder er wurde mit ihm zu arbeiten.
[Frau] warten. Zurück ein.
[Man] Was siehst du?
[♫ Spannungsgeladene Musik ♫]
[Frau] Bringt sein Gesicht. Vollbild.
[Man] Seine Brille. >> Es ist eine Reflexion.
[♫ Spannungsgeladene Musik ♫]
[Man] Das ist der Nuevita Baseball-Team. Das ist ihr Logo.
[Frau] Und er hat zu wer trägt die Jacke sprechen.
>> [David Malan] Also, das ist CS50 Woche 5, und heute haben wir ruinieren ein bisschen Fernsehen und Film für Sie.
Also, wenn Sie eine Sendung wie diese hier,
und die Polizisten sagen: "Können Sie das bereinigen?" oder "Enhance"
es gibt keine in der realen Welt zu verbessern.
In der Tat, was Sie wirklich bekommen ist ein wenig so etwas wie dieses.
Ich habe einen der Mitarbeiter von Fotos von der Seite gezogen.
Dies ist ein Programm namens Photoshop. Dies ist 1 von 2 Bowdens,
1 von 3 Bowdens eigentlich heute, denn wir haben Mrs. Bowden auch hier mit Rob und Paul.
Aber hier ist Rob auf dem Bildschirm, und wenn wir vergrößern auf diesem Glitzern er immer im Auge hatte,
was Sie tatsächlich sehen, ist das, was du siehst, ist was du bekommst.
Dies ist "enhanced", so "CSI" haben es ein bisschen falsch.
Es gibt einen anderen Clip, wenn wir uns auf "CSI" nur ein bisschen mehr auswählen können.
Dieses ist ein schönes Wort, künftig zu äußern, wenn du willst
klingt mit Ihren Freunden technischen wenn wirklich sagen, dass du absolut nichts sehen.
>> [Man] Seit Wochen Ich habe die Untersuchung der Cabby Killer-Morde
mit einer gewissen morbiden Faszination.
[Woman # 1] Dies ist in Echtzeit.
[Woman # 2] Ich werde eine GUI-Schnittstelle mit Visual Basic erstellen, sehen, ob ich eine IP-Adresse verfolgen können.
>> [Malan] So Audio out of sync beiseite, die Schaffung eines GUI-Schnittstelle mit Visual Basic
eine IP-Adresse zu verfolgen ist völliger Unsinn.
In diesen Tagen würden Sie nicht verwenden Visual Basic,
es gibt keine Notwendigkeit für eine GUI und IP-Adresse war eine technisch genaue Begriff.
So halten Sie ein Auge für diese, und einer meiner Favoriten:
Dieser ist ein wenig mehr geheimnisvoll, weil Sie eine andere Sprache wissen müssen.
Es gibt eine Sprache namens Objective-C, die eine Obermenge von C ist
Das bedeutet, es ist C plus einige zusätzliche Funktionen, darunter die objektorientierte Programmierung.
Und das ist die Sprache, dass Apple für iOS-Programmierung popularisiert.
Und hier ist ein Clip aus einer anderen Show überhaupt, von "Numbers"
, dass, wenn Sie tatsächlich genau hinsehen auf Ihrem TiVo und Pause zum richtigen Zeitpunkt,
Sie sehen, dass das, was sie sehen, ist nicht ganz das, was beschrieben.
Und lassen Sie mich versuchen, eine andere Audio-Anschluss hier und sehen, ob wir nicht
halten Sie die Audio synchron dieser Zeit.
Gebe ich euch "Numbers".
>> [Man # 1] Es ist ein 32-Bit-IPv4-Adresse.
[Man # 2] IP, das ist das Internet. >> Private Netzwerk. Es ist Anita privaten Netzwerk.
[Malan] Okay. Dies ist Objective-C, und es ist für einige Kinder-Färbung Programm
wie man vielleicht aus dem Namen der Variablen gibt abzuleiten.
Damit war dann "Numbers". Also heute und in dieser Woche stellen wir
ein wenig in die Welt der Forensik und dem Kontext, in den Problemen daher.
Heute wird eine gekürzte Vortrages sein, weil es ein besonderes Ereignis hier
danach, so nehmen wir einen Blick, und necken sowohl Studenten und Eltern gleichermaßen heute
mit einigen der Dinge, die am Horizont.
Unter ihnen ab Montag, haben Sie noch ein paar Klassenkameraden.
EdX, Harvard und MITs neue Online-Initiative für Open Courseware
und mehr, auf Harvard-Campus startet am Montag.
Was bedeutet, kommen Montag haben Sie - wie der letzten Zählung
86.000 zusätzliche Klassenkameraden folgen werden zusammen mit CS50 Vorlesungen
und Abschnitte und Komplettlösungen und Problem-Sets.
Und als Teil dieser, werden Sie Mitglied der konstituierenden Klasse geworden
CS50 und jetzt CS50x.
>> Als Teil dieser, jetzt erkennen, dass es einige upsides als gut.
Um bereit für diese, für die große Anzahl von Studenten,
es genügt zu sagen, dass, obwohl wir 108 TFs und CAs
nicht ganz der beste Schüler / Lehrer-Verhältnis, wenn wir 80.000 anderen Studenten getroffen.
So werden wir nicht zu einem Gehalt so viele Probleme setzt manuell.
So führte in dieser Woche das Problem Set wird CS50 prüfen sein,
was wird ein Kommandozeilenprogramm innerhalb des Gerätes
dass Sie bekommen, wenn Sie es später aktualisieren an diesem Wochenende,
und du wirst in der Lage sein, einen Befehl auszuführen, überprüfen 50,
auf Ihrem eigenen pset, und du wirst ein Feedback, ob Ihr Programm zu bekommen
richtig oder falsch nach verschiedenen Design-Spezifikationen, die wir zur Verfügung gestellt haben.
So mehr dazu und das Problem Satz Spezifikation und
die CS50x Klassenkameraden verwenden werden diese als gut.
>> So Problem Satz 4 dreht sich alles um Forensik.
Und dieses Stück wurde von einigen realen Sachen inspiriert,
wodurch dann, wenn ich in Graduiertenschule war, interniert ich für eine Weile mit
des Middlesex County District Attorney Büro zu tun forensische Arbeit
mit ihren Blei Forensiker, und was diese beliefen sich auf
ist, ich glaube, ich erwähnte ein paar Wochen in der Vergangenheit wird die Masse Staatspolizei oder andere
würde kommen, würden sie Drop-off Dinge wie Festplatten und CDs und Disketten
und dergleichen, und dann wird das Ziel der Forensik Büro war zu prüfen, ob
es war oder nicht Beweise einiger sortieren.
Dies war der Special Investigations Unit, so war es von Wirtschaftskriminalität,
es war mehr beunruhigende Art von Verbrechen,
alles was mit irgendeine Art von digitalen Medien; sich heraus, dass nicht so viele Leute
schreiben Sie uns eine E-Mail sagen "Ich habe es getan."
So oft diese Forensik Suchbegriffe nicht auftauchen, dass alle viel Obst,
aber manchmal Leute schreiben würden solche E-Mails.
Also manchmal die Bemühungen wurden belohnt.
>> Aber zu führen bis zu diesem forensischen pset, werden wir in pset 4 ein wenig von Grafiken vorstellen.
So dass Sie wahrscheinlich nehmen diese Dinge für selbstverständlich, JPEGs, GIFs und wie in diesen Tagen,
aber wenn du wirklich darüber nachdenken, ein Bild, ähnlich wie Rob Gesicht,
konnte als eine Sequenz von Punkten oder Pixeln modelliert werden.
Nun bei Rob Gesicht, gibt es alle Arten von Farben,
und wir begannen, die einzelnen Punkte, otherwide als Pixel bekannt zu sehen,
sobald wir angefangen zu vergrößern in.
Aber wenn wir zu vereinfachen, die Welt ein wenig, und nur sagen, dass dies hier Rob ist
in schwarz und weiß, gut, zur Darstellung von Schwarz und Weiß können wir einfach binär.
Und wenn wir gehen, um binäre verwenden, 1 oder 0, können wir ausdrücken dieses gleiche Bild
der lächelnde Gesicht Robs mit diesem Muster der Bits: 11000011 stellt
weiß, weiß, schwarz, schwarz, schwarz, schwarz, weiß weiß.
Und so ist es nicht ein großer Sprung, dann darüber zu sprechen bunte Fotografien.
Dinge, die man auf Facebook sehen oder mit einer Digitalkamera würde,
aber, natürlich, wenn es um Farben geht, brauchen Sie mehr Bits.
Und recht häufig in der Welt der Fotos ist nicht 1-Bit-Farbe zu verwenden,
da dies nahe legt, aber. 24-Bit-Farbe, wo Sie tatsächlich Millionen von Farben
So wie in dem Fall, wenn wir uns auf Rob Auge gezoomt,
das war eine beliebige Anzahl von Millionen von verschiedenen bunten Möglichkeiten.
>> Also werden wir dies Problem Satz 4 sowie in der exemplarischen Vorgehensweise einzuführen,
die wird heute um 3:30 Uhr statt der üblichen 02.30 aufgrund Freitag Vortrag hier.
Aber das Video online sein wird, wie üblich, morgen.
Wir werden auch eine Einführung in ein anderes Dateiformat.
Also das ist absichtlich soll auf den ersten Blick einschüchternd,
aber das ist nur Teil der Dokumentation für eine C-Struktur.
Es stellt sich heraus, dass Microsoft vor Jahren geholfen zu popularisieren dieses Format,
als die Bitmap-Datei-Format, BMP, und dies war ein super-einfach,
bunten grafischen Dateiformat, das seit geraumer Zeit verwendet wurde
und manchmal noch für Tapeten auf Desktops.
Wenn Sie glauben, zurück zu Windows XP und die sanften Hügel und blauer Himmel,
das war in der Regel ein BMP-oder Bitmap-Bild, und Bitmaps
sind ein Spaß für uns, weil sie ein bisschen mehr Komplexität zu haben.
Es ist nicht ganz so einfach, wie dieses Raster von 0 und 1 ist;
Stattdessen müssen Sie Dinge wie ein Header am Anfang einer Datei.
Also mit anderen Worten, in einem. Bmp-Datei ist eine ganze Reihe von 0 und 1 ist,
aber es gibt einige zusätzliche 0 und 1 ist drin.
Und es stellt sich heraus, dass das, was wir haben wahrscheinlich gemacht für für Jahr gewährt,
Dateiformate wie. doc oder. xls oder. mp3 oder. mp4,
unabhängig von den Dateiformaten, die Sie vertraut sind.
Nun, was macht es sogar bedeuten, ein Dateiformat?
Denn am Ende des Tages haben alle diese Dateien verwenden wir nur 0 und 1 ist
und vielleicht die 0en und 1en repräsentieren a, b, c, bis ASCII oder dergleichen,
aber bis zum Ende des Tages ist es nur 0 und 1 ist.
>> So Mensch nur gelegentlich entscheiden, ein neues Dateiformat erfinden
wo sie zu standardisieren, was Abfolgen von Bits wird eigentlich bedeuten.
Und in diesem Fall hier, die Leute, die konzipiert die Bitmap-Datei-Format
sagte, dass bei der ersten Byte in einer Bitmap-Datei, wie Offset 0 bezeichnet, da
es geht um einige kryptisch benannten Variable namens bfType sein,
das steht nur für Bitmap-Datei-Typ; welche Art von Bitmap-Datei ist.
Sie entnehmen kann, vielleicht aus der zweiten Reihe, dass 2 versetzt, Byte Zahl 2,
ein Muster von 0 und 1 ist, was darstellt?
Die Größe von etwas, und es geht von dort.
Also Problem Satz 4, werden Sie durch einige dieser Dinge begangen werden.
>> Wir werden am Ende nicht die Sorge um alle von ihnen, aber merkt es beginnt, interessant zu
um Zeile oder Byte 54, rgbtBlue, grün und rot.
Wenn Sie jemals die Abkürzung RGB, rot, grün, blau gehört habe, ist dies ein Verweis darauf.
Da es sich herausstellt, können Sie malen alle Farben des Regenbogens
mit einer Kombination aus rot und blau und grün.
Und in der Tat, könnten die Eltern im Zimmer erinnern an einige der frühesten Projektoren.
In diesen Tagen, die Sie gerade sehen 1 helles Licht aus einer Linse.
Aber zurück in den Tag, musste man die rote Linse, die blaue Linse, und die grüne Linse
und gemeinsam ausgerichtet auf den Bildschirm und bildeten ein buntes Bild.
Und ziemlich oft Mittelschulen und Gymnasien müssten diese Objektive
immer so leicht schräg, so dass Sie waren irgendwie sehen doppelt oder dreifach Bilder,
aber das war die Idee. Sie hatten rote, grüne und blaue Licht ein Bild zu malen.
Und das gleiche Prinzip wird bei Computern verwendet.
>> So gehören zu den Herausforderungen, dann für Sie in Problem-Set 4
gehen, um ein paar Dinge zu sein, man ist tatsächlich die Größe eines Bildes.
Um in einem Muster von 0en und 1en nehmen,
herauszufinden, welche Brocken von 0 und 1 ist, was in einer Struktur wie folgt darstellen,
und dann herausfinden, wie man die Pixel replizieren: die Rotweine, die Blues, die Grüns
innen, so dass, wenn ein Bild so aussieht anfangs könnte wie folgt statt zu suchen danach.
Zu den weiteren Herausforderungen auch sein wird, dass Sie übergeben werde
eine forensische der eigentlichen Datei von einer Digitalkamera
und auf dieser Kamera, einmal eine Zeit, da waren eine ganze Reihe von Fotos.
Das Problem ist, wir versehentlich gelöscht oder hatten das Bild verfälscht irgendwie.
Bad Dinge mit digitalen Kameras geschehen, und so haben wir schnell alle 0 und 1 ist kopiert
Aus dieser Karte für Sie, rettete sie alle in 1 große Datei, und dann werden wir sie Ihnen übergeben
in Problem-Set 4, so dass Sie ein Programm in C, mit denen sich zu erholen schreiben können
all diese JPEGs, ideal.
Und es stellt sich heraus, dass die JPEGs, obwohl sie etwas von einem komplexen Dateiformat sind,
sie sind viel komplexer als dieses lächelnde Gesicht hier.
Es stellt sich heraus, dass jeder JPEG mit den gleichen Mustern von 0 und 1 ist gestartet.
Also mit einer while-Schleife oder eine for-Schleife oder ähnliches,
Sie können über alle 0 und 1 ist in diesem forensische iterieren
und jedes Mal, wenn Sie das spezielle Muster, die in der Problem-Satzes Spezifikation definiert ist,
Sie können davon ausgehen, 'Oh, hier ist mit sehr hoher Wahrscheinlichkeit
der Beginn einer JPEG "und sobald Sie das gleiche Muster,
eine gewisse Anzahl von Bytes oder Kilobyte oder Megabyte später
Sie können davon ausgehen, "Ooh! Hier ist eine zweite JPEG, das Foto habe ich nach dem ersten stattfand.
Lassen Sie mich aufhören zu lesen, dass die erste Datei, mit dem Schreiben beginnen dieses neue ein. "
Und der Ausgang eines Programms zur pset 4 wird so viele wie 50 JPEG.
Und wenn es nicht 50 JPEGs, müssen Sie ein bisschen einer Schleife.
Wenn Sie eine unendliche Anzahl von JPEGs haben, haben Sie eine Endlosschleife.
So, dass wird auch ein ganz gewöhnlicher Fall sein.
Das ist, was am Horizont.
>> Quiz 0, hinter uns. Erkenne, pro meine E-Mail, das immer da ist folks
wer sind beide glücklich, irgendwie neutral, traurig und rund Quiz 0 mal.
Und bitte erreichen, um mich, der Kopf TFs, Zamyla, Ihr eigenes TF
oder eine der CAs, die Sie, wenn Sie möchten, zu diskutieren, wie es ging kennen.
>> So um die Eltern hier beeindrucken im Zimmer,
was ist der CS50-Bibliothek? Good job.
Was ist der CS50-Bibliothek? Yeah? [Schüler Antworten unverständlich]
>> Okay, gut. Also ist es eine vordefinierte Reihe von Code, den wir, das Personal, schrieb
bieten wir zu Ihnen, um einige gemeinsame Funktionalitäten bieten.
Sachen wie mir ein String, machen Sie mir ein int, alle Funktionen, die hier aufgelistet sind.
Ab sofort beginnen wir wirklich diese Stützräder aus.
Also werden wir anfangen zu nehmen, einen "string" von Ihnen,
die, Rückruf, war nur ein Synonym für das, was tatsächliche Datentyp? char *.
So für die Eltern, das war wohl - das ist gut, so char * wir anfangen zu sehen,
auf dem Bildschirm umso mehr, als wir "string" zu entfernen aus unserem Wortschatz,
zumindest wenn es darum geht, tatsächlich das Schreiben von Code.
Ebenso werden wir aufhören, einige dieser Funktionen so viel,
weil unsere Programme werden, um komplexere
anstatt nur Programme schreiben, die dort sitzen mit einem Prompt blinkt,
Warten auf den Benutzer, was rein geben
Sie Ihre Eingaben von anderswo zu bekommen.
Zum Beispiel werden Sie sie aus einer Reihe von Bits auf der lokalen Festplatte zu bekommen.
Sie stattdessen bekommen sie in Zukunft von einer Netzwerkverbindung, einige Website irgendwo.
Also lasst uns abziehen dieser Schicht zum ersten Mal, und ziehen Sie den CS50 Appliance
und diese Datei mit dem Namen CS50.h, die Sie schon scharfe habe auch für Wochen.
>> Aber lassen Sie tatsächlich sehen, was drin ist dafür.
Also das Anfang der Datei in blau ist nur eine ganze Reihe von Kommentaren,
Informationen zur Garantie und Lizenzierung. Dies ist eine Art gemeinsames Paradigma
in der Software, weil eine Menge von Software in diesen Tagen ist, was heißt "Open Source"
was bedeutet, dass jemand den Code geschrieben
und machte es frei verfügbar ist, nicht nur zu laufen und zu verwenden,
aber eigentlich lesen und zu verändern und zu integrieren in Ihre eigene Arbeit.
Also das ist, was Sie bisher über Open-Source-Software,
wenn auch in sehr kleine Form.
Wenn ich mich an den Kommentaren zu blättern, aber wir beginnen, einige weitere vertraute Dinge zu sehen.
So an der Spitze hier zu bemerken, dass die CS50.h-Datei eine ganze Reihe von Header-Dateien enthält.
Nun, die meisten von ihnen haben wir nicht gesehen, aber man ist
vertraut; die von ihnen haben wir gesehen, wenn auch nur kurz, so weit?
Yeah, Standard-Bibliotheken. Stdlib.h hat malloc,
so, wenn wir kamen ins Gespräch über die dynamische Speicherzuweisung,
welche wir kommen zurück, um nächste Woche sowie begannen wir mit dieser Datei.
Es stellt sich heraus, dass bool und wahr und falsch nicht wirklich in C existieren, per se,
es sei denn, Sie gehören diese Datei hier.
So haben wir, seit Wochen, wurde einschließlich Standard bool.h
so dass man mit dem Begriff des a bool, true oder false.
Ohne diese müsste man von gefälschten zu sortieren und verwenden Sie ein int
und nur willkürlich annehmen, dass 0 falsch ist und 1 wahr ist.
>> Nun, wenn wir nach unten scrollen weiter, hier ist unsere Definition einer Zeichenkette.
Es stellt sich heraus, wie wir schon gesagt, dass dort, wo das * ist nicht wirklich wichtig.
Sie können sogar Platz rundherum.
Wir, in diesem Semester, wurden fördern, da dies deutlich zu machen, dass die * mit der Art zu tun hat.
Aber klar, wie üblich, wenn nicht ein wenig mehr üblich, ist sie dort einführen
aber funktional ist es das Gleiche.
Aber jetzt, wenn wir weiter nach unten zu lesen, lassen Sie uns einen Blick auf Mitsprache, GetInt,
weil wir verwendet, dass vielleicht vor allem anderen in diesem Semester.
Und hier ist GetInt. Dies ist, was?
Dies ist der Prototyp. So oft haben wir Prototypen an den Spitzen unserer setzen. C Dateien,
aber du kannst auch Prototypen in Header-Dateien,. h-Dateien,
wie dieser hier, so dass, wenn Sie schreiben, sind einige Funktionen
dass Sie andere Menschen in der Lage sein zu verwenden wollen, ist das genau der Fall mit der CS50-Bibliothek,
Sie nicht nur die Umsetzung Ihrer Funktionen in so etwas wie CS50.c,
Sie auch setzen die Prototypen nicht an der Spitze dieser Datei, aber an der Spitze einer Header-Datei,
dann, dass Header-Datei ist, was Freunde und Kollegen gehören,
mit scharfen im eigenen Code enthalten.
Also alles dieser Zeit habe auch alle diese Prototypen
effektiv bei der Anfang der Datei, sondern durch diese scharfe Include-Mechanismus
dass im Wesentlichen Kopien und Pasten diese Datei in Ihre eigenen.
Nun, hier ist einige ziemlich detaillierte Dokumentation.
>> Wir haben ziemlich viel für selbstverständlich, dass GetInt einen int bekommt,
aber es stellt sich heraus, es gibt einige Grenzfälle, nicht wahr?
Was, wenn der Benutzer in einer Zahl, die viel zu groß ist?
Eine Trillionen, die einfach nicht innerhalb eines int passen?
Was ist das erwartete Verhalten? Nun, im Idealfall ist es vorhersehbar.
Also in diesem Fall, wenn Sie tatsächlich das Kleingedruckte lesen,
Sie sehen, dass, wenn die Leitung nicht gelesen werden kann, diese Renditen INT_MAX.
Wir haben nie darüber gesprochen, aber auf der Grundlage ihrer Kapitalisierung,
was ist es, wahrscheinlich?
Es ist eine Konstante, so dass es einige spezielle Konstante, die wahrscheinlich deklariert ist
in einem dieser Header-Dateien, die sich höher ist in der Datei
und INT_MAX ist wahrscheinlich so etwas wie, grob, 2 Milliarden Euro.
Die Idee ist, dass, weil wir irgendwie bedeuten, dass etwas brauchen schief ging,
wir, ja, 4 Mrd. Zahlen zur Verfügung,
negativen 2 Mrd. auf bis zu 2 Mrd., geben oder nehmen.
Nun, was ist üblich in der Programmierung Sie stehlen nur eine von diesen Zahlen.
Maybe 0, vielleicht 2 Milliarden, vielleicht negativ 2 Milliarden Euro.
So verbringen Sie einen Ihrer möglichen Werte, so dass Sie in die Welt begehen kann
dass, wenn etwas schief geht, werde ich zurückkehren diesen super-großen Wert.
Aber Sie wollen nicht der Benutzer Eingabe etwas kryptisch wie "2, 3, 4 ..."
der wirklich große Zahl, wo man statt zu verallgemeinern als Konstante.
Also wirklich, wenn Sie wurden anal in den letzten Wochen,
wann immer Sie GetInt anrufen, sollten Sie mit einer if-Bedingung wurden überprüft.
Haben die Benutzer in INT_MAX, oder genauer gesagt,
hat GetInt Rückkehr INT_MAX? Denn wenn es tat,
das tatsächlich bedeutet, dass sie nicht geben Sie es, etwas ging in diesem Fall falsch.
Also das ist, was im Allgemeinen als "Sentinel"-Wert, bedeutet nur spezielle bekannt.
>> Nun, lassen Sie uns nun in den. C Dateien umzuwandeln.
Die C-Datei ist in das Gerät für einige Zeit bestanden,
und in der Tat ist das Gerät es vorkompilierte für Sie
in diese Sache, die wir als "Objekt-Code"
aber es ist einfach nicht zu Ihnen egal, wo es, weil das System weiß, ist,
in diesem Fall, wo es ist, das Gerät.
Aber lasst uns nach unten scrollen nun GetInt und sehen, wie GetInt gearbeitet hat die ganze Zeit.
Also hier haben wir ähnliche Kommentare von früher.
Lassen Sie mich vergrößern nur auf die Codeteil,
und was haben wir für GetInt ist die folgende.
Es dauert keine Eingabe, und es gibt einen int, while (true), so dass wir eine bewusste Endlosschleife haben
aber vermutlich werden wir brechen aus dieser irgendwie, oder wieder aus diesem.
Also mal sehen, wie das funktioniert. Nun scheinen wir zu sein mit GetString
in dieser ersten Zeile in der Schleife, 166.
Das ist jetzt eine gute Praxis, weil unter welchen Umständen
könnte GetString zurücksenden spezielles Schlüsselwort, NULL?
Wenn etwas schief geht. Was könnte schief gehen, wenn Sie so etwas wie GetString nennen?
Yeah? [Schüler Antwort unverständlich] >> Ja. Also vielleicht malloc fehlschlägt.
Irgendwo unter der Haube GetString ruft malloc,
die Speicher zuweist, was können Sie den Computer Shop
alle Zeichen, die der Benutzer in die Tastatur-Typen.
Und angenommen, der Benutzer hatte eine ganze Menge freie Zeit
und mehr, zum Beispiel als 2 Milliarden Zeichen eingegeben.
Mehr Zeichen als der Computer hat sogar RAM.
Nun, GetString zu können, dass Sie bedeuten,
auch wenn dies ist ein super, super selten Ecke Fall.
Es muss irgendwie in der Lage sein, dies zu umgehen, und so GetString,
wenn wir gehen zurück und lesen Sie die Dokumentation, ist in der Tat, NULL zurück.
Nun, wenn GetString durch Rücksendung NULL fehlschlägt, wird GetInt zum Scheitern verurteilt
durch Rücksendung INT_MAX, wie ein Wächter.
Dies sind nur menschliche Konventionen. Der einzige Weg, dies zu wissen, würde der Fall ist
wird durch das Lesen der Dokumentation.
Also lasst uns nach unten scrollen, wo die int ist eigentlich GotInt.
>> Also, wenn ich mich ein bisschen weiter zu blättern, in Zeile 170 haben wir einen Kommentar über diesen Linien.
So erklären wir, in 172, ein int n und ein char c, und dann diese neue Funktion
die einige von Ihnen haben über, bevor gestolpert, aber sscanf.
Dies steht für String-Scan f.
In anderen Worten, gib mir einen String und ich werde es für Stücke von Informationen von Interesse zu scannen.
Also, was bedeutet das? Nun wird angenommen, dass ich in buchstäblich 1 2 3 Geben Sie über die Tastatur,
und dann drücken Sie Enter. Was ist der Datentyp 1 2 3, wenn sie von GetString zurückgekehrt?
Es ist offensichtlich ein String, nicht wahr? Ich habe einen String, so 1 2 3 ist wirklich "1 2 3"
mit dem \ 0 am Ende. Das ist nicht ein int.
Das ist nicht eine Nummer. Es sieht aus wie eine Zahl, aber es ist nicht wirklich.
Also, was bedeutet GetInt zu tun haben? Es muss die Zeichenfolge links nach rechts zu scannen,
1 2 3 \ 0, und irgendwie konvertieren Sie sie in einer tatsächlichen integer.
Jetzt könntest du herausfinden, wie dies zu tun.
Wenn Sie zurück zu pset 2 denken, Sie vermutlich habe ein wenig komfortabler
mit Caesar oder Vigenere so können Sie durchlaufen einen String,
Sie können Zeichen auf ints mit Pick zu konvertieren. Das ist eine ganze Menge Arbeit.
Warum nicht eine Funktion aufrufen, wie sscanf, die das tut für dich?
So sscanf erwartet ein Argument, in diesem Fall als Linie, die ein String ist.
Dann geben Sie, in Anführungszeichen, sehr ähnlich printf,
Was erwarten Sie in dieser Zeichenfolge sehen?
Was ich hier sage, ist, erwarte ich eine Dezimalzahl und vielleicht ein Zeichen sehen.
Und wir werden sehen, warum dies der Fall ist in nur einem Augenblick.
Es stellt sich heraus, dass diese Notation ist jetzt erinnert Sachen
Wir kamen ins Gespräch über etwas mehr als vor einer Woche.
>> Was ist & n und & c zu tun für uns hier? [Schüler Antworten unverständlich]
>> Ja. Es gibt mir die Adresse n und Anschrift des c.
Nun, warum ist das wichtig? Nun, wissen Sie, dass mit Funktionen in C
Sie können immer einen Wert zurückgeben oder überhaupt keinen Wert.
Sie können zurückgeben int, einen String, einen Schwimmer, einen char, was auch immer.
Oder Sie können void, aber Sie können nur 1 zurückgeben, was maximal.
Aber hier wollen wir sscanf mir vielleicht wieder ein int, eine Dezimalzahl,
und auch ein char, und ich werde, warum die Zeichen in einem Moment erklären.
So Sie effektiv wollen f 2 Dinge zurück; das ist einfach nicht in C möglich
So können Sie rund um das funktionieren, indem in 2 Adressen,
denn sobald Sie eine Funktion übergeben 2 Adressen, was kann diese Funktion mit ihnen tun?
Es kann an diese Adressen schreiben. Sie können die * Betriebs-und "go there" auf jede dieser Adressen.
Es ist eine Art des Backdoor-Mechanismus, sondern sehr häufig zum Ändern der Werte der Variablen
in mehr als nur ein Ort, in diesem Fall 2.
Jetzt merke ich bin für == to1 Kontrolle, und dann wieder n, wenn das bedeutet in der Tat, zu true ausgewertet.
Also, was ist los? Nun, technisch gesehen, ist alles, was wir wirklich wollen, in GetInt passiert dies.
Wir wollen analysieren, so zu sprechen, sondern wir wollen die Zeichenfolge gelesen
"1 2 3" und wenn es so aussieht, als gäbe es eine Reihe gibt,
was wir sagen sscanf zu tun ist, setzen Sie diese Zahl, 1 2 3, in dieser Variable n für mich.
Warum also hatte ich dies als gut?
Was ist die Rolle der sagt auch, sscanf, könnte man auch einen Charakter hier.
[Studenten gesprochen, unverständlich] >> Not - ein Dezimalpunkt funktionieren könnte.
Halten wir, dass dachte einen Moment nach. Was sonst noch?
[Student, unverständlich] >> Also, guten Gedanken, es könnte der NULL-Zeichen sein.
Es ist eigentlich nicht in diesem Fall. Yeah? [Student, unverständlich]
>> >> ASCII. Oder lassen Sie mich noch weiter zu verallgemeinern.
Die% c gibt es nur für Fehlerprüfung.
Wir haben dort nicht wollen Charakter nach der Zahl,
aber was dies ermöglicht mir zu tun ist folgendes:
Es stellt sich heraus, dass sscanf neben Speichern von Werten in n und c, in diesem Beispiel hier
was es auch tut, ist es gibt die Anzahl der Variablen, die es genommen Werte in.
Also, wenn Sie in 1 2 3 nur eingeben, dann wird nur die% d wird überein
und nur n wird mit einem Wert wie 1 2 3 gespeichert und nichts geht in c setzen;
c bleibt ein Müll-Wert, so zu sprechen.
Garbage, weil es noch nie so einen gewissen Wert initialisiert wurde.
So dass in diesem Fall kehrt sscanf 1, weil ich besiedelten einer dieser Zeiger,
in diesem Fall groß. Ich habe einen int, so befreie ich die Linie, um den Arbeitsspeicher freizugeben
das GetString tatsächlich zugeteilt, und dann bin ich wieder n.
Andernfalls, wenn Sie sich jemals gefragt, wo diese Anweisung retry stammt, kommt von hier.
Wenn hingegen, Typ I in 1 2 3 foo,
nur einige zufällige Sequenz von Texten, sscanf gehen, um zu sehen,
ooh, Anzahl, ooh, Anzahl, ooh, Anzahl, ooh - f.
Und es geht um die 1 2 3 in n setzen.
Es wird das f in c setzen, und dann wieder 2.
So haben wir, nur mit der grundlegenden Definition von scanf Verhalten,
eine sehr einfache Art und Weise - auch, komplexe auf den ersten Blick, aber am Ende des Tages,
relativ einfachen Mechanismus zu sagen, ist es ein int, und wenn ja, ist, dass die einzige Sache, die ich gefunden habe?
Und der weiße Raum ist hier gewollt. Wenn Sie die Dokumentation lesen für sscanf,
es sagt Ihnen, dass, wenn Sie eine Stück Leerzeichen am Anfang oder am Ende
sscanf auch Sie ermöglichen dem Benutzer, aus welchem ​​Grund, um die Leertaste 1 2 3 getroffen, und das wird für legitim.
Es wird nicht auf der Benutzerebene anschreien nur weil sie die Leertaste getroffen am Anfang oder am Ende,
das ist nur ein wenig mehr benutzerfreundlich.
>> Haben Sie Fragen, dann auf GetInts? Yeah?
[Studenten Frage unverständlich]
>> Gute Frage. Was passiert, wenn Sie in einem char gerade eingegeben, wie f und drücken Sie die Eingabetaste
ohne jemals eingeben 1 2 3; was denkst du das Verhalten dieser Zeile Code wäre dann?
So sscanf können, dass zu decken, da in diesem Fall,
es ist nicht zu n oder c zu füllen; es wird statt 0 zurück.
In diesem Fall bin ich auch fangen dieses Szenario, weil der erwartete Wert ich will, ist ein.
Ich will nur eins, und nur 1, was zu besetzen. Gute Frage. Andere?
>> Alles klar, also lassen Sie uns nicht über alle Funktionen, die hier gehen,
sondern jene, die zu sein, vielleicht der verbleibenden Interesse scheint
wird GetString, weil sich herausstellt, dass GetFloat, GetInt,
GetDouble, GetLongLong Alle punt einen Großteil ihrer Funktionalität GetString.
So lassen Sie uns einen Blick darauf, wie er hier umgesetzt.
Dieser sieht ein wenig komplex, aber es verwendet die gleichen Grundlagen
dass wir reden letzte Woche gestartet. So in GetString,
das dauert kein Argument nach der Leere hier,
und es gibt einen String zurück, so erkläre ich einen String namens Puffer.
Ich weiß nicht wirklich, was das los, um für noch verwendet werden, aber wir werden sehen.
Sieht aus wie Kapazität, die standardmäßig 0; nicht ganz sicher, wohin dieses geht.
Nicht sicher, was n los, um noch verwendet werden.
Aber jetzt wird es ein wenig interessanter, so im Einklang 243,
erklären wir eine int c, das ist eine Art von dummen Details.
Ein char ist 8 Bit und 8 Bit können, wie viele verschiedene Werte speichern?
256. Das Problem ist, wenn Sie 256 verschiedene ASCII-Zeichen haben wollen,
die es gibt, wenn Sie wieder zu denken, und das ist nicht etwas auswendig zu lernen.
Aber wenn Sie zurück zu diesem großen ASCII-Tabelle denke, wir hatten Wochen
gab es in diesem Fall, 128 oder 256 Zeichen.
Wir haben alle die Muster von 0 und 1 ist um.
Das ist ein Problem, wenn Sie in der Lage sein, um einen Fehler erkennen soll.
Denn wenn Sie bereits mit 256 Werten für eure Charaktere,
Sie nicht wirklich im Voraus zu planen, denn jetzt gibt es keine Möglichkeit zu sagen haben,
"Dies ist nicht ein legitimes Charakter; dies einige falsche Botschaft."
Also, was die Welt tut, ist, verwenden sie die nächste größte Wert,
so etwas wie ein int, so dass Sie eine verrückte Anzahl von Bits,
32 für 4 Milliarden möglichen Werte, so dass man einfach am Ende mit,
Wesentlichen, 257 von ihnen, ein von denen eine besondere Bedeutung als Fehler.
>> Also mal sehen, wie das funktioniert. In line 246 Ich habe diesen großen while-Schleife
das ruft fgetc; f Bedeutung Datei getc, und dann stdin.
Stellt sich heraus, das ist nur die genauere Art zu sagen, "lesen Eingabe über die Tastatur."
Standard-Eingabe mittels Tastatur, bedeutet Standard-Ausgabe-Bildschirm,
und Standardfehler, die wir in pset 4 sehen werden, bedeutet, den Bildschirm,
sondern eine besondere Teil des Bildschirms, so dass es nicht verschmolzen
mit den tatsächlichen Ausgang, die Sie drucken sollen, aber mehr auf, dass in der Zukunft.
So fgetc bedeutet nur lesen ein Zeichen von der Tastatur, und speichern Sie es wo?
Bewahren Sie es in c, und dann zu überprüfen, so dass ich nur mit ein paar boolean Konjunktionen hier
prüfen, ob es nicht gleich \ n, so hat der Benutzer drücken Sie Enter.
Wir wollen an diesem Punkt, Ende der Schleife zu stoppen, und wir wollen auch zu prüfen,
für die spezielle Konstante, EOF, die, wenn Sie oder erraten wissen - was es für nicht stehen?
Ende der Datei. Also das ist eine Art von Unsinn, denn wenn ich auf der Tastatur tippen bin,
gibt es wirklich keine Datei daran beteiligt,
Doch dies ist nur der Oberbegriff für meine sortieren
nichts anderes wird aus dem menschlichen Finger kommt. EOF. Ende der Datei.
Nebenbei, wenn Sie jemals Kontrolle d bei Ihrer Tastatur drücken,
nicht, dass Sie noch, Sie haben die Kontrolle c getroffen.
Aber die Kontrolle d sendet diese spezielle Konstante genannt EOF.
>> So, jetzt müssen wir nur noch einige dynamische Speicherzuweisung.
Also, wenn n + 1> Kapazität, jetzt werde ich erklären, n.
n ist nur, wie viele Bytes sind derzeit im Puffer
die Zeichenfolge, die Sie derzeit den Aufbau des Benutzers.
Wenn Sie mehr Zeichen in Ihrem Puffer als Sie im Puffer haben,
intuitiv, ist das, was wir brauchen, um dann dafür mehr Kapazität.
Ich werde überfliegen einige der arithmetischen hier
und nur auf diese Funktion hier zu konzentrieren.
Sie wissen, was malloc ist, oder zumindest allgemein bekannt.
Take a guess, was realloc tut. [Schüler Antwort unverständlich]
>> Ja. Und es ist nicht ganz das Hinzufügen von Arbeitsspeicher, es Verteilt Speicher wie folgt:
Wenn es immer noch Raum am Ende des Strings, um Ihnen mehr von dieser Erinnerung
als es gibt ursprünglich Sie, dann bekommen Sie diesen zusätzlichen Speicher.
So können Sie nur darum, die Saiten Zeichen Rücken an Rücken an Rücken an Rücken.
Aber wenn das nicht der Fall, weil Sie zu lange gewartet
und etwas zufällig bekam plumpste in den Speicher gibt, aber es gibt zusätzliche
Speicher hier unten, das ist okay. Realloc wird alle die Schwerstarbeit für Sie tun,
bewegen Sie die Zeichenfolge, die Sie in gelesen habe damit weit von hier,
legte es dort unten, und dann geben Sie etwas mehr Start-und Landebahn an diesem Punkt.
Also mit einer Handbewegung, lassen Sie mich sagen, dass das, was GetString tut
wird es mit einem kleinen Puffer, vielleicht ein einzelnes Zeichen ab,
und wenn die Benutzer in 2 Zeichen, endet GetString up
Aufruf realloc und sagt: "Ooh, war ein Zeichen, das nicht genug.
Gib mir 2 Zeichen. ' Dann, wenn Sie lesen, durch die Logik der Schleife
es wird sagen: "Oh, den Anwender bei 3 Zeichen eingegeben werden.
Gib mir jetzt nicht 2, sondern 4 Zeichen, dann geben Sie mir 8, dann geben Sie mir 16 und 32 ".
Die Tatsache, dass ich eine Verdoppelung der Kapazität jedes Mal
bedeutet, dass der Puffer nicht zu langsam wachsen.
Es wird super schnell wachsen, und was könnte der Vorteil das sein?
Warum bin ich die Verdoppelung der Größe des Puffers, obwohl der Benutzer
vielleicht brauchen nur 1 extra Zeichen von der Tastatur?
[Schüler Antwort unverständlich]. >> Was ist das?
Genau. Sie müssen nicht so oft zu wachsen.
Und dies ist nur eine Art a - du bist Absicherung Ihrer Wetten hier.
Die Idee ist, dass Sie nicht anrufen möchten realloc viel, weil es zu langsam neigt.
Jedes Mal, wenn Sie sich an das Betriebssystem für Speicher, wie Sie bald sehen
in einem zukünftigen Problem Set, neigt sie dazu, einige Zeit dauern.
So minimiert so viel Zeit, auch wenn Sie verschwenden etwas Platz sind, neigt dazu, eine gute Sache sein.
>> Aber wenn wir durch den letzten Teil der GetString hier lesen,
und wieder, das Verständnis jede einzelne Zeile ist hier nicht so wichtig heute.
Aber beachten Sie, dass es schließlich ruft malloc wieder, und es teilt
genau so viele Bytes wie sie benötigt für die Zeichenfolge
und dann wegwirft, indem Sie frei, die übermäßig große Puffer,
wenn es tatsächlich wurde zu oft verdoppelt.
Kurz gesagt, das ist, wie GetString gearbeitet hat die ganze Zeit.
Alles, was sie tut, ist ein Zeichen in einer Zeit wieder gelesen und immer wieder
und jedes Mal, es braucht einige zusätzliche Speicher, fragt er das Betriebssystem für ihn durch Aufrufen realloc.
Haben Sie Fragen? Gut.
>> Ein Angriff. Nun, da wir Zeiger zu verstehen, oder mindestens
zunehmend vertraut mit Zeiger,
Lassen Sie uns überlegen, wie die ganze Welt zum Einsturz beginnt
wenn Sie nicht ganz gegen kontradiktorischen Nutzer zu verteidigen,
Menschen, die versuchen, in Ihr System zu hacken sind.
Menschen, die versuchen, Ihre Software unter Umgehung einige Registrierungscode stehlen
dass sie vielleicht sonst zu tippen in.
Werfen Sie einen Blick auf dieses Beispiel hier, das ist nur C-Code
das hat eine Funktion main an der Unterseite, nennt das eine Funktion foo,
und wofür wird es vorbei an foo? [Student] Ein einziges Argument.
>> Single Argument. So argv [1], was bedeutet, dass das erste Wort der Benutzer eingegeben
in der Befehlszeile nach dem a.out oder was auch immer das Programm aufgerufen wird.
So foo, an der Spitze, nimmt in einem char *, aber char * ist nur was?
String. Es gibt hier nichts Neues, und diese Zeichenfolge beliebig aufgerufen bar.
In dieser Linie hier, char c [12], in einer Art semi-technisches Englisch, ist das, was diese Linie zu tun?
Array of -? Zeichen. Gib mir eine Reihe von 12 Zeichen.
So könnten wir nennen dies einen Puffer. Es ist technisch genannt c, aber ein Puffer in der Programmierung
bedeutet nur einen Haufen von Raum, dass man einige Sachen in. setzen
>> Dann endlich, memcpy, haben wir nicht vor verwendet.
Aber Sie können sich wahrscheinlich vorstellen, was es tut. Er kopiert Speicher.
Was bedeutet es? Nun, es ist offensichtlich kopiert bar, dessen Eingang in c,
aber nur bis zu der Länge der Stange.
Aber da ist ein Fehler hier.
Okay, technisch so sollten wir wirklich tun strlen (bar) x sizeof (char), das ist richtig.
Aber im schlimmsten Fall hier, gehen wir davon aus, dass that's - so, okay.
Dann gibt es noch 2 bugs. So sizeof (char), alles in Ordnung, wir machen dies ein wenig breiter.
So, jetzt gibt es noch einen Bug, das, was ist?
[Schüler Antwort unverständlich] >> Check for what? Okay, wir sollten prüfen
NULL, denn schlechte Dinge passieren, wenn Sie Ihre Zeiger NULL ist,
Da könnten Sie am Ende dorthin zu gehen, und Sie sollten nicht immer gehen auf NULL
durch Dereferenzierung mit dem Operator *.
Also das ist gut, und was sollen wir sonst tun? Logischerweise gibt es eine Schwachstelle auch hier.
[Schüler Antwort unverständlich]
>> So prüfen Sie, ob argc ≥ 2?
Okay, so gibt es 3 Fehler in diesem Programm hier.
Wir sind nicht überprüfen, ob der Benutzer tatsächlich in nichts in argv [1], gut getippt.
Also, was ist der dritte bug? Yeah?
[Schüler Antwort unverständlich] >> Gut.
So haben wir überprüft, ein Szenario. Wir implizit überprüft nicht kopieren mehr Speicher
als dies übersteigt die Länge des Balkens.
Also, wenn die Zeichenfolge der Benutzer eingetippt 10 Zeichen lang ist,
dies sagen: "Nur kopieren 10 Zeichen. '
Und das ist okay, aber was, wenn der Benutzer in einem Wort an der Eingabeaufforderung eingegeben
wie ein 20-Zeichen-Wort, das ist, sagen copy 20 Zeichen aus bar in was?
c, sonst als unser Puffer bezeichnet, was bedeutet, Sie gerade geschrieben haben Daten
zu 8 Byte Orte, die Sie nicht besitzen,
und Sie nicht besitzen sie in dem Sinne, dass man nie vergeben sie.
Also das ist, was allgemein als Pufferüberlauf Angriff bekannt,
oder Pufferüberlauf Angriff, und es ist Angriff in dem Sinne, dass, wenn der Benutzer
oder das Programm, die einen Aufruf Ihrer Funktion ist tut dies böswillig,
was tatsächlich passiert als nächstes könnte ziemlich schlecht.
>> Werfen wir einen Blick auf dieses Bild hier.
Dieses Bild stellt Ihr Stack Speicher.
Und daran erinnern, dass jedes Mal, wenn Sie eine Funktion aufrufen,
Sie erhalten diese kleinen Rahmen auf den Stapel und dann noch eine und dann noch eine und dann noch eine.
Und so weit wir nur irgendwie abstrahiert diese weg als Rechtecke
entweder es auf dem Board oder auf dem Bildschirm hier.
Aber wenn wir zu vergrößern auf einem dieser Rechtecke,
wenn Sie eine Funktion foo nennen, stellt sich heraus, dass es mehr auf dem Stapel
im Inneren des Rahmens und diesem Rechteck
als nur x-und y-und a und b, wie wir haben über Swap reden.
Es stellt sich heraus, dass es einige unteren Level-Details,
unter ihnen zurückzukehren Adresse.
So stellt sich heraus, wenn der Haupt ruft foo hat Wesentlichen auf foo informieren
Welches Hauptziel ist die Adresse in den Arbeitsspeicher des Computers.
Denn sonst wird sobald foo getan ausführt, wie im vorliegenden Fall ist,
sobald Sie erreichen diese enge geschweiften Klammer am Ende des foo,
Wie zum Teufel soll foo wissen, wo Kontrolle des Programms soll gehen?
Es stellt sich heraus, dass die Antwort auf diese Frage in dem roten Rechteck ist hier.
Dies repräsentiert einen Zeiger, und es ist bis zu dem Computer zu speichern, vorübergehend,
auf der so genannten Stapel die Adresse des Haupt so daß, sobald foo erfolgt ausführt,
der Computer weiß, wo und in welcher Zeile im Hauptspeicher, um wieder auf.
Gespeichert Framezeiger bezieht ebenfalls dazu bei.
Char * bar stellt hier was?
Nun, jetzt diese blaue Segment ist hier foo der Rahmen, was ist bar?
Okay, das ist so bar nur das Argument der foo-Funktion.
>> So, jetzt sind wir wieder auf das bekannte Bild.
Es gibt mehr Sachen und mehr Ablenkungen auf dem Bildschirm
aber das hellblaue Segment ist das, was wir an die Tafel gezeichnet für so etwas wie Swap.
Das ist der Rahmen für foo und das einzige, was in ihm ist im Moment bar,
was ist dieser Parameter.
Aber was sollte in dem Stapel zu sein, nach diesem Code hier?
Char c [12]. Also sollten wir auch 12 Quadrate des Gedächtnisses,
zugeordnet einer Variable namens c.
Und in der Tat haben wir nicht, dass auf dem Bildschirm haben.
Ganz oben gibt es c [0], und dann der Autor dieses Diagramms
nicht die Mühe der Erstellung all der Quadrate, aber es gibt in der Tat 12 gibt
denn wenn man in der unteren rechten schauen, c [11], wenn Sie zählen von 0 ist die 12 solcher Bytes.
Aber hier ist das Problem: In welche Richtung wird c wächst?
Sortieren von oben nach unten, nicht wahr? Wenn es beginnt an der Oberseite und an der Unterseite wächst,
nicht aussehen wie wir selbst ließ viel Landebahn hier überhaupt.
Wir haben Art von uns in eine Ecke manövriert,
und daß c [11] ist direkt gegen Bar, die bis gegen Stapelrahmen Zeiger,
das ist richtig gegen die Absender-Adresse, es gibt keinen Platz mehr.
Also, was ist die Implikation, dann, wenn Sie es vermasseln,
und Sie versuchen, das Lesen 20 Bytes in eine 12-Byte-Puffer?
Wo werden diese 8 zusätzliche Bytes gehen?
Im Inneren alles andere, ist von denen einige super wichtig.
Und das Wichtigste, möglicherweise ist das rote Feld dort Absenderadresse.
Da nehme an, dass Sie entweder versehentlich oder adversarially sind
überschreibt diese 4 Bytes, die Pointer-Adresse,
Nicht nur mit Müll, sondern mit einer Nummer, die einer tatsächlichen Adresse im Speicher darstellen geschieht?
Was ist der implicaiton, logisch?
[Schüler Antworten unverständlich] >> Genau. Wenn foo zurück
und Hits, die geschweiften Klammern, wird das Programm gehen, um fortzufahren, nicht zu Haupt zurückkehren,
es geht um alles, was Adresse ist in diesem roten Kasten zurückzukehren.
>> Nun, im Falle der Umgehung Software-Registrierung,
Was ist die Adresse, an ist wieder wird die Funktion
die normalerweise aufgerufen wird, nachdem Sie für die Software bezahlt haben und eingegeben Ihren Registrierungscode?
Man könnte der Trick der Computer in den nicht hier zu sortieren, aber stattdessen werde hier oben.
Oder, wenn Sie wirklich clever sind, können ein Gegner tatsächlich geben in die Tastatur,
zum Beispiel: Angenommen, nicht eine tatsächliche Wort, nicht 20 Zeichen, aber er oder sie
Typen in einigen Zeichen, Code darstellen?
Und es ist nicht zu C-Code sein, es geht um die Zeichen lang sein
das stellen binäre Maschine Codes, 0 und 1 ist.
Aber angenommen, sie sind klug genug zu tun, um irgendwie in die GetString prompt fügen
etwas, das im wesentlichen Code kompiliert,
und die letzten 4 Bytes überschrieben, dass die Rückkehr-Adresse und welche Adresse soll das Eingangssignal zu tun?
Er speichert in dieser roten Rechteck die Adresse des ersten Bytes des Puffers.
So muss man sich wirklich clever, und das ist eine Menge von Versuch und Irrtum
für schlechte Menschen da draußen, aber wenn Sie herausfinden können, wie groß dieser Puffer ist,
so dass die letzten Bytes im Eingang, den Sie für das Programm bereitstellen
geschehen zu sein entspricht der Adresse des Beginns des Puffers,
Sie können dies tun. Wenn wir sagen, in der Regel, hallo, und \ 0, ist das, was landet im Puffer.
Aber wenn wir klüger, und wir füllen diesen Puffer mit dem, was wir allgemein nennen Angriff Code,
A, A, A, A: Angriff, Angriff, Angriff, Angriff, wo das ist nur etwas, das etwas Schlimmes tut.
Nun, was passiert, wenn Sie wirklich clever sind, könnten Sie dies tun:
In der roten Box ist hier eine Folge von Zahlen: 80, CO, 35, 08.
Beachten Sie, dass die Zahl, die bis hier ist übereinstimmt.
Es ist in umgekehrter Reihenfolge, aber dazu ein anderes Mal.
Beachten Sie, dass diese Rückkehr-Adresse wurde absichtlich geändert
um die Adresse gleich hier oben, nicht die Adresse der main.
Also, wenn der Bösewicht super smart ist, wird er oder sie geht auf, in diesem Angriff Code
etwas wie: "Löschen Sie alle Dateien des Benutzers.
Oder 'Kopieren Sie die Passwörter "oder" Erstellen Sie ein Benutzerkonto, dass ich in anmelden können. "
Überhaupt nichts, und das ist sowohl die Gefahr und die Macht der C.
Denn Sie haben Zugriff auf den Speicher über Zeiger
und man kann daher alles schreiben, was Sie wollen in einem Computer-Speicher.
Sie können einen Computer zu tun, was Sie wollen einfach durch
nachdem sie hüpfen in einem eigenen Speicherbereich.
Und so, bis zum heutigen Tag, so viele Programme und so viele Websites, die kompromittiert werden
einkochen lassen, um Menschen nutzen diese.
Und dies mag wie eine super-ausgeklügelte Angriffe scheinen,
aber es funktioniert nicht immer starten auf diese Weise.
>> Die Realität ist, dass das, was böse Menschen werden in der Regel tun, ist,
ob es sich um ein Programm in einer Befehlszeile oder ein GUI-Programm oder eine Website,
wird man nur beginnen, einen Unsinn.
Sie geben in einem wirklich großen Wort in das Suchfeld ein und drücken Sie die Eingabetaste,
und Sie warten, um zu sehen, ob die Website abstürzt.
Oder Sie warten, um zu sehen, ob das Programm manifestiert einige Fehlermeldung.
Denn wenn Sie Glück haben, als der Bösewicht,
und Ihnen ein paar verrückte Eingang, der das Programm stürzt,
dh der Programmierer nicht vorhergesehen Dein schlechtes Benehmen
was bedeutet, Sie können sich wahrscheinlich mit genügend Anstrengung,
genug, trial and error, herauszufinden, wie man eine genauere Angriff zu führen.
So viel ein Teil der Sicherheit wird nicht nur die Vermeidung dieser Attacken insgesamt, aber deren Entdeckung
und tatsächlich Blick auf Protokolle und sehen, was verrückt Eingänge Menschen in Ihre Website eingegeben haben.
Welche Suchbegriffe haben die Menschen ihn auf Ihrer Webseite, in der Hoffnung Überlaufen einige Puffer eingegeben?
Und das läuft alles auf den einfachen Grundlagen dessen, was ist ein Array,
und was bedeutet es, zu vergeben und zu verwenden Speicher?
Und in Bezug auf das auch, das ist.
>> Lassen Sie uns also nur innerhalb Blick einer Festplatte noch einmal.
So erinnern Sie sich von ein oder zwei Wochen her, dass, wenn Sie ziehen Sie die Dateien
Ihre Papierkorb oder Mülleimer, was geschieht dann?
[Student] Nichts. >> Ja, absolut nichts. Schließlich, wenn Sie gehen zur Neige
Speicherplatz auf der Festplatte, Windows oder Mac OS zu starten Löschen von Dateien für Sie.
Aber wenn Sie etwas dort zu ziehen, dann ist es überhaupt nicht sicher.
Alle Ihre Mitbewohner, Freund oder ein Familienmitglied zu tun hat, ist doppelt zu klicken, und voila.
Es gibt alle sketchy-Dateien, die Sie löschen versucht.
So sind die meisten von uns zumindest wissen, dass Sie die rechte Maustaste oder Steuerelement klicken müssen
und leeren Sie den Papierkorb, oder so ähnlich.
Aber selbst dann ist das nicht ganz den Trick tun.
Denn was passiert, wenn Sie eine Datei auf Ihrer Festplatte haben
Das stellt einige Word-Dokument oder eine JPEG?
Und dies stellt Ihre Festplatte, und lasst uns sagen, dass dieses Bandes stellt hier die Datei,
und es ist von einem ganzen Bündel von 0 und 1 ist zusammengesetzt.
Was passiert, wenn Sie nicht nur ziehen Sie die Datei in den Papierkorb oder Papierkorb,
sondern auch entleeren?
Sortieren von nichts. Es ist nicht unbedingt jetzt nichts.
Jetzt ist es nur nichts, weil ein wenig etwas geschieht in Form dieser Tabelle.
So gibt es eine Art von Datenbank oder Tabelle innerhalb der Speicher eines Computers
das im wesentlichen 1 Spalte für Dateinamen,
und 1 Spalte Speicherort der Datei, wo dieser Ort 123, nur eine zufällige Zahl sein könnte.
So haben wir vielleicht so etwas wie x.jpg und Standort 123.
Und was passiert dann, wenn Sie Ihren Papierkorb leeren?
Das geht weg. Aber was geht nicht weg ist die 0 und 1 ist.
>> Also, was ist, dann, um die Verbindung PSET 4?
Nun, mit pset 4, nur weil wir versehentlich gelöscht
die Compact-Flash-Karte, die alle diese Fotos hatte,
oder einfach nur, weil sie vom Pech beschädigt wurde,
bedeutet nicht, dass die 0 und 1 ist nicht immer noch da.
Vielleicht ein paar von ihnen sind verloren, weil etwas habe beschädigt
in dem Sinne, dass einige 0en 1 und 1 ist geworden wurde 0en.
Bad Dinge passieren können, weil fehlerhafte Software oder fehlerhafte Hardware.
Aber viele dieser Bits, vielleicht sogar 100% von ihnen sind immer noch da,
es ist nur, dass der Computer oder die Kamera nicht weiß, wo JPEG 1 gestartet
und wo JPEG 2 gestartet, aber wenn Sie, der Programmierer,
wissen, mit ein wenig versierte, wo diese JPEGs sind oder wie sie aussehen,
Sie analysieren die 0 und 1 ist und sagen: 'Ooh. JPEG. Ooh, JPEG.
Sie können ein Programm mit im wesentlichen nur eine für Schreib-oder while-Schleife
dass wieder jede und jeder dieser Dateien.
So die Lehre ist also zu beginnen "sicher" Löschen von Dateien
wenn Sie möchten, dies ganz zu vermeiden. Ja?
[Studenten Frage unverständlich]
>> Mehr Speicher als vorher -
Oh! Gute Frage. Warum also, nach dem Entleeren des Papierkorbs,
wird Ihr Computer Ihnen sagen, dass Sie mehr freien Speicherplatz als vorher haben?
In einer Nussschale, weil sie lügt. Mehr technisch, haben Sie mehr Platz.
Weil Sie jetzt gesagt haben, kannst du andere Sachen, wo die Datei einmal war,
aber das bedeutet nicht, dass die Bits weg,
und das bedeutet nicht, dass die Bits sind alle 0 s geändert, zum Beispiel für Ihren Schutz.
Im Gegensatz dazu, wenn man "sicher" Löschen von Dateien oder physisch das Gerät zerstören,
das ist wirklich der einzige Weg, manchmal, um die.
Also, warum nicht wir auf diesem semi-beängstigend beachten verlassen, und wir werden Sie am Montag zu sehen.
CS50.TV