aboutsummaryrefslogtreecommitdiff
path: root/gcc/builtins.c
diff options
context:
space:
mode:
authorMartin Sebor <msebor@redhat.com>2018-09-14 18:35:26 +0000
committerJeff Law <law@gcc.gnu.org>2018-09-14 12:35:26 -0600
commit01b0acb7610032d5f6bb32cc6ecda5955cb0c18a (patch)
tree3cfc9708ab0990085d890f7f087d045398095e16 /gcc/builtins.c
parente08341bb0e026ef019a3b201ea26ecdc4a9233ea (diff)
downloadgcc-01b0acb7610032d5f6bb32cc6ecda5955cb0c18a.zip
gcc-01b0acb7610032d5f6bb32cc6ecda5955cb0c18a.tar.gz
gcc-01b0acb7610032d5f6bb32cc6ecda5955cb0c18a.tar.bz2
builtins.c (unterminated_array): Handle ARRAY_REF.
* builtins.c (unterminated_array): Handle ARRAY_REF. (expand_builtin_stpcpy_1): Detect unterminated char arrays. * builtins.h (unterminated_array): Declare extern. * gimple-fold.c (gimple_fold_builtin_stpcpy): Detect unterminated arrays. (gimple_fold_builtin_sprintf): Propagate NO_WARNING to transformed calls. * gcc.dg/warn-stpcpy-no-nul.c: New test. From-SVN: r264328
Diffstat (limited to 'gcc/builtins.c')
-rw-r--r--gcc/builtins.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/gcc/builtins.c b/gcc/builtins.c
index be813db..b2b7ca3 100644
--- a/gcc/builtins.c
+++ b/gcc/builtins.c
@@ -567,7 +567,7 @@ warn_string_no_nul (location_t loc, const char *fn, tree arg, tree decl)
the declaration of the object of which the array is a member or
element. Otherwise return null. */
-static tree
+tree
unterminated_array (tree exp)
{
if (TREE_CODE (exp) == SSA_NAME)
@@ -578,7 +578,10 @@ unterminated_array (tree exp)
tree rhs1 = gimple_assign_rhs1 (stmt);
tree_code code = gimple_assign_rhs_code (stmt);
- if (code != POINTER_PLUS_EXPR)
+ if (code == ADDR_EXPR
+ && TREE_CODE (TREE_OPERAND (rhs1, 0)) == ARRAY_REF)
+ rhs1 = rhs1;
+ else if (code != POINTER_PLUS_EXPR)
return NULL_TREE;
exp = rhs1;
@@ -3981,9 +3984,14 @@ expand_builtin_stpcpy_1 (tree exp, rtx target, machine_mode mode)
compile-time, not an expression containing a string. This is
because the latter will potentially produce pessimized code
when used to produce the return value. */
- if (! c_getstr (src) || ! (len = c_strlen (src, 0)))
+ tree nonstr = NULL_TREE;
+ if (!c_getstr (src, NULL)
+ || !(len = c_strlen (src, 0, &nonstr, 1)))
return expand_movstr (dst, src, target, /*endp=*/2);
+ if (nonstr && !TREE_NO_WARNING (exp))
+ warn_string_no_nul (EXPR_LOCATION (exp), "stpcpy", src, nonstr);
+
lenp1 = size_binop_loc (loc, PLUS_EXPR, len, ssize_int (1));
ret = expand_builtin_mempcpy_args (dst, src, lenp1,
target, exp, /*endp=*/2);