Commit cbbd2b1c by Tobias Burnus Committed by Tobias Burnus

re PR c/60194 (-Wformat should also warn when using %d (instead of %u) for unsigned arguments)

2014-04-11  Tobias Burnus  <burnus@net-b.de>

        PR c/60194
gcc/
        * doc/invoke.texi (-Wformat-signedness): Document it.
        (Wformat=2): Mention that this enables -Wformat-signedness.

gcc/c-family/
        * c.opt (Wformat-signedness): Add
        * c-format.c(check_format_types): Use it.

gcc/testsuite/
        * * g++.dg/warn/warn_format_signedness.C: New.
        * gcc.dg/format/warn-signedness.c: New.

From-SVN: r209328
parent cb414900
2014-04-11 Tobias Burnus <burnus@net-b.de>
PR c/60194
* doc/invoke.texi (-Wformat-signedness): Document it.
(Wformat=2): Mention that this enables -Wformat-signedness.
2014-04-11 Joern Rennecke <joern.rennecke@embecosm.com>
* common/config/epiphany/epiphany-common.c
......
2014-04-11 Tobias Burnus <burnus@net-b.de>
PR c/60194
* c.opt (Wformat-signedness): Add
* c-format.c(check_format_types): Use it.
2014-04-11 Jason Merrill <jason@redhat.com>
PR c++/57926
......
......@@ -2418,7 +2418,9 @@ check_format_types (format_wanted_type *types)
a second level of indirection. */
if (TREE_CODE (wanted_type) == INTEGER_TYPE
&& TREE_CODE (cur_type) == INTEGER_TYPE
&& (!pedantic || i == 0 || (i == 1 && char_type_flag))
&& ((!pedantic && !warn_format_signedness)
|| (i == 0 && !warn_format_signedness)
|| (i == 1 && char_type_flag))
&& (TYPE_UNSIGNED (wanted_type)
? wanted_type == c_common_unsigned_type (cur_type)
: wanted_type == c_common_signed_type (cur_type)))
......
......@@ -415,6 +415,10 @@ Wformat-security
C ObjC C++ ObjC++ Var(warn_format_security) Warning LangEnabledBy(C ObjC C++ ObjC++,Wformat=, warn_format >= 2, 0)
Warn about possible security problems with format functions
Wformat-signedness
C ObjC C++ ObjC++ Var(warn_format_signedness) Warning LangEnabledBy(C ObjC C++ ObjC++,Wformat=, warn_format >= 2, 0)
Warn about sign differences with format functions
Wformat-y2k
C ObjC C++ ObjC++ Var(warn_format_y2k) Warning LangEnabledBy(C ObjC C++ ObjC++,Wformat=,warn_format >= 2, 0)
Warn about strftime formats yielding 2-digit years
......
......@@ -246,7 +246,7 @@ Objective-C and Objective-C++ Dialects}.
-Wno-endif-labels -Werror -Werror=* @gol
-Wfatal-errors -Wfloat-equal -Wformat -Wformat=2 @gol
-Wno-format-contains-nul -Wno-format-extra-args -Wformat-nonliteral @gol
-Wformat-security -Wformat-y2k @gol
-Wformat-security -Wformat-signedness -Wformat-y2k @gol
-Wframe-larger-than=@var{len} -Wno-free-nonheap-object -Wjump-misses-init @gol
-Wignored-qualifiers @gol
-Wimplicit -Wimplicit-function-declaration -Wimplicit-int @gol
......@@ -3539,7 +3539,7 @@ The C standard specifies that zero-length formats are allowed.
@opindex Wformat=2
Enable @option{-Wformat} plus additional format checks. Currently
equivalent to @option{-Wformat -Wformat-nonliteral -Wformat-security
-Wformat-y2k}.
-Wformat-signedness -Wformat-y2k}.
@item -Wformat-nonliteral
@opindex Wformat-nonliteral
......@@ -3561,6 +3561,12 @@ currently a subset of what @option{-Wformat-nonliteral} warns about, but
in future warnings may be added to @option{-Wformat-security} that are not
included in @option{-Wformat-nonliteral}.)
@item -Wformat-signedness
@opindex Wformat-signedness
@opindex Wno-format-signedness
If @option{-Wformat} is specified, also warn if the format string
requires an unsigned argument and the argument is signed and vice versa.
@item -Wformat-y2k
@opindex Wformat-y2k
@opindex Wno-format-y2k
......
2014-04-11 Tobias Burnus <burnus@net-b.de>
PR c/60194
* * g++.dg/warn/warn_format_signedness.C: New.
* gcc.dg/format/warn-signedness.c: New.
2014-04-11 Tobias Burnus <burnus@net-b.de>
PR fortran/58880
PR fortran/60495
* gfortran.dg/finalize_25.f90: New.
......
/* { dg-do compile } */
/* { dg-options "-Wformat -Wformat-signedness" } */
/* PR c/60194 */
void foo(unsigned u, int i, unsigned char uc, signed char sc) {
__builtin_printf("%d\n", u); /* { dg-warning "expects argument of type 'int', but argument 2 has type 'unsigned int'" } */
__builtin_printf("%u\n", i); /* { dg-warning "expects argument of type 'unsigned int', but argument 2 has type 'int'" } */
__builtin_printf("%c\n", sc);
__builtin_printf("%c\n", uc);
}
/* { dg-do compile } */
/* { dg-options "-Wformat -Wformat-signedness" } */
/* PR c/60194 */
void foo(unsigned u, int i, unsigned char uc, signed char sc) {
__builtin_printf("%d\n", u); /* { dg-warning "expects argument of type 'int', but argument 2 has type 'unsigned int'" } */
__builtin_printf("%u\n", i); /* { dg-warning "expects argument of type 'unsigned int', but argument 2 has type 'int'" } */
__builtin_printf("%c\n", sc);
__builtin_printf("%c\n", uc);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment