diff options
author | Martin Sebor <msebor@redhat.com> | 2018-06-18 22:17:57 +0000 |
---|---|---|
committer | Martin Sebor <msebor@gcc.gnu.org> | 2018-06-18 16:17:57 -0600 |
commit | 4252ccd73701a330db365ccd39829e27d0d3b42d (patch) | |
tree | 18e21cecd1210c34cebb0fd5809861a217fbf0eb /gcc/tree-ssa-strlen.c | |
parent | 9e03592e40e7da85f9779ea1988a69f154d1ba7f (diff) | |
download | gcc-4252ccd73701a330db365ccd39829e27d0d3b42d.zip gcc-4252ccd73701a330db365ccd39829e27d0d3b42d.tar.gz gcc-4252ccd73701a330db365ccd39829e27d0d3b42d.tar.bz2 |
PR middle-end/85602 - -Wsizeof-pointer-memaccess for strncat with size of source
gcc/c-family/ChangeLog:
PR middle-end/85602
* c-warn.c (sizeof_pointer_memaccess_warning): Check for attribute
nonstring.
gcc/ChangeLog:
PR middle-end/85602
* calls.c (maybe_warn_nonstring_arg): Handle strncat.
* tree-ssa-strlen.c (is_strlen_related_p): Make extern.
Handle integer subtraction.
(maybe_diag_stxncpy_trunc): Handle nonstring source arguments.
* tree-ssa-strlen.h (is_strlen_related_p): Declare.
gcc/testsuite/ChangeLog:
PR middle-end/85602
* gcc.dg/attr-nonstring-2.c: Adjust text of expected warning.
* c-c++-common/attr-nonstring-8.c: New test.
From-SVN: r261718
Diffstat (limited to 'gcc/tree-ssa-strlen.c')
-rw-r--r-- | gcc/tree-ssa-strlen.c | 33 |
1 files changed, 27 insertions, 6 deletions
diff --git a/gcc/tree-ssa-strlen.c b/gcc/tree-ssa-strlen.c index 693d9d3..92545b9 100644 --- a/gcc/tree-ssa-strlen.c +++ b/gcc/tree-ssa-strlen.c @@ -1757,7 +1757,7 @@ handle_builtin_strncat (built_in_function bcode, gimple_stmt_iterator *gsi) assumed to be the argument in some call to strlen() whose relationship to SRC is being ascertained. */ -static bool +bool is_strlen_related_p (tree src, tree len) { if (TREE_CODE (TREE_TYPE (len)) == POINTER_TYPE @@ -1794,12 +1794,20 @@ is_strlen_related_p (tree src, tree len) && (code == BIT_AND_EXPR || code == NOP_EXPR))) { - /* Pointer plus (an integer) and integer cast or truncation are - considered among the (potentially) related expressions to strlen. - Others are not. */ + /* Pointer plus (an integer), and truncation are considered among + the (potentially) related expressions to strlen. */ return is_strlen_related_p (src, rhs1); } + if (tree rhs2 = gimple_assign_rhs2 (def_stmt)) + { + /* Integer subtraction is considered strlen-related when both + arguments are integers and second one is strlen-related. */ + rhstype = TREE_TYPE (rhs2); + if (INTEGRAL_TYPE_P (rhstype) && code == MINUS_EXPR) + return is_strlen_related_p (src, rhs2); + } + return false; } @@ -1870,9 +1878,22 @@ maybe_diag_stxncpy_trunc (gimple_stmt_iterator gsi, tree src, tree cnt) if (TREE_CODE (dstdecl) == ADDR_EXPR) dstdecl = TREE_OPERAND (dstdecl, 0); - /* If the destination refers to a an array/pointer declared nonstring - return early. */ tree ref = NULL_TREE; + + if (!sidx) + { + /* If the source is a non-string return early to avoid warning + for possible truncation (if the truncation is certain SIDX + is non-zero). */ + tree srcdecl = gimple_call_arg (stmt, 1); + if (TREE_CODE (srcdecl) == ADDR_EXPR) + srcdecl = TREE_OPERAND (srcdecl, 0); + if (get_attr_nonstring_decl (srcdecl, &ref)) + return false; + } + + /* Likewise, if the destination refers to a an array/pointer declared + nonstring return early. */ if (get_attr_nonstring_decl (dstdecl, &ref)) return false; |