Analyzability (since C11)
Diese optionale Erweiterung der C-Sprache begrenzt die möglichen Ergebnisse der Ausführung einiger Formen von undefiniertem Verhalten, was die Effektivität der statischen Analyse solcher Programme verbessert. Die Analysierbarkeit ist nur garantiert aktiviert, wenn das vordefinierte Makro __STDC_ANALYZABLE__ vom Compiler definiert wird.
Wenn der Compiler Analysierbarkeit unterstützt, wird jedes Sprach- oder Bibliothekskonstrukt mit undefiniertem Verhalten weiter klassifiziert zwischen kritischem und begrenztem undefiniertem Verhalten, und das Verhalten aller Fälle von begrenztem UB ist wie unten spezifiziert eingeschränkt.
Inhaltsverzeichnis |
Kritisches undefiniertes Verhalten
Kritisches UB ist undefiniertes Verhalten, das möglicherweise einen Speicherschreibvorgang oder einen flüchtigen Speicherlesevorgang außerhalb der Grenzen eines beliebigen Objekts durchführt. Ein Programm mit kritischem undefiniertem Verhalten könnte anfällig für Sicherheitsausnutzungen sein.
Nur die folgenden undefinierten Verhaltensweisen sind kritisch:
- Zugriff auf ein Objekt außerhalb seiner Lebensdauer (z.B. durch einen hängenden Zeiger)
- Schreibzugriff auf ein Objekt, dessen Deklarationen nicht kompatibel sind
- Funktionsaufruf durch einen Funktionszeiger, dessen Typ nicht kompatibel mit dem Typ der Funktion ist, auf die er zeigt
- Lvalue-Ausdruck wird ausgewertet, bezeichnet aber kein Objekt
- Versuchte Modifikation eines String-Literals
- Dereferenzieren eines ungültigen (null, undefiniert, etc.) oder End-of-Block Zeigers
- Modifikation eines const-Objekts durch einen nicht-konstanten Zeiger
- Aufruf einer Standardbibliotheksfunktion oder -makro mit ungültigem Argument
- Aufruf einer variadischen Standardbibliotheksfunktion mit unerwartetem Argumenttyp (z.B. Aufruf von printf mit einem Argument, dessen Typ nicht zum Konvertierungsspezifizierer passt)
- longjmp ohne vorhandenen setjmp im Aufrufkontext, über Threadgrenzen hinweg oder aus dem Gültigkeitsbereich eines VM-Typs
- Jede Verwendung eines Zeigers, der durch free oder realloc freigegeben wurde
- Jede String- oder Breitzeichen-String Bibliotheksfunktion, die außerhalb der Array-Grenzen zugreift
Begrenztes undefiniertes Verhalten
Bounded UB ist undefiniertes Verhalten, das keinen illegalen Speicherzugriff durchführen kann, obwohl es zu einem Trap führen und undefinierte Werte erzeugen oder speichern kann.
- Alle nicht als kritisch aufgeführten undefinierten Verhaltensweisen sind begrenzt, einschließlich
-
- Multithreaded-Datenrennen
- Verwendung von unbestimmten Werten mit automatischer Speicherdauer
- Strict-Aliasing Verletzungen
- Falsch ausgerichtete Objektzugriffe
- Vorzeichenbehafteter Integer-Überlauf
- Nichtsequenzierte Nebeneffekte modifizieren denselben Skalar oder modifizieren und lesen denselben Skalar
- Fließkomma-zu-Integer- oder Pointer-zu-Integer- Konvertierungsüberlauf
- Bitweise Verschiebung um eine negative oder zu große Bitanzahl
- Integer-Division durch Null
- Verwendung eines void-Ausdrucks
- Direkte Zuweisung oder memcpy von nicht exakt überlappenden Objekten
- restrict Verletzungen
- etc.. ALLES undefinierte Verhalten, das nicht in der kritischen Liste steht.
Hinweise
Begrenztes undefiniertes Verhalten deaktiviert bestimmte Optimierungen: Kompilierung mit aktivierter Analysierbarkeit bewahrt die Quellcode-Kausalität, die durch undefiniertes Verhalten anderweitig verletzt werden könnte .
Die Analysierbarkeitserweiterung erlaubt, als eine Form implementierungsdefinierten Verhaltens, dass der Runtime-Constraint-Handler aufgerufen wird, wenn ein Trap auftritt.
Referenzen
- C23-Standard (ISO/IEC 9899:2024):
-
- 6.10.10.4/1 Conditional feature macros (S: 188-189)
-
- Anhang L Analysierbarkeit (S: 672-673)
- C17-Standard (ISO/IEC 9899:2018):
-
- 6.10.8.3/1 Bedingte Feature-Makros (S: 128-129)
-
- Anhang L Analysierbarkeit (S: 473-474)
- C11-Standard (ISO/IEC 9899:2011):
-
- 6.10.8.3/1 Bedingte Funktionsmakros (S: 177)
-
- Anhang L Analysierbarkeit (S: 652-653)