3 ms·
AIUI, this code is not affected: X *foo = ...; if (foo) foo->bar(); But this code will be: X *foo = ...; foo->bar(); if (foo) { ... } Since foo is
by yrro 11y ago
AIUI, this code is not affected:
X *foo = ...;
if (foo) foo->bar();
But this code will be:
X *foo = ...;
foo->bar();
if (foo) { ... }
Since foo is dereferenced unconditionally, the compiler is allowed to assume that it will not be null in the above code, and therefore the test on the third line to determine whether foo is null or not is useless and can be omitted.
- iso-8859-1 11y agoSince this code is broken, wouldn't it be better to emit a warning and let the programmer fix it?
- caf 11y agoThe real case where it matters is where the "if (foo) { ... }" test happens in a function that's been inlined into the caller, but not all the callers do the foo->bar() dereference. So it's only being removed in some cases.
- brandmeyer 11y agoThere used to be a fairly broad warning (-Wunreachable-code), but it caused so many false positives and false negatives that it was removed.