Frage

Wie Benutzer Tony Punkte aus gibt es eine [Anmerkung] in Absatz 1.3.12 von C ++ Standard Spruch

  

zulässig undefiniertes Verhalten reicht von Ignorieren der Situation vollständig mit unvorhersehbaren Ergebnissen, während der Übersetzung oder Programmausführung in einer dokumentierten Weise charakteristisch für die Umwelt zu verhalten ...

Widerspricht das nicht der Definition von UB sagen, dass ... diese Internationale Norm legt keine Anforderungen ? Ich meine, sie „keine Anforderungen“ sagen und dann sagen „zulässig UB.“ - rechts im selben Absatz

Wie soll dieser Hinweis interpretiert werden? Ist es in der Tat UB in keiner Weise einschränken?

War es hilfreich?

Lösung

Von §6.5.1 von Teil 3 der ISO / IEC-Richtlinien:

  

Erläuterungen und Beispiele in der integrierten   Text eines Standard darf nur verwendet werden   zu geben zusätzliche Informationen   soll das Verständnis unterstützen,   oder den Standard verwenden und darf nicht   enthalten Bestimmungen, die es   notwendig, um konform zu sein   Lage Einhaltung der Anspruch   Standard.

Es ist also völlig nicht-normative (unverbindlich) und nur für eine mögliche Klärung bedeutete.

Andere Tipps

Als Noten sind nicht normativ ist es nicht UB in keiner Weise einschränken. Es ist nur eine Klarstellung, dass eine Implementierung einige Konstrukte verwenden könnte, die formal Ursache UB als dokumentierte Erweiterung, obwohl jedes Programm, das auf ein solches Detail beruht, ist natürlich, von Natur aus nicht sicher tragbar auf andere Umgebungen.

Diese Anmerkung ist zu erklären, was eine Implementierung tun könnte, wenn es Code trifft, für die es kein Verhalten definiert ist. Das Wort „zulässig“ ist keine Einschränkung sein, sondern einige Beispiele für gemeinsame Verhaltensweisen gegeben werden soll.

Es ist interessant, dass ein Compiler hat fast immer zu kompilieren etwas! Betrachten Sie dieses Code-Fragment:

void f() { 1 / 0; }

das Verhalten des Übersetzers dies auf der Begegnung ist nicht gut definiert, aber es kann nicht nur alles tun, es mag! In der Tat, wenn es ein Compiler es immer noch diese Übersetzungseinheit zu kompilieren benötigt wird. Das ist, weil das Verhalten eines Programms diese Funktion enthält noch gut definiert werden könnte! Der Compiler kann nicht wissen, ob die Funktion aufgerufen wird. Tatsächlich ergab sich die Frage, wo die Funktion „main ()“ wurde und die Kontrolle war sicher durch die Nullteilung fließen kann, und das Ergebnis ist, dass der Compiler selbst das Programms zu verwerfen ist nicht erlaubt. Der Grund dafür ist. Das Programm ist noch gut ausgebildet, und ein konformer Compiler erforderlich, um alle gut ausgebildet Programme zu akzeptieren (und lehnt alle schlecht gebildet Einsen und eine Diagnosefehlermeldung aus, wenn nicht anders angegeben)

Das kann nicht leicht gemacht werden, schlecht ausgebildet, da es schwierig ist, genau zu bestimmen, wie Smart-Compiler erforderlich sein kann bei der Erkennung sein, wenn eine Division durch Null stattfinden muss.

So interessant ist, die Forderung der Norm, dass es „erlegt keine Anforderungen“ ist in der Tat sehr nahe falsch zu sein. Es ist Eigenschaften eines Aufbereitungssystem getrennte Sammlung unterstützen, dass sie nicht erkennen kann, ob ein Stück Code, für die es kein gut Verhalten definiert ist, in der Tat, ausgeführt und so der Compiler ist in der Tat erforderlich Kompilierung etwas sowieso, weil es nicht ableiten kann, wenn das Programm nicht definiertes Verhalten hat.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top