Skip to content

Commit

Permalink
Update checkleakautovar.cpp
Browse files Browse the repository at this point in the history
  • Loading branch information
chrchr-github committed Jul 15, 2024
1 parent e0c3887 commit 5fc3bca
Showing 1 changed file with 33 additions and 15 deletions.
48 changes: 33 additions & 15 deletions lib/checkleakautovar.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,30 @@ static const Token * isFunctionCall(const Token * nameToken)
return nullptr;
}

static const Token* getOutparamAllocation(const Token* tok, const Settings& settings)
{
if (!tok)
return nullptr;
int argn{};
const Token* ftok = getTokenArgumentFunction(tok, argn);
if (!ftok)
return nullptr;
if (const Library::AllocFunc* allocFunc = settings.library.getAllocFuncInfo(ftok)) {
if (allocFunc->arg == argn + 1)
return ftok;
}
return nullptr;
}

static const Token* getReturnValueFromOutparamAlloc(const Token* alloc, const Settings& settings)
{
if (const Token* ftok = getOutparamAllocation(alloc, settings)) {
if (Token::simpleMatch(ftok->astParent()->astParent(), "="))
return ftok->next()->astParent()->astOperand1();
}
return nullptr;
}

bool CheckLeakAutoVar::checkScope(const Token * const startToken,
VarInfo &varInfo,
std::set<int> notzero,
Expand Down Expand Up @@ -526,6 +550,15 @@ bool CheckLeakAutoVar::checkScope(const Token * const startToken,
if (astIsVariableComparison(tok3, "!=", "0", &vartok) &&
(notzero.find(vartok->varId()) != notzero.end()))
varInfo2.clear();

if (std::any_of(varInfo1.alloctype.begin(), varInfo1.alloctype.end(), [&](const std::pair<int, VarInfo::AllocInfo>& info) {
if (info.second.status != VarInfo::ALLOC)
return false;
const Token* ret = getReturnValueFromOutparamAlloc(info.second.allocTok, *mSettings);
return ret && ret->varId() && ret->varId() == vartok->varId();
})) {
varInfo1.clear();
}
} else if (isVarTokComparison(tok3, &vartok, alloc_failed_conds)) {
varInfo1.reallocToAlloc(vartok->varId());
varInfo1.erase(vartok->varId());
Expand Down Expand Up @@ -1056,21 +1089,6 @@ void CheckLeakAutoVar::leakIfAllocated(const Token *vartok,
}
}

static const Token* getOutparamAllocation(const Token* tok, const Settings& settings)
{
if (!tok)
return nullptr;
int argn{};
const Token* ftok = getTokenArgumentFunction(tok, argn);
if (!ftok)
return nullptr;
if (const Library::AllocFunc* allocFunc = settings.library.getAllocFuncInfo(ftok)) {
if (allocFunc->arg == argn + 1)
return ftok;
}
return nullptr;
}

void CheckLeakAutoVar::ret(const Token *tok, VarInfo &varInfo, const bool isEndOfScope)
{
const std::map<int, VarInfo::AllocInfo> &alloctype = varInfo.alloctype;
Expand Down

0 comments on commit 5fc3bca

Please sign in to comment.