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