avifil32: Removed sign comparison warning (sizeof expresions)
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)
>> formatsize <= 16
>> One gives a bogus warning and the other doesn't.
> C99 std (para 184.108.40.206.4) states following about sizeof operator:
> "...its type (an unsigned integer type) is size_t, deﬁned 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 220.127.116.11 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