LINUX.ORG.RU

История изменений

Исправление alysnix, (текущая версия) :

Так как компилятор видит, что g(p) не может быть вычислено после free(p), то если some_else не имеет побочных эффектов, то компилятор может запомнить значение f(x) и если оно истинно, то не вычислять some_else.

откуда у «компилятора» такие мыслищи???

g(…) может просто проверять подставленный параметр на нулл, и больше ничего не делать кроме диагностики. также он может не использовать значение параметра вообще. то есть технически может быть вызвана и никакого UB не будет.

опять же «p» могло быть с самого начала нулом, и вполне себе корректно быть использовано в данном коде.

if(f(x)) { do_p(p); free(p); }
do_something_else();
if(some_else(y)) { g(p); }

Исходная версия alysnix, :

Так как компилятор видит, что g(p) не может быть вычислено после free(p), то если some_else не имеет побочных эффектов, то компилятор может запомнить значение f(x) и если оно истинно, то не вычислять some_else.

откуда у «компилятора» такие мыслищи???

g(…) может просто проверять подставленный параметр на нулл, и больше ничего не делать кроме диагностики. также он может не использовать значение параметра вообще. то есть технически может быть вызвана и никакого UB не будет.

опять же могло быть с самого начала нулом, и вполне себе корректно быть использовано в данном коде.

if(f(x)) { do_p(p); free(p); }
do_something_else();
if(some_else(y)) { g(p); }