Skip to content

Commit 2cca2d5

Browse files
committed
pass Library instead of Settings
1 parent 161dcc1 commit 2cca2d5

22 files changed

Lines changed: 100 additions & 97 deletions

lib/astutils.cpp

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2334,14 +2334,14 @@ bool isWithinScope(const Token* tok, const Variable* var, ScopeType type)
23342334
return false;
23352335
}
23362336

2337-
bool isVariableChangedByFunctionCall(const Token *tok, int indirect, nonneg int varid, const Settings &settings, bool *inconclusive)
2337+
bool isVariableChangedByFunctionCall(const Token *tok, int indirect, nonneg int varid, const Library &library, bool *inconclusive)
23382338
{
23392339
if (!tok)
23402340
return false;
23412341
if (tok->varId() == varid)
2342-
return isVariableChangedByFunctionCall(tok, indirect, settings, inconclusive);
2343-
return isVariableChangedByFunctionCall(tok->astOperand1(), indirect, varid, settings, inconclusive) ||
2344-
isVariableChangedByFunctionCall(tok->astOperand2(), indirect, varid, settings, inconclusive);
2342+
return isVariableChangedByFunctionCall(tok, indirect, library, inconclusive);
2343+
return isVariableChangedByFunctionCall(tok->astOperand1(), indirect, varid, library, inconclusive) ||
2344+
isVariableChangedByFunctionCall(tok->astOperand2(), indirect, varid, library, inconclusive);
23452345
}
23462346

23472347
bool isScopeBracket(const Token* tok)
@@ -2522,7 +2522,7 @@ bool isMutableExpression(const Token* tok)
25222522
return true;
25232523
}
25242524

2525-
bool isVariableChangedByFunctionCall(const Token *tok, int indirect, const Settings &settings, bool *inconclusive)
2525+
bool isVariableChangedByFunctionCall(const Token *tok, int indirect, const Library &library, bool *inconclusive)
25262526
{
25272527
if (!tok)
25282528
return false;
@@ -2562,13 +2562,13 @@ bool isVariableChangedByFunctionCall(const Token *tok, int indirect, const Setti
25622562

25632563
if (!tok->function() && !tok->variable() && tok->isName()) {
25642564
// Check if direction (in, out, inout) is specified in the library configuration and use that
2565-
const Library::ArgumentChecks::Direction argDirection = settings.library.getArgDirection(tok, 1 + argnr, indirect);
2565+
const Library::ArgumentChecks::Direction argDirection = library.getArgDirection(tok, 1 + argnr, indirect);
25662566
if (argDirection == Library::ArgumentChecks::Direction::DIR_IN)
25672567
return false;
25682568
if (argDirection == Library::ArgumentChecks::Direction::DIR_OUT || argDirection == Library::ArgumentChecks::Direction::DIR_INOUT)
25692569
return true;
25702570

2571-
const bool requireNonNull = settings.library.isnullargbad(tok, 1 + argnr);
2571+
const bool requireNonNull = library.isnullargbad(tok, 1 + argnr);
25722572
if (Token::simpleMatch(tok->tokAt(-2), "std :: tie"))
25732573
return true;
25742574
// if the library says 0 is invalid
@@ -2796,7 +2796,7 @@ bool isVariableChanged(const Token *tok, int indirect, const Settings &settings,
27962796
if (indirect == 0 && astIsLHS(tok2) && Token::Match(ptok, ". %var%") && astIsPointer(ptok->next()))
27972797
pindirect = 1;
27982798
bool inconclusive = false;
2799-
bool isChanged = isVariableChangedByFunctionCall(ptok, pindirect, settings, &inconclusive);
2799+
bool isChanged = isVariableChangedByFunctionCall(ptok, pindirect, settings.library, &inconclusive);
28002800
isChanged |= inconclusive;
28012801
if (isChanged)
28022802
return true;
@@ -3421,7 +3421,7 @@ bool isConstVarExpression(const Token *tok, const std::function<bool(const Token
34213421
return false;
34223422
}
34233423

3424-
static ExprUsage getFunctionUsage(const Token* tok, int indirect, const Settings& settings)
3424+
static ExprUsage getFunctionUsage(const Token* tok, int indirect, const Library& library)
34253425
{
34263426
const bool addressOf = tok->astParent() && tok->astParent()->isUnaryOp("&");
34273427

@@ -3483,14 +3483,14 @@ static ExprUsage getFunctionUsage(const Token* tok, int indirect, const Settings
34833483
} else if (ftok->str() == "{") {
34843484
return indirect == 0 ? ExprUsage::Used : ExprUsage::Inconclusive;
34853485
} else {
3486-
const bool isnullbad = settings.library.isnullargbad(ftok, argnr + 1);
3486+
const bool isnullbad = library.isnullargbad(ftok, argnr + 1);
34873487
if (indirect == 0 && astIsPointer(tok) && !addressOf && isnullbad)
34883488
return ExprUsage::Used;
34893489
bool hasIndirect = false;
3490-
const bool isuninitbad = settings.library.isuninitargbad(ftok, argnr + 1, indirect, &hasIndirect);
3490+
const bool isuninitbad = library.isuninitargbad(ftok, argnr + 1, indirect, &hasIndirect);
34913491
if (isuninitbad && (!addressOf || isnullbad))
34923492
return ExprUsage::Used;
3493-
const Library::ArgumentChecks::Direction argDirection = settings.library.getArgDirection(ftok, argnr + 1, indirect);
3493+
const Library::ArgumentChecks::Direction argDirection = library.getArgDirection(ftok, argnr + 1, indirect);
34943494
if (argDirection == Library::ArgumentChecks::Direction::DIR_IN) // TODO: DIR_INOUT?
34953495
return ExprUsage::Used;
34963496
if (argDirection == Library::ArgumentChecks::Direction::DIR_OUT)
@@ -3560,7 +3560,7 @@ ExprUsage getExprUsage(const Token* tok, int indirect, const Settings& settings)
35603560
(astIsLHS(tok) || Token::simpleMatch(parent, "( )")))
35613561
return ExprUsage::Used;
35623562
}
3563-
return getFunctionUsage(tok, indirect, settings);
3563+
return getFunctionUsage(tok, indirect, settings.library);
35643564
}
35653565

35663566
static void getLHSVariablesRecursive(std::vector<const Variable*>& vars, const Token* tok)

lib/astutils.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -327,20 +327,20 @@ bool isMutableExpression(const Token* tok);
327327
*
328328
* @param tok ast tree
329329
* @param varid Variable Id
330-
* @param settings program settings
330+
* @param library library configurations
331331
* @param inconclusive pointer to output variable which indicates that the answer of the question is inconclusive
332332
*/
333-
bool isVariableChangedByFunctionCall(const Token *tok, int indirect, nonneg int varid, const Settings &settings, bool *inconclusive);
333+
bool isVariableChangedByFunctionCall(const Token *tok, int indirect, nonneg int varid, const Library &library, bool *inconclusive);
334334

335335
/** Is variable changed by function call?
336336
* In case the answer of the question is inconclusive, e.g. because the function declaration is not known
337337
* the return value is false and the output parameter inconclusive is set to true
338338
*
339-
* @param tok token of variable in function call
340-
* @param settings program settings
339+
* @param tok token of variable in function call
340+
* @param library library configurations
341341
* @param inconclusive pointer to output variable which indicates that the answer of the question is inconclusive
342342
*/
343-
CPPCHECKLIB bool isVariableChangedByFunctionCall(const Token *tok, int indirect, const Settings &settings, bool *inconclusive);
343+
CPPCHECKLIB bool isVariableChangedByFunctionCall(const Token *tok, int indirect, const Library &library, bool *inconclusive);
344344

345345
/** Is variable changed in block of code? */
346346
CPPCHECKLIB bool isVariableChanged(const Token *start, const Token *end, nonneg int exprid, bool globalvar, const Settings &settings, int depth = 20);

lib/checkautovariables.cpp

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -139,14 +139,14 @@ static bool isAutoVarArray(const Token *tok)
139139
return false;
140140
}
141141

142-
static bool isLocalContainerBuffer(const Token* tok, const Settings& settings)
142+
static bool isLocalContainerBuffer(const Token* tok, const Library& library)
143143
{
144144
if (!tok)
145145
return false;
146146

147147
// x+y
148148
if (tok->str() == "+")
149-
return isLocalContainerBuffer(tok->astOperand1(), settings) || isLocalContainerBuffer(tok->astOperand2(), settings);
149+
return isLocalContainerBuffer(tok->astOperand1(), library) || isLocalContainerBuffer(tok->astOperand2(), library);
150150

151151
if (tok->str() != "(" || !Token::simpleMatch(tok->astOperand1(), "."))
152152
return false;
@@ -157,7 +157,7 @@ static bool isLocalContainerBuffer(const Token* tok, const Settings& settings)
157157
if (!var || !var->isLocal() || var->isStatic())
158158
return false;
159159

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

162162
return yield == Library::Container::Yield::BUFFER || yield == Library::Container::Yield::BUFFER_NT;
163163
}
@@ -233,8 +233,8 @@ void CheckAutoVariablesImpl::assignFunctionArg()
233233
}
234234
}
235235

236-
static bool isAutoVariableRHS(const Token* tok, const Settings& settings) {
237-
return isAddressOfLocalVariable(tok) || isAutoVarArray(tok) || isLocalContainerBuffer(tok, settings);
236+
static bool isAutoVariableRHS(const Token* tok, const Library& library) {
237+
return isAddressOfLocalVariable(tok) || isAutoVarArray(tok) || isLocalContainerBuffer(tok, library);
238238
}
239239

240240
static bool hasOverloadedAssignment(const Token* tok, bool& inconclusive)
@@ -257,7 +257,7 @@ static bool hasOverloadedAssignment(const Token* tok, bool& inconclusive)
257257
return true;
258258
}
259259

260-
static bool isMemberAssignment(const Token* tok, const Token*& rhs, const Settings& settings)
260+
static bool isMemberAssignment(const Token* tok, const Token*& rhs, const Library& library)
261261
{
262262
const Token *endBracket = nullptr;
263263
if (!Token::Match(tok, "[;{}] %var% . %var%")) {
@@ -274,7 +274,7 @@ static bool isMemberAssignment(const Token* tok, const Token*& rhs, const Settin
274274
assign = assign->astParent();
275275
if (!Token::simpleMatch(assign, "="))
276276
return false;
277-
if (!isAutoVariableRHS(assign->astOperand2(), settings))
277+
if (!isAutoVariableRHS(assign->astOperand2(), library))
278278
return false;
279279
rhs = assign->astOperand2();
280280
return true;
@@ -295,23 +295,23 @@ void CheckAutoVariablesImpl::autoVariables()
295295
}
296296
// Critical assignment
297297
const Token* rhs{};
298-
if (Token::Match(tok, "[;{}] %var% =") && isRefPtrArg(tok->next()) && isAutoVariableRHS(tok->tokAt(2)->astOperand2(), mSettings)) {
298+
if (Token::Match(tok, "[;{}] %var% =") && isRefPtrArg(tok->next()) && isAutoVariableRHS(tok->tokAt(2)->astOperand2(), mSettings.library)) {
299299
checkAutoVariableAssignment(tok->next(), false);
300-
} else if (Token::Match(tok, "[;{}] * %var% =") && isPtrArg(tok->tokAt(2)) && isAutoVariableRHS(tok->tokAt(3)->astOperand2(), mSettings)) {
300+
} else if (Token::Match(tok, "[;{}] * %var% =") && isPtrArg(tok->tokAt(2)) && isAutoVariableRHS(tok->tokAt(3)->astOperand2(), mSettings.library)) {
301301
const Token* lhs = tok->tokAt(2);
302302
bool inconclusive = false;
303303
if (!hasOverloadedAssignment(lhs, inconclusive) || (printInconclusive && inconclusive))
304304
checkAutoVariableAssignment(tok->next(), inconclusive);
305305
tok = tok->tokAt(4);
306-
} else if (isMemberAssignment(tok, rhs, mSettings)) {
306+
} else if (isMemberAssignment(tok, rhs, mSettings.library)) {
307307
const Token* lhs = tok->tokAt(3);
308308
bool inconclusive = false;
309309
if (!hasOverloadedAssignment(lhs, inconclusive) || (printInconclusive && inconclusive))
310310
checkAutoVariableAssignment(tok->next(), inconclusive);
311311
tok = rhs;
312312
} else if (Token::Match(tok, "[;{}] %var% [") && Token::simpleMatch(tok->linkAt(2), "] =") &&
313313
(isPtrArg(tok->next()) || isArrayArg(tok->next(), mSettings)) &&
314-
isAutoVariableRHS(tok->linkAt(2)->next()->astOperand2(), mSettings)) {
314+
isAutoVariableRHS(tok->linkAt(2)->next()->astOperand2(), mSettings.library)) {
315315
errorAutoVariableAssignment(tok->next(), false);
316316
}
317317
// Invalid pointer deallocation

lib/checkbufferoverrun.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ static int getMinFormatStringOutputLength(const std::vector<const Token*> &param
133133
case 's':
134134
parameterLength = 0;
135135
if (inputArgNr < parameters.size())
136-
parameterLength = ValueFlow::valueFlowGetStrLength(parameters[inputArgNr], settings);
136+
parameterLength = ValueFlow::valueFlowGetStrLength(parameters[inputArgNr], settings.library);
137137

138138
handleNextParameter = true;
139139
break;

lib/checkclass.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1059,7 +1059,7 @@ void CheckClassImpl::initializeVarList(const Function &func, std::list<const Fun
10591059
tok2 = tok2->next();
10601060
if (tok2->str() == "&")
10611061
tok2 = tok2->next();
1062-
if (isVariableChangedByFunctionCall(tok2, tok2->strAt(-1) == "&", tok2->varId(), mSettings, nullptr))
1062+
if (isVariableChangedByFunctionCall(tok2, tok2->strAt(-1) == "&", tok2->varId(), mSettings.library, nullptr))
10631063
assignVar(usage, tok2->varId());
10641064
}
10651065
}

lib/checkio.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -855,7 +855,7 @@ void CheckIOImpl::checkFormatString(const Token * const tok,
855855
// Perform type checks
856856
ArgumentInfo argInfo(argListTok, mSettings, mTokenizer->isCPP());
857857

858-
if ((argInfo.typeToken && !argInfo.isLibraryType(mSettings)) || *i == ']') {
858+
if ((argInfo.typeToken && !argInfo.isLibraryType(mSettings.library)) || *i == ']') {
859859
if (scan) {
860860
std::string specifier;
861861
bool done = false;
@@ -1857,9 +1857,9 @@ bool CheckIOImpl::ArgumentInfo::isKnownType() const
18571857
return typeToken->isStandardType() || Token::Match(typeToken, "std :: string|wstring");
18581858
}
18591859

1860-
bool CheckIOImpl::ArgumentInfo::isLibraryType(const Settings &settings) const
1860+
bool CheckIOImpl::ArgumentInfo::isLibraryType(const Library &library) const
18611861
{
1862-
return typeToken && typeToken->isStandardType() && settings.library.podtype(typeToken->str());
1862+
return typeToken && typeToken->isStandardType() && library.podtype(typeToken->str());
18631863
}
18641864

18651865
void CheckIOImpl::wrongPrintfScanfArgumentsError(const Token* tok,

lib/checkio.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ class Token;
3535
class Variable;
3636
class ErrorLogger;
3737
class Tokenizer;
38+
class Library;
3839
enum class Severity : std::uint8_t;
3940

4041
/// @addtogroup Checks
@@ -101,7 +102,7 @@ class CPPCHECKLIB CheckIOImpl : public CheckImpl {
101102
bool isKnownType() const;
102103
bool isStdVectorOrString();
103104
bool isStdContainer(const Token *tok);
104-
bool isLibraryType(const Settings &settings) const;
105+
bool isLibraryType(const Library &library) const;
105106

106107
const Variable* variableInfo{};
107108
const Token* typeToken{};

lib/checkleakautovar.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -267,24 +267,24 @@ static const Token * isFunctionCall(const Token * nameToken)
267267
return nullptr;
268268
}
269269

270-
static const Token* getOutparamAllocation(const Token* tok, const Settings& settings)
270+
static const Token* getOutparamAllocation(const Token* tok, const Library& library)
271271
{
272272
if (!tok)
273273
return nullptr;
274274
int argn{};
275275
const Token* ftok = getTokenArgumentFunction(tok, argn);
276276
if (!ftok)
277277
return nullptr;
278-
if (const Library::AllocFunc* allocFunc = settings.library.getAllocFuncInfo(ftok)) {
278+
if (const Library::AllocFunc* allocFunc = library.getAllocFuncInfo(ftok)) {
279279
if (allocFunc->arg == argn + 1)
280280
return ftok;
281281
}
282282
return nullptr;
283283
}
284284

285-
static const Token* getReturnValueFromOutparamAlloc(const Token* alloc, const Settings& settings)
285+
static const Token* getReturnValueFromOutparamAlloc(const Token* alloc, const Library& library)
286286
{
287-
if (const Token* ftok = getOutparamAllocation(alloc, settings)) {
287+
if (const Token* ftok = getOutparamAllocation(alloc, library)) {
288288
if (Token::simpleMatch(ftok->astParent()->astParent(), "="))
289289
return ftok->next()->astParent()->astOperand1();
290290
}
@@ -623,7 +623,7 @@ bool CheckLeakAutoVarImpl::checkScope(const Token * const startToken,
623623
if (std::any_of(varInfo1.alloctype.begin(), varInfo1.alloctype.end(), [&](const std::pair<int, VarInfo::AllocInfo>& info) {
624624
if (info.second.status != VarInfo::ALLOC)
625625
return false;
626-
const Token* ret = getReturnValueFromOutparamAlloc(info.second.allocTok, mSettings);
626+
const Token* ret = getReturnValueFromOutparamAlloc(info.second.allocTok, mSettings.library);
627627
return ret && vartok && ret->varId() && ret->varId() == vartok->varId();
628628
})) {
629629
varInfo1.clear();
@@ -896,7 +896,7 @@ const Token * CheckLeakAutoVarImpl::checkTokenInsideExpression(const Token * con
896896
if (var != varInfo.alloctype.end()) {
897897
bool unknown = false;
898898
if (var->second.status == VarInfo::DEALLOC && tok->valueType() && tok->valueType()->pointer &&
899-
CheckNullPointerImpl::isPointerDeRef(tok, unknown, mSettings, /*checkNullArg*/ false) && !unknown) {
899+
CheckNullPointerImpl::isPointerDeRef(tok, unknown, mSettings.library, /*checkNullArg*/ false) && !unknown) {
900900
deallocUseError(tok, tok->str());
901901
} else if (Token::simpleMatch(tok->tokAt(-2), "= &")) {
902902
varInfo.erase(tok->varId());
@@ -1232,7 +1232,7 @@ void CheckLeakAutoVarImpl::ret(const Token *tok, VarInfo &varInfo, const bool is
12321232
// don't warn when returning after checking return value of outparam allocation
12331233
const Token* outparamFunc{};
12341234
if ((tok->scope()->type == ScopeType::eIf || tok->scope()->type== ScopeType::eElse) &&
1235-
(outparamFunc = getOutparamAllocation(it->second.allocTok, mSettings))) {
1235+
(outparamFunc = getOutparamAllocation(it->second.allocTok, mSettings.library))) {
12361236
const Scope* scope = tok->scope();
12371237
if (scope->type == ScopeType::eElse) {
12381238
scope = scope->bodyStart->tokAt(-2)->scope();

lib/checknullpointer.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -130,10 +130,10 @@ namespace {
130130

131131
bool CheckNullPointerImpl::isPointerDeRef(const Token *tok, bool &unknown) const
132132
{
133-
return isPointerDeRef(tok, unknown, mSettings);
133+
return isPointerDeRef(tok, unknown, mSettings.library);
134134
}
135135

136-
bool CheckNullPointerImpl::isPointerDeRef(const Token *tok, bool &unknown, const Settings &settings, bool checkNullArg)
136+
bool CheckNullPointerImpl::isPointerDeRef(const Token *tok, bool &unknown, const Library &library, bool checkNullArg)
137137
{
138138
unknown = false;
139139

@@ -146,7 +146,7 @@ bool CheckNullPointerImpl::isPointerDeRef(const Token *tok, bool &unknown, const
146146
ftok = ftok->previous();
147147
}
148148
if (ftok && ftok->previous()) {
149-
const std::list<const Token *> varlist = CheckNullPointerImpl::parseFunctionCall(*ftok->previous(), settings.library, checkNullArg);
149+
const std::list<const Token *> varlist = CheckNullPointerImpl::parseFunctionCall(*ftok->previous(), library, checkNullArg);
150150
if (std::find(varlist.cbegin(), varlist.cend(), tok) != varlist.cend()) {
151151
return true;
152152
}
@@ -161,7 +161,7 @@ bool CheckNullPointerImpl::isPointerDeRef(const Token *tok, bool &unknown, const
161161
return false;
162162
const bool addressOf = parent->astParent() && parent->astParent()->str() == "&";
163163
if (parent->str() == "." && astIsRHS(tok))
164-
return isPointerDeRef(parent, unknown, settings);
164+
return isPointerDeRef(parent, unknown, library);
165165
const bool firstOperand = parent->astOperand1() == tok;
166166
parent = astParentSkipParens(tok);
167167
if (!parent)
@@ -298,7 +298,7 @@ void CheckNullPointerImpl::nullPointerByDeRefAndCheck()
298298

299299
// Pointer dereference.
300300
bool unknown = false;
301-
if (!CheckNullPointerImpl::isPointerDeRef(tok, unknown, mSettings)) {
301+
if (!CheckNullPointerImpl::isPointerDeRef(tok, unknown, mSettings.library)) {
302302
if (unknown)
303303
nullPointerError(tok, tok->expressionString(), value, true);
304304
continue;
@@ -578,7 +578,7 @@ static bool isUnsafeUsage(const Settings &settings, const Token *vartok, CTU::Fi
578578
{
579579
(void)value;
580580
bool unknown = false;
581-
return CheckNullPointerImpl::isPointerDeRef(vartok, unknown, settings);
581+
return CheckNullPointerImpl::isPointerDeRef(vartok, unknown, settings.library);
582582
}
583583

584584
// a Clang-built executable will crash when using the anonymous MyFileInfo later on - so put it in a unique namespace for now

0 commit comments

Comments
 (0)