aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/c-c++-common/analyzer
diff options
context:
space:
mode:
authorDavid Malcolm <dmalcolm@redhat.com>2024-04-10 16:43:30 -0400
committerDavid Malcolm <dmalcolm@redhat.com>2024-04-10 16:43:30 -0400
commit4a94551d7eaaf7a75c5195fc0bf4af94185a04c7 (patch)
treec717cac5e8d2d4c3a022d1390ffd2b48fdcb379b /gcc/testsuite/c-c++-common/analyzer
parent107b0e63be023c11017aa53625a6557950df4d99 (diff)
downloadgcc-4a94551d7eaaf7a75c5195fc0bf4af94185a04c7.zip
gcc-4a94551d7eaaf7a75c5195fc0bf4af94185a04c7.tar.gz
gcc-4a94551d7eaaf7a75c5195fc0bf4af94185a04c7.tar.bz2
analyzer: fix ICE on negative values for size_t [PR114472]
I made several attempts to fix this properly, but for now apply a band-aid to at least prevent crashing on such cases. gcc/analyzer/ChangeLog: PR analyzer/114472 * access-diagram.cc (bit_size_expr::maybe_get_formatted_str): Reject attempts to print sizes that are too large. * region.cc (region_offset::calc_symbolic_bit_offset): Use a typeless svalue for the bit offset. * store.cc (bit_range::intersects_p): Replace assertion with test. (bit_range::exceeds_p): Likewise. (bit_range::falls_short_of_p): Likewise. gcc/testsuite/ChangeLog: * c-c++-common/analyzer/out-of-bounds-pr114472.c: New test. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
Diffstat (limited to 'gcc/testsuite/c-c++-common/analyzer')
-rw-r--r--gcc/testsuite/c-c++-common/analyzer/out-of-bounds-pr114472.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/gcc/testsuite/c-c++-common/analyzer/out-of-bounds-pr114472.c b/gcc/testsuite/c-c++-common/analyzer/out-of-bounds-pr114472.c
new file mode 100644
index 0000000..ef9e771
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/analyzer/out-of-bounds-pr114472.c
@@ -0,0 +1,17 @@
+/* Verify we don't ICE on cases involving very large values for size. */
+
+char s, d;
+
+void
+foo(void)
+{
+ __builtin_strncpy(&d, &s + 3, -1); /* { dg-warning "Wstringop-overflow" } */
+ __builtin_strncpy(&d + 3, &s, -1); /* { dg-warning "Wstringop-overflow" } */
+}
+
+void
+bar(void)
+{
+ __builtin_strncpy(&d, &s - 3, -1); /* { dg-warning "Wstringop-overflow" } */
+ __builtin_strncpy(&d - 3, &s, -1); /* { dg-warning "Wstringop-overflow" } */
+}