aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/Analysis/uninit-vals.m61
1 files changed, 59 insertions, 2 deletions
diff --git a/test/Analysis/uninit-vals.m b/test/Analysis/uninit-vals.m
index 1cd57590df..57e83e3f97 100644
--- a/test/Analysis/uninit-vals.m
+++ b/test/Analysis/uninit-vals.m
@@ -1,7 +1,13 @@
-// RUN: %clang_cc1 -analyze -analyzer-checker=core -analyzer-store=region -verify %s
-// expected-no-diagnostics
+// RUN: %clang_cc1 -analyze -analyzer-checker=core,unix.Malloc,debug.ExprInspection -verify %s
typedef unsigned int NSUInteger;
+typedef __typeof__(sizeof(int)) size_t;
+
+void *malloc(size_t);
+void *calloc(size_t nmemb, size_t size);
+void free(void *);
+
+void clang_analyzer_eval(int);
@interface A
- (NSUInteger)foo;
@@ -32,3 +38,54 @@ void PR10163 (void) {
float x[2] = {0};
test_PR10163(x[1]); // no-warning
}
+
+
+typedef struct {
+ float x;
+ float y;
+} Point;
+typedef struct {
+ Point origin;
+ int size;
+} Circle;
+
+Point makePoint(float x, float y) {
+ Point result;
+ result.x = x;
+ result.y = y;
+ return result;
+}
+
+void PR14765_test() {
+ Circle *testObj = calloc(sizeof(Circle), 1);
+
+ clang_analyzer_eval(testObj->size == 0); // expected-warning{{TRUE}}
+
+ testObj->origin = makePoint(0.0, 0.0);
+ if (testObj->size > 0) { ; } // warning occurs here
+
+ // FIXME: Assigning to 'testObj->origin' kills the default binding for the
+ // whole region, meaning that we've forgotten that testObj->size should also
+ // default to 0. Tracked by <rdar://problem/12701038>.
+ // This should be TRUE.
+ clang_analyzer_eval(testObj->size == 0); // expected-warning{{UNKNOWN}}
+
+ free(testObj);
+}
+
+void PR14765_incorrectBehavior(Circle *testObj) {
+ int oldSize = testObj->size;
+
+ clang_analyzer_eval(testObj->size == oldSize); // expected-warning{{TRUE}}
+
+ testObj->origin = makePoint(0.0, 0.0);
+
+ // FIXME: Assigning to 'testObj->origin' kills the default binding for the
+ // whole region, meaning that we've forgotten that testObj->size should also
+ // default to 0. Tracked by <rdar://problem/12701038>.
+ // This should be TRUE.
+ clang_analyzer_eval(testObj->size == oldSize); // expected-warning{{UNKNOWN}}
+
+ free(testObj);
+}
+