mirror of https://github.com/microsoft/clang.git
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
This commit is contained in:
parent
30d3f201ef
commit
4a9b0e9a58
|
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue