https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65752
--- Comment #16 from Richard Biener <rguenth at gcc dot gnu.org> --- (In reply to Chung-Kil Hur from comment #15) > Hi Richard, > > Thanks for the explanation. > But, what I wonder was how to justify such an optimization, rather than how > it works. > > I have a better example. This might be a real bug of GCC. > > #include <stdio.h> > > int main() { > int x = 0; > uintptr_t pi = (uintptr_t) &x; > uintptr_t i, j; > > for (i = 0; i < pi; i++) { } > j = i; > /* Note that the following "if" statement is never executed because j == > pi. */ Wrong, j == i != pi. > if (j != pi) { > j = pi; > } > > *(int*)((pi+i)-j) = 15; > > printf("%d\n", x); > } > > This program prints out "0" instead of "15". > Here, "pi" contains the address of the variable x; and "i" and "j" contain > the same integer. > So, it seems that "(pi+i)-j" should have a proper provenance of "x" and thus > the variable "x" should be updated to 15. > However, GCC seems to think that "(pi+i)-j" has no provenance. > > So, as a programmer, I wonder how I should calculate the provenance of an > integer in order to see whether casting it to a pointer is valid or not. > > Thanks.