From 7afa3b82918a75a486aad7818f11df9ea7504368 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Tue, 17 Mar 2020 10:42:35 +0100 Subject: [PATCH] expand: Don't depend on warning flags in code generation of strnlen [PR94189] The following testcase FAILs with -O2 -fcompare-debug, but the reason isn't that we'd emit different code based on -g or non-debug, but rather that we emit different code depending on whether -w is used or not (or e.g. -Wno-stringop-overflow or whether some other pass emitted some other warning already on the call). Code generation shouldn't depend on whether we emit a warning or not if at all possible. The following patch punts (i.e. doesn't optimize the strnlen call to a constant value) if we would emit the warning if it was enabled. In the PR there is an alternate patch which does optimize the strnlen call no matter if we emit the warning or not, though I think I prefer the version below, e.g. the strnlen call might be crossing field boundaries, which is in strict reading undefined, but I'd be afraid people do that in the real world programs. 2020-03-17 Jakub Jelinek PR middle-end/94189 * builtins.c (expand_builtin_strnlen): Do return NULL_RTX if we would emit a warning if it was enabled and don't depend on TREE_NO_WARNING for code-generation. * gcc.dg/pr94189.c: New test. --- gcc/ChangeLog | 7 +++++++ gcc/builtins.c | 22 ++++++++++------------ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/pr94189.c | 11 +++++++++++ 4 files changed, 33 insertions(+), 12 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr94189.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 25a27f8070d..fc35ceac272 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2020-03-17 Jakub Jelinek + + PR middle-end/94189 + * builtins.c (expand_builtin_strnlen): Do return NULL_RTX if we would + emit a warning if it was enabled and don't depend on TREE_NO_WARNING + for code-generation. + 2020-03-16 Vladimir Makarov PR target/94185 diff --git a/gcc/builtins.c b/gcc/builtins.c index e4a8694054e..53bae599d3e 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -3142,27 +3142,25 @@ expand_builtin_strnlen (tree exp, rtx target, machine_mode target_mode) return NULL_RTX; } - if (lendata.decl - && !TREE_NO_WARNING (exp) - && ((tree_int_cst_lt (len, bound)) - || !exact)) + if (lendata.decl && (tree_int_cst_lt (len, bound) || !exact)) { location_t warnloc = expansion_point_location_if_in_system_header (loc); - if (warning_at (warnloc, OPT_Wstringop_overflow_, - exact - ? G_("%K%qD specified bound %E exceeds the size %E " - "of unterminated array") - : G_("%K%qD specified bound %E may exceed the size " - "of at most %E of unterminated array"), - exp, func, bound, len)) + if (!TREE_NO_WARNING (exp) + && warning_at (warnloc, OPT_Wstringop_overflow_, + exact + ? G_("%K%qD specified bound %E exceeds the size " + "%E of unterminated array") + : G_("%K%qD specified bound %E may exceed the " + "size of at most %E of unterminated array"), + exp, func, bound, len)) { inform (DECL_SOURCE_LOCATION (lendata.decl), "referenced argument declared here"); TREE_NO_WARNING (exp) = true; - return NULL_RTX; } + return NULL_RTX; } if (!len) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ac9f0772bcf..879a67d88ef 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2020-03-17 Jakub Jelinek + + PR middle-end/94189 + * gcc.dg/pr94189.c: New test. + 2020-03-17 Martin Liska PR lto/94157 diff --git a/gcc/testsuite/gcc.dg/pr94189.c b/gcc/testsuite/gcc.dg/pr94189.c new file mode 100644 index 00000000000..f927d55279a --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr94189.c @@ -0,0 +1,11 @@ +/* PR middle-end/94189 */ +/* { dg-do compile } */ +/* { dg-options "-O2 -fcompare-debug" } */ + +const char a[] = { 'a', 'b', 'c', 'd' };/* { dg-message "declared here" } */ + +int +foo (void) +{ + return __builtin_strnlen (a, 5); /* { dg-warning "specified bound 5 exceeds the size 4 of unterminated array" } */ +} -- 2.30.2