forked from OSchip/llvm-project
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
This commit is contained in:
parent
b64f71b029
commit
f6ccde7810
|
@ -354,15 +354,17 @@ til::SExpr *SExprBuilder::translateCallExpr(const CallExpr *CE,
|
||||||
const Expr *SelfE) {
|
const Expr *SelfE) {
|
||||||
if (CapabilityExprMode) {
|
if (CapabilityExprMode) {
|
||||||
// Handle LOCK_RETURNED
|
// Handle LOCK_RETURNED
|
||||||
const FunctionDecl *FD = CE->getDirectCallee()->getMostRecentDecl();
|
if (const FunctionDecl *FD = CE->getDirectCallee()) {
|
||||||
if (LockReturnedAttr* At = FD->getAttr<LockReturnedAttr>()) {
|
FD = FD->getMostRecentDecl();
|
||||||
CallingContext LRCallCtx(Ctx);
|
if (LockReturnedAttr *At = FD->getAttr<LockReturnedAttr>()) {
|
||||||
LRCallCtx.AttrDecl = CE->getDirectCallee();
|
CallingContext LRCallCtx(Ctx);
|
||||||
LRCallCtx.SelfArg = SelfE;
|
LRCallCtx.AttrDecl = CE->getDirectCallee();
|
||||||
LRCallCtx.NumArgs = CE->getNumArgs();
|
LRCallCtx.SelfArg = SelfE;
|
||||||
LRCallCtx.FunArgs = CE->getArgs();
|
LRCallCtx.NumArgs = CE->getNumArgs();
|
||||||
return const_cast<til::SExpr *>(
|
LRCallCtx.FunArgs = CE->getArgs();
|
||||||
translateAttrExpr(At->getArg(), &LRCallCtx).sexpr());
|
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() {
|
void test() {
|
||||||
Foo foo;
|
Foo foo;
|
||||||
Foo *fooArray;
|
Foo *fooArray;
|
||||||
|
Foo &(*fooFuncPtr)();
|
||||||
Bar bar;
|
Bar bar;
|
||||||
int a;
|
int a;
|
||||||
int b;
|
int b;
|
||||||
|
@ -2359,6 +2360,10 @@ void test() {
|
||||||
(a > 0 ? fooArray[1] : fooArray[b]).mu_.Lock();
|
(a > 0 ? fooArray[1] : fooArray[b]).mu_.Lock();
|
||||||
(a > 0 ? fooArray[1] : fooArray[b]).a = 0;
|
(a > 0 ? fooArray[1] : fooArray[b]).a = 0;
|
||||||
(a > 0 ? fooArray[1] : fooArray[b]).mu_.Unlock();
|
(a > 0 ? fooArray[1] : fooArray[b]).mu_.Unlock();
|
||||||
|
|
||||||
|
fooFuncPtr().mu_.Lock();
|
||||||
|
fooFuncPtr().a = 0;
|
||||||
|
fooFuncPtr().mu_.Unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue