With no optimization, -Wformat-overflow and -Wformat-truncation
runs early to detect a subset of simple bugs. But as it turns out,
the pass runs just a tad too early, before SSA. That causes it to
miss a class of problems that can easily be detected once code is
in SSA form, and I would expect might also cause false positives.
The attached change moves the sprintf pass just after pass_build_ssa,
similar to other early flow-sensitive warnings (-Wnonnull-compare and
-Wuninitialized).
Martin
PR middle-end/100325 - missing warning with -O0 on sprintf overflow with pointer plus offset
gcc/ChangeLog:
* passes.def (pass_warn_printf): Run after SSA.
gcc/testsuite/ChangeLog:
* gcc.dg/tree-ssa/builtin-sprintf-warn-26.c: New test.
diff --git a/gcc/passes.def b/gcc/passes.def
index 55e8164d56b..de39fa48b3d 100644
--- a/gcc/passes.def
+++ b/gcc/passes.def
@@ -45,7 +45,6 @@ along with GCC; see the file COPYING3. If not see
NEXT_PASS (pass_warn_function_return);
NEXT_PASS (pass_coroutine_early_expand_ifns);
NEXT_PASS (pass_expand_omp);
- NEXT_PASS (pass_warn_printf);
NEXT_PASS (pass_walloca, /*strict_mode_p=*/true);
NEXT_PASS (pass_build_cgraph_edges);
TERMINATE_PASS_LIST (all_lowering_passes)
@@ -58,6 +57,7 @@ along with GCC; see the file COPYING3. If not see
PUSH_INSERT_PASSES_WITHIN (pass_build_ssa_passes)
NEXT_PASS (pass_fixup_cfg);
NEXT_PASS (pass_build_ssa);
+ NEXT_PASS (pass_warn_printf);
NEXT_PASS (pass_warn_nonnull_compare);
NEXT_PASS (pass_early_warn_uninitialized);
NEXT_PASS (pass_ubsan);
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf-warn-26.c b/gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf-warn-26.c
index 16a551d9c8d..677b6345c5c 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf-warn-26.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/builtin-sprintf-warn-26.c
@@ -22,17 +22,17 @@ void nowarn_4m3 ()
void warn_2m1 ()
{
char *p = a + 2;
- sprintf (p - 1, "%i", 123); // { dg-warning "-Wformat-overflow" "pr100325" { xfail *-*-* } }
+ sprintf (p - 1, "%i", 123); // { dg-warning "-Wformat-overflow" "pr100325" }
}
void warn_3m1 ()
{
char *p = a + 3;
- sprintf (p - 1, "%i", 12); // { dg-warning "-Wformat-overflow" "pr100325" { xfail *-*-* } }
+ sprintf (p - 1, "%i", 12); // { dg-warning "-Wformat-overflow" "pr100325" }
}
void warn_4m1 ()
{
char *p = a + 4;
- sprintf (p - 1, "%i", 1); // { dg-warning "-Wformat-overflow" "pr100325" { xfail *-*-* } }
+ sprintf (p - 1, "%i", 1); // { dg-warning "-Wformat-overflow" "pr100325" }
}