https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113414

            Bug ID: 113414
           Summary: Incorrent checking for printf format: does not
                    distinguish whether the variable is signed or unsigned
           Product: gcc
           Version: 11.4.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: tongxiangzheng.route at gmail dot com
  Target Milestone: ---

When checking the printf() function, gcc does not distinguish whether the
variable is signed or unsigned.
for example:
$ gcc test.cpp

#include<stdio.h>
int main(){
        int n;
        printf("%u",n);
}

The code should be warned, but it did not.

example 2:
$ gcc test.cpp

#include<stdio.h>
int main(){
        unsigned long long int n;
        printf("%d",n);
}

The code be warned, but it's wrong:
test.cpp: In function ‘int main()’:
test.cpp:4:18: warning: format ‘%d’ expects argument of type ‘int’, but
argument 2 has type ‘long long unsigned int’ [-Wformat=]
    4 |         printf("%d",n);
      |                 ~^  ~
      |                  |  |
      |                  |  long long unsigned int
      |                  int
      |                 %lld
gcc suggests using %lld, but in reality, %llu should be used.

Reply via email to