Mythos: Explained by a Retired Microsoft Engineer – YouTube
| Kanal-Aufrufe | 0 |
| Kanal | https://www.youtube.com/channel/UCNzszbnvQeFzObW0ghk0Ckw |
🔗 https://www.youtube.com/watch?v=kdnN0kk7MS0
🤖 Zusammenfassung
Der Sprecher, Dave, präsentiert printf als weit mehr als eine simple Ausgabefunktion: Sie ist eine kompakte Formatierungs-Engine oder „virtuelle Maschine", die Formatstrings wie kleine Programme interpretiert. Er erläutert die Grundlagen anhand eines x86-Assembler-Formatierers von Ben Slivka aus den Jahren 1987/88 und erklärt dessen Zustandsmaschine für Flags, Breite, Größe und Typ. Anschließend werden gängige und fortgeschrittene Formatierungsmerkmale besprochen: numerische Basen, Gleitkommaformate, dynamische Breite/Präzision mit Stern, snprintf als Messinstrument, Positionsargumente, portable Ganzzahlformate, %n, C23-Binärausgabe sowie GNU-spezifische Erweiterungen. Dave warnt eindringlich vor Sicherheitsrisiken unkontrollierter Formatstrings und betont, dass printf trotz seines Alters ein dichtes Lehrstück für Sprachdesign, Parsing, Datendarstellung, Sicherheit und Lokalisierung darstellt.
Summary created by "LinkBuster-KI HAL8999 – Status READY!!"
📜 Transkript
Hey, ich bin Dave. Willkommen in meinem Shop. Heute möchte ich über eine der seltsamsten kleinen Maschinen sprechen, die in fast jeder jemals ausgelieferten C-Laufzeitumgebung versteckt ist . Es handelt sich um eine so vertraute Funktion, dass die meisten Programmierer sie gar nicht mehr wahrnehmen . Sie benutzen es so, wie man einen Lichtschalter in der Garage benutzt. Dreh es um, es erfüllt seinen Zweck, und weiter geht's. Aber printf ist eigentlich nicht nur eine Funktion, die Dinge ausgibt. Es handelt sich um eine Formatierungs- Engine. Es ist ein winziger Dolmetscher. Es liest eine Miniatursprache, durchläuft einen Strom dynamischer Argumente, die es auf keine typsichere Weise sehen kann, wandelt Binärwerte in menschenlesbaren Text um, richtet sie aus, füllt sie auf , kürzt sie, wechselt die Basen, rundet Gleitkommazahlen und gibt das Ergebnis dann in Ihrer Konsole, einer Datei, einem Stringpuffer oder einem anderen Ziel aus, das die Laufzeitumgebung im Hintergrund eingerichtet hat . Und das Lustige daran ist, dass die meisten Programmierer, genau wie bei diesem alten Klischee über das Gehirn, nur etwa 10 % davon nutzen . Heute fangen wir also mit den üblichen %d, %s und %x an, denn das ist der Teil, von dem jeder glaubt, ihn bereits zu kennen. Aber wir werden dorthin gelangen, indem wir zunächst einen Schritt zurückgehen, hinab zu einer rohen x86-Assemblerversion eines schnellen sprintf-Ersatzes, der von meinem ersten Manager bei Microsoft, Ben Slivka, geschrieben wurde. Als ich dort war, war Ben Entwicklungsleiter für MS-DOS, und sein Formatierer ist wunderbar aufschlussreich, weil sich die Magie nirgendwo verstecken kann. Es gibt keine Template-Engine, keine verwaltete Laufzeitumgebung, keine Speicherverwaltungsfee und keinen Abhängigkeitsgraphen von der Größe eines europäischen Parlaments. Lediglich Register, Zeiger, eine Zustandsmaschine und eine Formatzeichenkette, die Byte für Byte verarbeitet wird . Und wenn man printf einmal auf diesem Niveau gesehen hat, hört die moderne Version auf, wie eine langweilige Bibliotheksfunktion auszusehen, sondern sie beginnt zu erkennen, was sie wirklich ist: eine winzige virtuelle Maschine zur Textwiedergabe mit einem überraschend ausgefeilten Werkzeugkasten im Inneren. Bens Datei beschreibt sich selbst als schnellen Ersatz für die C-Laufzeitfunktion printf, geschrieben 1987 und aktualisiert 1988, und sie unterstützt explizit eine kompakte Teilmenge der C- Formatierungssprache. Flags, Breite, optionale Größenmodifikatoren H oder L, Dezimalzahl, vorzeichenlose Dezimalzahl, Zeichenkette, Kleinbuchstabe und Großbuchstabe X, plus Prozent Prozent zum Drucken eines Prozentzeichens. Das ist zwar nicht die gesamte moderne printf- Sprache, aber es reicht, um das Grundgerüst zu sehen . Und das Skelett ist im Moment der wichtigste Teil. Der Formatierer beginnt mit zwei Zeigern. Einer verweist auf die Formatzeichenfolge, der andere auf den Zielpuffer. In Assemblersprache ausgedrückt bedeutet das im Wesentlichen, dass das DS-SI-Paar den Quellcode durchläuft und das ES-DI- Paar in den Ausgabecode schreibt. Bei jedem Durchlauf wird ein Byte aus der Formatzeichenkette geladen. Wenn es sich um ein gewöhnliches Zeichen handelt, wird es einfach gespeichert. Wenn es sich um ein Prozentzeichen handelt, ändert die Maschine ihre Persönlichkeit. An diesem Punkt hört es auf, ein Kopierer zu sein , sondern wird zu einem Parser. Bens Code springt buchstäblich durch die Zustände mit den Namen start, flag, width, size und type, was genau der Grammatik entspricht, die in jedem printf-Aufruf steckt, den Sie jemals geschrieben haben. Und das ist die erste mentale Umstellung. Eine Formatzeichenkette ist nicht nur eine Zeichenkette, sie ist ein Programm. Ein sehr kleines, sehr seltsames Programm, aber immerhin ein Programm. Nehmen wir zum Beispiel so etwas. Für uns klingt das wie ein Satz mit einigen Lücken. Aber printf ist eine Folge von Anweisungen. Kopiere die Buchstaben e r r o r und dann ein Leerzeichen, dann erkennt es Prozent, setzt seine kleinen internen Standardeinstellungen zurück, erkennt Null als Größe, da nun das Nullfüllzeichen anstelle von Leerzeichen verwendet werden soll, erkennt acht, also erstellt es eine Feldbreite von acht, erkennt x, ruft ein ganzzahliges Argument ab, konvertiert es in hexadezimale Großbuchstaben, füllt es auf die acht Zeichen auf und kopiert es dann heraus. Dann wird wieder einfach kopiert, bis zum nächsten Prozentzeichen. Bens Montage verdeutlicht das auf ganz wörtliche Weise. Wenn ein Prozentzeichen auftritt, wird die Breite gelöscht, das Standardfüllzeichen auf leer gesetzt, rechtsbündiger Blocksatz angenommen, davon ausgegangen, dass es sich nicht um einen langen Wert handelt, und dann in den Zustand der Flag-Analyse übergegangen. Das ist die Laufzeitumgebung, die die kleine Uhrwerkmaus aufzieht und sie durch das Labyrinth der Formatbezeichner schickt. Die Breitenanalyse ist besonders interessant, weil sie zeigt, wie einfach die zugrundeliegende Technik sein kann. Wenn Bens Formatierer eine Ziffer im Breitenzustand erkennt, wandelt er die ASCII-Ziffer in Binär um, multipliziert die aktuelle Breite mit 10, addiert eine Ziffer und bleibt im Breitenzustand. Das war’s. Die Zeichenkette %123d ist nichts Besonderes. Wenn die erste Breitenziffer Null ist, wird das Füllzeichen zu Null, weshalb sich %08 so verhält, wie es immer der Fall war. Und das erklärt auch den ersten und grundlegendsten Trick, den Programmierer ganz unbewusst lernen. %8d bedeutet, eine Dezimalzahl in einem Feld von mindestens acht Zeichen Breite auszugeben, wobei links Leerzeichen aufgefüllt werden. %08d bedeutet dasselbe, nur mit Nullen aufgefüllt. %-8d bedeutet linksbündig mit rechtem Abstand. Und diese eine kleine Grammatik liefert Ihnen ein einfaches Tabellenlayout. Und ja, im Zeitalter von HTML, JSON, CSS und Terminal-UI- Bibliotheken mag das ziemlich altmodisch wirken, aber wenn Sie Protokolle, Diagnosen, Status-Dumps, Firmware-Tools, Kernel- Dienstprogramme, altmodische Kommandozeilenanwendungen oder irgendetwas schreiben, das von einem müden Menschen um 2:17 Uhr morgens gelesen werden muss, spielen ausgerichtete Spalten immer noch eine Rolle. Eine gute Logdatei enthält nicht nur Daten, sondern ist ein Notfallinstrumentenfeld, und printf ist eines der ältesten Beispiele dafür . Die grundlegenden numerischen Umrechnungen sind diejenigen, die jeder zumindest grob kennt. %d und %i geben vorzeichenbehaftete Dezimalzahlen aus. %u gibt eine vorzeichenlose Dezimalzahl aus. %x gibt Hexadezimalzahlen mit Kleinbuchstaben aus, und % uppercase X verwendet Großbuchstaben. %o gibt eine Oktalzahl aus, was vor allem dann nützlich ist, wenn man sich in der Unix-Berechtigungswelt oder im PDP-11-Umfeld bewegt oder gerne jungen Entwicklern erklärt, warum 010 nicht immer 10 ist. %c gibt ein Zeichen aus, %s eine Zeichenkette und %p einen Zeiger in einer implementierungsdefinierten Form. Das ist die Sprache der Standardisierungsgremien für: Man erhält etwas, das einem Zeiger ähnelt, aber man sollte nicht unbedingt die exakte Schreibweise erwarten. Bei den Größenmodifikatoren kommt es auf die harmlos aussehenden Dinge an. In Bens Version bedeutet H kurz und L lang, und sein Code verfolgt dies mit einem Flag namens format long. Wenn der Typzustand erreicht wird, werden %ld und %lu anders behandelt als gewöhnliche %d und %U, weil auf diesem alten 16-Bit-Ziel ein Long nicht einfach so in einem Register liegt und darauf wartet, ausgegeben zu werden. Der Formatierer muss zwei Wörter abrufen und diese als einen 32-Bit-Wert behandeln. Dies ist einer der Gründe, warum die printf-Funktion schon immer sowohl mächtig als auch gefährlich war. Die Formatzeichenfolge ist das Einzige, was der Laufzeitumgebung mitteilt, was als Nächstes abgerufen werden soll. Wenn Sie beispielsweise „Prozent D“ angeben, aber einen Gleitkommawert übergeben, oder „Prozent S“ angeben und dann einen Integer-Wert übergeben, helfen Ihnen in klassischem C keine Objektmetadaten. Printf greift einfach auf die Argumentliste zu, extrahiert die erwartete Anzahl an Bytes und interpretiert diese gemäß dem kleinen Formatierungsprogramm, das Sie übergeben haben. Das ist ein bisschen so, als würde man einem Maschinisten mit verbundenen Augen eine Kiste mit zufällig ausgewählten Teilen und einer Anleitung geben und sagen: „Das dritte Teil ist ein Vergaser.“ Sollte es sich bei dem dritten Teil tatsächlich um eine Mausefalle handeln, wird der Maschinist sie trotzdem einbauen. Deshalb bemühen sich Compiler heutzutage sehr darum, Sie vor nicht übereinstimmenden Formatzeichenketten zu warnen und Ihnen zu erklären, warum Sie diese ignorieren sollten . Die Maschine ist leistungsstark, aber sie vertraut dir auf diese beängstigende alte C-Art, so als würde ich meinem Teenager die Schlüssel zu meiner Corvette geben und sagen: „Ich bin sicher, du wirst gute Entscheidungen treffen.“ Aber es gibt keine Stabilitätskontrolle, die Sie auffängt, wenn Sie einen Fehler machen. Nun lasst uns über Zeichenketten sprechen, denn Prozent S ist einfach, bis es das nicht mehr ist. Im Normalfall von printf hello percent S erwartet printf einen Zeiger auf ein nullterminiertes Zeichenarray. Es beginnt an dieser Adresse und kopiert Zeichen, bis es auf ein Nullbyte stößt. Bens Version macht das mit einem strlen- Makro, das repne scasb verwendet, eine dieser schönen alten x86-String-Anweisungen, die sich so anfühlt, als käme sie von einer CPU, die von jemandem entworfen wurde, der Assembler- Programmierern eine faire Chance geben wollte. Es sucht nach dem Nullterminator, berechnet die Länge und verwendet diese Länge dann, um zu entscheiden, wie viel Füllmaterial nach oder vor der Zeichenkette benötigt wird. Damit erhalten Sie die grundlegenden Werkzeuge zur Saitenausrichtung. Es bietet Ihnen außerdem rechts- und linksbündige Textfelder. Wenn Sie jemals eine ordentlich ausgerichtete Befehlstabelle gesehen haben, vielleicht top oder eine Art Aufgabenmanager, dann ist die Wahrscheinlichkeit groß, dass ein Nachfolger dieser Idee beteiligt war. Das moderne printf geht aber noch weiter. Präzision bei einer Saite bedeutet maximale Saitenlänge. Das überrascht die Leute, denn bei Gleitkommazahlen bedeutet Präzision die Anzahl der Ziffern nach dem Komma oder die Anzahl der signifikanten Stellen, je nach Umrechnung. Der eigentliche Clou ist jedoch die dynamische Version, bei der man die Länge angeben kann. Das ist einer der besten printf-Tricks in ganz C. Damit kann man eine Teilzeichenkette, einen Puffer oder irgendetwas anderes ausgeben, das nicht bereits mit einem Nullbyte abgeschlossen ist. Angenommen, Sie haben gerade ein Paket, ein Dateiformat oder einen Speicherbereich analysiert und verfügen nun über einen Zeiger und die zugehörige Länge. Der Anfänger kopiert den Text in einen temporären Puffer, hängt ein Nullbyte an, gibt ihn aus und gibt dann den Puffer frei. Der erfahrene Programmierer verwendet… Das ist die Art von Redewendung, bei der man sich fühlt, als hätte man gerade eine versteckte Tür in einem Haus entdeckt, in dem man seit 20 Jahren wohnt. Bevor wir uns nun den exotischeren Dingen zuwenden, beenden wir erst einmal die grundlegende numerische Tour mit Gleitkommazahlen. Percent f gibt eine Dezimalzahl mit fester Kommasetzung aus. Prozent e gibt wissenschaftliche Notation aus. Percent g wählt je nach Wert und gewünschter Genauigkeit zwischen festem und wissenschaftlichem Verfahren. Die Großbuchstabenformen von Prozent e und Prozent g verwenden Großbuchstaben als Exponentenzeichen . Wenn Ihnen die Anzahl der Stellen wichtig ist, ist Präzision Ihr Freund. Wichtig ist, sich vor Augen zu halten, dass die Formatierung von Gleitkommazahlen tatsächlich Arbeit leistet. Es geht nicht einfach nur darum, Bytes zu verschieben . Es wandelt eine binäre Gleitkomma-Approximation in eine Dezimaldarstellung um, die Rundungsregeln und Genauigkeitsanforderungen erfüllt. Moderne Implementierungen verfügen über äußerst clevere Algorithmen, da das Problem viel schwieriger ist, als es aussieht. Die korrekte Umwandlung von Gleitkommazahlen in Text ist eine jener Aufgaben, die ziemlich langweilig erscheinen, bis man versucht, sie selbst genau durchzuführen. Dann wird sie zu einem Sumpf voller mathematischer Krokodile. Und das führt uns zu einem der coolsten Gleitkommaformate, das die meisten Leute nie benutzen: Prozent a. Dies gibt die Gleitkommazahl im Hexadezimalformat mit einem binären Exponenten aus. Jetzt sieht es komisch aus, ungefähr so. So druckt man sicherlich keine Rechnung, aber so druckt man die Wahrheit. Die Dezimalausgabe versucht oft, benutzerfreundlich zu sein. Die Ausgabe von Hex-Gleitkommazahlen zeigt die tatsächliche Binärstruktur des Wertes an. Wenn Sie Probleme mit Gleitkommazahlen beheben müssen, ist Prozent A Ihr Röntgengerät. Die Zahl 0,1 sieht im Dezimalsystem recht harmlos aus , wie ein kleiner Engel, der auf einer Wolke sitzt, aber im Binärsystem ist sie ein periodischer Bruch mit einem falschen Schnurrbart, und Prozent A erwischt sie an der Grenze. Nun kommen wir zum finalen Kniff, denn hier hört printf auf, nur nützlich zu sein, und beginnt, herrlich raffiniert zu werden. Die erste ist dynamische Breite und Präzision mit Stern. Bens Formatierer unterstützte bereits das Sternchen für die Breite und ermittelte die Feldbreite aus dem nächsten Argument anstatt aus der Formatzeichenfolge. Das moderne printf macht das auch, und zwar mit höchster Präzision. Das ist genial, weil es ermöglicht, dass sich Ihre Formatierung zur Laufzeit anpasst. Vielleicht scannt man zuerst eine Tabelle, um den breitesten Namen zu ermitteln, und druckt dann alle Zeilen mit dieser Breite. Vielleicht lassen Sie den Benutzer die Genauigkeit festlegen. Möglicherweise ordnet Ihr Diagnosetool die Werte anhand der längsten Bezeichnung im aktuellen Datensatz zu. Plötzlich ist Ihre Formatzeichenfolge keine feste Schablone mehr. Es ist wie eine Layout-Engine mit Parametern. Und der zweite Trick ist snprintf als Messinstrument. Dies ist eine zivilisierte Methode, um formatierte Zeichenketten zu erstellen, wenn man nicht weiß, wie groß das Ergebnis sein wird. Der erste Aufruf gibt an, wie viele Zeichen geschrieben worden wären, ohne das Nullzeichen. Dann reserviert man genügend Speicherplatz, um die eigentliche Formatierung durchzuführen. Das ist unendlich viel besser, als zu vermuten, dass 256 Bytes ausreichen sollten, denn, wie wir alle irgendwann lernen, bestraft das Universum gerne die Formulierung „sollte ausreichen“. Und der dritte Trick ist das alternative Formatflag oder der Hash. Die meisten kennen es nur von hex, printf percent hash x, was in diesem Fall so etwas wie beef ergibt . Es betrifft aber auch die Gleitkommaausgabe. Bei Prozent G werden normalerweise nachfolgende Nullen entfernt. Mit dem Prozentzeichen G können sie erhalten bleiben. Das kann von Bedeutung sein, wenn Sie einen Text generieren, der von einem anderen Programmierer gelesen werden soll, da 42 und 42.0 visuell nicht dieselbe Idee vermitteln. Die alternative Form ist printf, was bedeutet: „Gut, ich lasse die Dezimaltrennzeichen da, wo Sie sie hingestellt haben.“ Der vierte Trick sind Positionsargumente, die in printf-Implementierungen üblich sind und für die Lokalisierung absolut unerlässlich sind . Anstatt die Argumente strikt von links nach rechts zu verarbeiten, kann die Formatzeichenkette beispielsweise angeben: „Verwende hier Argument Nummer zwei und hier Argument Nummer eins.“ Im Englischen würde man sagen: Dave hat fünf Nachrichten, aber in einer anderen Sprache wäre die natürliche Reihenfolge vielleicht: fünf Nachrichten hat Dave. Und hoffentlich in besserer Grammatik. Ohne Positionsargumente sind Übersetzer an die Argumentationsreihenfolge im Englischen gebunden . Mit ihnen kann der Satz jedoch verschoben werden, ohne den Code zu ändern. Der fünfte Trick besteht in der korrekten Formatierung der Ganzzahlgröße. Nicht besonders spektakulär, aber es ist der Unterschied zwischen Code, der auf Ihrem Rechner funktioniert, und Code, der auch den Kontakt mit einer anderen Architektur übersteht. Für size_t verwenden Sie %zu. Für ptrdiff_t verwenden Sie %td. Für Ganzzahlen mit maximaler Breite verwenden Sie %jd. Für Ganzzahlen fester Breite wie uint64_t verwenden Sie die Makros aus inttypes.h. Es ist nicht glamourös, aber das Anziehen der Radmuttern an Ihrem Camaro ist es auch nicht. Man macht es trotzdem, weil sich das Rad irgendwann löst, wenn man es nicht tut. Fragen Sie mich, woher ich das weiß, und nicht nur von C. Der sechste Trick ist %n, was sowohl faszinierend als auch ein wenig radioaktiv ist. %n gibt nichts aus. Stattdessen speichert es die Anzahl der bisher ausgegebenen Zeichen in einem von Ihnen angegebenen Integer-Zeiger . Danach enthält der Code fünf. Das klingt jetzt vielleicht nach einem Partytrick, bis man merkt, dass man damit Offsets markieren kann, während man komplizierte Ausgaben erstellt. Aber %n ist auch deshalb in der Sicherheitsgeschichte berüchtigt, weil unkontrollierte Formatzeichenketten es verwenden können, um in den Speicher zu schreiben. Und genau deshalb ist printf für Benutzereingaben nicht nur schlechter Stil, sondern eine geradezu einladende Einladung zum Chaos. Schreiben Sie also immer %f gefolgt von %s und der Benutzereingabe. Ich möchte es noch deutlicher formulieren. Wenn Sie vom Benutzer bereitgestellten Text an die printf-Formatierungs-Engine übergeben, wird dieser genauso zuverlässig verarbeitet, als hätten Sie ihn selbst von Hand codiert. Also, tu das niemals . Dieses eine zusätzliche %s ist der Unterschied zwischen dem Ausgeben einer Zeichenkette und dem Überreichen eines Einbruchswerkzeugs durch den Benutzer an Ihre kleine Formatierungsmaschine . Der siebte Trick ist die Binärausgabe, sofern diese unterstützt wird. C23 fügt schließlich Prozent B für die Formatierung von Binärzahlen hinzu, und einige Bibliotheken hatten bereits vorher ihre eigenen Erweiterungen . Wenn es also unterstützt wird, ergibt diese 42 den Wert 101010. Und je nach Implementierung erhalten Sie möglicherweise das Präfix 0b. Das ist eine so offensichtliche Debugging-Funktion, dass es fast schon komisch ist, dass es so lange gedauert hat, bis sie in C zum Standard wurde. C hatte von Anbeginn der Zeit Dezimal-, Oktal- und Hexadezimalzahlen, aber Binärzahlen, die eigentliche Basis, die der Computer verwendet, waren anscheinend zu exotisch und anstößig für den Gebrauch in höflicher Gesellschaft. Und dann gibt es noch die plattformspezifischen Extras. Auf GNU-Systemen gibt percent m die Zeichenkette aus, die der aktuellen Fehlernummer zugeordnet ist, ohne dass Sie ein Argument übergeben müssen. Anstatt also beispielsweise ` printf with open failed strerror of the error number` zu schreiben, schreibt man einfach ` percent m`. Es ist zwar kein portables C, aber es ist ein gutes Beispiel dafür, wie sich printf zu einer Diagnosesprache und nicht nur zu einer Formatierungsfunktion entwickelt hat. Und nun zu dem Teil, den man meiner Meinung nach ziemlich ernst nehmen sollte. Printf ist zwar alt, aber nicht primitiv. Es stammt aus einer Zeit, in der jedes Byte zählte und jede Abstraktion ihren Wert erst verdienen musste. Bens Assembler-Formatter verfügt über Dispatch- Tabellen für Zustände, Nachschlagetabellen für Hexadezimalziffern, eine Einheitentabelle für die Konvertierung von Dezimalzahlen, Scratch-Puffer auf dem Stack und eine sorgfältige Behandlung von Vorzeichen, Füllzeichen, Breite und Ausrichtung. Man kann dem Laufzeitsystem förmlich beim Denken zusehen. Es ist, als würde man eine Taschenuhr betrachten, deren Gehäuseboden entfernt wurde, bei der nun jedes Zahnrad einen Existenzgrund hat . Und deshalb lohnt es sich immer noch, diese Funktion zu untersuchen. Nicht, weil wir alle wieder anfangen sollten, 16-Bit- Assembler-Formatierer von Hand zu schreiben, obwohl ich zugeben muss, dass das auch eine gewisse therapeutische Wirkung hat. Es lohnt sich, printf zu studieren, denn es ist eine kompakte Lektion in Sprachdesign, Parsing, Aufrufkonventionen, Datendarstellung, Ganzzahlkonvertierung, Eigenheiten der Gleitkommaarithmetik, Sicherheit, Lokalisierung und API-Ergonomie – alles in einer kleinen Funktion zusammengefasst, die die meisten von uns in Kapitel zwei gelernt und dann nie wieder angesehen haben. Und so leistet die einfache Formatzeichenkette viel mehr, als man auf den ersten Blick vermuten würde. Es handelt sich um einen Vertrag zwischen Ihrem Programm und der Laufzeitumgebung. Es heißt: „So durchwandert man meine Erinnerung. So interpretiert man jeden Wert, so transformiert man ihn und so bereitet man ihn für den menschlichen Verzehr auf.“ Wenn Sie den Vertrag richtig gestalten, erhalten Sie saubere Diagnosen, lesbare Protokolle, kompakten Code und Zero-Copy-Tricks wie Prozent {dot} Stern s. Wenn man etwas falsch macht, erhält man wertlose Ausgaben, Verwirrung im Stack, Sicherheitslücken und eine Debugging-Session, bei der man anfängt, mit leblosen Objekten zu verhandeln. Wenn Sie also das nächste Mal printf percent d eingeben, denken Sie daran, dass Sie nicht einfach nur eine ganze Zahl ausgeben. Sie rufen eine winzige Maschine auf, die über Jahrzehnte hinweg durch verschiedene C-Laufzeitumgebungen, Betriebssysteme, Compiler und Architekturen verfeinert wurde. Es mag alt sein, aber langweilig ist es nicht. Und wenn Sie die Teile davon lernen, die die meisten Programmierer nie anfassen, können Sie Ihren Code sauberer, sicherer, schneller und manchmal auch ein bisschen eleganter gestalten. Eleganz bedeutet, dass der Code genau weiß, was er tut, genau das verwendet, was er braucht, und nichts Unnötiges zurücklässt . Wenn man genauer darüber nachdenkt, ist das auch keine schlechte Beschreibung für eine gute printf-Implementierung. Falls ihr die heutige Folge interessant oder unterhaltsam fandet, denkt daran, dass es mir dabei hauptsächlich um Abonnenten und Likes geht. Ich würde mich geehrt fühlen, wenn Sie mir vor Ihrer Abreise heute jeweils eines davon dalassen würden. Und falls Sie bereits Abonnent sind, vielen Dank. Und falls Sie eine Frage oder einen Vorschlag haben, hinterlassen Sie diesen bitte hier in den Kommentaren. Die besten davon beantworten wir jeden Freitag in der Sendung „Shop Talk“ auf dem Dave's Garage-Kanal. Hört euch eine Folge über den Link an, den ich hier einfügen werde, und abonniert den Podcast, wenn er euch gefällt . In der Zwischenzeit hoffen wir, Sie beim nächsten Mal hier in Dave's Garage wiederzusehen. Mach es, Glenn. Mach es. Mach es.
📊 Link-Infos
| URL | https://www.youtube.com/watch?v=kdnN0kk7MS0 |
| Titel | printf is Actually a Secret Virtual Machine – And a Giant Security Hole! |
| Kategorien | BulkNews, Dave's Garage |
| Hinzugefügt | 2026-07-18 00:21:37 |
| Mediendatei | Original-Medium ansehen · Lokale Kopie |

