[clang] d2240cd - [NFC] [analyzer] Add ArrayBound tests to document casting bug (#127062)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Feb 13 07:09:16 PST 2025
Author: DonĂ¡t Nagy
Date: 2025-02-13T16:09:09+01:00
New Revision: d2240cd314102ed99d35b84d43006e324f344163
URL: https://github.com/llvm/llvm-project/commit/d2240cd314102ed99d35b84d43006e324f344163
DIFF: https://github.com/llvm/llvm-project/commit/d2240cd314102ed99d35b84d43006e324f344163.diff
LOG: [NFC] [analyzer] Add ArrayBound tests to document casting bug (#127062)
Add a few security.ArrayBound testcases that document the false
positives caused the fact that the analyzer doesn't model a cast from
`signed char` to `unsigned char`.
Added:
Modified:
clang/test/Analysis/out-of-bounds.c
Removed:
################################################################################
diff --git a/clang/test/Analysis/out-of-bounds.c b/clang/test/Analysis/out-of-bounds.c
index 9f410e884d763..7a094b8fdc840 100644
--- a/clang/test/Analysis/out-of-bounds.c
+++ b/clang/test/Analysis/out-of-bounds.c
@@ -1,4 +1,6 @@
-// RUN: %clang_analyze_cc1 -Wno-array-bounds -analyzer-checker=core,security.ArrayBound -verify %s
+// RUN: %clang_analyze_cc1 -Wno-array-bounds -analyzer-checker=core,security.ArrayBound,debug.ExprInspection -verify %s
+
+void clang_analyzer_value(int);
// Tests doing an out-of-bounds access after the end of an array using:
// - constant integer index
@@ -180,3 +182,36 @@ char test_comparison_with_extent_symbol(struct incomplete *p) {
return ((char *)p)[-1]; // no-warning
}
+int table[256], small_table[128];
+int test_cast_to_unsigned(signed char x) {
+ unsigned char y = x;
+ if (x >= 0)
+ return x;
+ // FIXME: Here the analyzer ignores the signed -> unsigned cast, and manages to
+ // load a negative value from an unsigned variable. This causes an underflow
+ // report, which is an ugly false positive.
+ // The underlying issue is tracked by Github ticket #39492.
+ clang_analyzer_value(y); // expected-warning {{8s:{ [-128, -1] } }}
+ return table[y]; // expected-warning {{Out of bound access to memory preceding}}
+}
+
+int test_cast_to_unsigned_overflow(signed char x) {
+ unsigned char y = x;
+ if (x >= 0)
+ return x;
+ // A variant of 'test_cast_to_unsigned' where the correct behavior would be
+ // an overflow report (because the negative values are cast to `unsigned
+ // char` values that are too large).
+ // FIXME: See comment in 'test_cast_to_unsigned'.
+ clang_analyzer_value(y); // expected-warning {{8s:{ [-128, -1] } }}
+ return small_table[y]; // expected-warning {{Out of bound access to memory preceding}}
+}
+
+int test_negative_offset_with_unsigned_idx(void) {
+ // An example where the subscript operator uses an unsigned index, but the
+ // underflow report is still justified. (We should try to keep this if we
+ // silence false positives like the one in 'test_cast_to_unsigned'.)
+ int *p = table - 10;
+ unsigned idx = 2u;
+ return p[idx]; // expected-warning {{Out of bound access to memory preceding}}
+}
More information about the cfe-commits
mailing list