int8_t i;
/* ... */
i += 1;
if (i == 0) {
/* ... */
} int incr(int i) {
int old = i;
i += 1;
if (i < old) return 1;
return 0;
}
GCC optimizes this to 'return 0;'.EDIT: Updated to a better example.
int zero1(int* i) {
*i = 0;
return 0;
}
int zero2(int* i) {
*i = 0;
if(i == 0) return 1;
return 0;
}
GCC produces the same code for these two functions. If the 'if' in zero2 is moved to the top of the function, it takes effect.I tried this on GCC 4.8.1. A wonderful site for checking these things is: http://gcc.godbolt.org/
Regardless of optimisation, it will never be followed - it segfaults if NULL and returns normally if not.
I found you can control this with -f{no-,}delete-null-pointer-checks. Apparently it's enabled by -O2.
http://gcc.gnu.org/onlinedocs/gcc-4.8.2/gcc/Optimize-Options...
I'm not describing some optimization that you, the programmer, can do. I'm talking about what the compiler can (and will) do by assuming your code doesn't have undefined behavior.
In this particular case, the compiler recognizes that if the pointer is NULL, undefined behavior has already been invoked and it can therefore eliminate the check.
I recommend this series of posts on the LLVM blog: http://blog.llvm.org/2011/05/what-every-c-programmer-should-...
ah, makes sense thank you !
*you will see a segfault*
No, you will see undefined behavior. Undefined behavior doesn't mean "you get a segfault". That would be defined behavior.