What does zero-length array mean at file scope?

Uros Bizjak ubizjak@gmail.com
Sun May 24 09:47:00 GMT 2009


Hello!

>   I found something rather odd in testcase gcc.c-torture/execute/20030811-1.c:
>
> > /* Origin: PR target/11535 from H. J. Lu <hjl@lucon.org> */
> > 
> > void vararg (int i, ...)
> > {
> >   (void) i;
> > }
> > 
> > int i0[0], i1;
>
>   Huh?
>
> > void test1 (void)
> > {
> >   int a = (int) (long long) __builtin_return_address (0);
> >   vararg (0, a);
> > }
> > 
> > void test2 (void)
> > {
> >   i0[0] = (int) (long long) __builtin_return_address (0);
> > }
>
>   Nasal demons?
>
> > void test3 (void)
> > {
> >   i1 = (int) (long long) __builtin_return_address (0);
> > }
> > 
> > void test4 (void)
> > {
> >   volatile long long a = (long long) __builtin_return_address (0);
> >   i0[0] = (int) a;
> > }
>
>   
>   And testing it on Linux, I see that the linker goes ahead and assigns zero
> bytes of the common area to i0, then assigns four bytes of common space to i1
> at the same address, so writing to i0[0] aliases and alters i1.  That
> certainly sounds like undefined behaviour to me!
>   

It looks like a typo in the testcase to me, but let's add some CCs to be 
sure.

Uros.



More information about the Gcc mailing list