Unterschied zwischen undefiniertem Verhalten und fehlerhaftem Verhalten, keine Diagnosemeldung erforderlich

Der C ++ - Standard enthält eine erstaunliche Anzahl von Definitionen fürunklar1 Verhalten, das mehr oder weniger dasselbe mit subtilen Unterschieden bedeutet. lesendiese AntwortIch bemerkte den Wortlaut"Das Programm ist falsch aufgebaut; keine Diagnose erforderlich".

Implementierung definiert unterscheidet sich vonnicht spezifiziert Verhalten dahingehend, dass die Implementierung im ersteren Fall klar dokumentieren muss, was sie tut (im letzteren Fall muss es nicht sein), beides istwohlgeformt. Nicht definiert Verhalten unterscheidet sich von nicht angegeben, dass das Programm istfalsch (1.3.13).
Ansonsten haben alle gemeinsam, dass der Standard keine Annahmen oder Anforderungen hinsichtlich der Umsetzung trifft. Mit Ausnahme von 1.4 / 8, in dem angegeben ist, dass Implementierungen möglicherweise Erweiterungen aufweisen, die das Verhalten von wohlgeformten Programmen nicht ändern, die jedoch gemäß dem Standard und der Implementierung falsch sindMuss diagnostizieren Sie deren Verwendung, können Sie das fehlerhafte Programm anschließend aber weiter kompilieren und ausführen.

Einschlecht geformt Programm wird sonst nur als nicht wohlgeformt definiert (toll!). EINwohlgeformt Programm hingegen ist ein Programm, das sich an die Syntax und die diagnostizierbaren semantischen Regeln hält. Das würde folglich bedeuten, dass ein schlecht geformtes Programm entweder die Syntax oder die semantischen Regeln (oder beides) verletzt. Mit anderen Worten, ein schlecht geformtes Programmtatsächlich sollte überhaupt nicht kompiliert werden (wie würde man beispielsweise ein Programm mit einer falschen Syntax auf sinnvolle Weise übersetzen?).

Ich wäre geneigt zu denken, dass das Wortfalsch impliziert auch, dass der Compiler den Build mit einer Fehlermeldung abbrechen sollte (immerhinfalsch deutet auf einen Fehler hin), aber der Abschnitt "Hinweis" in 1.3.13 lässt ausdrücklich etwas anderes zu, einschließlich des stillen Ignorierens des Problems (und nachweislich der Compiler)unterlassen Sie brechen den Build wegen UB ab (die meisten warnen nicht einmal standardmäßig).

Man könnte das weiter glaubenfalsch und schlecht geformt sind gleich, aber die Norm geht nicht ins Detail, wenn dies der Fall ist oder was das Wort bedeuten soll.

1.4 besagt weiter, dass

Eine konforme Implementierung muss [...] ein wohlgeformtes Programm akzeptieren und korrekt ausführen

und

Wenn ein Programm einen Verstoß gegen eine Regel enthält, für die keine Diagnose erforderlich ist, [...] keine Anforderung für Implementierungen in Bezug auf dieses Programm.

Mit anderen Worten, eine konforme ImplementierungMuss Akzeptiere ein wohlgeformtes Programm, aber es könnte genauso gut ein schlecht geformtes akzeptieren, und das sogar ohne Vorwarnung. Außer wenn das Programm schlecht istweil es eine Erweiterung verwendet.

Der zweite Absatz besagt, dass alles in Verbindung mit "keine Diagnose erforderlich" bedeutet, dass es keine Anforderungen aus der Spezifikation gibt, was bedeutet, dass es größtenteils gleichbedeutend mit "undefiniertem Verhalten" ist, außer dass nicht erwähnt wirdfalsch.

Welche Absicht stünde dahinter, eine Formulierung wie"schlecht geformt; keine Diagnose erforderlich"?

Das Vorhandensein von "keine Diagnose" würde darauf hindeuten, dass es identisch ist (odermeist identisch?) mit undefiniertem Verhalten. Auch seitImplementierung definiert undnicht spezifiziert Verhalten sind definiert alswohlgeformt, es muss seinetwas anderes.

Andererseits sollte ein schlecht geformtes Programm nicht kompiliert werden, da es gegen die Syntax- / Semantikregeln verstößt. Was jedoch in Verbindung mit "keine Diagnose erforderlich" bedeuten würde, dass ein Compiler ohne Warnung stillschweigend beendet werden kann und Sie anschließend keine ausführbare Datei finden können.

Gibt es einen Unterschied zwischen "schlecht geformt, keine Diagnose erforderlich" und "undefiniertem Verhalten", oder ist dies einfach ein kompliziertes Synonym für dasselbe?

1In Ermangelung einer besseren Formulierung für das Verhaltenskollektiv