avifil32: Removed sign comparison warning (sizeof expresions)

Marko Nikolic grkoma at gmail.com
Mon Aug 23 06:41:12 CDT 2010

Andrey Turkin wrote:

> On Monday 23 August 2010 13:16:07 Michael Stefaniuc wrote:
>> IMHO gcc is *wrong* in emitting a warning there. sizeof(PCMWAVEFORMAT)
>> is a compile time constant and gcc can see that sizeof(PCMWAVEFORMAT)
>> falls well inside the number range expressible by a LONG. Logically
>> there is no difference between
>>     formatsize <= sizeof(PCMWAVEFORMAT)
>> and
>>     formatsize <= 16
>> One gives a bogus warning and the other doesn't.
> C99 std (para states following about sizeof operator:
> "...its type (an unsigned integer type) is size_t, defined in <stddef.h>
> (and other headers)."
> sizeof result is a compile-time constant but, unlike numeric constants,
> its type must always be size_t so gcc does the correct thing here.

The same is with C89, paragraph from standard:

   The value of the result is implementation-defined, and its type (an
unsigned integral type) is size_t defined in the <stddef.h> header.

So, the gcc is correct. In the example above, correct would be

   formatsize <= 16U

which gives a warning, as expected.

What remains is how to correctly remove warning. In this case (and there are 
many similar in the code), signed function parameter is comparing with 
values that are natively unsigned. Changing type of the parameter is not 
possible, the same if with sizeof operator. One possiblity is to add some 
temporary variable, but in my opinioin it will just unncesary bloat the code 
and is worse than casting return value of sizeof.

Maybe better solution is to make signed_sizeof macro, which will always 
return signed values and use it instead of sizeof; I will check if there is 
possiblity for that.

More information about the wine-devel mailing list