bk99.de entertain the web since 1997

Bessere Speichergrenzen in C-Funktionssignaturen

Zusammenfassung

Felix von Leitner wünschte sich 2025, dass die C-Norm eine Syntax übernimmt, die die Linux-Manpages inzwischen nutzen: Funktionsparameter, deren Größe direkt im Prototyp an einen anderen Parameter gekoppelt ist. Bisher gibt es dafür nur eine GCC-eigene Erweiterung über __attribute__, die clang nicht unterstützt. Seit von Leitner diese Attribute großflächig nutzt, warnt der Compiler, wenn ein Zeiger mit größerer Länge übergeben wird als der Speicher, auf den er zeigt.

Worum es geht

In C übergibt man Puffer meist als Zeiger plus getrennte Längenangabe. Ob beides zusammenpasst, weiß der Compiler nicht. Viele Sicherheitslücken entstehen genau hier: Ein Puffer ist 50 Bytes groß, aber eine Funktion schreibt 100 hinein. Eine Schreibweise wie char s[maxlen] im Prototyp verrät dem Compiler, dass s mindestens maxlen Bytes lang sein muss, und er kann falsche Aufrufe erkennen.

Die neue Notation der Manpages nutzt dafür eine Vorwärtsdeklaration des Längenparameters, damit die Länge auch dann benutzt werden kann, wenn sie in der Parameterliste erst nach dem Puffer steht. Der Beitrag verweist auf einen Vorschlag an das C-Normungsgremium, der genau das standardisieren soll.

Warum das wichtig ist

Speicherfehler in C und C++ sind für einen großen Teil der schweren Sicherheitslücken verantwortlich. Neben dem Umstieg auf speichersichere Sprachen wie Rust ist es deshalb wichtig, bestehenden C-Code sicherer zu machen. Annotationen, die der Compiler prüfen kann, sind dafür ein günstiger Weg, weil sie keinen Umbau erfordern und Fehler schon beim Übersetzen sichtbar machen.

Ideen

  • Prototypen können die Größe eines Puffers an einen Längenparameter koppeln.
  • Der Compiler kann dann falsche Längenangaben beim Aufruf erkennen.
  • Krypto-Bibliotheken würden von solchen Annotationen besonders profitieren.

Einsichten

  • Viele Speicherfehler lassen sich durch bessere Typinformation schon beim Übersetzen finden.
  • Compilerspezifische Erweiterungen bremsen die Verbreitung guter Ideen.

Fakten

  • GCC unterstützt solche Prüfungen über __attribute__, clang bisher nicht.
  • Die Linux-Manpages nutzen eine eigene Notation mit Vorwärtsdeklaration der Länge.
  • Als Beispiel nennt der Beitrag die Krypto-Bibliothek libsodium.

Referenzen

Bemerkungen

  • Der verlinkte Vorschlag liegt als Dokument N3394 beim C-Normungsgremium WG14.

Empfehlungen

  • Nutze in C-Projekten die verfügbaren Compiler-Annotationen für Puffergrößen und schalte die Warnungen ein.
  • Prüfe für neuen sicherheitskritischen Code, ob eine speichersichere Sprache in Frage kommt.

Originalbeitrag lesen →

Im Webarchiv suchen