Skip to content

Commit 228f9cd

Browse files
authored
ValueFlow: pass ErrorLogger by reference into ValueFlow::setValues() / removed need for LifetimeStore::Context (#5299)
1 parent 3170c17 commit 228f9cd

15 files changed

+179
-144
lines changed

lib/cppcheck.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -513,7 +513,7 @@ unsigned int CppCheck::checkClang(const std::string &path)
513513
clangimport::parseClangAstDump(tokenizer, ast);
514514
ValueFlow::setValues(tokenizer.list,
515515
const_cast<SymbolDatabase&>(*tokenizer.getSymbolDatabase()),
516-
this,
516+
*this,
517517
mSettings,
518518
&s_timerResults);
519519
if (mSettings.debugnormal)

lib/forwardanalyzer.cpp

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,12 @@ namespace {
4747
struct ForwardTraversal {
4848
enum class Progress { Continue, Break, Skip };
4949
enum class Terminate { None, Bail, Inconclusive };
50-
ForwardTraversal(const ValuePtr<Analyzer>& analyzer, const TokenList& tokenList, ErrorLogger* const errorLogger, const Settings& settings)
50+
ForwardTraversal(const ValuePtr<Analyzer>& analyzer, const TokenList& tokenList, ErrorLogger& errorLogger, const Settings& settings)
5151
: analyzer(analyzer), tokenList(tokenList), errorLogger(errorLogger), settings(settings)
5252
{}
5353
ValuePtr<Analyzer> analyzer;
5454
const TokenList& tokenList;
55-
ErrorLogger* const errorLogger;
55+
ErrorLogger& errorLogger;
5656
const Settings& settings;
5757
Analyzer::Action actions;
5858
bool analyzeOnly{};
@@ -839,11 +839,9 @@ namespace {
839839
}
840840

841841
void reportError(Severity severity, const std::string& id, const std::string& msg) {
842-
if (errorLogger) {
843-
ErrorMessage::FileLocation loc(tokenList.getSourceFilePath(), 0, 0);
844-
const ErrorMessage errmsg({std::move(loc)}, tokenList.getSourceFilePath(), severity, msg, id, Certainty::normal);
845-
errorLogger->reportErr(errmsg);
846-
}
842+
ErrorMessage::FileLocation loc(tokenList.getSourceFilePath(), 0, 0);
843+
const ErrorMessage errmsg({std::move(loc)}, tokenList.getSourceFilePath(), severity, msg, id, Certainty::normal);
844+
errorLogger.reportErr(errmsg);
847845
}
848846

849847
static bool isFunctionCall(const Token* tok)
@@ -904,7 +902,7 @@ namespace {
904902
};
905903
}
906904

907-
Analyzer::Result valueFlowGenericForward(Token* start, const Token* end, const ValuePtr<Analyzer>& a, const TokenList& tokenList, ErrorLogger* const errorLogger, const Settings& settings)
905+
Analyzer::Result valueFlowGenericForward(Token* start, const Token* end, const ValuePtr<Analyzer>& a, const TokenList& tokenList, ErrorLogger& errorLogger, const Settings& settings)
908906
{
909907
if (a->invalid())
910908
return Analyzer::Result{Analyzer::Action::None, Analyzer::Terminate::Bail};
@@ -915,7 +913,7 @@ Analyzer::Result valueFlowGenericForward(Token* start, const Token* end, const V
915913
return Analyzer::Result{ ft.actions, ft.terminate };
916914
}
917915

918-
Analyzer::Result valueFlowGenericForward(Token* start, const ValuePtr<Analyzer>& a, const TokenList& tokenList, ErrorLogger* const errorLogger, const Settings& settings)
916+
Analyzer::Result valueFlowGenericForward(Token* start, const ValuePtr<Analyzer>& a, const TokenList& tokenList, ErrorLogger& errorLogger, const Settings& settings)
919917
{
920918
if (Settings::terminated())
921919
throw TerminateException();

lib/forwardanalyzer.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,9 @@ Analyzer::Result valueFlowGenericForward(Token* start,
3131
const Token* end,
3232
const ValuePtr<Analyzer>& a,
3333
const TokenList& tokenList,
34-
ErrorLogger* const errorLogger,
34+
ErrorLogger& errorLogger,
3535
const Settings& settings);
3636

37-
Analyzer::Result valueFlowGenericForward(Token* start, const ValuePtr<Analyzer>& a, const TokenList& tokenList, ErrorLogger* const errorLogger, const Settings& settings);
37+
Analyzer::Result valueFlowGenericForward(Token* start, const ValuePtr<Analyzer>& a, const TokenList& tokenList, ErrorLogger& errorLogger, const Settings& settings);
3838

3939
#endif

lib/importproject.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -553,20 +553,23 @@ namespace {
553553
}
554554
}
555555

556+
// see https://learn.microsoft.com/en-us/visualstudio/msbuild/msbuild-conditions
557+
// properties are .NET String objects and you can call any of its members on them
556558
bool conditionIsTrue(const ProjectConfiguration &p) const {
557559
if (condition.empty())
558560
return true;
559561
std::string c = '(' + condition + ");";
560562
replaceAll(c, "$(Configuration)", p.configuration);
561563
replaceAll(c, "$(Platform)", p.platformStr);
562564

563-
// TODO: evaluate without using the Tokenizer
565+
// TODO: improve evaluation
564566
const Settings s;
565-
Tokenizer tokenizer(s);
567+
TokenList tokenlist(&s);
566568
std::istringstream istr(c);
567-
tokenizer.tokenize(istr,"vcxproj.c");
568-
for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next()) {
569+
tokenlist.createTokens(istr, Standards::Language::C); // TODO: check result
570+
for (const Token *tok = tokenlist.front(); tok; tok = tok->next()) {
569571
if (tok->str() == "(" && tok->astOperand1() && tok->astOperand2()) {
572+
// TODO: this is wrong - it is Contains() not Equals()
570573
if (tok->astOperand1()->expressionString() == "Configuration.Contains")
571574
return ('\'' + p.configuration + '\'') == tok->astOperand2()->str();
572575
}

lib/reverseanalyzer.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,12 @@
3737

3838
namespace {
3939
struct ReverseTraversal {
40-
ReverseTraversal(const ValuePtr<Analyzer>& analyzer, const TokenList& tokenlist, ErrorLogger* const errorLogger, const Settings& settings)
40+
ReverseTraversal(const ValuePtr<Analyzer>& analyzer, const TokenList& tokenlist, ErrorLogger& errorLogger, const Settings& settings)
4141
: analyzer(analyzer), tokenlist(tokenlist), errorLogger(errorLogger), settings(settings)
4242
{}
4343
ValuePtr<Analyzer> analyzer;
4444
const TokenList& tokenlist;
45-
ErrorLogger* const errorLogger;
45+
ErrorLogger& errorLogger;
4646
const Settings& settings;
4747

4848
std::pair<bool, bool> evalCond(const Token* tok) const {
@@ -395,7 +395,7 @@ namespace {
395395
};
396396
}
397397

398-
void valueFlowGenericReverse(Token* start, const Token* end, const ValuePtr<Analyzer>& a, const TokenList& tokenlist, ErrorLogger* const errorLogger, const Settings& settings)
398+
void valueFlowGenericReverse(Token* start, const Token* end, const ValuePtr<Analyzer>& a, const TokenList& tokenlist, ErrorLogger& errorLogger, const Settings& settings)
399399
{
400400
if (a->invalid())
401401
return;

lib/reverseanalyzer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,6 @@ class TokenList;
2727
template<class T>
2828
class ValuePtr;
2929

30-
void valueFlowGenericReverse(Token* start, const Token* end, const ValuePtr<Analyzer>& a, const TokenList& tokenlist, ErrorLogger* const errorLogger, const Settings& settings);
30+
void valueFlowGenericReverse(Token* start, const Token* end, const ValuePtr<Analyzer>& a, const TokenList& tokenlist, ErrorLogger& errorLogger, const Settings& settings);
3131

3232
#endif

lib/symboldatabase.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2152,7 +2152,7 @@ void SymbolDatabase::validateExecutableScopes() const
21522152
for (std::size_t i = 0; i < functions; ++i) {
21532153
const Scope* const scope = functionScopes[i];
21542154
const Function* const function = scope->function;
2155-
if (scope->isExecutable() && !function) {
2155+
if (mErrorLogger && scope->isExecutable() && !function) {
21562156
const std::list<const Token*> callstack(1, scope->classDef);
21572157
const std::string msg = std::string("Executable scope '") + scope->classDef->str() + "' with unknown function.";
21582158
const ErrorMessage errmsg(callstack, &mTokenizer.list, Severity::debug,
@@ -2217,7 +2217,7 @@ void SymbolDatabase::debugSymbolDatabase() const
22172217
for (const Token* tok = mTokenizer.list.front(); tok != mTokenizer.list.back(); tok = tok->next()) {
22182218
if (tok->astParent() && tok->astParent()->getTokenDebug() == tok->getTokenDebug())
22192219
continue;
2220-
if (tok->getTokenDebug() == TokenDebug::ValueType) {
2220+
if (mErrorLogger && tok->getTokenDebug() == TokenDebug::ValueType) {
22212221

22222222
std::string msg = "Value type is ";
22232223
ErrorPath errorPath;

lib/tokenize.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1149,7 +1149,7 @@ void Tokenizer::simplifyTypedefCpp()
11491149
return;
11501150

11511151
if (maxTime > 0 && std::time(nullptr) > maxTime) {
1152-
if (mSettings.debugwarnings) {
1152+
if (mErrorLogger && mSettings.debugwarnings) {
11531153
ErrorMessage::FileLocation loc(list.getFiles()[0], 0, 0);
11541154
ErrorMessage errmsg({std::move(loc)},
11551155
emptyString,
@@ -3406,11 +3406,12 @@ bool Tokenizer::simplifyTokens1(const std::string &configuration)
34063406
const bool doValueFlow = !disableValueflowEnv || (std::strcmp(disableValueflowEnv, "1") != 0);
34073407

34083408
if (doValueFlow) {
3409+
assert(mErrorLogger);
34093410
if (mTimerResults) {
34103411
Timer t("Tokenizer::simplifyTokens1::ValueFlow", mSettings.showtime, mTimerResults);
3411-
ValueFlow::setValues(list, *mSymbolDatabase, mErrorLogger, mSettings, mTimerResults);
3412+
ValueFlow::setValues(list, *mSymbolDatabase, *mErrorLogger, mSettings, mTimerResults);
34123413
} else {
3413-
ValueFlow::setValues(list, *mSymbolDatabase, mErrorLogger, mSettings, mTimerResults);
3414+
ValueFlow::setValues(list, *mSymbolDatabase, *mErrorLogger, mSettings, mTimerResults);
34143415
}
34153416

34163417
arraySizeAfterValueFlow();
@@ -3438,6 +3439,7 @@ bool Tokenizer::simplifyTokens1(const std::string &configuration)
34383439
return true;
34393440
}
34403441

3442+
// cppcheck-suppress unusedFunction - used in tests only
34413443
bool Tokenizer::tokenize(std::istream &code,
34423444
const char FileName[],
34433445
const std::string &configuration)
@@ -6069,7 +6071,8 @@ void Tokenizer::dump(std::ostream &out) const
60696071
out << outs;
60706072
outs.clear();
60716073

6072-
mSymbolDatabase->printXml(out);
6074+
if (mSymbolDatabase)
6075+
mSymbolDatabase->printXml(out);
60736076

60746077
containers.erase(nullptr);
60756078
if (!containers.empty()) {

lib/tokenize.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ class CPPCHECKLIB Tokenizer {
5454
friend class TemplateSimplifier;
5555

5656
public:
57-
explicit Tokenizer(const Settings & settings, ErrorLogger *errorLogger = nullptr, const Preprocessor *preprocessor = nullptr);
57+
explicit Tokenizer(const Settings & settings, ErrorLogger *errorLogger, const Preprocessor *preprocessor = nullptr);
5858
~Tokenizer();
5959

6060
void setTimerResults(TimerResults *tr) {

0 commit comments

Comments
 (0)