Re: r293604 - In VirtualCallChecker, handle indirect calls

2017-02-24 Thread Hans Wennborg via cfe-commits
On Mon, Jan 30, 2017 at 9:23 PM, Sam McCall via cfe-commits
 wrote:
> Author: sammccall
> Date: Mon Jan 30 23:23:20 2017
> New Revision: 293604
>
> URL: http://llvm.org/viewvc/llvm-project?rev=293604=rev
> Log:
> In VirtualCallChecker, handle indirect calls
>
> Summary:
> In VirtualCallChecker, handle indirect calls.
>
> getDirectCallee() can be nullptr, and dyn_cast(nullptr) is UB
>
> Reviewers: bkramer
>
> Subscribers: cfe-commits
>
> Differential Revision: https://reviews.llvm.org/D29303
>
> Modified:
> cfe/trunk/lib/StaticAnalyzer/Checkers/VirtualCallChecker.cpp
> cfe/trunk/test/Analysis/virtualcall.cpp

Merged to 4.0 in r296154 as suggested in the code review email thread.
___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


r293604 - In VirtualCallChecker, handle indirect calls

2017-01-30 Thread Sam McCall via cfe-commits
Author: sammccall
Date: Mon Jan 30 23:23:20 2017
New Revision: 293604

URL: http://llvm.org/viewvc/llvm-project?rev=293604=rev
Log:
In VirtualCallChecker, handle indirect calls

Summary:
In VirtualCallChecker, handle indirect calls.

getDirectCallee() can be nullptr, and dyn_cast(nullptr) is UB

Reviewers: bkramer

Subscribers: cfe-commits

Differential Revision: https://reviews.llvm.org/D29303

Modified:
cfe/trunk/lib/StaticAnalyzer/Checkers/VirtualCallChecker.cpp
cfe/trunk/test/Analysis/virtualcall.cpp

Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/VirtualCallChecker.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/VirtualCallChecker.cpp?rev=293604=293603=293604=diff
==
--- cfe/trunk/lib/StaticAnalyzer/Checkers/VirtualCallChecker.cpp (original)
+++ cfe/trunk/lib/StaticAnalyzer/Checkers/VirtualCallChecker.cpp Mon Jan 30 
23:23:20 2017
@@ -179,7 +179,8 @@ void WalkAST::VisitCXXMemberCallExpr(Cal
   }
 
   // Get the callee.
-  const CXXMethodDecl *MD = dyn_cast(CE->getDirectCallee());
+  const CXXMethodDecl *MD =
+  dyn_cast_or_null(CE->getDirectCallee());
   if (MD && MD->isVirtual() && !callIsNonVirtual && !MD->hasAttr() 
&&
   !MD->getParent()->hasAttr())
 ReportVirtualCall(CE, MD->isPure());

Modified: cfe/trunk/test/Analysis/virtualcall.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/virtualcall.cpp?rev=293604=293603=293604=diff
==
--- cfe/trunk/test/Analysis/virtualcall.cpp (original)
+++ cfe/trunk/test/Analysis/virtualcall.cpp Mon Jan 30 23:23:20 2017
@@ -115,12 +115,23 @@ public:
   int foo() override;
 };
 
+// Regression test: don't crash when there's no direct callee.
+class F {
+public:
+  F() {
+void (F::* ptr)() = ::foo;
+(this->*ptr)();
+  }
+  void foo();
+};
+
 int main() {
   A *a;
   B *b;
   C *c;
   D *d;
   E *e;
+  F *f;
 }
 
 #include "virtualcall.h"


___
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits