re PR tree-optimization/86572 (unsafe strlen folding of const arguments with non-const offset)

gcc:
2018-11-04  Bernd Edlinger  <bernd.edlinger@hotmail.de>

        PR tree-optimization/86572
        * builtins.c (c_strlen): Handle negative offsets in a safe way.

testsuite:
2018-11-04  Bernd Edlinger  <bernd.edlinger@hotmail.de>

        PR tree-optimization/86572
        * gcc.dg/pr86572.c: New test.

From-SVN: r265778
This commit is contained in:
Bernd Edlinger 2018-11-04 19:51:09 +00:00 committed by Bernd Edlinger
parent 770fe3a364
commit e8bf3d5ed9
4 changed files with 28 additions and 4 deletions

View File

@ -1,3 +1,8 @@
2018-11-04 Bernd Edlinger <bernd.edlinger@hotmail.de>
PR tree-optimization/86572
* builtins.c (c_strlen): Handle negative offsets in a safe way.
2018-11-04 Bernd Edlinger <bernd.edlinger@hotmail.de>
PR tree-optimization/87672

View File

@ -734,11 +734,14 @@ c_strlen (tree src, int only_value, c_strlen_data *data, unsigned eltsize)
of the string subtract the offset from the length of the string,
and return that. Otherwise the length is zero. Take care to
use SAVE_EXPR in case the OFFSET has side-effects. */
tree offsave = TREE_SIDE_EFFECTS (byteoff) ? save_expr (byteoff) : byteoff;
offsave = fold_convert (ssizetype, offsave);
tree offsave = TREE_SIDE_EFFECTS (byteoff) ? save_expr (byteoff)
: byteoff;
offsave = fold_convert_loc (loc, sizetype, offsave);
tree condexp = fold_build2_loc (loc, LE_EXPR, boolean_type_node, offsave,
build_int_cst (ssizetype, len));
tree lenexp = size_diffop_loc (loc, ssize_int (len), offsave);
size_int (len));
tree lenexp = fold_build2_loc (loc, MINUS_EXPR, sizetype, size_int (len),
offsave);
lenexp = fold_convert_loc (loc, ssizetype, lenexp);
return fold_build3_loc (loc, COND_EXPR, ssizetype, condexp, lenexp,
build_zero_cst (ssizetype));
}

View File

@ -1,3 +1,8 @@
2018-11-04 Bernd Edlinger <bernd.edlinger@hotmail.de>
PR tree-optimization/86572
* gcc.dg/pr86572.c: New test.
2018-11-04 Bernd Edlinger <bernd.edlinger@hotmail.de>
PR tree-optimization/87672

View File

@ -0,0 +1,11 @@
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-optimized" } */
const char buf[40] = "test";
void test (int x)
{
if (__builtin_strlen (buf + x) > 4)
__builtin_abort ();
}
/* { dg-final { scan-tree-dump-not "abort" "optimized" } } */