summaryrefslogtreecommitdiffstats
path: root/clang/test/Analysis/logical-ops.c
diff options
context:
space:
mode:
authorJordan Rose <jordan_rose@apple.com>2012-08-20 17:04:45 +0000
committerJordan Rose <jordan_rose@apple.com>2012-08-20 17:04:45 +0000
commit0a9ea7c70de2db1e8de3f75fbac61d302ef52375 (patch)
treeb088b91232261fb4babfbbb068b99b05b31f74f2 /clang/test/Analysis/logical-ops.c
parent486290078c7af9afefe0564f2094047f07ee84a5 (diff)
downloadbcm5719-llvm-0a9ea7c70de2db1e8de3f75fbac61d302ef52375.tar.gz
bcm5719-llvm-0a9ea7c70de2db1e8de3f75fbac61d302ef52375.zip
[analyzer] The result of && or || is always a 1 or 0.
Forgetting to at least cast the result was giving us Loc/NonLoc problems in SValBuilder (hitting an assertion). But the standard (both C and C++) does actually guarantee that && and || will result in the actual values 1 and 0, typed as 'int' in C and 'bool' in C++, and we can easily model that. PR13461 llvm-svn: 162209
Diffstat (limited to 'clang/test/Analysis/logical-ops.c')
-rw-r--r--clang/test/Analysis/logical-ops.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/clang/test/Analysis/logical-ops.c b/clang/test/Analysis/logical-ops.c
new file mode 100644
index 00000000000..a1223b39fa8
--- /dev/null
+++ b/clang/test/Analysis/logical-ops.c
@@ -0,0 +1,27 @@
+// RUN: %clang_cc1 -analyze -analyzer-checker=core,debug.ExprInspection -verify %s
+
+void clang_analyzer_eval(int);
+
+void testAnd(int i, int *p) {
+ int *nullP = 0;
+ int *knownP = &i;
+ clang_analyzer_eval((knownP && knownP) == 1); // expected-warning{{TRUE}}
+ clang_analyzer_eval((knownP && nullP) == 0); // expected-warning{{TRUE}}
+ clang_analyzer_eval((knownP && p) == 1); // expected-warning{{UNKNOWN}}
+}
+
+void testOr(int i, int *p) {
+ int *nullP = 0;
+ int *knownP = &i;
+ clang_analyzer_eval((nullP || knownP) == 1); // expected-warning{{TRUE}}
+ clang_analyzer_eval((nullP || nullP) == 0); // expected-warning{{TRUE}}
+ clang_analyzer_eval((nullP || p) == 1); // expected-warning{{UNKNOWN}}
+}
+
+
+// PR13461
+int testTypeIsInt(int i, void *p) {
+ if (i | (p && p))
+ return 1;
+ return 0;
+}
OpenPOWER on IntegriCloud