summaryrefslogtreecommitdiffstats
path: root/clang/test/Analysis
diff options
context:
space:
mode:
Diffstat (limited to 'clang/test/Analysis')
-rw-r--r--clang/test/Analysis/dtor.cpp37
1 files changed, 35 insertions, 2 deletions
diff --git a/clang/test/Analysis/dtor.cpp b/clang/test/Analysis/dtor.cpp
index f5837539cb7..4e3c0017f4a 100644
--- a/clang/test/Analysis/dtor.cpp
+++ b/clang/test/Analysis/dtor.cpp
@@ -1,4 +1,6 @@
-// RUN: %clang_cc1 -analyze -analyzer-checker=core,unix.Malloc -analyzer-store region -analyzer-ipa=inlining -cfg-add-implicit-dtors -cfg-add-initializers -verify %s
+// RUN: %clang_cc1 -analyze -analyzer-checker=core,unix.Malloc,debug.ExprInspection -analyzer-store region -analyzer-ipa=inlining -cfg-add-implicit-dtors -cfg-add-initializers -verify %s
+
+void clang_analyzer_eval(bool);
class A {
public:
@@ -100,7 +102,7 @@ void testMultipleInheritance3() {
// Remove dead bindings...
doSomething();
// destructor called here
- // expected-warning@25 {{Attempt to free released memory}}
+ // expected-warning@27 {{Attempt to free released memory}}
}
}
@@ -121,3 +123,34 @@ void testSmartPointerMember() {
}
*mem = 0; // expected-warning{{Use of memory after it is freed}}
}
+
+
+struct IntWrapper {
+ IntWrapper() : x(0) {}
+ ~IntWrapper();
+ int *x;
+};
+
+void testArrayInvalidation() {
+ int i = 42;
+ int j = 42;
+
+ {
+ IntWrapper arr[2];
+
+ // There should be no undefined value warnings here.
+ // Eventually these should be TRUE as well, but right now
+ // we can't handle array constructors.
+ clang_analyzer_eval(arr[0].x == 0); // expected-warning{{UNKNOWN}}
+ clang_analyzer_eval(arr[1].x == 0); // expected-warning{{UNKNOWN}}
+
+ arr[0].x = &i;
+ arr[1].x = &j;
+ clang_analyzer_eval(*arr[0].x == 42); // expected-warning{{TRUE}}
+ clang_analyzer_eval(*arr[1].x == 42); // expected-warning{{TRUE}}
+ }
+
+ // The destructors should have invalidated i and j.
+ clang_analyzer_eval(i == 42); // expected-warning{{UNKNOWN}}
+ clang_analyzer_eval(j == 42); // expected-warning{{UNKNOWN}}
+}
OpenPOWER on IntegriCloud