diff options
author | Martin Sebor <msebor@redhat.com> | 2019-01-02 06:02:37 +0000 |
---|---|---|
committer | Jeff Law <law@gcc.gnu.org> | 2019-01-01 23:02:37 -0700 |
commit | 5d6655ebcc96030644f99eb1c431dd96e374db90 (patch) | |
tree | 254a28a425e845f22414200219cf3f13aec1f0a6 /gcc/builtins.c | |
parent | 79b1c2295b3031764904ce66ae294aa57aef50ae (diff) | |
download | gcc-5d6655ebcc96030644f99eb1c431dd96e374db90.zip gcc-5d6655ebcc96030644f99eb1c431dd96e374db90.tar.gz gcc-5d6655ebcc96030644f99eb1c431dd96e374db90.tar.bz2 |
gimple-fold.h (get_range_strlen): Update prototype.
* gimple-fold.h (get_range_strlen): Update prototype.
* builtins.c (check_access): Update call to get_range_strlen to use
c_strlen_data pointer. Change various variable accesses to instead
pull data from the c_strlen_data structure.
(check_strncat_sizes, expand_builtin_strncat): Likewise.
* calls.c (maybe_warn_nonstring_arg): Likewise.
* tree-ssa-strlen.c (maybe_diag_stxncpy_trunc): Likewise. Reset
minimum length if maximum lengh is unknown.
* gimple-ssa-sprintf.c (get_string_length): Likewise. Drop code
that used c_strlen, it's no longer needed. Restructure slightly.
(format_string): Set unlikely range appropriately.
* gimple-fold.c (get_range_strlen): Update comments. Fix minor
formatting issues.
(get_range_strlen): Accept c_strlen_data pointer for external
call sites as well. Pass through to call to internal get_range_strlen.
Adjust minlen, maxlen and maxbound as needed.
(get_maxval_strlen): Update comments.
(gimple_fold_builtin_strlen): Update call to get_range_strlen
to use c_strlen_data pointer. Change variable accesses to instead
use c_strlen_data data members.
* gcc.dg/strlenopt-40.c: Disable a couple tests.
* gcc.dg/strlenopt-48.c: Twiddle test.
* gcc.dg/strlenopt-59.c: New test.
* gcc.dg/tree-ssa/builtin-snprintf-5.c: New test.
* g++.dg/init/strlen.C: New test.
Co-Authored-By: Jeff Law <law@redhat.com>
From-SVN: r267503
Diffstat (limited to 'gcc/builtins.c')
-rw-r--r-- | gcc/builtins.c | 32 |
1 files changed, 19 insertions, 13 deletions
diff --git a/gcc/builtins.c b/gcc/builtins.c index 9fa11e1..28155b8 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -3341,7 +3341,10 @@ check_access (tree exp, tree, tree, tree dstwrite, the upper bound given by MAXREAD add one to it for the terminating nul. Otherwise, set it to one for the same reason, or to MAXREAD as appropriate. */ - get_range_strlen (srcstr, range); + c_strlen_data lendata = { }; + get_range_strlen (srcstr, &lendata, /* eltsize = */ 1); + range[0] = lendata.minlen; + range[1] = lendata.maxbound; if (range[0] && (!maxread || TREE_CODE (maxread) == INTEGER_CST)) { if (maxread && tree_int_cst_le (maxread, range[0])) @@ -4209,8 +4212,8 @@ check_strncat_sizes (tree exp, tree objsize) /* Try to determine the range of lengths that the source expression refers to. */ - tree lenrange[2]; - get_range_strlen (src, lenrange); + c_strlen_data lendata = { }; + get_range_strlen (src, &lendata, /* eltsize = */ 1); /* Try to verify that the destination is big enough for the shortest string. */ @@ -4224,8 +4227,8 @@ check_strncat_sizes (tree exp, tree objsize) } /* Add one for the terminating nul. */ - tree srclen = (lenrange[0] - ? fold_build2 (PLUS_EXPR, size_type_node, lenrange[0], + tree srclen = (lendata.minlen + ? fold_build2 (PLUS_EXPR, size_type_node, lendata.minlen, size_one_node) : NULL_TREE); @@ -4277,12 +4280,15 @@ expand_builtin_strncat (tree exp, rtx) tree slen = c_strlen (src, 1); /* Try to determine the range of lengths that the source expression - refers to. */ - tree lenrange[2]; - if (slen) - lenrange[0] = lenrange[1] = slen; - else - get_range_strlen (src, lenrange); + refers to. Since the lengths are only used for warning and not + for code generation disable strict mode below. */ + tree maxlen = slen; + if (!maxlen) + { + c_strlen_data lendata = { }; + get_range_strlen (src, &lendata, /* eltsize = */ 1); + maxlen = lendata.maxbound; + } /* Try to verify that the destination is big enough for the shortest string. First try to determine the size of the destination object @@ -4290,8 +4296,8 @@ expand_builtin_strncat (tree exp, rtx) tree destsize = compute_objsize (dest, warn_stringop_overflow - 1); /* Add one for the terminating nul. */ - tree srclen = (lenrange[0] - ? fold_build2 (PLUS_EXPR, size_type_node, lenrange[0], + tree srclen = (maxlen + ? fold_build2 (PLUS_EXPR, size_type_node, maxlen, size_one_node) : NULL_TREE); |