Clarification on Gcc's strict aliasing rules

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello,

I'm trying to understand what '-fstrict-aliasing' actually means.

Looking at the man page, one can read:

   -fstrict-aliasing
       Allow the compiler to assume the strictest aliasing
       rules applicable to the language being compiled.  For C
       [...]

What does "the strictest aliasing rules ..." means ?

   - Does it mean that Gcc allows only a subset of the standard aliasing
     rules (which I believe is defined in 6.5p7 ? In this case, which
     ones ?
     That would mean that Gcc also miss compiled conforming programs.

   - Does it mean that the C standard has some 'gray' areas (undefined
     behaviours) about aliasing and Gcc choose to specify the behaviour
     for optimisation purposes ?

   - or something else ?


Also I don't really understand the examples provided by the man page. Ok
type punning using union is still allowed.

But the second example which is:

    However, this code might not:

		  int f() {
		    union a_union t;
		    int* ip;
		    t.d = 3.0;
		    ip = &t.i;
		    return *ip;
		  }

_might_ not work. Why using 'might' ? Does it work or not ?
AFAIK, this type of aliasing is defined by the standard.

The third example is:

    Similarly, access by taking the address, casting the
    resulting pointer and dereferencing the result has
    undefined behavior, even if the cast uses a union type,
    e.g.:

		  int f() {
		    double d = 3.0;
		    return ((union a_union *) &d)->i;
		  }

Again in my understanding of the standard, this is an undefined
behaviour. So why does man page mention this case ?

Clarifications would be very appreciated.

Thanks.
-- 
Francis


[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux