[PATCH] D29303: In VirtualCallChecker, handle indirect calls
Sam McCall via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Jan 30 21:34:47 PST 2017
This revision was automatically updated to reflect the committed changes.
Closed by commit rL293604: In VirtualCallChecker, handle indirect calls (authored by sammccall).
Changed prior to commit:
https://reviews.llvm.org/D29303?vs=86342&id=86385#toc
Repository:
rL LLVM
https://reviews.llvm.org/D29303
Files:
cfe/trunk/lib/StaticAnalyzer/Checkers/VirtualCallChecker.cpp
cfe/trunk/test/Analysis/virtualcall.cpp
Index: cfe/trunk/test/Analysis/virtualcall.cpp
===================================================================
--- cfe/trunk/test/Analysis/virtualcall.cpp
+++ cfe/trunk/test/Analysis/virtualcall.cpp
@@ -115,12 +115,23 @@
int foo() override;
};
+// Regression test: don't crash when there's no direct callee.
+class F {
+public:
+ F() {
+ void (F::* ptr)() = &F::foo;
+ (this->*ptr)();
+ }
+ void foo();
+};
+
int main() {
A *a;
B *b;
C *c;
D *d;
E *e;
+ F *f;
}
#include "virtualcall.h"
Index: cfe/trunk/lib/StaticAnalyzer/Checkers/VirtualCallChecker.cpp
===================================================================
--- cfe/trunk/lib/StaticAnalyzer/Checkers/VirtualCallChecker.cpp
+++ cfe/trunk/lib/StaticAnalyzer/Checkers/VirtualCallChecker.cpp
@@ -179,7 +179,8 @@
}
// Get the callee.
- const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(CE->getDirectCallee());
+ const CXXMethodDecl *MD =
+ dyn_cast_or_null<CXXMethodDecl>(CE->getDirectCallee());
if (MD && MD->isVirtual() && !callIsNonVirtual && !MD->hasAttr<FinalAttr>() &&
!MD->getParent()->hasAttr<FinalAttr>())
ReportVirtualCall(CE, MD->isPure());
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D29303.86385.patch
Type: text/x-patch
Size: 1182 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20170131/40ff83ce/attachment.bin>
More information about the cfe-commits
mailing list