Namespaces
Variants

Analyzability (since C11)

From cppreference.net

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

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)