Являются ли атрибуты noreturn
для никогда не возвращающихся функций, или это просто (возможно, преждевременный? - по крайней мере, для выходов, я не могу себе представить, почему оптимизировать там)?
Мне объяснили, что в контексте, таком как
void myexit(int s) _Noreturn {
exit(s);
}
// ...
if (!p) { myexit(1); }
f(*p);
/// ...
noreturn
предотвращает оптимизацию ветвления !p
.
Но действительно ли разрешено компилятору оптимизировать эту ветвь?
Я понимаю, что обоснование для его оптимизации было бы следующим: "Undefined поведение не может произойти. Если p
== NULL
, разыменованием является UB, поэтому p
никогда не может быть NULL
в этом контексте, поэтому ветвь !p
не запускается". Но не может ли компилятор разрешить проблему так же, если предположить, что myexit
может быть функцией, которая не возвращается (даже если она явно не помечена как таковая)?