diff options
author | Aaron Puchert <aaronpuchert@alice-dsl.net> | 2018-09-19 00:19:38 +0000 |
---|---|---|
committer | Aaron Puchert <aaronpuchert@alice-dsl.net> | 2018-09-19 00:19:38 +0000 |
commit | f6ccde781004295dc031b86ee1f19a367130db70 (patch) | |
tree | e55e816118d1c49819c0babce007f9b16713904a /clang/lib/Analysis/ThreadSafetyCommon.cpp | |
parent | b64f71b0296f45bd2a527a5da37b2692f665fcb3 (diff) | |
download | llvm-f6ccde781004295dc031b86ee1f19a367130db70.zip llvm-f6ccde781004295dc031b86ee1f19a367130db70.tar.gz llvm-f6ccde781004295dc031b86ee1f19a367130db70.tar.bz2 |
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
Diffstat (limited to 'clang/lib/Analysis/ThreadSafetyCommon.cpp')
-rw-r--r-- | clang/lib/Analysis/ThreadSafetyCommon.cpp | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/clang/lib/Analysis/ThreadSafetyCommon.cpp b/clang/lib/Analysis/ThreadSafetyCommon.cpp index fced17f..ac76580 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()); + } } } |