
Die Situation, in der C ++ - Code syntaktisch gültig ist, sein Verhalten jedoch nicht im Standard definiert ist, wird in der russischsprachigen Literatur häufig als einfach undefiniertes Verhalten bezeichnet. Im Standard selbst gibt es für solche Situationen bis zu drei Begriffe: undefiniertes Verhalten , nicht spezifiziertes Verhalten und implementierungsdefiniertes Verhalten . In dieser kurzen Notiz werden wir verstehen, wie sie sich unterscheiden.
Implementierungsdefiniertes Verhalten
Dieser Begriff wird verwendet, um Situationen zu beschreiben, in denen C ++ - Code vollständig gültig ist, sein Verhalten jedoch von der Implementierung abhängt (z. B. vom Compiler oder der Laufzeit), und dieses Verhalten wird dokumentiert . Beispielsweise hängt die Größe eines Zeigers oder Int- Typs in Byte von der jeweiligen Implementierung oder den Compiler-Einstellungen ab. Dies wird jedoch in der Dokumentation beschrieben, und Sie können sich auf diese Dokumentation verlassen.
Nicht spezifiziertes Verhalten
Der Begriff bedeutet, dass das Verhalten von gültigem C ++ - Code nicht durch den Standard definiert ist und von der Implementierung abhängt, außerdem wird es (zumindest offiziell) nicht dokumentiert . Beispiel: Die Prozedur zum Berechnen der Werte von Funktionsargumenten wird vom Compiler festgelegt, aber nirgends wird beschrieben, wie. Der Standard sagt uns: Dies sind Verhaltensmerkmale, die nirgendwo festgelegt sind, daher können Sie sich nicht auf sie verlassen. Daher sollte das Verhalten Ihres Codes nicht von diesen Funktionen abhängen.
Undefiniertes Verhalten
Dies ist die gefährlichste Variante der Unsicherheit. Im Standard wird es verwendet, um Verhalten zu beschreiben, das zu völlig unvorhersehbaren Konsequenzen führen kann. Die auffälligsten Beispiele sind der Zugriff auf die Grenzen eines Arrays oder die Dereferenzierung eines Zeigers auf ein freigegebenes Objekt. Das Schlimmste ist, dass das Programm nicht sofort beendet werden muss oder sogar einen Fehler erzeugt. Auf sein Verhalten kann man sich jedoch nicht mehr verlassen.
Abschließend möchte ich Sie noch einmal daran erinnern, dass sich alle oben genannten Begriffe auf syntaktisch gültigen Code beziehen, der erfolgreich kompiliert wird (Compiler geben jedoch häufig Warnungen für die offensichtlichsten Fälle von undefiniertem Verhalten ). Code, der aus Sicht des Standards ungültig ist, wird als schlecht geformtes Programm bezeichnet .