typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned int uint32_t;
typedef unsigned long long upad64_t;

typedef struct _pthread_mutex {
        struct {
                uint16_t        __pthread_mutex_flag1;
                uint8_t         __pthread_mutex_flag2;
                uint8_t         __pthread_mutex_ceiling;
                uint16_t        __pthread_mutex_type;
                uint16_t        __pthread_mutex_magic;
        } __pthread_mutex_flags;
        union {
                struct {
                        uint8_t __pthread_mutex_pad[8];
                } __pthread_mutex_lock64;
                struct {
                        uint32_t __pthread_ownerpid;
                        uint32_t __pthread_lockword;
                } __pthread_mutex_lock32;
                upad64_t __pthread_mutex_owner64;
        } __pthread_mutex_lock;
        upad64_t __pthread_mutex_data;
} pthread_mutex_t; 

void foo(void)
{
   pthread_mutex_t tmp =  {{0, 0, 0, 0, 0x4d58}, {{{0}}}, 0};
}


On SPARC64 at -O0:

        sth     %g0, [%fp+2007]
        stb     %g0, [%fp+2009]
        stb     %g0, [%fp+2010]
        sth     %g0, [%fp+2011]
        sethi   %hi(19456), %g1
        or      %g1, 344, %g1
        sth     %g1, [%fp+2013]
        stb     %g0, [%fp+2015]
        stx     %g0, [%fp+2023]


On AMD64 at -O0:

        movw    $0, -32(%rbp)
        movb    $0, -30(%rbp)
        movb    $0, -29(%rbp)
        movw    $0, -28(%rbp)
        movw    $19800, -26(%rbp)
        movb    $0, -24(%rbp)
        movq    $0, -16(%rbp)


Note the 'b' on the last but one line in both cases: __pthread_mutex_pad is not
initialized according to the ISO C99 rules.  This is critical on Solaris 64-bit
as it affects POSIX thread support.

The C++ and Objective-C compilers are also affected.

-- 
           Summary: [4.0 Regression] Violation of C99 6.7.8 §21
           Product: gcc
           Version: 4.0.0
            Status: UNCONFIRMED
          Severity: critical
          Priority: P2
         Component: c
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: ebotcazou at gcc dot gnu dot org
                CC: gcc-bugs at gcc dot gnu dot org
 GCC build triplet: *-*-*
  GCC host triplet: *-*-*
GCC target triplet: *-*-*


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19515

Reply via email to