From 4a9b0e9a580ad0b54a646d6fb04eb9b80d7c1a92 Mon Sep 17 00:00:00 2001 From: Aaron Puchert Date: Wed, 19 Sep 2018 00:19:38 +0000 Subject: [PATCH] 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. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@342519 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/ThreadSafetyCommon.cpp | 20 +++++++++++--------- test/SemaCXX/warn-thread-safety-analysis.cpp | 5 +++++ 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/lib/Analysis/ThreadSafetyCommon.cpp b/lib/Analysis/ThreadSafetyCommon.cpp index fced17ff91..ac765808ce 100644 --- a/lib/Analysis/ThreadSafetyCommon.cpp +++ b/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()) { - CallingContext LRCallCtx(Ctx); - LRCallCtx.AttrDecl = CE->getDirectCallee(); - LRCallCtx.SelfArg = SelfE; - LRCallCtx.NumArgs = CE->getNumArgs(); - LRCallCtx.FunArgs = CE->getArgs(); - return const_cast( - translateAttrExpr(At->getArg(), &LRCallCtx).sexpr()); + if (const FunctionDecl *FD = CE->getDirectCallee()) { + FD = FD->getMostRecentDecl(); + if (LockReturnedAttr *At = FD->getAttr()) { + CallingContext LRCallCtx(Ctx); + LRCallCtx.AttrDecl = CE->getDirectCallee(); + LRCallCtx.SelfArg = SelfE; + LRCallCtx.NumArgs = CE->getNumArgs(); + LRCallCtx.FunArgs = CE->getArgs(); + return const_cast( + translateAttrExpr(At->getArg(), &LRCallCtx).sexpr()); + } } } diff --git a/test/SemaCXX/warn-thread-safety-analysis.cpp b/test/SemaCXX/warn-thread-safety-analysis.cpp index deaa7d12cf..0be2668a48 100644 --- a/test/SemaCXX/warn-thread-safety-analysis.cpp +++ b/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(); } -- 2.40.0