summaryrefslogtreecommitdiffstats
path: root/clang/test/Analysis/array-struct-region.c
diff options
context:
space:
mode:
authorJordan Rose <jordan_rose@apple.com>2012-07-06 21:59:56 +0000
committerJordan Rose <jordan_rose@apple.com>2012-07-06 21:59:56 +0000
commit3f89e0ec93be52cfe305ba3a352621012e4208e8 (patch)
tree9331b7b2c48381a253ad16f7c075aee23f285b7b /clang/test/Analysis/array-struct-region.c
parent8a9ee14803fed1f59c928fbba03d32df95594da6 (diff)
downloadbcm5719-llvm-3f89e0ec93be52cfe305ba3a352621012e4208e8.tar.gz
bcm5719-llvm-3f89e0ec93be52cfe305ba3a352621012e4208e8.zip
[analyzer] Be careful about LazyCompoundVals, which may be for the first field.
We use LazyCompoundVals to avoid copying the contents of structs and arrays around in the store, and when we need to pass a struct around that already has a LazyCompoundVal we just use the original one. However, it's possible that the first field of a struct may have a LazyCompoundVal of its own, and we currently can't distinguish a LazyCompoundVal for the first element of a struct from a LazyCompoundVal for the entire struct. In this case we should just drop the optimization and make a new LazyCompoundVal that encompasses the old one. PR13264 / <rdar://problem/11802440> llvm-svn: 159866
Diffstat (limited to 'clang/test/Analysis/array-struct-region.c')
-rw-r--r--clang/test/Analysis/array-struct-region.c39
1 files changed, 37 insertions, 2 deletions
diff --git a/clang/test/Analysis/array-struct-region.c b/clang/test/Analysis/array-struct-region.c
index c1eddcdd217..ddb9f4b1167 100644
--- a/clang/test/Analysis/array-struct-region.c
+++ b/clang/test/Analysis/array-struct-region.c
@@ -1,5 +1,5 @@
-// RUN: %clang_cc1 -analyze -analyzer-checker=core,experimental.core,debug.ExprInspection -analyzer-store=region -analyzer-constraints=basic -verify %s
-// RUN: %clang_cc1 -analyze -analyzer-checker=core,experimental.core,debug.ExprInspection -analyzer-store=region -analyzer-constraints=range -verify %s
+// RUN: %clang_cc1 -analyze -analyzer-checker=core,experimental.core,debug.ExprInspection -analyzer-store=region -analyzer-constraints=basic -analyzer-ipa=all -verify %s
+// RUN: %clang_cc1 -analyze -analyzer-checker=core,experimental.core,debug.ExprInspection -analyzer-store=region -analyzer-constraints=range -analyzer-ipa=all -verify %s
void clang_analyzer_eval(int);
@@ -57,3 +57,38 @@ void struct_as_array() {
clang_analyzer_eval(p->y == 5); // expected-warning{{TRUE}}
}
+
+// PR13264 / <rdar://problem/11802440>
+struct point { int x; int y; };
+struct circle { struct point o; int r; };
+struct circle get_circle() {
+ struct circle result;
+ result.r = 5;
+ result.o = (struct point){0, 0};
+ return result;
+}
+
+void struct_in_struct() {
+ struct circle c;
+ c = get_circle();
+ // This used to think c.r was undefined because c.o is a LazyCompoundVal.
+ clang_analyzer_eval(c.r == 5); // expected-warning{{TRUE}}
+}
+
+// We also test with floats because we don't model floats right now,
+// and the original bug report used a float.
+struct circle_f { struct point o; float r; };
+struct circle_f get_circle_f() {
+ struct circle_f result;
+ result.r = 5.0;
+ result.o = (struct point){0, 0};
+ return result;
+}
+
+float struct_in_struct_f() {
+ struct circle_f c;
+ c = get_circle_f();
+
+ return c.r; // no-warning
+}
+
OpenPOWER on IntegriCloud