[Bug tree-optimization/65752] Too strong optimizations int -> pointer casts
rguenth at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Thu Oct 20 08:49:00 GMT 2016
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65752
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Keywords| |wrong-code
Status|UNCONFIRMED |NEW
Last reconfirmed| |2016-10-20
Ever confirmed|0 |1
--- Comment #52 from Richard Biener <rguenth at gcc dot gnu.org> ---
Testcase with integers involving propagation that still "works" on trunk:
#include <stdio.h>
int main()
{
int x, y = 1;
int *volatile v;
int *p;
v = &y;
p = v;
unsigned long k = (unsigned long)(&x + 1);
unsigned long pi = (unsigned long)p;
if (pi == k) {
pi+=4;
p = (int *)pi;
*(p-1) = 2;
printf("y = %d\n", y);
}
}
it needs enough obfuscation (before the equivalency propagation which has
to happen before another PTA pass happens). Either via IPA inlining
if we'd ever propagate such equivalences before inlining or as above via
offsetting.
Here we replace pi with k in pi = pi + 4; which makes PTA consider pi
to point to x. The propagation essentially introduces undefined behavior.
You can expose the same issue by piecewise decomposing the pointer to
chars, and having them equivalency propagated in a bogus way, then
reconstruct the pointer from the chars. So it's not enough to disable
pointer and uintptr_t propagations either.
It's not enough to put points-to information in the dereference site
(which would fix some related issues) as this issue appears as part
of PTA analysis itself (it doesn't consider an equivalency relation
to form a dependency, see the discussion in this PR).
More information about the Gcc-bugs
mailing list