Skip to content

Commit 06f6f1c

Browse files
authored
fixed missing parameter to astContainer*() calls (#7403)
1 parent b1f30ac commit 06f6f1c

10 files changed

+32
-32
lines changed

lib/astutils.cpp

+7-7
Original file line numberDiff line numberDiff line change
@@ -289,10 +289,10 @@ bool astIsContainerString(const Token* tok)
289289
return container->stdStringLike;
290290
}
291291

292-
static std::pair<const Token*, const Library::Container*> getContainerFunction(const Token* tok, const Settings* settings)
292+
static std::pair<const Token*, const Library::Container*> getContainerFunction(const Token* tok, const Library& library)
293293
{
294294
const Library::Container* cont{};
295-
if (!tok || !tok->valueType() || (!tok->valueType()->container && (!settings || !(cont = settings->library.detectContainerOrIterator(tok->valueType()->smartPointerTypeToken)))))
295+
if (!tok || !tok->valueType() || (!tok->valueType()->container && (!(cont = library.detectContainerOrIterator(tok->valueType()->smartPointerTypeToken)))))
296296
return {};
297297
const Token* parent = tok->astParent();
298298
if (Token::Match(parent, ". %name% (") && astIsLHS(tok)) {
@@ -301,19 +301,19 @@ static std::pair<const Token*, const Library::Container*> getContainerFunction(c
301301
return {};
302302
}
303303

304-
Library::Container::Action astContainerAction(const Token* tok, const Token** ftok, const Settings* settings)
304+
Library::Container::Action astContainerAction(const Token* tok, const Library& library, const Token** ftok)
305305
{
306-
const auto ftokCont = getContainerFunction(tok, settings);
306+
const auto ftokCont = getContainerFunction(tok, library);
307307
if (ftok)
308308
*ftok = ftokCont.first;
309309
if (!ftokCont.first)
310310
return Library::Container::Action::NO_ACTION;
311311
return ftokCont.second->getAction(ftokCont.first->str());
312312
}
313313

314-
Library::Container::Yield astContainerYield(const Token* tok, const Token** ftok, const Settings* settings)
314+
Library::Container::Yield astContainerYield(const Token* tok, const Library& library, const Token** ftok)
315315
{
316-
const auto ftokCont = getContainerFunction(tok, settings);
316+
const auto ftokCont = getContainerFunction(tok, library);
317317
if (ftok)
318318
*ftok = ftokCont.first;
319319
if (!ftokCont.first)
@@ -2895,7 +2895,7 @@ static bool isExpressionChangedAt(const F& getExprTok,
28952895
(!(tok->function() && (tok->function()->isAttributePure() || tok->function()->isAttributeConst())))) {
28962896
if (!Token::simpleMatch(tok->astParent(), "."))
28972897
return true;
2898-
const auto yield = astContainerYield(tok->astParent()->astOperand1());
2898+
const auto yield = astContainerYield(tok->astParent()->astOperand1(), settings.library);
28992899
if (yield != Library::Container::Yield::SIZE && yield != Library::Container::Yield::EMPTY &&
29002900
yield != Library::Container::Yield::BUFFER && yield != Library::Container::Yield::BUFFER_NT)
29012901
// TODO: Is global variable really changed by function call?

lib/astutils.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -164,8 +164,8 @@ bool astIsContainerView(const Token* tok);
164164
bool astIsContainerOwned(const Token* tok);
165165
bool astIsContainerString(const Token* tok);
166166

167-
Library::Container::Action astContainerAction(const Token* tok, const Token** ftok = nullptr, const Settings* settings = nullptr);
168-
Library::Container::Yield astContainerYield(const Token* tok, const Token** ftok = nullptr, const Settings* settings = nullptr);
167+
Library::Container::Action astContainerAction(const Token* tok, const Library& library, const Token** ftok = nullptr);
168+
Library::Container::Yield astContainerYield(const Token* tok, const Library& library, const Token** ftok = nullptr);
169169

170170
Library::Container::Yield astFunctionYield(const Token* tok, const Settings& settings, const Token** ftok = nullptr);
171171

lib/checkautovariables.cpp

+9-9
Original file line numberDiff line numberDiff line change
@@ -143,14 +143,14 @@ static bool isAutoVarArray(const Token *tok)
143143
return false;
144144
}
145145

146-
static bool isLocalContainerBuffer(const Token* tok)
146+
static bool isLocalContainerBuffer(const Token* tok, const Settings& settings)
147147
{
148148
if (!tok)
149149
return false;
150150

151151
// x+y
152152
if (tok->str() == "+")
153-
return isLocalContainerBuffer(tok->astOperand1()) || isLocalContainerBuffer(tok->astOperand2());
153+
return isLocalContainerBuffer(tok->astOperand1(), settings) || isLocalContainerBuffer(tok->astOperand2(), settings);
154154

155155
if (tok->str() != "(" || !Token::simpleMatch(tok->astOperand1(), "."))
156156
return false;
@@ -161,7 +161,7 @@ static bool isLocalContainerBuffer(const Token* tok)
161161
if (!var || !var->isLocal() || var->isStatic())
162162
return false;
163163

164-
const Library::Container::Yield yield = astContainerYield(tok);
164+
const Library::Container::Yield yield = astContainerYield(tok, settings.library);
165165

166166
return yield == Library::Container::Yield::BUFFER || yield == Library::Container::Yield::BUFFER_NT;
167167
}
@@ -237,8 +237,8 @@ void CheckAutoVariables::assignFunctionArg()
237237
}
238238
}
239239

240-
static bool isAutoVariableRHS(const Token* tok) {
241-
return isAddressOfLocalVariable(tok) || isAutoVarArray(tok) || isLocalContainerBuffer(tok);
240+
static bool isAutoVariableRHS(const Token* tok, const Settings& settings) {
241+
return isAddressOfLocalVariable(tok) || isAutoVarArray(tok) || isLocalContainerBuffer(tok, settings);
242242
}
243243

244244
static bool hasOverloadedAssignment(const Token* tok, bool& inconclusive)
@@ -275,23 +275,23 @@ void CheckAutoVariables::autoVariables()
275275
continue;
276276
}
277277
// Critical assignment
278-
if (Token::Match(tok, "[;{}] %var% =") && isRefPtrArg(tok->next()) && isAutoVariableRHS(tok->tokAt(2)->astOperand2())) {
278+
if (Token::Match(tok, "[;{}] %var% =") && isRefPtrArg(tok->next()) && isAutoVariableRHS(tok->tokAt(2)->astOperand2(), *mSettings)) {
279279
checkAutoVariableAssignment(tok->next(), false);
280-
} else if (Token::Match(tok, "[;{}] * %var% =") && isPtrArg(tok->tokAt(2)) && isAutoVariableRHS(tok->tokAt(3)->astOperand2())) {
280+
} else if (Token::Match(tok, "[;{}] * %var% =") && isPtrArg(tok->tokAt(2)) && isAutoVariableRHS(tok->tokAt(3)->astOperand2(), *mSettings)) {
281281
const Token* lhs = tok->tokAt(2);
282282
bool inconclusive = false;
283283
if (!hasOverloadedAssignment(lhs, inconclusive) || (printInconclusive && inconclusive))
284284
checkAutoVariableAssignment(tok->next(), inconclusive);
285285
tok = tok->tokAt(4);
286-
} else if (Token::Match(tok, "[;{}] %var% . %var% =") && isPtrArg(tok->next()) && isAutoVariableRHS(tok->tokAt(4)->astOperand2())) {
286+
} else if (Token::Match(tok, "[;{}] %var% . %var% =") && isPtrArg(tok->next()) && isAutoVariableRHS(tok->tokAt(4)->astOperand2(), *mSettings)) {
287287
const Token* lhs = tok->tokAt(3);
288288
bool inconclusive = false;
289289
if (!hasOverloadedAssignment(lhs, inconclusive) || (printInconclusive && inconclusive))
290290
checkAutoVariableAssignment(tok->next(), inconclusive);
291291
tok = tok->tokAt(5);
292292
} else if (Token::Match(tok, "[;{}] %var% [") && Token::simpleMatch(tok->linkAt(2), "] =") &&
293293
(isPtrArg(tok->next()) || isArrayArg(tok->next(), *mSettings)) &&
294-
isAutoVariableRHS(tok->linkAt(2)->next()->astOperand2())) {
294+
isAutoVariableRHS(tok->linkAt(2)->next()->astOperand2(), *mSettings)) {
295295
errorAutoVariableAssignment(tok->next(), false);
296296
}
297297
// Invalid pointer deallocation

lib/checkfunctions.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -646,9 +646,9 @@ void CheckFunctions::checkLibraryMatchFunctions()
646646

647647
if (Token::simpleMatch(tok->astParent(), ".")) {
648648
const Token* contTok = tok->astParent()->astOperand1();
649-
if (astContainerAction(contTok, nullptr, mSettings) != Library::Container::Action::NO_ACTION)
649+
if (astContainerAction(contTok, mSettings->library) != Library::Container::Action::NO_ACTION)
650650
continue;
651-
if (astContainerYield(contTok, nullptr, mSettings) != Library::Container::Yield::NO_YIELD)
651+
if (astContainerYield(contTok, mSettings->library) != Library::Container::Yield::NO_YIELD)
652652
continue;
653653
}
654654

lib/checkother.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -1311,7 +1311,7 @@ bool CheckOther::checkInnerScope(const Token *tok, const Variable* var, bool& us
13111311
}
13121312
}
13131313
}
1314-
const auto yield = astContainerYield(tok);
1314+
const auto yield = astContainerYield(tok, mSettings->library);
13151315
if (yield == Library::Container::Yield::BUFFER || yield == Library::Container::Yield::BUFFER_NT)
13161316
return false;
13171317
}

lib/checkstl.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -713,7 +713,7 @@ static bool isSameIteratorContainerExpression(const Token* tok1,
713713
if (isSameExpression(false, tok1, tok2, settings, false, false)) {
714714
return !astIsContainerOwned(tok1) || !isTemporary(tok1, &settings.library);
715715
}
716-
if (astContainerYield(tok2) == Library::Container::Yield::ITEM)
716+
if (astContainerYield(tok2, settings.library) == Library::Container::Yield::ITEM)
717717
return true;
718718
if (kind == ValueFlow::Value::LifetimeKind::Address || kind == ValueFlow::Value::LifetimeKind::Iterator) {
719719
const auto address1 = getAddressContainer(tok1);

lib/checkuninitvar.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -1660,7 +1660,7 @@ void CheckUninitVar::valueFlowUninit()
16601660
if (isarray && tok->variable()->isMember())
16611661
continue; // Todo: this is a bailout
16621662
if (isarray && tok->variable()->isStlType() && Token::simpleMatch(tok->astParent(), ".")) {
1663-
const auto yield = astContainerYield(tok);
1663+
const auto yield = astContainerYield(tok, mSettings->library);
16641664
if (yield != Library::Container::Yield::AT_INDEX && yield != Library::Container::Yield::ITEM)
16651665
continue;
16661666
}

lib/library.cpp

+5-5
Original file line numberDiff line numberDiff line change
@@ -1576,10 +1576,10 @@ Library::UseRetValType Library::getUseRetValType(const Token *ftok) const
15761576
if (Token::simpleMatch(ftok->astParent(), ".")) {
15771577
const Token* contTok = ftok->astParent()->astOperand1();
15781578
using Yield = Library::Container::Yield;
1579-
const Yield yield = astContainerYield(contTok);
1579+
const Yield yield = astContainerYield(contTok, *this);
15801580
if (yield == Yield::START_ITERATOR || yield == Yield::END_ITERATOR || yield == Yield::AT_INDEX ||
15811581
yield == Yield::SIZE || yield == Yield::EMPTY || yield == Yield::BUFFER || yield == Yield::BUFFER_NT ||
1582-
((yield == Yield::ITEM || yield == Yield::ITERATOR) && astContainerAction(contTok) == Library::Container::Action::NO_ACTION))
1582+
((yield == Yield::ITEM || yield == Yield::ITERATOR) && astContainerAction(contTok, *this) == Library::Container::Action::NO_ACTION))
15831583
return Library::UseRetValType::DEFAULT;
15841584
}
15851585
return Library::UseRetValType::NONE;
@@ -1713,7 +1713,7 @@ bool Library::isFunctionConst(const Token *ftok) const
17131713
if (isNotLibraryFunction(ftok)) {
17141714
if (Token::simpleMatch(ftok->astParent(), ".")) {
17151715
using Yield = Library::Container::Yield;
1716-
const Yield yield = astContainerYield(ftok->astParent()->astOperand1());
1716+
const Yield yield = astContainerYield(ftok->astParent()->astOperand1(), *this);
17171717
if (yield == Yield::EMPTY || yield == Yield::SIZE || yield == Yield::BUFFER_NT)
17181718
return true;
17191719
}
@@ -1732,8 +1732,8 @@ bool Library::isnoreturn(const Token *ftok) const
17321732
if (isNotLibraryFunction(ftok)) {
17331733
if (Token::simpleMatch(ftok->astParent(), ".")) {
17341734
const Token* contTok = ftok->astParent()->astOperand1();
1735-
if (astContainerAction(contTok) != Library::Container::Action::NO_ACTION ||
1736-
astContainerYield(contTok) != Library::Container::Yield::NO_YIELD)
1735+
if (astContainerAction(contTok, *this) != Library::Container::Action::NO_ACTION ||
1736+
astContainerYield(contTok, *this) != Library::Container::Yield::NO_YIELD)
17371737
return false;
17381738
}
17391739
return false;

lib/valueflow.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -6288,7 +6288,7 @@ bool ValueFlow::isContainerSizeChanged(const Token* tok, int indirect, const Set
62886288
return true;
62896289
if (astIsLHS(tok) && Token::simpleMatch(tok->astParent(), "["))
62906290
return tok->valueType()->container->stdAssociativeLike;
6291-
const Library::Container::Action action = astContainerAction(tok);
6291+
const Library::Container::Action action = astContainerAction(tok, settings.library);
62926292
switch (action) {
62936293
case Library::Container::Action::RESIZE:
62946294
case Library::Container::Action::CLEAR:
@@ -6302,7 +6302,7 @@ bool ValueFlow::isContainerSizeChanged(const Token* tok, int indirect, const Set
63026302
case Library::Container::Action::NO_ACTION:
63036303
// Is this an unknown member function call?
63046304
if (astIsLHS(tok) && Token::Match(tok->astParent(), ". %name% (")) {
6305-
const Library::Container::Yield yield = astContainerYield(tok);
6305+
const Library::Container::Yield yield = astContainerYield(tok, settings.library);
63066306
return yield == Library::Container::Yield::NO_YIELD;
63076307
}
63086308
break;
@@ -6408,7 +6408,7 @@ static void valueFlowSmartPointer(TokenList &tokenlist, ErrorLogger & errorLogge
64086408

64096409
static Library::Container::Yield findIteratorYield(Token* tok, const Token*& ftok, const Settings& settings)
64106410
{
6411-
auto yield = astContainerYield(tok, &ftok);
6411+
auto yield = astContainerYield(tok, settings.library, &ftok);
64126412
if (ftok)
64136413
return yield;
64146414

lib/vf_analyzers.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ struct ValueFlowAnalyzer : Analyzer {
203203
Library::Container::Action::INSERT,
204204
Library::Container::Action::APPEND,
205205
Library::Container::Action::CHANGE_INTERNAL},
206-
astContainerAction(tok)))
206+
astContainerAction(tok, getSettings().library)))
207207
return read;
208208
}
209209
bool inconclusive = false;

0 commit comments

Comments
 (0)