diff options
author | David Malcolm <dmalcolm@redhat.com> | 2024-01-18 12:11:57 -0500 |
---|---|---|
committer | David Malcolm <dmalcolm@redhat.com> | 2024-01-18 12:11:57 -0500 |
commit | d5604febcfb09445eb738dcb8c675a4cb9671519 (patch) | |
tree | 72591169c0bcfd3f255c3d0b6f3a9895797674b4 /gcc | |
parent | 84096e665c5f7d7ffb07f18a5fd5e804a94b237b (diff) | |
download | gcc-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.cc | 9 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/analyzer/strlen-pr111361.c | 18 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/analyzer/strncpy-1.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/analyzer/strncpy-pr111361.c | 8 |
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); +} |