Skip to content

Commit 578113b

Browse files
committed
fixed #11342 - cache Library::getFunctionName() calls in Token
1 parent 20dbc8d commit 578113b

File tree

7 files changed

+40
-29
lines changed

7 files changed

+40
-29
lines changed

lib/astutils.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2209,7 +2209,7 @@ static bool hasNoreturnFunction(const Token* tok, const Library& library, const
22092209
} else if (Token::Match(ftok, "exit|abort")) {
22102210
return true;
22112211
}
2212-
if (unknownFunc && !function && library.functions().count(library.getFunctionName(ftok)) == 0)
2212+
if (unknownFunc && !function && library.functions().count(ftok->funcname(library)) == 0)
22132213
*unknownFunc = ftok;
22142214
return false;
22152215
}

lib/checkassert.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ void CheckAssert::assertWithSideEffects()
7878
f->containerYield == Library::Container::Yield::END_ITERATOR ||
7979
f->containerYield == Library::Container::Yield::ITERATOR)
8080
continue;
81-
sideEffectInAssertError(tmp, mSettings->library.getFunctionName(tmp));
81+
sideEffectInAssertError(tmp, tmp->funcname(mSettings->library));
8282
}
8383
continue;
8484
}

lib/checkfunctions.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -655,7 +655,7 @@ void CheckFunctions::checkLibraryMatchFunctions()
655655
if (!mSettings->library.isNotLibraryFunction(tok))
656656
continue;
657657

658-
const std::string &functionName = mSettings->library.getFunctionName(tok);
658+
const std::string &functionName = tok->funcname(mSettings->library);
659659
if (functionName.empty())
660660
continue;
661661

lib/checkleakautovar.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ void CheckLeakAutoVar::configurationInfo(const Token* tok, const std::pair<const
142142
{
143143
if (mSettings->checkLibrary && functionUsage.second == VarInfo::USED &&
144144
(!functionUsage.first || !functionUsage.first->function() || !functionUsage.first->function()->hasBody())) {
145-
std::string funcStr = functionUsage.first ? mSettings->library.getFunctionName(functionUsage.first) : "f";
145+
std::string funcStr = functionUsage.first ? functionUsage.first->funcname(mSettings->library) : "f";
146146
if (funcStr.empty())
147147
funcStr = "unknown::" + functionUsage.first->str();
148148
reportError(tok,
@@ -748,7 +748,7 @@ bool CheckLeakAutoVar::checkScope(const Token * const startToken,
748748
if (ftok->function() && !ftok->function()->isAttributeNoreturn() &&
749749
!(ftok->function()->functionScope && mTokenizer->isScopeNoReturn(ftok->function()->functionScope->bodyEnd))) // check function scope
750750
continue;
751-
const std::string functionName(mSettings->library.getFunctionName(ftok));
751+
const std::string& functionName(ftok->funcname(mSettings->library));
752752
if (!mSettings->library.isLeakIgnore(functionName) && !mSettings->library.isUse(functionName)) {
753753
const VarInfo::Usage usage = Token::simpleMatch(openingPar, "( )") ? VarInfo::NORET : VarInfo::USED; // TODO: check parameters passed to function
754754
varInfo.possibleUsageAll({ ftok, usage });
@@ -989,7 +989,7 @@ void CheckLeakAutoVar::changeAllocStatus(VarInfo &varInfo, const VarInfo::AllocI
989989
void CheckLeakAutoVar::functionCall(const Token *tokName, const Token *tokOpeningPar, VarInfo &varInfo, const VarInfo::AllocInfo& allocation, const Library::AllocFunc* af)
990990
{
991991
// Ignore function call?
992-
const bool isLeakIgnore = mSettings->library.isLeakIgnore(mSettings->library.getFunctionName(tokName));
992+
const bool isLeakIgnore = mSettings->library.isLeakIgnore(tokName->funcname(mSettings->library));
993993
if (mSettings->library.getReallocFuncInfo(tokName))
994994
return;
995995
if (tokName->next()->valueType() && tokName->next()->valueType()->container && tokName->next()->valueType()->container->stdStringLike)

lib/library.cpp

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1183,7 +1183,7 @@ bool Library::isnullargbad(const Token *ftok, int argnr) const
11831183
const ArgumentChecks *arg = getarg(ftok, argnr);
11841184
if (!arg) {
11851185
// scan format string argument should not be null
1186-
const std::string funcname = getFunctionName(ftok);
1186+
const std::string& funcname = ftok->funcname(*this);
11871187
const auto it = utils::as_const(mData->mFunctions).find(funcname);
11881188
if (it != mData->mFunctions.cend() && it->second.formatstr && it->second.formatstr_scan)
11891189
return true;
@@ -1196,7 +1196,7 @@ bool Library::isuninitargbad(const Token *ftok, int argnr, int indirect, bool *h
11961196
const ArgumentChecks *arg = getarg(ftok, argnr);
11971197
if (!arg) {
11981198
// non-scan format string argument should not be uninitialized
1199-
const std::string funcname = getFunctionName(ftok);
1199+
const std::string& funcname = ftok->funcname(*this);
12001200
const auto it = utils::as_const(mData->mFunctions).find(funcname);
12011201
if (it != mData->mFunctions.cend() && it->second.formatstr && !it->second.formatstr_scan)
12021202
return true;
@@ -1214,7 +1214,7 @@ const Library::AllocFunc* Library::getAllocFuncInfo(const Token *tok) const
12141214
tok = tok->astOperand2() ? tok->astOperand2() : tok->astOperand1();
12151215
if (!tok)
12161216
return nullptr;
1217-
const std::string funcname = getFunctionName(tok);
1217+
const std::string& funcname = tok->funcname(*this);
12181218
return isNotLibraryFunction(tok) && mData->mFunctions.find(funcname) != mData->mFunctions.end() ? nullptr : getAllocDealloc(mData->mAlloc, funcname);
12191219
}
12201220

@@ -1225,7 +1225,7 @@ const Library::AllocFunc* Library::getDeallocFuncInfo(const Token *tok) const
12251225
tok = tok->astOperand2() ? tok->astOperand2() : tok->astOperand1();
12261226
if (!tok)
12271227
return nullptr;
1228-
const std::string funcname = getFunctionName(tok);
1228+
const std::string& funcname = tok->funcname(*this);
12291229
return isNotLibraryFunction(tok) && mData->mFunctions.find(funcname) != mData->mFunctions.end() ? nullptr : getAllocDealloc(mData->mDealloc, funcname);
12301230
}
12311231

@@ -1236,7 +1236,7 @@ const Library::AllocFunc* Library::getReallocFuncInfo(const Token *tok) const
12361236
tok = tok->astOperand2() ? tok->astOperand2() : tok->astOperand1();
12371237
if (!tok)
12381238
return nullptr;
1239-
const std::string funcname = getFunctionName(tok);
1239+
const std::string& funcname = tok->funcname(*this);
12401240
return isNotLibraryFunction(tok) && mData->mFunctions.find(funcname) != mData->mFunctions.end() ? nullptr : getAllocDealloc(mData->mRealloc, funcname);
12411241
}
12421242

@@ -1443,7 +1443,7 @@ bool Library::isNotLibraryFunction(const Token *ftok, const Function **func) con
14431443
if (ftok->varId())
14441444
return true;
14451445

1446-
return !matchArguments(ftok, getFunctionName(ftok), func);
1446+
return !matchArguments(ftok, ftok->funcname(*this), func);
14471447
}
14481448

14491449
bool Library::matchArguments(const Token *ftok, const std::string &functionName, const Function **func) const
@@ -1483,7 +1483,7 @@ const Library::WarnInfo* Library::getWarnInfo(const Token* ftok) const
14831483
{
14841484
if (isNotLibraryFunction(ftok))
14851485
return nullptr;
1486-
const auto i = utils::as_const(mData->mFunctionwarn).find(getFunctionName(ftok));
1486+
const auto i = utils::as_const(mData->mFunctionwarn).find(ftok->funcname(*this));
14871487
if (i == mData->mFunctionwarn.cend())
14881488
return nullptr;
14891489
return &i->second;
@@ -1539,15 +1539,15 @@ bool Library::formatstr_function(const Token* ftok) const
15391539
if (isNotLibraryFunction(ftok))
15401540
return false;
15411541

1542-
const auto it = utils::as_const(mData->mFunctions).find(getFunctionName(ftok));
1542+
const auto it = utils::as_const(mData->mFunctions).find(ftok->funcname(*this));
15431543
if (it != mData->mFunctions.cend())
15441544
return it->second.formatstr;
15451545
return false;
15461546
}
15471547

15481548
int Library::formatstr_argno(const Token* ftok) const
15491549
{
1550-
const std::map<int, Library::ArgumentChecks>& argumentChecksFunc = mData->mFunctions.at(getFunctionName(ftok)).argumentChecks;
1550+
const std::map<int, Library::ArgumentChecks>& argumentChecksFunc = mData->mFunctions.at(ftok->funcname(*this)).argumentChecks;
15511551
auto it = std::find_if(argumentChecksFunc.cbegin(), argumentChecksFunc.cend(), [](const std::pair<const int, Library::ArgumentChecks>& a) {
15521552
return a.second.formatstr;
15531553
});
@@ -1556,19 +1556,19 @@ int Library::formatstr_argno(const Token* ftok) const
15561556

15571557
bool Library::formatstr_scan(const Token* ftok) const
15581558
{
1559-
return mData->mFunctions.at(getFunctionName(ftok)).formatstr_scan;
1559+
return mData->mFunctions.at(ftok->funcname(*this)).formatstr_scan;
15601560
}
15611561

15621562
bool Library::formatstr_secure(const Token* ftok) const
15631563
{
1564-
return mData->mFunctions.at(getFunctionName(ftok)).formatstr_secure;
1564+
return mData->mFunctions.at(ftok->funcname(*this)).formatstr_secure;
15651565
}
15661566

15671567
const Library::NonOverlappingData* Library::getNonOverlappingData(const Token *ftok) const
15681568
{
15691569
if (isNotLibraryFunction(ftok))
15701570
return nullptr;
1571-
const auto it = utils::as_const(mData->mNonOverlappingData).find(getFunctionName(ftok));
1571+
const auto it = utils::as_const(mData->mNonOverlappingData).find(ftok->funcname(*this));
15721572
return (it != mData->mNonOverlappingData.cend()) ? &it->second : nullptr;
15731573
}
15741574

@@ -1586,7 +1586,7 @@ Library::UseRetValType Library::getUseRetValType(const Token *ftok) const
15861586
}
15871587
return Library::UseRetValType::NONE;
15881588
}
1589-
const auto it = utils::as_const(mData->mFunctions).find(getFunctionName(ftok));
1589+
const auto it = utils::as_const(mData->mFunctions).find(ftok->funcname(*this));
15901590
if (it != mData->mFunctions.cend())
15911591
return it->second.useretval;
15921592
return Library::UseRetValType::NONE;
@@ -1596,7 +1596,7 @@ const std::string& Library::returnValue(const Token *ftok) const
15961596
{
15971597
if (isNotLibraryFunction(ftok))
15981598
return mEmptyString;
1599-
const auto it = utils::as_const(mData->mReturnValue).find(getFunctionName(ftok));
1599+
const auto it = utils::as_const(mData->mReturnValue).find(ftok->funcname(*this));
16001600
return it != mData->mReturnValue.cend() ? it->second : mEmptyString;
16011601
}
16021602

@@ -1614,31 +1614,31 @@ const std::string& Library::returnValueType(const Token *ftok) const
16141614
}
16151615
return mEmptyString;
16161616
}
1617-
const auto it = utils::as_const(mData->mReturnValueType).find(getFunctionName(ftok));
1617+
const auto it = utils::as_const(mData->mReturnValueType).find(ftok->funcname(*this));
16181618
return it != mData->mReturnValueType.cend() ? it->second : mEmptyString;
16191619
}
16201620

16211621
int Library::returnValueContainer(const Token *ftok) const
16221622
{
16231623
if (isNotLibraryFunction(ftok))
16241624
return -1;
1625-
const auto it = utils::as_const(mData->mReturnValueContainer).find(getFunctionName(ftok));
1625+
const auto it = utils::as_const(mData->mReturnValueContainer).find(ftok->funcname(*this));
16261626
return it != mData->mReturnValueContainer.cend() ? it->second : -1;
16271627
}
16281628

16291629
std::vector<MathLib::bigint> Library::unknownReturnValues(const Token *ftok) const
16301630
{
16311631
if (isNotLibraryFunction(ftok))
16321632
return std::vector<MathLib::bigint>();
1633-
const auto it = utils::as_const(mData->mUnknownReturnValues).find(getFunctionName(ftok));
1633+
const auto it = utils::as_const(mData->mUnknownReturnValues).find(ftok->funcname(*this));
16341634
return (it == mData->mUnknownReturnValues.cend()) ? std::vector<MathLib::bigint>() : it->second;
16351635
}
16361636

16371637
const Library::Function *Library::getFunction(const Token *ftok) const
16381638
{
16391639
if (isNotLibraryFunction(ftok))
16401640
return nullptr;
1641-
const auto it1 = utils::as_const(mData->mFunctions).find(getFunctionName(ftok));
1641+
const auto it1 = utils::as_const(mData->mFunctions).find(ftok->funcname(*this));
16421642
if (it1 == mData->mFunctions.cend())
16431643
return nullptr;
16441644
return &it1->second;
@@ -1649,7 +1649,7 @@ bool Library::hasminsize(const Token *ftok) const
16491649
{
16501650
if (isNotLibraryFunction(ftok))
16511651
return false;
1652-
const auto it = utils::as_const(mData->mFunctions).find(getFunctionName(ftok));
1652+
const auto it = utils::as_const(mData->mFunctions).find(ftok->funcname(*this));
16531653
if (it == mData->mFunctions.cend())
16541654
return false;
16551655
return std::any_of(it->second.argumentChecks.cbegin(), it->second.argumentChecks.cend(), [](const std::pair<const int, Library::ArgumentChecks>& a) {
@@ -1721,7 +1721,7 @@ bool Library::isFunctionConst(const Token *ftok) const
17211721
}
17221722
return false;
17231723
}
1724-
const auto it = utils::as_const(mData->mFunctions).find(getFunctionName(ftok));
1724+
const auto it = utils::as_const(mData->mFunctions).find(ftok->funcname(*this));
17251725
return (it != mData->mFunctions.cend() && it->second.isconst);
17261726
}
17271727

@@ -1740,7 +1740,7 @@ bool Library::isnoreturn(const Token *ftok) const
17401740
}
17411741
return false;
17421742
}
1743-
const auto it = utils::as_const(mData->mNoReturn).find(getFunctionName(ftok));
1743+
const auto it = utils::as_const(mData->mNoReturn).find(ftok->funcname(*this));
17441744
if (it == mData->mNoReturn.end())
17451745
return false;
17461746
if (it->second == LibraryData::FalseTrueMaybe::Maybe)
@@ -1753,8 +1753,8 @@ bool Library::isnotnoreturn(const Token *ftok) const
17531753
if (ftok->function() && ftok->function()->isAttributeNoreturn())
17541754
return false;
17551755
if (isNotLibraryFunction(ftok))
1756-
return hasAnyTypeCheck(getFunctionName(ftok));
1757-
const auto it = utils::as_const(mData->mNoReturn).find(getFunctionName(ftok));
1756+
return hasAnyTypeCheck(ftok->funcname(*this));
1757+
const auto it = utils::as_const(mData->mNoReturn).find(ftok->funcname(*this));
17581758
if (it == mData->mNoReturn.end())
17591759
return false;
17601760
if (it->second == LibraryData::FalseTrueMaybe::Maybe)

lib/token.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2721,3 +2721,9 @@ Token* findLambdaEndScope(Token* tok)
27212721
const Token* findLambdaEndScope(const Token* tok) {
27222722
return findLambdaEndScope(const_cast<Token*>(tok));
27232723
}
2724+
2725+
const std::string& Token::funcname(const Library& library) const {
2726+
if (!mImpl->mFuncName)
2727+
mImpl->mFuncName = new std::string(library.getFunctionName(this));
2728+
return *mImpl->mFuncName;
2729+
}

lib/token.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ class ConstTokenRange;
5353
class Token;
5454
struct TokensFrontBack;
5555
class TokenList;
56+
class Library;
5657

5758
struct ScopeInfo2 {
5859
ScopeInfo2(std::string name_, const Token *bodyEnd_, std::set<std::string> usingNamespaces_ = std::set<std::string>()) : name(std::move(name_)), bodyEnd(bodyEnd_), usingNamespaces(std::move(usingNamespaces_)) {}
@@ -104,6 +105,8 @@ struct TokenImpl {
104105
// If this token came from a macro replacement list, this is the name of that macro
105106
std::string* mMacroName{};
106107

108+
std::string* mFuncName{};
109+
107110
// ValueType
108111
ValueType* mValueType{};
109112

@@ -1589,6 +1592,8 @@ class CPPCHECKLIB Token {
15891592
{
15901593
return mIsC;
15911594
}
1595+
1596+
const std::string& funcname(const Library& library) const;
15921597
};
15931598

15941599
Token* findTypeEnd(Token* tok);

0 commit comments

Comments
 (0)