optimization/8300: [3.2/3.3/3.4 regression] [sparc] ICE in gen_reg_rtx, at emit-rtl.c:662
Daniel Jacobowitz
drow@mvista.com
Mon Mar 17 15:17:00 GMT 2003
On Mon, Mar 17, 2003 at 10:25:04AM +0100, Robert Schiele wrote:
> On Mon, Mar 17, 2003 at 01:05:55AM -0800, Richard Henderson wrote:
> > On Mon, Mar 17, 2003 at 06:08:21AM +0100, Robert Schiele wrote:
> > > *(&c + 1) is also well defined.
> >
> > How's that?
>
> It's pointer arithmetic:
>
> Assume you have the following memory layout...
>
> | |
> +---+
> | | <== ... then the contents of that address is *(&c + 1)
> +---+
> | c |
> +---+
> | |
>
> It is:
>
> c: The contents of the variable c on the stack.
>
> &c: The address where c is located on the stack.
>
> &c + 1: That address plus 4 byte. (sizeof(int) == 4 on sparc)
>
> *(&c + 1): The contents of the above address.
>
> > > 1. My rewritten example is legal code with no doubt and produces an
> > > ICE whit optimization.
> >
> > Nyet.
>
> Well, I still don't see why this is illegal. Can you give me the
> paragraph of the C standard that prohibits this sort of pointer
> arithmetic?
If you have a copy of the standard, it's 6.5.6#8. Once a pointer is
adjusted to point outside of the original object it must not be
dereferenced. Accessing memory in this way produces undefined
behavior.
--
Daniel Jacobowitz
MontaVista Software Debian GNU/Linux Developer
More information about the Gcc-bugs
mailing list