Incorrect compile warning, possible bug in inttypes.h

Cary R. cygcary@yahoo.com
Mon Apr 27 22:53:00 GMT 2015


The following code:

#include <stdio.h>
#include <inttypes.h>

int main()
{
        int32_t ival = 1;
        uint32_t uval = 2;

        printf("int = %"PRId32", uint = %"PRIu32".\n", ival, uval);
        return 0;
}


when compiled with either gcc or clang on a 32-bit system and with the -Wall flag produces the following warnings:

tmp.c: In function ‘main’:
tmp.c:9:5: warning: format ‘%ld’ expects argument of type ‘long int’, but argument 2 has type ‘int32_t’ [-Wformat=]
         printf("int = %"PRId32", uint = %"PRIu32".\n", ival, uval);
         ^
tmp.c:9:5: warning: format ‘%lu’ expects argument of type ‘long unsigned int’, but argument 3 has type ‘uint32_t’ [-Wformat=]
tmp.c:9:5: warning: format ‘%ld’ expects argument of type ‘long int’, but argument 2 has type ‘int32_t’ [-Wformat=]
tmp.c:9:5: warning: format ‘%lu’ expects argument of type ‘long unsigned int’, but argument 3 has type ‘uint32_t’ [-Wformat=]

I'm not sure why the double report for this, but both gcc and clang do the same thing. This looks to be an issue that is generated because a long is 32 bits on a 32-bit system and in inttypes.h __have_long32 is likely defined and that is forcing the use of the 'l' formats when that is incorrect for at least these two 32 bit types.

--
Problem reports:       http://cygwin.com/problems.html
FAQ:                   http://cygwin.com/faq/
Documentation:         http://cygwin.com/docs.html
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple



More information about the Cygwin mailing list