[PATCH] D103440: [WIP][analyzer] Introduce range-based reasoning for addition operator
Manas Gupta via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Jun 2 04:08:23 PDT 2021
manas updated this revision to Diff 349225.
manas added a comment.
Fixed test cases expecting wrong assertions and added few more test cases.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D103440/new/
https://reviews.llvm.org/D103440
Files:
clang/test/Analysis/constant-folding.c
Index: clang/test/Analysis/constant-folding.c
===================================================================
--- clang/test/Analysis/constant-folding.c
+++ clang/test/Analysis/constant-folding.c
@@ -251,3 +251,57 @@
clang_analyzer_eval((b % a) < x + 10); // expected-warning{{TRUE}}
}
}
+
+void testAdditionRules(unsigned int a, unsigned int b, int c, int d) {
+ if (a == 0) {
+ clang_analyzer_eval((a + 0) == 0); // expected-warning{{TRUE}}
+ }
+
+ // Checks for unsigned operands
+ clang_analyzer_eval((a + b) < 0); // expected-warning{{FALSE}}
+ clang_analyzer_eval((a + b) <= UINT_MAX); // expected-warning{{TRUE}}
+
+ if (a == UINT_MAX && b == UINT_MAX) {
+ clang_analyzer_eval((a + b) == UINT_MAX - 1); // expected-warning{{TRUE}}
+ }
+
+ // Checks for inclusive ranges for unsigned integers
+ if (a >= 0 && a <= 10 && b >= 0 && b <= 20) {
+ clang_analyzer_eval((a + b) >= 0); // expected-warning{{TRUE}}
+ clang_analyzer_eval((a + b) > 30); // expected-warning{{FALSE}}
+ }
+
+ // Checks for negative signed integers
+ if (c < 0 && d < 0) {
+ clang_analyzer_eval((c + d) < 0); // expected-warning{{UNKNOWN}}
+
+ if (c == INT_MIN && d == INT_MIN) {
+ clang_analyzer_eval((c + d) == 0); // expected-warning{{TRUE}}
+ }
+
+ if (c >= -20 && d >= -40) {
+ clang_analyzer_eval((c + d) < -1); // expected-warning{{TRUE}}
+ clang_analyzer_eval((c + d) >= -60); // expected-warning{{TRUE}}
+ }
+ }
+
+ // Checks for integers with different sign bits
+ if (c < 0 && d > 0) {
+ if (c >= -20 && d <= 10) {
+ clang_analyzer_eval((c + d) > -20); // expected-warning{{TRUE}}
+ clang_analyzer_eval((c + d) < 10); // expected-warning{{TRUE}}
+ }
+ }
+
+ // Checks for overlapping signed integers ranges
+ if (c >= -20 && c <= 20 && d >= -10 && d <= 10) {
+ clang_analyzer_eval((c + d) >= -30); // expected-warning{{TRUE}}
+ clang_analyzer_eval((c + d) <= 30); // expected-warning{{TRUE}}
+ }
+
+ // Checks for positive signed integers
+ if (c > 0 && d > 0) {
+ clang_analyzer_eval((c + d) > 1); // expected-warning{{TRUE}}
+ clang_analyzer_eval((c + d) < -1); // expected-warning{{TRUE}}
+ }
+}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D103440.349225.patch
Type: text/x-patch
Size: 2191 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20210602/44979293/attachment.bin>
More information about the cfe-commits
mailing list