From 54529a347e13c789ebb544fdae75a2651085b95f Mon Sep 17 00:00:00 2001 From: Jordan Rose Date: Thu, 26 Jul 2012 20:04:21 +0000 Subject: [analyzer] Handle C++ member initializers and destructors. This uses CFG to tell if a constructor call is for a member, and uses the member's region appropriately. llvm-svn: 160808 --- clang/test/Analysis/dtor.cpp | 18 ++++++++++++++++++ clang/test/Analysis/initializer.cpp | 35 ++++++++++++++++++++++++++++++++++- 2 files changed, 52 insertions(+), 1 deletion(-) (limited to 'clang/test/Analysis') diff --git a/clang/test/Analysis/dtor.cpp b/clang/test/Analysis/dtor.cpp index 8d67f78a4a7..f5837539cb7 100644 --- a/clang/test/Analysis/dtor.cpp +++ b/clang/test/Analysis/dtor.cpp @@ -103,3 +103,21 @@ void testMultipleInheritance3() { // expected-warning@25 {{Attempt to free released memory}} } } + + +class SmartPointerMember { + SmartPointer P; +public: + SmartPointerMember(void *x) : P(x) {} +}; + +void testSmartPointerMember() { + char *mem = (char*)malloc(4); + { + SmartPointerMember Deleter(mem); + // Remove dead bindings... + doSomething(); + // destructor called here + } + *mem = 0; // expected-warning{{Use of memory after it is freed}} +} diff --git a/clang/test/Analysis/initializer.cpp b/clang/test/Analysis/initializer.cpp index 6640e1fc495..0580503a44b 100644 --- a/clang/test/Analysis/initializer.cpp +++ b/clang/test/Analysis/initializer.cpp @@ -1,4 +1,7 @@ -// RUN: %clang_cc1 -analyze -analyzer-checker=core,debug.ExprInspection -analyzer-store region -cfg-add-initializers -verify %s +// RUN: %clang_cc1 -analyze -analyzer-checker=core,debug.ExprInspection -analyzer-store region -cfg-add-initializers -cfg-add-implicit-dtors -verify %s + +// We don't inline constructors unless we have both initializers and +// implicit destructors turned on. void clang_analyzer_eval(bool); @@ -11,3 +14,33 @@ public: A::A() : x(0) { clang_analyzer_eval(x == 0); // expected-warning{{TRUE}} } + + +class DirectMember { + int x; +public: + DirectMember(int value) : x(value) {} + + int getX() { return x; } +}; + +void testDirectMember() { + DirectMember obj(3); + clang_analyzer_eval(obj.getX() == 3); // expected-warning{{TRUE}} +} + + +class IndirectMember { + struct { + int x; + }; +public: + IndirectMember(int value) : x(value) {} + + int getX() { return x; } +}; + +void testIndirectMember() { + IndirectMember obj(3); + clang_analyzer_eval(obj.getX() == 3); // expected-warning{{TRUE}} +} -- cgit v1.2.3