diff options
author | Martin Sebor <msebor@redhat.com> | 2019-10-09 21:35:11 +0000 |
---|---|---|
committer | Martin Sebor <msebor@gcc.gnu.org> | 2019-10-09 15:35:11 -0600 |
commit | a7160771da8b77a03317aab2c27706ba70fe3e9c (patch) | |
tree | d959d13c4cf04cf2f20c0cc56cd382c62d3b3b45 /gcc/doc | |
parent | 89e0a492af5bec8ffa2ec5d99c4858df50d22c16 (diff) | |
download | gcc-a7160771da8b77a03317aab2c27706ba70fe3e9c.zip gcc-a7160771da8b77a03317aab2c27706ba70fe3e9c.tar.gz gcc-a7160771da8b77a03317aab2c27706ba70fe3e9c.tar.bz2 |
PR tree-optimization/90879 - fold zero-equality of strcmp between a longer string and a smaller array
gcc/c-family/ChangeLog:
PR tree-optimization/90879
* c.opt (-Wstring-compare): New option.
gcc/testsuite/ChangeLog:
PR tree-optimization/90879
* gcc.dg/Wstring-compare-2.c: New test.
* gcc.dg/Wstring-compare.c: New test.
* gcc.dg/strcmpopt_3.c: Scan the optmized dump instead of strlen.
* gcc.dg/strcmpopt_6.c: New test.
* gcc.dg/strlenopt-65.c: Remove uinnecessary declarations, add
test cases.
* gcc.dg/strlenopt-66.c: Run it.
* gcc.dg/strlenopt-68.c: New test.
gcc/ChangeLog:
PR tree-optimization/90879
* builtins.c (check_access): Avoid using maxbound when null.
* calls.c (maybe_warn_nonstring_arg): Adjust to get_range_strlen change.
* doc/invoke.texi (-Wstring-compare): Document new warning option.
* gimple-fold.c (get_range_strlen_tree): Make setting maxbound
conditional.
(get_range_strlen): Overwrite initial maxbound when non-null.
* gimple-ssa-sprintf.c (get_string_length): Adjust to get_range_strlen
changes.
* tree-ssa-strlen.c (maybe_diag_stxncpy_trunc): Same.
(used_only_for_zero_equality): New function.
(handle_builtin_memcmp): Call it.
(determine_min_objsize): Return an integer instead of tree.
(get_len_or_size, strxcmp_eqz_result): New functions.
(maybe_warn_pointless_strcmp): New function.
(handle_builtin_string_cmp): Call it. Fold zero-equality of strcmp
between a longer string and a smaller array.
(get_range_strlen_dynamic): Overwrite initial maxbound when non-null.
From-SVN: r276773
Diffstat (limited to 'gcc/doc')
-rw-r--r-- | gcc/doc/invoke.texi | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index dc9a3e5..9247603 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -349,6 +349,7 @@ Objective-C and Objective-C++ Dialects}. -Wsizeof-pointer-memaccess -Wsizeof-array-argument @gol -Wstack-protector -Wstack-usage=@var{byte-size} -Wstrict-aliasing @gol -Wstrict-aliasing=n -Wstrict-overflow -Wstrict-overflow=@var{n} @gol +-Wstring-compare @gol -Wstringop-overflow=@var{n} -Wstringop-truncation -Wsubobject-linkage @gol -Wsuggest-attribute=@r{[}pure@r{|}const@r{|}noreturn@r{|}format@r{|}malloc@r{]} @gol -Wsuggest-final-types @gol -Wsuggest-final-methods -Wsuggest-override @gol @@ -4485,6 +4486,7 @@ name is still supported, but the newer name is more descriptive.) -Wold-style-declaration @r{(C only)} @gol -Woverride-init @gol -Wsign-compare @r{(C only)} @gol +-Wstring-compare @gol -Wredundant-move @r{(only for C++)} @gol -Wtype-limits @gol -Wuninitialized @gol @@ -5800,6 +5802,30 @@ comparisons, so this warning level gives a very large number of false positives. @end table +@item -Wstring-compare +@opindex Wstring-compare +@opindex Wno-string-compare +Warn for calls to @code{strcmp} and @code{strncmp} whose result is +determined to be either zero or non-zero in tests for such equality +owing to the length of one argument being greater than the size of +the array the other argument is stored in (or the bound in the case +of @code{strncmp}). Such calls could be mistakes. For example, +the call to @code{strcmp} below is diagnosed because its result is +necessarily non-zero irrespective of the contents of the array @code{a}. + +@smallexample +extern char a[4]; +void f (char *d) +@{ + strcpy (d, "string"); + @dots{} + if (0 == strcmp (a, d)) // cannot be true + puts ("a and d are the same"); +@} +@end smallexample + +@option{-Wstring-compare} is enabled by @option{-Wextra}. + @item -Wstringop-overflow @itemx -Wstringop-overflow=@var{type} @opindex Wstringop-overflow |