История изменений
Исправление 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); }