[Bug c/52085] New: sizeof packed enum can vary without warning depending on include order

joe.eykholt at gmail dot com gcc-bugzilla@gcc.gnu.org
Wed Feb 1 21:53:00 GMT 2012


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

             Bug #: 52085
           Summary: sizeof packed enum can vary without warning depending
                    on include order
    Classification: Unclassified
           Product: gcc
           Version: 4.5.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
        AssignedTo: unassigned@gcc.gnu.org
        ReportedBy: joe.eykholt@gmail.com


An enum that can be packed to 1 byte will be 4 bytes long if it is used in a
function prototype return type (or perhaps a parameter) before its declaration.

Suppose the enum is declared in header file enum.h and used in a function
prototype in header use.h.   If enum.h is included first, the enum will be 1
byte long, otherwise it'll be 4 bytes.

It would be very nice if there was a warning about this at least.  It would be
even better if the size of the enum was treated as indeterminate until the
declaration.

Otherwise, a structure using this enum would have different sizes in different
C files if they include those headers in different orders.

#include <stdio.h>

enum name func(void);           /* comment this out to get 1-byte enum */

enum name {
        val = 1,
} __attribute__ ((__packed__));

enum name x;

int main(int argc, char **argv)
{
        printf("%zd\n", sizeof(x));
        return 0;
}

Here's the build and version info:

$ gcc -v -save-temps -o t t.c
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/i686-redhat-linux/4.5.1/lto-wrapper
Target: i686-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man
--infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla
--enable-bootstrap --enable-shared --enable-threads=posix
--enable-checking=release --with-system-zlib --enable-__cxa_atexit
--disable-libunwind-exceptions --enable-gnu-unique-object
--enable-linker-build-id
--enable-languages=c,c++,objc,obj-c++,java,fortran,ada,lto --enable-plugin
--enable-java-awt=gtk --disable-dssi
--with-java-home=/usr/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre
--enable-libgcj-multifile --enable-java-maintainer-mode
--with-ecj-jar=/usr/share/java/eclipse-ecj.jar --disable-libjava-multilib
--with-ppl --with-cloog --with-tune=generic --with-arch=i686
--build=i686-redhat-linux
Thread model: posix
gcc version 4.5.1 20100924 (Red Hat 4.5.1-4) (GCC) 
COLLECT_GCC_OPTIONS='-v' '-save-temps' '-o' 't' '-mtune=generic' '-march=i686'
 /usr/libexec/gcc/i686-redhat-linux/4.5.1/cc1 -E -quiet -v t.c -mtune=generic
-march=i686 -fpch-preprocess -o t.i
ignoring nonexistent directory
"/usr/lib/gcc/i686-redhat-linux/4.5.1/include-fixed"
ignoring nonexistent directory
"/usr/lib/gcc/i686-redhat-linux/4.5.1/../../../../i686-redhat-linux/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/local/include
 /usr/lib/gcc/i686-redhat-linux/4.5.1/include
 /usr/include
End of search list.
COLLECT_GCC_OPTIONS='-v' '-save-temps' '-o' 't' '-mtune=generic' '-march=i686'
 /usr/libexec/gcc/i686-redhat-linux/4.5.1/cc1 -fpreprocessed t.i -quiet
-dumpbase t.c -mtune=generic -march=i686 -auxbase t -version -o t.s
GNU C (GCC) version 4.5.1 20100924 (Red Hat 4.5.1-4) (i686-redhat-linux)
    compiled by GNU C version 4.5.1 20100924 (Red Hat 4.5.1-4), GMP version
4.3.1, MPFR version 2.4.2, MPC version 0.8.1
GGC heuristics: --param ggc-min-expand=98 --param ggc-min-heapsize=128270
GNU C (GCC) version 4.5.1 20100924 (Red Hat 4.5.1-4) (i686-redhat-linux)
    compiled by GNU C version 4.5.1 20100924 (Red Hat 4.5.1-4), GMP version
4.3.1, MPFR version 2.4.2, MPC version 0.8.1
GGC heuristics: --param ggc-min-expand=98 --param ggc-min-heapsize=128270
Compiler executable checksum: 96e2ff891a3517bf2aed246a142fe05d
COLLECT_GCC_OPTIONS='-v' '-save-temps' '-o' 't' '-mtune=generic' '-march=i686'
 as -V -Qy --32 -o t.o t.s
GNU assembler version 2.20.51.0.7 (i686-redhat-linux) using BFD version version
2.20.51.0.7-6.fc14 20100318
COMPILER_PATH=/usr/libexec/gcc/i686-redhat-linux/4.5.1/:/usr/libexec/gcc/i686-redhat-linux/4.5.1/:/usr/libexec/gcc/i686-redhat-linux/:/usr/lib/gcc/i686-redhat-linux/4.5.1/:/usr/lib/gcc/i686-redhat-linux/
LIBRARY_PATH=/usr/lib/gcc/i686-redhat-linux/4.5.1/:/usr/lib/gcc/i686-redhat-linux/4.5.1/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-v' '-save-temps' '-o' 't' '-mtune=generic' '-march=i686'
 /usr/libexec/gcc/i686-redhat-linux/4.5.1/collect2 --build-id --no-add-needed
--eh-frame-hdr -m elf_i386 --hash-style=gnu -dynamic-linker /lib/ld-linux.so.2
-o t /usr/lib/gcc/i686-redhat-linux/4.5.1/../../../crt1.o
/usr/lib/gcc/i686-redhat-linux/4.5.1/../../../crti.o
/usr/lib/gcc/i686-redhat-linux/4.5.1/crtbegin.o
-L/usr/lib/gcc/i686-redhat-linux/4.5.1
-L/usr/lib/gcc/i686-redhat-linux/4.5.1/../../.. t.o -lgcc --as-needed -lgcc_s
--no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed
/usr/lib/gcc/i686-redhat-linux/4.5.1/crtend.o
/usr/lib/gcc/i686-redhat-linux/4.5.1/../../../crtn.o



More information about the Gcc-bugs mailing list