aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMarek Polacek <polacek@redhat.com>2018-02-08 16:18:04 +0000
committerMarek Polacek <mpolacek@gcc.gnu.org>2018-02-08 16:18:04 +0000
commitc6ba596b58e458391ed015e26b763e72ec725600 (patch)
treedb118338713f091c7af541415bf7da87e6a40dea /gcc
parenta4296998322d3bb3b53c7412715cc2169f1d4f61 (diff)
downloadgcc-c6ba596b58e458391ed015e26b763e72ec725600.zip
gcc-c6ba596b58e458391ed015e26b763e72ec725600.tar.gz
gcc-c6ba596b58e458391ed015e26b763e72ec725600.tar.bz2
re PR tree-optimization/84238 (ICE tree check: expected integer_cst, have plus_expr in to_wide, at tree.h:5527)
PR tree-optimization/84238 * tree-ssa-strlen.c (maybe_diag_stxncpy_trunc): Verify the result of get_range_strlen. * gcc.dg/Wstringop-overflow-3.c: New test. From-SVN: r257497
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/Wstringop-overflow-3.c13
-rw-r--r--gcc/tree-ssa-strlen.c5
4 files changed, 28 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d9c45c9..461656b 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2018-02-08 Marek Polacek <polacek@redhat.com>
+
+ PR tree-optimization/84238
+ * tree-ssa-strlen.c (maybe_diag_stxncpy_trunc): Verify the result of
+ get_range_strlen.
+
2018-02-08 Richard Sandiford <richard.sandiford@linaro.org>
PR tree-optimization/84265
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 6d45195..92e9e34 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2018-02-08 Marek Polacek <polacek@redhat.com>
+
+ PR tree-optimization/84238
+ * gcc.dg/Wstringop-overflow-3.c: New test.
+
2018-02-08 Nathan Sidwell <nathan@acm.org>
* g++.dg/cpp0x/initlist93.C: Adjust diagnostic.
diff --git a/gcc/testsuite/gcc.dg/Wstringop-overflow-3.c b/gcc/testsuite/gcc.dg/Wstringop-overflow-3.c
new file mode 100644
index 0000000..5901844
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/Wstringop-overflow-3.c
@@ -0,0 +1,13 @@
+/* PR tree-optimization/84238 */
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+char a[1];
+int b;
+char *strncpy (char *, char *, __SIZE_TYPE__);
+void
+c ()
+{
+ char d[b];
+ strncpy (a, &d[3], 3); /* { dg-warning "writing 3 bytes into a region of size 1" } */
+}
diff --git a/gcc/tree-ssa-strlen.c b/gcc/tree-ssa-strlen.c
index f0f6535..94ed2be 100644
--- a/gcc/tree-ssa-strlen.c
+++ b/gcc/tree-ssa-strlen.c
@@ -1899,7 +1899,10 @@ maybe_diag_stxncpy_trunc (gimple_stmt_iterator gsi, tree src, tree cnt)
{
tree range[2];
get_range_strlen (src, range);
- if (range[0])
+ if (range[0] != NULL_TREE
+ && TREE_CODE (range[0]) == INTEGER_CST
+ && range[1] != NULL_TREE
+ && TREE_CODE (range[1]) == INTEGER_CST)
{
lenrange[0] = wi::to_wide (range[0], prec);
lenrange[1] = wi::to_wide (range[1], prec);