Skip to content

Commit 646b422

Browse files
authored
pass Settings as reference into TokenList (danmar#7401)
1 parent ebc80c0 commit 646b422

25 files changed

+207
-219
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -587,7 +587,7 @@ $(libcppdir)/infer.o: lib/infer.cpp lib/calculate.h lib/config.h lib/errortypes.
587587
$(libcppdir)/keywords.o: lib/keywords.cpp lib/config.h lib/keywords.h lib/standards.h lib/utils.h
588588
$(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/keywords.cpp
589589

590-
$(libcppdir)/library.o: lib/library.cpp externals/tinyxml2/tinyxml2.h lib/astutils.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenlist.h lib/utils.h lib/vfvalue.h lib/xml.h
590+
$(libcppdir)/library.o: lib/library.cpp externals/tinyxml2/tinyxml2.h lib/addoninfo.h lib/astutils.h lib/checkers.h lib/config.h lib/errortypes.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/smallvector.h lib/sourcelocation.h lib/standards.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenlist.h lib/utils.h lib/vfvalue.h lib/xml.h
591591
$(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/library.cpp
592592

593593
$(libcppdir)/mathlib.o: lib/mathlib.cpp externals/simplecpp/simplecpp.h lib/config.h lib/errortypes.h lib/mathlib.h lib/templatesimplifier.h lib/token.h lib/utils.h lib/vfvalue.h

lib/checkfunctions.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,9 +131,9 @@ void CheckFunctions::invalidFunctionUsage()
131131
invalidFunctionArgBoolError(argtok, functionToken->str(), argnr);
132132

133133
// Are the values 0 and 1 valid?
134-
else if (!mSettings->library.isIntArgValid(functionToken, argnr, 0))
134+
else if (!mSettings->library.isIntArgValid(functionToken, argnr, 0, *mSettings))
135135
invalidFunctionArgError(argtok, functionToken->str(), argnr, nullptr, mSettings->library.validarg(functionToken, argnr));
136-
else if (!mSettings->library.isIntArgValid(functionToken, argnr, 1))
136+
else if (!mSettings->library.isIntArgValid(functionToken, argnr, 1, *mSettings))
137137
invalidFunctionArgError(argtok, functionToken->str(), argnr, nullptr, mSettings->library.validarg(functionToken, argnr));
138138
}
139139
// check <strz>

lib/clangimport.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -677,7 +677,7 @@ void clangimport::AstNode::setValueType(Token *tok)
677677
// TODO
678678
continue;
679679

680-
TokenList decl(nullptr, tok->isCpp() ? Standards::Language::CPP : Standards::Language::C);
680+
TokenList decl(mData->mSettings, tok->isCpp() ? Standards::Language::CPP : Standards::Language::C);
681681
addTypeTokens(decl, type, tok->scope());
682682
if (!decl.front())
683683
break;

lib/cppcheck.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -715,7 +715,7 @@ unsigned int CppCheck::checkClang(const FileWithDetails &file)
715715
}
716716

717717
try {
718-
TokenList tokenlist{&mSettings, file.lang()};
718+
TokenList tokenlist{mSettings, file.lang()};
719719
tokenlist.appendFileIfNew(file.spath());
720720
Tokenizer tokenizer(std::move(tokenlist), mSettings, mErrorLogger);
721721
std::istringstream ast(output2);
@@ -911,7 +911,7 @@ unsigned int CppCheck::checkFile(const FileWithDetails& file, const std::string
911911
if (mUnusedFunctionsCheck && (mSettings.useSingleJob() || analyzerInformation)) {
912912
std::size_t hash = 0;
913913
// markup files are special and do not adhere to the enforced language
914-
TokenList tokenlist{&mSettings, Standards::Language::C};
914+
TokenList tokenlist{mSettings, Standards::Language::C};
915915
if (fileStream) {
916916
std::vector<std::string> files;
917917
simplecpp::TokenList tokens(*fileStream, files, file.spath());
@@ -1055,7 +1055,7 @@ unsigned int CppCheck::checkFile(const FileWithDetails& file, const std::string
10551055
if (startsWith(dir.str,"#define ") || startsWith(dir.str,"#include "))
10561056
code += "#line " + std::to_string(dir.linenr) + " \"" + dir.file + "\"\n" + dir.str + '\n';
10571057
}
1058-
TokenList tokenlist(&mSettings, file.lang());
1058+
TokenList tokenlist(mSettings, file.lang());
10591059
std::istringstream istr2(code);
10601060
tokenlist.createTokens(istr2); // TODO: check result?
10611061
executeRules("define", tokenlist);
@@ -1133,7 +1133,7 @@ unsigned int CppCheck::checkFile(const FileWithDetails& file, const std::string
11331133
}
11341134

11351135
try {
1136-
TokenList tokenlist{&mSettings, file.lang()};
1136+
TokenList tokenlist{mSettings, file.lang()};
11371137

11381138
// Create tokens, skip rest of iteration if failed
11391139
Timer::run("Tokenizer::createTokens", mSettings.showtime, &s_timerResults, [&]() {

lib/importproject.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -577,7 +577,7 @@ namespace {
577577

578578
// TODO: improve evaluation
579579
const Settings s;
580-
TokenList tokenlist(&s, Standards::Language::C);
580+
TokenList tokenlist(s, Standards::Language::C);
581581
std::istringstream istr(c);
582582
tokenlist.createTokens(istr); // TODO: check result
583583
// TODO: put in a helper

lib/library.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "errortypes.h"
2323
#include "mathlib.h"
2424
#include "path.h"
25+
#include "settings.h"
2526
#include "symboldatabase.h"
2627
#include "token.h"
2728
#include "tokenlist.h"
@@ -1055,14 +1056,14 @@ Library::Error Library::loadFunction(const tinyxml2::XMLElement * const node, co
10551056
return Error(ErrorCode::OK);
10561057
}
10571058

1058-
bool Library::isIntArgValid(const Token *ftok, int argnr, const MathLib::bigint argvalue) const
1059+
bool Library::isIntArgValid(const Token *ftok, int argnr, const MathLib::bigint argvalue, const Settings& settings) const
10591060
{
10601061
const ArgumentChecks *ac = getarg(ftok, argnr);
10611062
if (!ac || ac->valid.empty())
10621063
return true;
10631064
if (ac->valid.find('.') != std::string::npos)
1064-
return isFloatArgValid(ftok, argnr, static_cast<double>(argvalue));
1065-
TokenList tokenList(nullptr, ftok->isCpp() ? Standards::Language::CPP : Standards::Language::C);
1065+
return isFloatArgValid(ftok, argnr, static_cast<double>(argvalue), settings);
1066+
TokenList tokenList(settings, ftok->isCpp() ? Standards::Language::CPP : Standards::Language::C);
10661067
gettokenlistfromvalid(ac->valid, tokenList);
10671068
for (const Token *tok = tokenList.front(); tok; tok = tok->next()) {
10681069
if (tok->isNumber() && argvalue == MathLib::toBigNumber(tok))
@@ -1077,12 +1078,12 @@ bool Library::isIntArgValid(const Token *ftok, int argnr, const MathLib::bigint
10771078
return false;
10781079
}
10791080

1080-
bool Library::isFloatArgValid(const Token *ftok, int argnr, double argvalue) const
1081+
bool Library::isFloatArgValid(const Token *ftok, int argnr, double argvalue, const Settings& settings) const
10811082
{
10821083
const ArgumentChecks *ac = getarg(ftok, argnr);
10831084
if (!ac || ac->valid.empty())
10841085
return true;
1085-
TokenList tokenList(nullptr, ftok->isCpp() ? Standards::Language::CPP : Standards::Language::C);
1086+
TokenList tokenList(settings, ftok->isCpp() ? Standards::Language::CPP : Standards::Language::C);
10861087
gettokenlistfromvalid(ac->valid, tokenList);
10871088
for (const Token *tok = tokenList.front(); tok; tok = tok->next()) {
10881089
if (Token::Match(tok, "%num% : %num%") && argvalue >= MathLib::toDoubleNumber(tok) && argvalue <= MathLib::toDoubleNumber(tok->tokAt(2)))

lib/library.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
#include <vector>
3737

3838
class Token;
39+
class Settings; // TODO: remove dependency on settings
3940
enum class Severity : std::uint8_t;
4041

4142
namespace tinyxml2 {
@@ -346,8 +347,8 @@ class CPPCHECKLIB Library {
346347
return arg && arg->strz;
347348
}
348349

349-
bool isIntArgValid(const Token *ftok, int argnr, MathLib::bigint argvalue) const;
350-
bool isFloatArgValid(const Token *ftok, int argnr, double argvalue) const;
350+
bool isIntArgValid(const Token *ftok, int argnr, MathLib::bigint argvalue, const Settings& settings) const;
351+
bool isFloatArgValid(const Token *ftok, int argnr, double argvalue, const Settings& settings) const;
351352

352353
const std::string& validarg(const Token *ftok, int argnr) const {
353354
const ArgumentChecks *arg = getarg(ftok, argnr);

lib/programmemory.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1750,7 +1750,7 @@ static std::shared_ptr<Token> createTokenFromExpression(const std::string& retur
17501750
bool cpp,
17511751
std::unordered_map<nonneg int, const Token*>& lookupVarId)
17521752
{
1753-
std::shared_ptr<TokenList> tokenList = std::make_shared<TokenList>(&settings, cpp ? Standards::Language::CPP : Standards::Language::C);
1753+
std::shared_ptr<TokenList> tokenList = std::make_shared<TokenList>(settings, cpp ? Standards::Language::CPP : Standards::Language::C);
17541754
{
17551755
const std::string code = "return " + returnValue + ";";
17561756
std::istringstream istr(code);

lib/symboldatabase.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1808,7 +1808,7 @@ void SymbolDatabase::setArrayDimensionsUsingValueFlow()
18081808

18091809
// In template arguments, there might not be AST
18101810
// Determine size by using the "raw tokens"
1811-
TokenList tokenList(&mSettings, dimension.tok->isCpp() ? Standards::Language::CPP : Standards::Language::C);
1811+
TokenList tokenList(mSettings, dimension.tok->isCpp() ? Standards::Language::CPP : Standards::Language::C);
18121812
tokenList.addtoken(";", 0, 0, 0, false);
18131813
bool fail = false;
18141814
for (const Token *tok = dimension.tok; tok && !Token::Match(tok, "[,>]"); tok = tok->next()) {
@@ -7292,7 +7292,7 @@ static const Token* parsedecl(const Token* type,
72927292
else if (Token::simpleMatch(type, "volatile"))
72937293
valuetype->volatileness |= (1 << (valuetype->pointer - pointer0));
72947294
else if (settings.clang && type->str().size() > 2 && type->str().find("::") < type->str().find('<')) {
7295-
TokenList typeTokens(&settings, type->isCpp() ? Standards::Language::CPP : Standards::Language::C);
7295+
TokenList typeTokens(settings, type->isCpp() ? Standards::Language::CPP : Standards::Language::C);
72967296
std::string::size_type pos1 = 0;
72977297
do {
72987298
const std::string::size_type pos2 = type->str().find("::", pos1);
@@ -7715,7 +7715,7 @@ void SymbolDatabase::setValueTypeInTokenList(bool reportDebugWarnings, Token *to
77157715
const std::string& typestr(mSettings.library.returnValueType(tok->previous()));
77167716
if (!typestr.empty()) {
77177717
ValueType valuetype;
7718-
TokenList tokenList(&mSettings, tok->isCpp() ? Standards::Language::CPP : Standards::Language::C);
7718+
TokenList tokenList(mSettings, tok->isCpp() ? Standards::Language::CPP : Standards::Language::C);
77197719
std::istringstream istr(typestr+";");
77207720
tokenList.createTokens(istr); // TODO: check result?
77217721
tokenList.simplifyStdType();
@@ -7805,7 +7805,7 @@ void SymbolDatabase::setValueTypeInTokenList(bool reportDebugWarnings, Token *to
78057805
}
78067806
continue;
78077807
}
7808-
TokenList tokenList(&mSettings, tok->isCpp() ? Standards::Language::CPP : Standards::Language::C);
7808+
TokenList tokenList(mSettings, tok->isCpp() ? Standards::Language::CPP : Standards::Language::C);
78097809
std::istringstream istr(typestr+";");
78107810
if (tokenList.createTokens(istr)) {
78117811
ValueType vt;

lib/token.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1955,8 +1955,8 @@ const ValueFlow::Value * Token::getInvalidValue(const Token *ftok, nonneg int ar
19551955
for (auto it = mImpl->mValues->begin(); it != mImpl->mValues->end(); ++it) {
19561956
if (it->isImpossible())
19571957
continue;
1958-
if ((it->isIntValue() && !settings.library.isIntArgValid(ftok, argnr, it->intvalue)) ||
1959-
(it->isFloatValue() && !settings.library.isFloatArgValid(ftok, argnr, it->floatValue))) {
1958+
if ((it->isIntValue() && !settings.library.isIntArgValid(ftok, argnr, it->intvalue, settings)) ||
1959+
(it->isFloatValue() && !settings.library.isFloatArgValid(ftok, argnr, it->floatValue, settings))) {
19601960
if (!ret || ret->isInconclusive() || (ret->condition && !it->isInconclusive()))
19611961
ret = &(*it);
19621962
if (!ret->isInconclusive() && !ret->condition)

0 commit comments

Comments
 (0)