Sind noreturn
Attribute auf nie wiederkehrende Funktionen notwendig, oder ist das nur ein (wohl zu frühes? - zumindest für Exits, kann ich mir nicht vorstellen, warum dort Optimierung optimieren)?Sind Noreturn-Attribute bei bestehenden Funktionen notwendig?
Es wurde mir erklärt, dass in einem Kontext wie
void myexit(int s) _Noreturn {
exit(s);
}
// ...
if (!p) { myexit(1); }
f(*p);
/// ...
noreturn
verhindert, dass die !p
Zweig von out optimiert. Aber ist es wirklich zulässig, dass ein Compiler diesen Zweig optimiert? Ich realisiere die Begründung für die Optimierung wäre: "Undefined Verhalten kann nicht passieren. Wenn == NULL
, Dereferenzierung ist es UB, daher p
kann nie NULL
in diesem Zusammenhang sein, daher der !p
Zweig nicht ausgelöst". Kann der Compiler das Problem nicht genauso gut lösen, indem er annimmt, dass myexit
eine Funktion sein kann, die nicht zurückkehrt (auch wenn sie nicht explizit als solche gekennzeichnet ist)?
Ich bin zögerlich, dieses C++ auch zu markieren, weil glücklich Puristen downvote, aber C++ hat noreturn Attribute ('[[noreturn]]') auch, und eine C/C++ Antwort wäre sehr willkommen. – PSkocik
_ "noreturn verhindert, dass der'! P'-Zweig optimiert wird. "_ Why? – mvidelgauz
Mögliches Duplikat - http://stackoverflow.com/questions/10538291/what-is-the-point-of-noreturn – mvidelgauz