aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorDavid Malcolm <dmalcolm@redhat.com>2024-01-18 12:11:57 -0500
committerDavid Malcolm <dmalcolm@redhat.com>2024-01-18 12:11:57 -0500
commitd5604febcfb09445eb738dcb8c675a4cb9671519 (patch)
tree72591169c0bcfd3f255c3d0b6f3a9895797674b4 /gcc
parent84096e665c5f7d7ffb07f18a5fd5e804a94b237b (diff)
downloadgcc-d5604febcfb09445eb738dcb8c675a4cb9671519.zip
gcc-d5604febcfb09445eb738dcb8c675a4cb9671519.tar.gz
gcc-d5604febcfb09445eb738dcb8c675a4cb9671519.tar.bz2
analyzer: fix ICE on strlen ((char *)&VECTOR_CST) [PR111361]
gcc/analyzer/ChangeLog: PR analyzer/111361 * region-model.cc (svalue_byte_range_has_null_terminator_1): The initial byte of an all-zeroes SVAL is a zero byte. Remove gcc_unreachable from SK_CONSTANT for constants that aren't STRING_CST or INTEGER_CST. gcc/testsuite/ChangeLog: PR analyzer/111361 * c-c++-common/analyzer/strlen-pr111361.c: New test. * c-c++-common/analyzer/strncpy-1.c (test_zero_fill): Remove fixed xfail. * c-c++-common/analyzer/strncpy-pr111361.c: New test. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
Diffstat (limited to 'gcc')
-rw-r--r--gcc/analyzer/region-model.cc9
-rw-r--r--gcc/testsuite/c-c++-common/analyzer/strlen-pr111361.c18
-rw-r--r--gcc/testsuite/c-c++-common/analyzer/strncpy-1.c3
-rw-r--r--gcc/testsuite/c-c++-common/analyzer/strncpy-pr111361.c8
4 files changed, 35 insertions, 3 deletions
diff --git a/gcc/analyzer/region-model.cc b/gcc/analyzer/region-model.cc
index f01010c..dbb2149 100644
--- a/gcc/analyzer/region-model.cc
+++ b/gcc/analyzer/region-model.cc
@@ -3605,6 +3605,14 @@ svalue_byte_range_has_null_terminator_1 (const svalue *sval,
byte_offset_t *out_bytes_read,
logger *logger)
{
+ if (bytes.m_start_byte_offset == 0
+ && sval->all_zeroes_p ())
+ {
+ /* The initial byte of an all-zeroes SVAL is a zero byte. */
+ *out_bytes_read = 1;
+ return tristate (true);
+ }
+
switch (sval->get_kind ())
{
case SK_CONSTANT:
@@ -3631,7 +3639,6 @@ svalue_byte_range_has_null_terminator_1 (const svalue *sval,
return tristate::TS_UNKNOWN;
default:
- gcc_unreachable ();
break;
}
}
diff --git a/gcc/testsuite/c-c++-common/analyzer/strlen-pr111361.c b/gcc/testsuite/c-c++-common/analyzer/strlen-pr111361.c
new file mode 100644
index 0000000..b3b875c
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/analyzer/strlen-pr111361.c
@@ -0,0 +1,18 @@
+#include "analyzer-decls.h"
+
+typedef int __attribute__((__vector_size__ (32))) V;
+
+typedef __SIZE_TYPE__ size_t;
+
+static size_t __attribute__((noinline))
+call_strlen (const char *p)
+{
+ return __builtin_strlen (p);
+}
+
+void
+foo (void *out)
+{
+ V v = (V) { };
+ __analyzer_eval (call_strlen ((const char *)&v) == 0); /* { dg-warning "TRUE" } */
+}
diff --git a/gcc/testsuite/c-c++-common/analyzer/strncpy-1.c b/gcc/testsuite/c-c++-common/analyzer/strncpy-1.c
index 3ca1d81..8edaf26 100644
--- a/gcc/testsuite/c-c++-common/analyzer/strncpy-1.c
+++ b/gcc/testsuite/c-c++-common/analyzer/strncpy-1.c
@@ -44,8 +44,7 @@ test_zero_fill (char *dst)
__analyzer_eval (dst[4] == '\0'); /* { dg-warning "TRUE" "correct" { xfail *-*-* } } */
/* { dg-bogus "UNKNOWN" "status quo" { xfail *-*-* } .-1 } */
__analyzer_eval (__analyzer_get_strlen (dst) == 0); /* { dg-warning "TRUE" } */
- __analyzer_eval (__analyzer_get_strlen (dst + 1) == 0); /* { dg-warning "TRUE" "correct" { xfail *-*-* } } */
- /* { dg-bogus "UNKNOWN" "status quo" { xfail *-*-* } .-1 } */
+ __analyzer_eval (__analyzer_get_strlen (dst + 1) == 0); /* { dg-warning "TRUE" } */
}
char *test_unterminated_concrete_a (char *dst)
diff --git a/gcc/testsuite/c-c++-common/analyzer/strncpy-pr111361.c b/gcc/testsuite/c-c++-common/analyzer/strncpy-pr111361.c
new file mode 100644
index 0000000..da3eaeb
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/analyzer/strncpy-pr111361.c
@@ -0,0 +1,8 @@
+typedef int __attribute__((__vector_size__ (32))) V;
+
+void
+foo (char *out)
+{
+ V v = (V) { };
+ __builtin_strncpy (out, (char *)&v, 5);
+}