]> granicus.if.org Git - clang/commitdiff
[static analyzer] Fix crash in LiveVariables and Environment::getSVal() when analyzin...
authorTed Kremenek <kremenek@apple.com>
Thu, 6 Oct 2011 20:53:28 +0000 (20:53 +0000)
committerTed Kremenek <kremenek@apple.com>
Thu, 6 Oct 2011 20:53:28 +0000 (20:53 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@141312 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/LiveVariables.cpp
lib/StaticAnalyzer/Core/ObjCMessage.cpp
test/Analysis/misc-ps-cxx0x.cpp

index be6e659bd99b5d8801e80d8cd13bf8e4413c7262..c800c70a38ffa1d3df077a7923379baea2dbe521 100644 (file)
@@ -352,9 +352,10 @@ void TransferFunctions::Visit(Stmt *S) {
     case Stmt::CXXMemberCallExprClass: {
       // Include the implicit "this" pointer as being live.
       CXXMemberCallExpr *CE = cast<CXXMemberCallExpr>(S);
-      val.liveStmts =
-        LV.SSetFact.add(val.liveStmts,
-                        CE->getImplicitObjectArgument()->IgnoreParens());
+      if (Expr *ImplicitObj = CE->getImplicitObjectArgument()) {
+        ImplicitObj = ImplicitObj->IgnoreParens();        
+        val.liveStmts = LV.SSetFact.add(val.liveStmts, ImplicitObj);
+      }
       break;
     }
     case Stmt::DeclStmtClass: {
index 112c468210045d672181693ba7953ccd89dff508..0974fe877ac20ff21bb63d81c38456e0a78519f6 100644 (file)
@@ -148,7 +148,13 @@ SVal CallOrObjCMessage::getCXXCallee() const {
   const CallExpr *ActualCall = CallE.get<const CallExpr *>();
   const Expr *callee =
     cast<CXXMemberCallExpr>(ActualCall)->getImplicitObjectArgument();
-  return State->getSVal(callee);  
+  
+  // FIXME: Will eventually need to cope with member pointers.  This is
+  // a limitation in getImplicitObjectArgument().
+  if (!callee)
+    return UnknownVal();
+  
+  return State->getSVal(callee);
 }
 
 SVal
index 598fea2bb7e2aa3ef21cfd5ebd2823f03226b642..1089fa7f9a592a46a20b125d8088e588ed50d552 100644 (file)
@@ -9,3 +9,15 @@ void test_analyzer_working() {
   *p = 0xDEADBEEF; // expected-warning {{null}}
 }
 
+// Test that pointer-to-member functions don't cause the analyzer
+// to crash.
+struct RDar10243398 {
+  void bar(int x);
+};
+
+typedef void (RDar10243398::*RDar10243398MemberFn)(int x);
+
+void test_rdar10243398(RDar10243398 *p) {
+  RDar10243398MemberFn q = &RDar10243398::bar;
+  ((*p).*(q))(1);
+}