[clang] [NFC][analyzer] OOB test consolidation II: constraint checking (PR #126748)
Balazs Benics via cfe-commits
cfe-commits at lists.llvm.org
Wed Feb 12 03:48:38 PST 2025
=?utf-8?q?DonĂ¡t?= Nagy <donat.nagy at ericsson.com>
Message-ID:
In-Reply-To: <llvm.org/llvm/llvm-project/pull/126748 at github.com>
================
@@ -1,112 +1,163 @@
// RUN: %clang_analyze_cc1 -analyzer-checker=core,unix.Malloc,security.ArrayBound,debug.ExprInspection \
// RUN: -analyzer-config eagerly-assume=false -verify %s
-void clang_analyzer_eval(int);
-void clang_analyzer_printState(void);
-
-typedef typeof(sizeof(int)) size_t;
-const char a[] = "abcd"; // extent: 5 bytes
-
-void symbolic_size_t_and_int0(size_t len) {
- (void)a[len + 1]; // no-warning
- // We infered that the 'len' must be in a specific range to make the previous indexing valid.
- // len: [0,3]
- clang_analyzer_eval(len <= 3); // expected-warning {{TRUE}}
- clang_analyzer_eval(len <= 2); // expected-warning {{UNKNOWN}}
-}
-
-void symbolic_size_t_and_int1(size_t len) {
- (void)a[len]; // no-warning
- // len: [0,4]
- clang_analyzer_eval(len <= 4); // expected-warning {{TRUE}}
- clang_analyzer_eval(len <= 3); // expected-warning {{UNKNOWN}}
-}
-
-void symbolic_size_t_and_int2(size_t len) {
- (void)a[len - 1]; // no-warning
- // len: [1,5]
- clang_analyzer_eval(1 <= len && len <= 5); // expected-warning {{TRUE}}
- clang_analyzer_eval(2 <= len); // expected-warning {{UNKNOWN}}
- clang_analyzer_eval(len <= 4); // expected-warning {{UNKNOWN}}
-}
-
-void symbolic_uint_and_int0(unsigned len) {
- (void)a[len + 1]; // no-warning
- // len: [0,3]
- clang_analyzer_eval(0 <= len && len <= 3); // expected-warning {{TRUE}}
- clang_analyzer_eval(1 <= len); // expected-warning {{UNKNOWN}}
- clang_analyzer_eval(len <= 2); // expected-warning {{UNKNOWN}}
-}
-
-void symbolic_uint_and_int1(unsigned len) {
- (void)a[len]; // no-warning
- // len: [0,4]
- clang_analyzer_eval(0 <= len && len <= 4); // expected-warning {{TRUE}}
- clang_analyzer_eval(1 <= len); // expected-warning {{UNKNOWN}}
- clang_analyzer_eval(len <= 3); // expected-warning {{UNKNOWN}}
-}
-void symbolic_uint_and_int2(unsigned len) {
- (void)a[len - 1]; // no-warning
- // len: [1,5]
- clang_analyzer_eval(1 <= len && len <= 5); // expected-warning {{TRUE}}
- clang_analyzer_eval(2 <= len); // expected-warning {{UNKNOWN}}
- clang_analyzer_eval(len <= 4); // expected-warning {{UNKNOWN}}
-}
-
-void symbolic_int_and_int0(int len) {
- (void)a[len + 1]; // no-warning
- // len: [-1,3]
- clang_analyzer_eval(-1 <= len && len <= 3); // expected-warning {{TRUE}}
- clang_analyzer_eval(0 <= len); // expected-warning {{UNKNOWN}}
- clang_analyzer_eval(len <= 2); // expected-warning {{UNKNOWN}}
-}
-void symbolic_int_and_int1(int len) {
- (void)a[len]; // no-warning
- // len: [0,4]
- clang_analyzer_eval(0 <= len && len <= 4); // expected-warning {{TRUE}}
- clang_analyzer_eval(1 <= len); // expected-warning {{UNKNOWN}}
- clang_analyzer_eval(len <= 3); // expected-warning {{UNKNOWN}}
-}
-void symbolic_int_and_int2(int len) {
- (void)a[len - 1]; // no-warning
- // len: [1,5]
- clang_analyzer_eval(1 <= len && len <= 5); // expected-warning {{TRUE}}
- clang_analyzer_eval(2 <= len); // expected-warning {{UNKNOWN}}
- clang_analyzer_eval(len <= 4); // expected-warning {{UNKNOWN}}
-}
-
-void symbolic_longlong_and_int0(long long len) {
- (void)a[len + 1]; // no-warning
- // len: [-1,3]
- clang_analyzer_eval(-1 <= len && len <= 3); // expected-warning {{TRUE}}
- clang_analyzer_eval(0 <= len); // expected-warning {{UNKNOWN}}
- clang_analyzer_eval(len <= 2); // expected-warning {{UNKNOWN}}
+// When the checker security.ArrayBound encounters an array subscript operation
+// that _may be_ in bounds, it assumes that indexing _is_ in bound. This test
+// file validates these assumptions.
+
+void clang_analyzer_value(int);
+
+// Simple case: memory area with a static extent.
+
+int FiveInts[5] = {1, 2, 3, 4, 5};
+
+void int_plus_one(int len) {
+ (void)FiveInts[len + 1]; // no-warning
+ clang_analyzer_value(len); // expected-warning {{32s:{ [-1, 3] }}}
----------------
steakhal wrote:
Yes, checking only the ranges should suffice in this case.
https://github.com/llvm/llvm-project/pull/126748
More information about the cfe-commits
mailing list