------- Comment #35 from ebotcazou at gcc dot gnu dot org 2007-03-06 06:59
-------
> The problem looks like a bug in GCC's optimisation in 4.1.1 - for the
> following code:
>
> 152 while (--delete_count>=0) {
> 153 zval *q = *(zval **)(--p);
> 154 *p = NULL;
> (gdb) l
> 155 zval_ptr_dtor(&q);
> 156 }
> 157 EG(argument_stack).top_element = p;
>
> ('p' is declared as void **)
Thanks for investigating. The above code is illegal as per the ISO C standard
because it violates the type-based aliasing rules: you're not allowed to read
a void** object through a zval** lvalue, so the code is equivalent to
152 while (--delete_count>=0) {
--p;
zval *q = NULL;
*p = NULL;
155 zval_ptr_dtor(&q);
156 }
157 EG(argument_stack).top_element = p;
and the compiler correctly optimizes it. You must compile such code with
-fno-strict-aliasing (see the entry for this option in the manual).
--
ebotcazou at gcc dot gnu dot org changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|RESOLVED |UNCONFIRMED
Resolution|FIXED |
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=30819