diff options
author | Martin Sebor <msebor@redhat.com> | 2018-09-14 18:35:26 +0000 |
---|---|---|
committer | Jeff Law <law@gcc.gnu.org> | 2018-09-14 12:35:26 -0600 |
commit | 01b0acb7610032d5f6bb32cc6ecda5955cb0c18a (patch) | |
tree | 3cfc9708ab0990085d890f7f087d045398095e16 /gcc/builtins.c | |
parent | e08341bb0e026ef019a3b201ea26ecdc4a9233ea (diff) | |
download | gcc-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.c | 14 |
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); |