Zum Hauptinhalt springen
usedby

Thomas Habets über die Unmöglichkeit von gültigem C

Thomas Habets argumentiert, die Programmiersprache C sei grundsätzlich ungültig, weil ihre formale Spezifikation fast jede komplexe Operation als Undefined Behavior (UB) definiert.

Das Versprechen

Thomas Habets argumentiert, die Programmiersprache C sei grundsätzlich ungültig, weil ihre formale Spezifikation fast jede komplexe Operation als Undefined Behavior (UB) definiert. Auf Hacker News hat das eine lebhafte Debatte ausgelöst, denn Entwickler müssen sich damit auseinandersetzen, dass „formal korrektes“ C nach modernen Standards kaum zu schreiben ist.

Unter der Haube

Der Standard ISO C23 (ISO/IEC 9899:2024) hat die Vorgaben verschärft und bisher übliche Muster wie realloc(ptr, 0) zu formalem Undefined Behavior gemacht (Quelle: i-programmer.info). Für ältere Codebasen, die auf C23 oder das kommende C2y migrieren, drohen damit stille Fehler, weil Compiler immer aggressiver optimieren.

Das Casten nicht ausgerichteter Zeiger gilt jetzt als UB, selbst wenn kein Speicherzugriff stattfindet. Entwickler, die sich auf ältere Annahmen aus C11 oder C17 verlassen, übersehen diese Feinheit oft (Quelle: HN). Zudem gelten volatile Lesezugriffe nach Abschnitt 5.1.2.4.1 als Seiteneffekte, was in nicht sequenzierten Ausdrücken zu überraschendem UB führt (Quelle: HN).

Moderne Compiler wie GCC 16 und Clang 22 nutzen diese UB-Definitionen für extreme Optimierungen.

Aktuelle Tools mit Reasoning-Fähigkeiten wie Claude 4.5 Opus und GPT-5 haben die Sicherheitslage verändert, weil sie solche tief liegenden UB-Fehler finden, die klassische statische Analysewerkzeuge übersehen (Quelle: devops.com). Unternehmen wie Notion, DuckDuckGo und Quora nutzen derzeit die Suite Claude Code Security, um genau diese Szenarien zu prüfen.
Profil von Claude ansehen

Noch ist unklar, wie das Komitee WG14 auf den Artikel von Habets reagieren wird.

Unsere Einschätzung

Technisch hat Habets recht, aber seine Schlussfolgerung ist für einen Google-Engineer erwartbar reißerisch. Produktionssysteme haben nie mit reinem, ISO-konformem C überlebt. Sie überleben dank implementierungsdefiniertem Verhalten und spezieller GCC/Clang-Flags, die die pedantischeren Fallen des Standards aushebeln. Wer 2026 ein neues Projekt beginnt und immer noch C statt einer speichersicheren Alternative wählt, unterschreibt praktisch einen Vertrag, seine Wochenenden mit dem Debuggen von Pointer Provenance zu verbringen.