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

Re: [csmith-dev] Pragma pack clang/gcc difference

Hi Pascal,


If a packed struct has bit-fields, 0 length or not, Csmith should make no assumption about its size. If the test case does that, it’s a Csmith bug. Please send us the Csmith command used to generate the program.






From: csmith-dev-bounces@flux.utah.edu [mailto:csmith-dev-bounces@flux.utah.edu] On Behalf Of Pascal Cuoq
Sent: Friday, August 12, 2011 7:17 AM
To: csmith-dev@flux.utah.edu
Subject: [csmith-dev] Pragma pack clang/gcc difference




the generation of pragma pack directives in Csmith programs

recently became active by default. I am not asking how to

deactivate it (I can only re-iterate here that I find Csmith

really easy to use for what it does). But together with unions,

programs may be generated that test the same thing as

this reduced program:


#pragma pack(push)

#pragma pack(1)

struct S0 {

  unsigned f0 : 5;

  unsigned    : 0;

  unsigned f1 : 5;


#pragma pack(pop)



  return (sizeof(struct S0));



Generated programs do not use sizeof (that I know of)

but an union containing struct S0 allows to observe the

layout chosen by the compiler.


Clang and GCC have different layouts when using #pragma pack

together with size 0 bitfields!


~ $ clang t.c

t.c:10:1: warning: type specifier missing, defaults to 'int' [-Wimplicit-int]



1 diagnostic generated.

~ $ ./a.out 

~ $ echo $?


~ $ gcc t.c

~ $ ./a.out 

~ $ echo $?



One does not seem more "right" than the other

(although 5 is surprising to me).

Does anyone know how to make GCC behave like clang, or the

opposite, and whether someone might like to know about this

(this may break some ABIs, although anyone using :0 bitfields

in packed structs in ABI definitions is basically asking for it).