Die immer gleichen Bugs, die sich in Ihren vertrauenswürdigen Bibliotheken verstecken
Ich verbringe Zeit damit, kleine Fixes an große Repositories wie Langchain, Vite und Bat zu senden.
Diese Projekte nutzen unterschiedliche Sprachen und unterschiedliche Fachbereiche. Die Maintainer sind Experten.
Das Überraschende ist nicht die Anzahl der Bugs. Es sind die Muster. Die meisten Bugs haben dieselben wenigen Formen, nur in unterschiedlicher Kleidung.
Sobald man diese Formen benennt, kann man sie abfangen, bevor sie die Produktion erreichen. Hier sind fünf häufige Muster, die ich finde:
Falsche Input-Keys In Langchain suchte eine Rename-Funktion nach einem Key namens
old_path. Das System sendete jedoch einen Key namenspath. Der Code stürzte ab. Warum er den Review übersteht: Der Unit-Test bestand, weil der Entwickler den Input, den die Funktion erwartete, manuell erstellt hatte – und nicht den Input, den das System tatsächlich sendet. Der Check: Wenn eine Funktion einen Key ausliest, finde heraus, wo dieses Objekt erstellt wird. Wenn nichts diesen Key setzt, hast du einen Bug gefunden. Teste gegen den tatsächlichen Aufrufer.Truthiness-Fallen Ein häufiger Fehler ist die Verwendung eines Truthiness-Checks, wenn man eigentlich meint: „Ist dieser Wert gesetzt?“ Beispiel:
const clause = defaultValue ? \DEFAULT ${defaultValue}` : '';Wenn der Wert 0 ist, überspringt der Code diesen Zweig. 0 ist ein echter Wert, aber er ist „falsy“. Der Check: Teste immer 0, leere Strings undfalse`. Wenn dein Code nicht zwischen „fehlend“ und „vorhanden, aber Null“ unterscheiden kann, ist er fehlerhaft.Underflow bei Unsigned Integers Im Bat-Projekt wurde Mathematik verwendet, um die Terminalbreite zu berechnen. Wenn die Breite zu klein war, führte die Subtraktion zu einem Underflow. Bei Unsigned-Typen führt dies zu einem Überlauf in eine riesige Zahl oder zum Absturz. Der Check: Jede Subtraktion auf einem Unsigned-Typ unter Verwendung von Benutzereingaben benötigt eine Sättigungs-Subtraktion (saturating subtraction). Teste mit 0 und 1.
Encoding und Edge Cases Textregeln wirken einfach, bis man auf Nicht-ASCII-Zeichen stößt. Mistune hatte Probleme mit gestapelten Delimitern, die ein Generator erzeugen könnte. Wenmode scheiterte beim Umgang mit Unicode-Kombinationszeichen. Warum er den Review übersteht: ASCII besteht jeden Test. Die Bugs treten nur bei Eingaben auf, die man nicht von Hand tippt. Der Check: Nutze einen Differential-Test. Vergleiche deine Ausgabe mit einer anderen, bewährten Implementierung.
Unsicheres Parsing Vite hatte eine Middleware, die URLs ohne Absicherung dekodierte. Eine fehlerhafte URL warf einen
URIErrorund ließ die Middleware abstürzen. Der Check: Alles, was du dekodierst oder parst und das du nicht selbst erstellt hast, benötigt einentry/catch-Block. Wirf kaputte Strings auf deinen Code, um zu sehen, ob er nachgibt oder bricht.
Meine Gewohnheit ist simpel. Wenn ich einen Bug fixe, schaue ich mir den Code direkt daneben an. Wenn ein Handler einen Bug hat, hat der benachbarte Handler oft dieselbe Form.
Quelle: https://dev.to/greymothjp/the-same-few-bugs-keep-hiding-in-libraries-you-already-trust-1pgp
