Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -587,7 +587,7 @@ $(libcppdir)/infer.o: lib/infer.cpp lib/calculate.h lib/config.h lib/errortypes.
$(libcppdir)/keywords.o: lib/keywords.cpp lib/config.h lib/keywords.h lib/standards.h lib/utils.h
$(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/keywords.cpp

$(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
$(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
$(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ $(libcppdir)/library.cpp

$(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
Expand Down
4 changes: 2 additions & 2 deletions lib/checkfunctions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -131,9 +131,9 @@ void CheckFunctions::invalidFunctionUsage()
invalidFunctionArgBoolError(argtok, functionToken->str(), argnr);

// Are the values 0 and 1 valid?
else if (!mSettings->library.isIntArgValid(functionToken, argnr, 0))
else if (!mSettings->library.isIntArgValid(functionToken, argnr, 0, *mSettings))
invalidFunctionArgError(argtok, functionToken->str(), argnr, nullptr, mSettings->library.validarg(functionToken, argnr));
else if (!mSettings->library.isIntArgValid(functionToken, argnr, 1))
else if (!mSettings->library.isIntArgValid(functionToken, argnr, 1, *mSettings))
invalidFunctionArgError(argtok, functionToken->str(), argnr, nullptr, mSettings->library.validarg(functionToken, argnr));
}
// check <strz>
Expand Down
2 changes: 1 addition & 1 deletion lib/clangimport.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -677,7 +677,7 @@ void clangimport::AstNode::setValueType(Token *tok)
// TODO
continue;

TokenList decl(nullptr, tok->isCpp() ? Standards::Language::CPP : Standards::Language::C);
TokenList decl(mData->mSettings, tok->isCpp() ? Standards::Language::CPP : Standards::Language::C);
addTypeTokens(decl, type, tok->scope());
if (!decl.front())
break;
Expand Down
8 changes: 4 additions & 4 deletions lib/cppcheck.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -715,7 +715,7 @@ unsigned int CppCheck::checkClang(const FileWithDetails &file)
}

try {
TokenList tokenlist{&mSettings, file.lang()};
TokenList tokenlist{mSettings, file.lang()};
tokenlist.appendFileIfNew(file.spath());
Tokenizer tokenizer(std::move(tokenlist), mSettings, mErrorLogger);
std::istringstream ast(output2);
Expand Down Expand Up @@ -911,7 +911,7 @@ unsigned int CppCheck::checkFile(const FileWithDetails& file, const std::string
if (mUnusedFunctionsCheck && (mSettings.useSingleJob() || analyzerInformation)) {
std::size_t hash = 0;
// markup files are special and do not adhere to the enforced language
TokenList tokenlist{&mSettings, Standards::Language::C};
TokenList tokenlist{mSettings, Standards::Language::C};
if (fileStream) {
std::vector<std::string> files;
simplecpp::TokenList tokens(*fileStream, files, file.spath());
Expand Down Expand Up @@ -1055,7 +1055,7 @@ unsigned int CppCheck::checkFile(const FileWithDetails& file, const std::string
if (startsWith(dir.str,"#define ") || startsWith(dir.str,"#include "))
code += "#line " + std::to_string(dir.linenr) + " \"" + dir.file + "\"\n" + dir.str + '\n';
}
TokenList tokenlist(&mSettings, file.lang());
TokenList tokenlist(mSettings, file.lang());
std::istringstream istr2(code);
tokenlist.createTokens(istr2); // TODO: check result?
executeRules("define", tokenlist);
Expand Down Expand Up @@ -1133,7 +1133,7 @@ unsigned int CppCheck::checkFile(const FileWithDetails& file, const std::string
}

try {
TokenList tokenlist{&mSettings, file.lang()};
TokenList tokenlist{mSettings, file.lang()};

// Create tokens, skip rest of iteration if failed
Timer::run("Tokenizer::createTokens", mSettings.showtime, &s_timerResults, [&]() {
Expand Down
2 changes: 1 addition & 1 deletion lib/importproject.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -577,7 +577,7 @@ namespace {

// TODO: improve evaluation
const Settings s;
TokenList tokenlist(&s, Standards::Language::C);
TokenList tokenlist(s, Standards::Language::C);
std::istringstream istr(c);
tokenlist.createTokens(istr); // TODO: check result
// TODO: put in a helper
Expand Down
11 changes: 6 additions & 5 deletions lib/library.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#include "errortypes.h"
#include "mathlib.h"
#include "path.h"
#include "settings.h"
#include "symboldatabase.h"
#include "token.h"
#include "tokenlist.h"
Expand Down Expand Up @@ -1055,14 +1056,14 @@ Library::Error Library::loadFunction(const tinyxml2::XMLElement * const node, co
return Error(ErrorCode::OK);
}

bool Library::isIntArgValid(const Token *ftok, int argnr, const MathLib::bigint argvalue) const
bool Library::isIntArgValid(const Token *ftok, int argnr, const MathLib::bigint argvalue, const Settings& settings) const
{
const ArgumentChecks *ac = getarg(ftok, argnr);
if (!ac || ac->valid.empty())
return true;
if (ac->valid.find('.') != std::string::npos)
return isFloatArgValid(ftok, argnr, static_cast<double>(argvalue));
TokenList tokenList(nullptr, ftok->isCpp() ? Standards::Language::CPP : Standards::Language::C);
return isFloatArgValid(ftok, argnr, static_cast<double>(argvalue), settings);
TokenList tokenList(settings, ftok->isCpp() ? Standards::Language::CPP : Standards::Language::C);
gettokenlistfromvalid(ac->valid, tokenList);
for (const Token *tok = tokenList.front(); tok; tok = tok->next()) {
if (tok->isNumber() && argvalue == MathLib::toBigNumber(tok))
Expand All @@ -1077,12 +1078,12 @@ bool Library::isIntArgValid(const Token *ftok, int argnr, const MathLib::bigint
return false;
}

bool Library::isFloatArgValid(const Token *ftok, int argnr, double argvalue) const
bool Library::isFloatArgValid(const Token *ftok, int argnr, double argvalue, const Settings& settings) const
{
const ArgumentChecks *ac = getarg(ftok, argnr);
if (!ac || ac->valid.empty())
return true;
TokenList tokenList(nullptr, ftok->isCpp() ? Standards::Language::CPP : Standards::Language::C);
TokenList tokenList(settings, ftok->isCpp() ? Standards::Language::CPP : Standards::Language::C);
gettokenlistfromvalid(ac->valid, tokenList);
for (const Token *tok = tokenList.front(); tok; tok = tok->next()) {
if (Token::Match(tok, "%num% : %num%") && argvalue >= MathLib::toDoubleNumber(tok) && argvalue <= MathLib::toDoubleNumber(tok->tokAt(2)))
Expand Down
5 changes: 3 additions & 2 deletions lib/library.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
#include <vector>

class Token;
class Settings; // TODO: remove dependency on settings
enum class Severity : std::uint8_t;

namespace tinyxml2 {
Expand Down Expand Up @@ -346,8 +347,8 @@ class CPPCHECKLIB Library {
return arg && arg->strz;
}

bool isIntArgValid(const Token *ftok, int argnr, MathLib::bigint argvalue) const;
bool isFloatArgValid(const Token *ftok, int argnr, double argvalue) const;
bool isIntArgValid(const Token *ftok, int argnr, MathLib::bigint argvalue, const Settings& settings) const;
bool isFloatArgValid(const Token *ftok, int argnr, double argvalue, const Settings& settings) const;

const std::string& validarg(const Token *ftok, int argnr) const {
const ArgumentChecks *arg = getarg(ftok, argnr);
Expand Down
2 changes: 1 addition & 1 deletion lib/programmemory.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1750,7 +1750,7 @@ static std::shared_ptr<Token> createTokenFromExpression(const std::string& retur
bool cpp,
std::unordered_map<nonneg int, const Token*>& lookupVarId)
{
std::shared_ptr<TokenList> tokenList = std::make_shared<TokenList>(&settings, cpp ? Standards::Language::CPP : Standards::Language::C);
std::shared_ptr<TokenList> tokenList = std::make_shared<TokenList>(settings, cpp ? Standards::Language::CPP : Standards::Language::C);
{
const std::string code = "return " + returnValue + ";";
std::istringstream istr(code);
Expand Down
8 changes: 4 additions & 4 deletions lib/symboldatabase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1808,7 +1808,7 @@ void SymbolDatabase::setArrayDimensionsUsingValueFlow()

// In template arguments, there might not be AST
// Determine size by using the "raw tokens"
TokenList tokenList(&mSettings, dimension.tok->isCpp() ? Standards::Language::CPP : Standards::Language::C);
TokenList tokenList(mSettings, dimension.tok->isCpp() ? Standards::Language::CPP : Standards::Language::C);
tokenList.addtoken(";", 0, 0, 0, false);
bool fail = false;
for (const Token *tok = dimension.tok; tok && !Token::Match(tok, "[,>]"); tok = tok->next()) {
Expand Down Expand Up @@ -7292,7 +7292,7 @@ static const Token* parsedecl(const Token* type,
else if (Token::simpleMatch(type, "volatile"))
valuetype->volatileness |= (1 << (valuetype->pointer - pointer0));
else if (settings.clang && type->str().size() > 2 && type->str().find("::") < type->str().find('<')) {
TokenList typeTokens(&settings, type->isCpp() ? Standards::Language::CPP : Standards::Language::C);
TokenList typeTokens(settings, type->isCpp() ? Standards::Language::CPP : Standards::Language::C);
std::string::size_type pos1 = 0;
do {
const std::string::size_type pos2 = type->str().find("::", pos1);
Expand Down Expand Up @@ -7715,7 +7715,7 @@ void SymbolDatabase::setValueTypeInTokenList(bool reportDebugWarnings, Token *to
const std::string& typestr(mSettings.library.returnValueType(tok->previous()));
if (!typestr.empty()) {
ValueType valuetype;
TokenList tokenList(&mSettings, tok->isCpp() ? Standards::Language::CPP : Standards::Language::C);
TokenList tokenList(mSettings, tok->isCpp() ? Standards::Language::CPP : Standards::Language::C);
std::istringstream istr(typestr+";");
tokenList.createTokens(istr); // TODO: check result?
tokenList.simplifyStdType();
Expand Down Expand Up @@ -7805,7 +7805,7 @@ void SymbolDatabase::setValueTypeInTokenList(bool reportDebugWarnings, Token *to
}
continue;
}
TokenList tokenList(&mSettings, tok->isCpp() ? Standards::Language::CPP : Standards::Language::C);
TokenList tokenList(mSettings, tok->isCpp() ? Standards::Language::CPP : Standards::Language::C);
std::istringstream istr(typestr+";");
if (tokenList.createTokens(istr)) {
ValueType vt;
Expand Down
4 changes: 2 additions & 2 deletions lib/token.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1955,8 +1955,8 @@ const ValueFlow::Value * Token::getInvalidValue(const Token *ftok, nonneg int ar
for (auto it = mImpl->mValues->begin(); it != mImpl->mValues->end(); ++it) {
if (it->isImpossible())
continue;
if ((it->isIntValue() && !settings.library.isIntArgValid(ftok, argnr, it->intvalue)) ||
(it->isFloatValue() && !settings.library.isFloatArgValid(ftok, argnr, it->floatValue))) {
if ((it->isIntValue() && !settings.library.isIntArgValid(ftok, argnr, it->intvalue, settings)) ||
(it->isFloatValue() && !settings.library.isFloatArgValid(ftok, argnr, it->floatValue, settings))) {
if (!ret || ret->isInconclusive() || (ret->condition && !it->isInconclusive()))
ret = &(*it);
if (!ret->isInconclusive() && !ret->condition)
Expand Down
2 changes: 1 addition & 1 deletion lib/tokenize.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10870,7 +10870,7 @@ bool Tokenizer::isPacked(const Token * bodyStart) const

void Tokenizer::getErrorMessages(ErrorLogger& errorLogger, const Settings& settings)
{
TokenList tokenlist{&settings, Standards::Language::C};
TokenList tokenlist{settings, Standards::Language::C};
Tokenizer tokenizer(std::move(tokenlist), settings, errorLogger);
tokenizer.invalidConstFunctionTypeError(nullptr);
// checkLibraryNoReturn
Expand Down
45 changes: 16 additions & 29 deletions lib/tokenlist.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@
static constexpr int AST_MAX_DEPTH = 150;


TokenList::TokenList(const Settings* settings, Standards::Language lang)
TokenList::TokenList(const Settings& settings, Standards::Language lang)
: mTokensFrontBack(new TokensFrontBack)
, mSettings(settings)
{
Expand Down Expand Up @@ -102,7 +102,7 @@ void TokenList::determineCppC()
// only try to determine if it wasn't enforced
if (mLang == Standards::Language::None) {
ASSERT_LANG(!getSourceFilePath().empty());
mLang = Path::identify(getSourceFilePath(), mSettings ? mSettings->cppHeaderProbe : false);
mLang = Path::identify(getSourceFilePath(), mSettings.cppHeaderProbe);
// TODO: cannot enable assert as this might occur for unknown extensions
//ASSERT_LANG(mLang != Standards::Language::None);
if (mLang == Standards::Language::None) {
Expand Down Expand Up @@ -408,9 +408,9 @@ void TokenList::createTokens(simplecpp::TokenList&& tokenList)
tokenList.deleteToken(tok->previous);
}

if (mSettings && mSettings->relativePaths) {
if (mSettings.relativePaths) {
for (std::string & mFile : mFiles)
mFile = Path::getRelativePath(mFile, mSettings->basePaths);
mFile = Path::getRelativePath(mFile, mSettings.basePaths);
}

Token::assignProgressValues(mTokensFrontBack->front);
Expand Down Expand Up @@ -2006,20 +2006,17 @@ bool TokenList::validateToken(const Token* tok) const

void TokenList::simplifyPlatformTypes()
{
if (!mSettings)
return;

const bool isCPP11 = isCPP() && (mSettings->standards.cpp >= Standards::CPP11);
const bool isCPP11 = isCPP() && (mSettings.standards.cpp >= Standards::CPP11);

enum : std::uint8_t { isLongLong, isLong, isInt } type;

/** @todo This assumes a flat address space. Not true for segmented address space (FAR *). */

if (mSettings->platform.sizeof_size_t == mSettings->platform.sizeof_long)
if (mSettings.platform.sizeof_size_t == mSettings.platform.sizeof_long)
type = isLong;
else if (mSettings->platform.sizeof_size_t == mSettings->platform.sizeof_long_long)
else if (mSettings.platform.sizeof_size_t == mSettings.platform.sizeof_long_long)
type = isLongLong;
else if (mSettings->platform.sizeof_size_t == mSettings->platform.sizeof_int)
else if (mSettings.platform.sizeof_size_t == mSettings.platform.sizeof_int)
type = isInt;
else
return;
Expand Down Expand Up @@ -2072,13 +2069,13 @@ void TokenList::simplifyPlatformTypes()
}
}

const std::string platform_type(mSettings->platform.toString());
const std::string platform_type(mSettings.platform.toString());

for (Token *tok = front(); tok; tok = tok->next()) {
if (tok->tokType() != Token::eType && tok->tokType() != Token::eName)
continue;

const Library::PlatformType * const platformtype = mSettings->library.platform_type(tok->str(), platform_type);
const Library::PlatformType * const platformtype = mSettings.library.platform_type(tok->str(), platform_type);

if (platformtype) {
// check for namespace
Expand Down Expand Up @@ -2166,7 +2163,7 @@ void TokenList::simplifyStdType()
continue;
}

if (Token::Match(tok, "char|short|int|long|unsigned|signed|double|float") || (isC() && (!mSettings || (mSettings->standards.c >= Standards::C99)) && Token::Match(tok, "complex|_Complex"))) {
if (Token::Match(tok, "char|short|int|long|unsigned|signed|double|float") || (isC() && (mSettings.standards.c >= Standards::C99) && Token::Match(tok, "complex|_Complex"))) {
bool isFloat= false;
bool isSigned = false;
bool isUnsigned = false;
Expand All @@ -2189,7 +2186,7 @@ void TokenList::simplifyStdType()
else if (Token::Match(tok2, "float|double")) {
isFloat = true;
typeSpec = tok2;
} else if (isC() && (!mSettings || (mSettings->standards.c >= Standards::C99)) && Token::Match(tok2, "complex|_Complex"))
} else if (isC() && (mSettings.standards.c >= Standards::C99) && Token::Match(tok2, "complex|_Complex"))
isComplex = !isFloat || tok2->str() == "_Complex" || Token::Match(tok2->next(), "*|&|%name%"); // Ensure that "complex" is not the variables name
else if (Token::Match(tok2, "char|int")) {
if (!typeSpec)
Expand Down Expand Up @@ -2234,13 +2231,8 @@ bool TokenList::isKeyword(const std::string &str) const
if (cpp_types.find(str) != cpp_types.end())
return false;

if (mSettings) {
const auto &cpp_keywords = Keywords::getAll(mSettings->standards.cpp);
return cpp_keywords.find(str) != cpp_keywords.end();
}

static const auto& latest_cpp_keywords = Keywords::getAll(Standards::cppstd_t::CPPLatest);
return latest_cpp_keywords.find(str) != latest_cpp_keywords.end();
const auto &cpp_keywords = Keywords::getAll(mSettings.standards.cpp);
return cpp_keywords.find(str) != cpp_keywords.end();
}

// TODO: integrate into Keywords?
Expand All @@ -2249,13 +2241,8 @@ bool TokenList::isKeyword(const std::string &str) const
if (c_types.find(str) != c_types.end())
return false;

if (mSettings) {
const auto &c_keywords = Keywords::getAll(mSettings->standards.c);
return c_keywords.find(str) != c_keywords.end();
}

static const auto& latest_c_keywords = Keywords::getAll(Standards::cstd_t::CLatest);
return latest_c_keywords.find(str) != latest_c_keywords.end();
const auto &c_keywords = Keywords::getAll(mSettings.standards.c);
return c_keywords.find(str) != c_keywords.end();
}

bool TokenList::isC() const
Expand Down
5 changes: 2 additions & 3 deletions lib/tokenlist.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,7 @@ struct TokensFrontBack {

class CPPCHECKLIB TokenList {
public:
// TODO: pass settings as reference
explicit TokenList(const Settings* settings, Standards::Language lang);
explicit TokenList(const Settings& settings, Standards::Language lang);
~TokenList();

TokenList(const TokenList &) = delete;
Expand Down Expand Up @@ -219,7 +218,7 @@ class CPPCHECKLIB TokenList {
std::vector<std::string> mOrigFiles;

/** settings */
const Settings* const mSettings{};
const Settings& mSettings;

/** File is known to be C/C++ code */
Standards::Language mLang{Standards::Language::None};
Expand Down
Loading
Loading