Skip to content

Commit 00fd3d9

Browse files
authored
made ForwardTraversal::mSettings and ReverseTraversal::mSettings references / adjusted some calling code to use references as well (#4858)
1 parent 87d9c8f commit 00fd3d9

5 files changed

Lines changed: 42 additions & 42 deletions

File tree

lib/forwardanalyzer.cpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,11 @@ struct OnExit {
5050
struct ForwardTraversal {
5151
enum class Progress { Continue, Break, Skip };
5252
enum class Terminate { None, Bail, Escape, Modified, Inconclusive, Conditional };
53-
ForwardTraversal(const ValuePtr<Analyzer>& analyzer, const Settings* settings)
53+
ForwardTraversal(const ValuePtr<Analyzer>& analyzer, const Settings& settings)
5454
: analyzer(analyzer), settings(settings), actions(Analyzer::Action::None), analyzeOnly(false), analyzeTerminate(false)
5555
{}
5656
ValuePtr<Analyzer> analyzer;
57-
const Settings* settings;
57+
const Settings& settings;
5858
Analyzer::Action actions;
5959
bool analyzeOnly;
6060
bool analyzeTerminate;
@@ -138,7 +138,7 @@ struct ForwardTraversal {
138138
traverseRecursive(tok->astOperand2(), f, traverseUnknown);
139139
traverseRecursive(tok->astOperand1(), f, traverseUnknown);
140140
return Break(Analyzer::Terminate::Escape);
141-
} else if (Token::Match(tok, "%name% (") && isEscapeFunction(tok, &settings->library)) {
141+
} else if (Token::Match(tok, "%name% (") && isEscapeFunction(tok, &settings.library)) {
142142
// Traverse the parameters of the function before escaping
143143
traverseRecursive(tok->next()->astOperand2(), f, traverseUnknown);
144144
return Break(Analyzer::Terminate::Escape);
@@ -315,7 +315,7 @@ struct ForwardTraversal {
315315
for (const Token* tok=start; tok != end; tok = tok->previous()) {
316316
if (Token::simpleMatch(tok, "}")) {
317317
const Token* ftok = nullptr;
318-
const bool r = isReturnScope(tok, &settings->library, &ftok);
318+
const bool r = isReturnScope(tok, &settings.library, &ftok);
319319
if (r)
320320
return true;
321321
}
@@ -325,7 +325,7 @@ struct ForwardTraversal {
325325

326326
bool isEscapeScope(const Token* endBlock, bool& unknown) const {
327327
const Token* ftok = nullptr;
328-
const bool r = isReturnScope(endBlock, &settings->library, &ftok);
328+
const bool r = isReturnScope(endBlock, &settings.library, &ftok);
329329
if (!r && ftok)
330330
unknown = true;
331331
return r;
@@ -388,13 +388,13 @@ struct ForwardTraversal {
388388
if (stepTok) {
389389
std::pair<const Token*, const Token*> exprToks = stepTok->findExpressionStartEndTokens();
390390
if (exprToks.first != nullptr && exprToks.second != nullptr)
391-
stepChangesCond |= isExpressionChanged(condTok, exprToks.first, exprToks.second->next(), settings, true);
391+
stepChangesCond |= isExpressionChanged(condTok, exprToks.first, exprToks.second->next(), &settings, true);
392392
}
393-
const bool bodyChangesCond = isExpressionChanged(condTok, endBlock->link(), endBlock, settings, true);
393+
const bool bodyChangesCond = isExpressionChanged(condTok, endBlock->link(), endBlock, &settings, true);
394394
// Check for mutation in the condition
395395
const bool condChanged =
396396
nullptr != findAstNode(condTok, [&](const Token* tok) {
397-
return isVariableChanged(tok, 0, settings, true);
397+
return isVariableChanged(tok, 0, &settings, true);
398398
});
399399
const bool changed = stepChangesCond || bodyChangesCond || condChanged;
400400
if (!changed)
@@ -896,14 +896,14 @@ struct ForwardTraversal {
896896
}
897897
};
898898

899-
Analyzer::Result valueFlowGenericForward(Token* start, const Token* end, const ValuePtr<Analyzer>& a, const Settings* settings)
899+
Analyzer::Result valueFlowGenericForward(Token* start, const Token* end, const ValuePtr<Analyzer>& a, const Settings& settings)
900900
{
901901
ForwardTraversal ft{a, settings};
902902
ft.updateRange(start, end);
903903
return Analyzer::Result{ ft.actions, ft.terminate };
904904
}
905905

906-
Analyzer::Result valueFlowGenericForward(Token* start, const ValuePtr<Analyzer>& a, const Settings* settings)
906+
Analyzer::Result valueFlowGenericForward(Token* start, const ValuePtr<Analyzer>& a, const Settings& settings)
907907
{
908908
if (Settings::terminated())
909909
throw TerminateException();

lib/forwardanalyzer.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ template<class T> class ValuePtr;
2828
Analyzer::Result valueFlowGenericForward(Token* start,
2929
const Token* end,
3030
const ValuePtr<Analyzer>& a,
31-
const Settings* settings);
31+
const Settings& settings);
3232

33-
Analyzer::Result valueFlowGenericForward(Token* start, const ValuePtr<Analyzer>& a, const Settings* settings);
33+
Analyzer::Result valueFlowGenericForward(Token* start, const ValuePtr<Analyzer>& a, const Settings& settings);
3434

3535
#endif

lib/reverseanalyzer.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,11 @@
3636
#include <vector>
3737

3838
struct ReverseTraversal {
39-
ReverseTraversal(const ValuePtr<Analyzer>& analyzer, const Settings* settings)
39+
ReverseTraversal(const ValuePtr<Analyzer>& analyzer, const Settings& settings)
4040
: analyzer(analyzer), settings(settings)
4141
{}
4242
ValuePtr<Analyzer> analyzer;
43-
const Settings* settings;
43+
const Settings& settings;
4444

4545
std::pair<bool, bool> evalCond(const Token* tok) const {
4646
std::vector<MathLib::bigint> result = analyzer->evaluate(tok);
@@ -244,7 +244,7 @@ struct ReverseTraversal {
244244
// Assignment to
245245
} else if (lhsAction.matches() && !assignTok->astOperand2()->hasKnownIntValue() &&
246246
assignTok->astOperand2()->exprId() > 0 &&
247-
isConstExpression(assignTok->astOperand2(), settings->library, true)) {
247+
isConstExpression(assignTok->astOperand2(), settings.library, true)) {
248248
const std::string info = "Assignment to '" + assignTok->expressionString() + "'";
249249
ValuePtr<Analyzer> a = analyzer->reanalyze(assignTok->astOperand2(), info);
250250
if (a) {
@@ -388,13 +388,13 @@ struct ReverseTraversal {
388388
}
389389
};
390390

391-
void valueFlowGenericReverse(Token* start, const ValuePtr<Analyzer>& a, const Settings* settings)
391+
void valueFlowGenericReverse(Token* start, const ValuePtr<Analyzer>& a, const Settings& settings)
392392
{
393393
ReverseTraversal rt{a, settings};
394394
rt.traverse(start);
395395
}
396396

397-
void valueFlowGenericReverse(Token* start, const Token* end, const ValuePtr<Analyzer>& a, const Settings* settings)
397+
void valueFlowGenericReverse(Token* start, const Token* end, const ValuePtr<Analyzer>& a, const Settings& settings)
398398
{
399399
ReverseTraversal rt{a, settings};
400400
rt.traverse(start, end);

lib/reverseanalyzer.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ class Token;
2525
template<class T>
2626
class ValuePtr;
2727

28-
void valueFlowGenericReverse(Token* start, const ValuePtr<Analyzer>& a, const Settings* settings);
29-
void valueFlowGenericReverse(Token* start, const Token* end, const ValuePtr<Analyzer>& a, const Settings* settings);
28+
void valueFlowGenericReverse(Token* start, const ValuePtr<Analyzer>& a, const Settings& settings);
29+
void valueFlowGenericReverse(Token* start, const Token* end, const ValuePtr<Analyzer>& a, const Settings& settings);
3030

3131
#endif

lib/valueflow.cpp

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2000,7 +2000,7 @@ static Analyzer::Result valueFlowForward(Token* startToken,
20002000
return valueFlowGenericForward(startToken,
20012001
endToken,
20022002
makeAnalyzer(exprTok, std::move(value), tokenlist, settings),
2003-
settings);
2003+
*settings);
20042004
}
20052005

20062006
static Analyzer::Result valueFlowForward(Token* startToken,
@@ -2045,7 +2045,7 @@ static Analyzer::Result valueFlowForwardRecursive(Token* top,
20452045
if (settings->debugnormal)
20462046
setSourceLocation(v, loc, top);
20472047
result.update(
2048-
valueFlowGenericForward(top, makeAnalyzer(exprTok, std::move(v), tokenlist, settings), settings));
2048+
valueFlowGenericForward(top, makeAnalyzer(exprTok, std::move(v), tokenlist, settings), *settings));
20492049
}
20502050
return result;
20512051
}
@@ -2061,7 +2061,7 @@ static void valueFlowReverse(Token* tok,
20612061
for (ValueFlow::Value& v : values) {
20622062
if (settings->debugnormal)
20632063
setSourceLocation(v, loc, tok);
2064-
valueFlowGenericReverse(tok, endToken, makeReverseAnalyzer(varToken, std::move(v), tokenlist, settings), settings);
2064+
valueFlowGenericReverse(tok, endToken, makeReverseAnalyzer(varToken, std::move(v), tokenlist, settings), *settings);
20652065
}
20662066
}
20672067

@@ -5109,12 +5109,12 @@ static const Scope* getLoopScope(const Token* tok)
51095109
}
51105110

51115111
//
5112-
static void valueFlowConditionExpressions(TokenList *tokenlist, SymbolDatabase* symboldatabase, ErrorLogger *errorLogger, const Settings *settings)
5112+
static void valueFlowConditionExpressions(TokenList *tokenlist, SymbolDatabase* symboldatabase, ErrorLogger *errorLogger, const Settings &settings)
51135113
{
51145114
for (const Scope * scope : symboldatabase->functionScopes) {
51155115
if (const Token* incompleteTok = findIncompleteVar(scope->bodyStart, scope->bodyEnd)) {
51165116
if (incompleteTok->isIncompleteVar()) {
5117-
if (settings->debugwarnings)
5117+
if (settings.debugwarnings)
51185118
bailoutIncompleteVar(tokenlist, errorLogger, incompleteTok, "Skipping function due to incomplete variable " + incompleteTok->str());
51195119
break;
51205120
}
@@ -5132,7 +5132,7 @@ static void valueFlowConditionExpressions(TokenList *tokenlist, SymbolDatabase*
51325132
continue;
51335133
if (condTok->hasKnownIntValue())
51345134
continue;
5135-
if (!isConstExpression(condTok, settings->library, tokenlist->isCPP()))
5135+
if (!isConstExpression(condTok, settings.library, tokenlist->isCPP()))
51365136
continue;
51375137
const bool is1 = (condTok->isComparisonOp() || condTok->tokType() == Token::eLogicalOp || astIsBool(condTok));
51385138

@@ -5142,11 +5142,11 @@ static void valueFlowConditionExpressions(TokenList *tokenlist, SymbolDatabase*
51425142
for (const Token* condTok2 : getConditions(condTok, "&&")) {
51435143
if (is1) {
51445144
const bool isBool = astIsBool(condTok2) || Token::Match(condTok2, "%comp%|%oror%|&&");
5145-
SameExpressionAnalyzer a1(condTok2, makeConditionValue(1, condTok2, /*assume*/ true, !isBool), tokenlist, settings); // don't set '1' for non-boolean expressions
5145+
SameExpressionAnalyzer a1(condTok2, makeConditionValue(1, condTok2, /*assume*/ true, !isBool), tokenlist, &settings); // don't set '1' for non-boolean expressions
51465146
valueFlowGenericForward(startTok, startTok->link(), a1, settings);
51475147
}
51485148

5149-
OppositeExpressionAnalyzer a2(true, condTok2, makeConditionValue(0, condTok2, true), tokenlist, settings);
5149+
OppositeExpressionAnalyzer a2(true, condTok2, makeConditionValue(0, condTok2, true), tokenlist, &settings);
51505150
valueFlowGenericForward(startTok, startTok->link(), a2, settings);
51515151
}
51525152
}
@@ -5157,18 +5157,18 @@ static void valueFlowConditionExpressions(TokenList *tokenlist, SymbolDatabase*
51575157
if (Token::simpleMatch(startTok->link(), "} else {")) {
51585158
startTok = startTok->link()->tokAt(2);
51595159
for (const Token* condTok2:conds) {
5160-
SameExpressionAnalyzer a1(condTok2, makeConditionValue(0, condTok2, false), tokenlist, settings);
5160+
SameExpressionAnalyzer a1(condTok2, makeConditionValue(0, condTok2, false), tokenlist, &settings);
51615161
valueFlowGenericForward(startTok, startTok->link(), a1, settings);
51625162

51635163
if (is1) {
5164-
OppositeExpressionAnalyzer a2(true, condTok2, makeConditionValue(1, condTok2, false), tokenlist, settings);
5164+
OppositeExpressionAnalyzer a2(true, condTok2, makeConditionValue(1, condTok2, false), tokenlist, &settings);
51655165
valueFlowGenericForward(startTok, startTok->link(), a2, settings);
51665166
}
51675167
}
51685168
}
51695169

51705170
// Check if the block terminates early
5171-
if (isEscapeScope(blockTok, tokenlist, settings)) {
5171+
if (isEscapeScope(blockTok, tokenlist, &settings)) {
51725172
const Scope* scope2 = scope;
51735173
// If escaping a loop then only use the loop scope
51745174
if (isBreakOrContinueScope(blockTok->link())) {
@@ -5177,11 +5177,11 @@ static void valueFlowConditionExpressions(TokenList *tokenlist, SymbolDatabase*
51775177
continue;
51785178
}
51795179
for (const Token* condTok2:conds) {
5180-
SameExpressionAnalyzer a1(condTok2, makeConditionValue(0, condTok2, false), tokenlist, settings);
5180+
SameExpressionAnalyzer a1(condTok2, makeConditionValue(0, condTok2, false), tokenlist, &settings);
51815181
valueFlowGenericForward(startTok->link()->next(), scope2->bodyEnd, a1, settings);
51825182

51835183
if (is1) {
5184-
OppositeExpressionAnalyzer a2(true, condTok2, makeConditionValue(1, condTok2, false), tokenlist, settings);
5184+
OppositeExpressionAnalyzer a2(true, condTok2, makeConditionValue(1, condTok2, false), tokenlist, &settings);
51855185
valueFlowGenericForward(startTok->link()->next(), scope2->bodyEnd, a2, settings);
51865186
}
51875187
}
@@ -7210,20 +7210,20 @@ bool productParams(const std::unordered_map<Key, std::list<ValueFlow::Value>>& v
72107210
static void valueFlowInjectParameter(TokenList* tokenlist,
72117211
SymbolDatabase* symboldatabase,
72127212
ErrorLogger* errorLogger,
7213-
const Settings* settings,
7213+
const Settings& settings,
72147214
const Scope* functionScope,
72157215
const std::unordered_map<const Variable*, std::list<ValueFlow::Value>>& vars)
72167216
{
72177217
const bool r = productParams(vars, [&](const std::unordered_map<const Variable*, ValueFlow::Value>& arg) {
7218-
MultiValueFlowAnalyzer a(arg, tokenlist, settings, symboldatabase);
7218+
MultiValueFlowAnalyzer a(arg, tokenlist, &settings, symboldatabase);
72197219
valueFlowGenericForward(const_cast<Token*>(functionScope->bodyStart), functionScope->bodyEnd, a, settings);
72207220
});
72217221
if (!r) {
72227222
std::string fname = "<unknown>";
72237223
Function* f = functionScope->function;
72247224
if (f)
72257225
fname = f->name();
7226-
if (settings->debugwarnings)
7226+
if (settings.debugwarnings)
72277227
bailout(tokenlist, errorLogger, functionScope->bodyStart, "Too many argument passed to " + fname);
72287228
}
72297229
}
@@ -7387,7 +7387,7 @@ IteratorRange<Iterator> MakeIteratorRange(Iterator start, Iterator last)
73877387
return {start, last};
73887388
}
73897389

7390-
static void valueFlowSubFunction(TokenList* tokenlist, SymbolDatabase* symboldatabase, ErrorLogger* errorLogger, const Settings* settings)
7390+
static void valueFlowSubFunction(TokenList* tokenlist, SymbolDatabase* symboldatabase, ErrorLogger* errorLogger, const Settings& settings)
73917391
{
73927392
int id = 0;
73937393
for (const Scope* scope : MakeIteratorRange(symboldatabase->functionScopes.crbegin(), symboldatabase->functionScopes.crend())) {
@@ -7401,9 +7401,9 @@ static void valueFlowSubFunction(TokenList* tokenlist, SymbolDatabase* symboldat
74017401
const Function * const calledFunction = tok->function();
74027402
if (!calledFunction) {
74037403
// library function?
7404-
const std::string& returnValue(settings->library.returnValue(tok));
7404+
const std::string& returnValue(settings.library.returnValue(tok));
74057405
if (!returnValue.empty())
7406-
valueFlowLibraryFunction(tok->next(), returnValue, settings);
7406+
valueFlowLibraryFunction(tok->next(), returnValue, &settings);
74077407
continue;
74087408
}
74097409

@@ -7433,7 +7433,7 @@ static void valueFlowSubFunction(TokenList* tokenlist, SymbolDatabase* symboldat
74337433
});
74347434
// Remove uninit values if argument is passed by value
74357435
if (argtok->variable() && !argtok->variable()->isPointer() && argvalues.size() == 1 && argvalues.front().isUninitValue()) {
7436-
if (CheckUninitVar::isVariableUsage(tokenlist->isCPP(), argtok, settings->library, false, CheckUninitVar::Alloc::NO_ALLOC, 0))
7436+
if (CheckUninitVar::isVariableUsage(tokenlist->isCPP(), argtok, settings.library, false, CheckUninitVar::Alloc::NO_ALLOC, 0))
74377437
continue;
74387438
}
74397439

@@ -7665,7 +7665,7 @@ static void valueFlowUninit(TokenList* tokenlist, SymbolDatabase* /*symbolDataba
76657665
continue;
76667666
}
76677667
MemberExpressionAnalyzer analyzer(memVar.nameToken()->str(), tok, uninitValue, tokenlist, settings);
7668-
valueFlowGenericForward(tok->next(), tok->scope()->bodyEnd, analyzer, settings);
7668+
valueFlowGenericForward(tok->next(), tok->scope()->bodyEnd, analyzer, *settings);
76697669

76707670
for (auto&& p : *analyzer.partialReads) {
76717671
Token* tok2 = p.first;
@@ -8895,7 +8895,7 @@ void ValueFlow::setValues(TokenList *tokenlist, SymbolDatabase* symboldatabase,
88958895
valueFlowSymbolic(tokenlist, symboldatabase, settings);
88968896
valueFlowBitAnd(tokenlist, settings);
88978897
valueFlowSameExpressions(tokenlist, settings);
8898-
valueFlowConditionExpressions(tokenlist, symboldatabase, errorLogger, settings);
8898+
valueFlowConditionExpressions(tokenlist, symboldatabase, errorLogger, *settings);
88998899

89008900
const std::uint64_t stopTime = getValueFlowStopTime(settings);
89018901

@@ -8931,7 +8931,7 @@ void ValueFlow::setValues(TokenList *tokenlist, SymbolDatabase* symboldatabase,
89318931
if (std::time(nullptr) < stopTime)
89328932
valueFlowForLoop(tokenlist, symboldatabase, errorLogger, settings);
89338933
if (std::time(nullptr) < stopTime)
8934-
valueFlowSubFunction(tokenlist, symboldatabase, errorLogger, settings);
8934+
valueFlowSubFunction(tokenlist, symboldatabase, errorLogger, *settings);
89358935
if (std::time(nullptr) < stopTime)
89368936
valueFlowFunctionReturn(tokenlist, errorLogger, settings);
89378937
if (std::time(nullptr) < stopTime)

0 commit comments

Comments
 (0)