https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65752
--- Comment #24 from Chung-Kil Hur <gil.hur at sf dot snu.ac.kr> --- (In reply to schwab from comment #23) > "gil.hur at sf dot snu.ac.kr" <gcc-bugzi...@gcc.gnu.org> writes: > > > Since "hello" is not printed, I think the if-statement is the same as no-op. > > Thus, removing the if-statement should not change the behavior of the > > program > > according to ISO C11. > > Unless you are invoking undefined behaviour. > > Andreas. ============================== #include <stdio.h> int main() { int x = 0; uintptr_t xp = (uintptr_t) &x; uintptr_t i, j; for (i = 0; i < xp; i++) { } j = i; *(int*)((xp+i)-j) = 15; printf("%d\n", x); } ============================= This prints "15". And I do not think there is any UB. Please correct me if I am wrong. Then, I add the if-statement. ============================== #include <stdio.h> int main() { int x = 0; uintptr_t xp = (uintptr_t) &x; uintptr_t i, j; for (i = 0; i < xp; i++) { } j = i; /****** begin *******/ if (j != xp) { printf("hello\n"); j = xp; } /****** end *********/ *(int*)((xp+i)-j) = 15; printf("%d\n", x); } ============================= This prints "0" without printing "hello". Thus, this raises no UB unless "j != xp" raises UB. If you think "j != xp" raises UB, please explain why and give some reference. Otherwise, I think it is a bug of GCC.