Warning for non-portable integer operations?

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

 



Is there any gcc warning available that would
warn about the following C code, which gives
different results depending on the platform:

#include <stdio.h>
int main(void) {
    unsigned int x = 2;
    long y = -3;
    if (x + y < 10)
        printf("Foo\n");
    else
        printf("Bar\n");
    return 0;
}

On OS X 10.5/Core 2 Duo, I get the following
results.  Here gcc-mp-4.4 is gcc version 4.4.0.

Macintosh-4:~ dickinsm$ gcc-mp-4.4 -Wall -Wextra test.c && ./a.out
Bar
Macintosh-4:~ dickinsm$ gcc-mp-4.4 -m64 -Wall -Wextra test.c && ./a.out
Foo

There are no warnings produced in either case.

This is all perfectly legitimate, of course:  the
behaviour stems from the last couple of clauses
of C99 6.3.1.8 paragraph 1 (and the corresponding
bit of C89), on the 'usual arithmetic conversions' .
Those clauses imply that the type of x+y above depends
on whether sizeof(int) < sizeof(long) or not.  If
sizeof(int) == sizeof(long) then x+y has type unsigned
long, otherwise it has type long:

It seems to me that this is a potential source of
bugs, and that a careful programmer who's worried
about portability might want to know when these two
clauses are being invoked to determine the type of
the result of an arithmetic operation.

So does such a warning already exist?

Mark

[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux