summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAaron Puchert <aaronpuchert@alice-dsl.net>2018-09-19 00:19:38 +0000
committerAaron Puchert <aaronpuchert@alice-dsl.net>2018-09-19 00:19:38 +0000
commitf6ccde781004295dc031b86ee1f19a367130db70 (patch)
treee55e816118d1c49819c0babce007f9b16713904a
parentb64f71b0296f45bd2a527a5da37b2692f665fcb3 (diff)
downloadbcm5719-llvm-f6ccde781004295dc031b86ee1f19a367130db70.tar.gz
bcm5719-llvm-f6ccde781004295dc031b86ee1f19a367130db70.zip
Thread safety analysis: Fix crash for function pointers
For function pointers, the FunctionDecl of the callee is unknown, so getDirectCallee will return nullptr. We have to catch that case to avoid crashing. We assume there is no attribute then. llvm-svn: 342519
-rw-r--r--clang/lib/Analysis/ThreadSafetyCommon.cpp20
-rw-r--r--clang/test/SemaCXX/warn-thread-safety-analysis.cpp5
2 files changed, 16 insertions, 9 deletions
diff --git a/clang/lib/Analysis/ThreadSafetyCommon.cpp b/clang/lib/Analysis/ThreadSafetyCommon.cpp
index fced17ff919..ac765808cea 100644
--- a/clang/lib/Analysis/ThreadSafetyCommon.cpp
+++ b/clang/lib/Analysis/ThreadSafetyCommon.cpp
@@ -354,15 +354,17 @@ til::SExpr *SExprBuilder::translateCallExpr(const CallExpr *CE,
const Expr *SelfE) {
if (CapabilityExprMode) {
// Handle LOCK_RETURNED
- const FunctionDecl *FD = CE->getDirectCallee()->getMostRecentDecl();
- if (LockReturnedAttr* At = FD->getAttr<LockReturnedAttr>()) {
- CallingContext LRCallCtx(Ctx);
- LRCallCtx.AttrDecl = CE->getDirectCallee();
- LRCallCtx.SelfArg = SelfE;
- LRCallCtx.NumArgs = CE->getNumArgs();
- LRCallCtx.FunArgs = CE->getArgs();
- return const_cast<til::SExpr *>(
- translateAttrExpr(At->getArg(), &LRCallCtx).sexpr());
+ if (const FunctionDecl *FD = CE->getDirectCallee()) {
+ FD = FD->getMostRecentDecl();
+ if (LockReturnedAttr *At = FD->getAttr<LockReturnedAttr>()) {
+ CallingContext LRCallCtx(Ctx);
+ LRCallCtx.AttrDecl = CE->getDirectCallee();
+ LRCallCtx.SelfArg = SelfE;
+ LRCallCtx.NumArgs = CE->getNumArgs();
+ LRCallCtx.FunArgs = CE->getArgs();
+ return const_cast<til::SExpr *>(
+ translateAttrExpr(At->getArg(), &LRCallCtx).sexpr());
+ }
}
}
diff --git a/clang/test/SemaCXX/warn-thread-safety-analysis.cpp b/clang/test/SemaCXX/warn-thread-safety-analysis.cpp
index deaa7d12cfb..0be2668a48d 100644
--- a/clang/test/SemaCXX/warn-thread-safety-analysis.cpp
+++ b/clang/test/SemaCXX/warn-thread-safety-analysis.cpp
@@ -2323,6 +2323,7 @@ Foo& getBarFoo(Bar &bar, int c) { return bar.getFoo2(c); }
void test() {
Foo foo;
Foo *fooArray;
+ Foo &(*fooFuncPtr)();
Bar bar;
int a;
int b;
@@ -2359,6 +2360,10 @@ void test() {
(a > 0 ? fooArray[1] : fooArray[b]).mu_.Lock();
(a > 0 ? fooArray[1] : fooArray[b]).a = 0;
(a > 0 ? fooArray[1] : fooArray[b]).mu_.Unlock();
+
+ fooFuncPtr().mu_.Lock();
+ fooFuncPtr().a = 0;
+ fooFuncPtr().mu_.Unlock();
}
OpenPOWER on IntegriCloud