From dfed93049fa8409be5e269b5af0645587cb9efa0 Mon Sep 17 00:00:00 2001 From: firewave Date: Mon, 20 Feb 2023 21:52:55 +0100 Subject: [PATCH] avoid more unchecked pointer dereferences --- lib/astutils.cpp | 10 ++++----- lib/astutils.h | 2 +- lib/check.h | 4 +--- lib/checkbufferoverrun.cpp | 12 +++++----- lib/checkbufferoverrun.h | 8 +++---- lib/checkclass.cpp | 10 ++++----- lib/checkclass.h | 2 +- lib/checkleakautovar.cpp | 2 +- lib/checknullpointer.cpp | 46 ++++++++++++++++++-------------------- lib/checknullpointer.h | 6 ++--- lib/checkother.cpp | 2 +- lib/checkstl.cpp | 2 +- lib/checkuninitvar.cpp | 10 ++++----- lib/checkuninitvar.h | 2 +- lib/cppcheck.cpp | 4 ++-- lib/ctu.cpp | 30 ++++++++++++------------- lib/ctu.h | 12 +++++----- lib/summaries.cpp | 8 +++---- lib/summaries.h | 2 +- lib/tokenize.cpp | 14 ++++++------ test/testbufferoverrun.cpp | 4 ++-- test/testclass.cpp | 4 ++-- test/testnullpointer.cpp | 8 +++---- test/testsummaries.cpp | 2 +- test/testuninitvar.cpp | 4 ++-- 25 files changed, 103 insertions(+), 107 deletions(-) diff --git a/lib/astutils.cpp b/lib/astutils.cpp index 6a99cb2e6b5..bd832a8b852 100644 --- a/lib/astutils.cpp +++ b/lib/astutils.cpp @@ -3286,7 +3286,7 @@ bool isConstVarExpression(const Token *tok, const std::functionastParent() && tok->astParent()->isUnaryOp("&"); @@ -3326,11 +3326,11 @@ static ExprUsage getFunctionUsage(const Token* tok, int indirect, const Settings if (ftok->variable()->isStlType() || (ftok->variable()->valueType() && ftok->variable()->valueType()->container)) // STL types or containers don't initialize external variables return ExprUsage::Used; } else { - const bool isnullbad = settings->library.isnullargbad(ftok, argnr + 1); + const bool isnullbad = settings.library.isnullargbad(ftok, argnr + 1); if (indirect == 0 && astIsPointer(tok) && !addressOf && isnullbad) return ExprUsage::Used; bool hasIndirect = false; - const bool isuninitbad = settings->library.isuninitargbad(ftok, argnr + 1, indirect, &hasIndirect); + const bool isuninitbad = settings.library.isuninitargbad(ftok, argnr + 1, indirect, &hasIndirect); if (isuninitbad && (!addressOf || isnullbad)) return ExprUsage::Used; } @@ -3349,7 +3349,7 @@ bool isLeafDot(const Token* tok) return isLeafDot(parent); } -ExprUsage getExprUsage(const Token* tok, int indirect, const Settings* settings) +ExprUsage getExprUsage(const Token* tok, int indirect, const Settings& settings) { const Token* parent = tok->astParent(); if (indirect > 0 && parent) { @@ -3365,7 +3365,7 @@ ExprUsage getExprUsage(const Token* tok, int indirect, const Settings* settings) return ExprUsage::NotUsed; if (Token::simpleMatch(parent, ":") && Token::simpleMatch(parent->astParent(), "?")) return getExprUsage(parent->astParent(), indirect, settings); - if (isUsedAsBool(tok, settings)) + if (isUsedAsBool(tok, &settings)) return ExprUsage::NotUsed; } if (indirect == 0) { diff --git a/lib/astutils.h b/lib/astutils.h index 1526d00a7d7..6c296b4e9ee 100644 --- a/lib/astutils.h +++ b/lib/astutils.h @@ -439,7 +439,7 @@ bool isLeafDot(const Token* tok); enum class ExprUsage { None, NotUsed, PassedByReference, Used, Inconclusive }; -ExprUsage getExprUsage(const Token* tok, int indirect, const Settings* settings); +ExprUsage getExprUsage(const Token* tok, int indirect, const Settings& settings); const Variable *getLHSVariable(const Token *tok); diff --git a/lib/check.h b/lib/check.h index 91930a37450..ab7f3ccad13 100644 --- a/lib/check.h +++ b/lib/check.h @@ -109,9 +109,7 @@ class CPPCHECKLIB Check { } }; - virtual FileInfo * getFileInfo(const Tokenizer *tokenizer, const Settings *settings) const { - (void)tokenizer; - (void)settings; + virtual FileInfo * getFileInfo(const Tokenizer& /*tokenizer*/, const Settings& /*settings*/) const { return nullptr; } diff --git a/lib/checkbufferoverrun.cpp b/lib/checkbufferoverrun.cpp index 5c5cc5e0c81..884ca51f2f3 100644 --- a/lib/checkbufferoverrun.cpp +++ b/lib/checkbufferoverrun.cpp @@ -915,11 +915,11 @@ namespace }; } -bool CheckBufferOverrun::isCtuUnsafeBufferUsage(const Settings *settings, const Token *argtok, MathLib::bigint *offset, int type) +bool CheckBufferOverrun::isCtuUnsafeBufferUsage(const Settings &settings, const Token *argtok, MathLib::bigint *offset, int type) { if (!offset) return false; - if (!argtok->valueType() || argtok->valueType()->typeSize(settings->platform) == 0) + if (!argtok->valueType() || argtok->valueType()->typeSize(settings.platform) == 0) return false; const Token *indexTok = nullptr; if (type == 1 && Token::Match(argtok, "%name% [") && argtok->astParent() == argtok->next() && !Token::simpleMatch(argtok->linkAt(1), "] [")) @@ -932,22 +932,22 @@ bool CheckBufferOverrun::isCtuUnsafeBufferUsage(const Settings *settings, const return false; if (!indexTok->hasKnownIntValue()) return false; - *offset = indexTok->getKnownIntValue() * argtok->valueType()->typeSize(settings->platform); + *offset = indexTok->getKnownIntValue() * argtok->valueType()->typeSize(settings.platform); return true; } -bool CheckBufferOverrun::isCtuUnsafeArrayIndex(const Settings *settings, const Token *argtok, MathLib::bigint *offset) +bool CheckBufferOverrun::isCtuUnsafeArrayIndex(const Settings &settings, const Token *argtok, MathLib::bigint *offset) { return isCtuUnsafeBufferUsage(settings, argtok, offset, 1); } -bool CheckBufferOverrun::isCtuUnsafePointerArith(const Settings *settings, const Token *argtok, MathLib::bigint *offset) +bool CheckBufferOverrun::isCtuUnsafePointerArith(const Settings &settings, const Token *argtok, MathLib::bigint *offset) { return isCtuUnsafeBufferUsage(settings, argtok, offset, 2); } /** @brief Parse current TU and extract file info */ -Check::FileInfo *CheckBufferOverrun::getFileInfo(const Tokenizer *tokenizer, const Settings *settings) const +Check::FileInfo *CheckBufferOverrun::getFileInfo(const Tokenizer &tokenizer, const Settings &settings) const { const std::list &unsafeArrayIndex = CTU::getUnsafeUsage(tokenizer, settings, isCtuUnsafeArrayIndex); const std::list &unsafePointerArith = CTU::getUnsafeUsage(tokenizer, settings, isCtuUnsafePointerArith); diff --git a/lib/checkbufferoverrun.h b/lib/checkbufferoverrun.h index e97cf518848..b993dafdfbb 100644 --- a/lib/checkbufferoverrun.h +++ b/lib/checkbufferoverrun.h @@ -92,7 +92,7 @@ class CPPCHECKLIB CheckBufferOverrun : public Check { } /** @brief Parse current TU and extract file info */ - Check::FileInfo *getFileInfo(const Tokenizer *tokenizer, const Settings *settings) const override; + Check::FileInfo *getFileInfo(const Tokenizer &tokenizer, const Settings &settings) const override; /** @brief Analyse all file infos for all TU */ bool analyseWholeProgram(const CTU::FileInfo *ctu, const std::list &fileInfo, const Settings& settings, ErrorLogger &errorLogger) override; @@ -130,9 +130,9 @@ class CPPCHECKLIB CheckBufferOverrun : public Check { ValueFlow::Value getBufferSize(const Token *bufTok) const; // CTU - static bool isCtuUnsafeBufferUsage(const Settings *settings, const Token *argtok, MathLib::bigint *offset, int type); - static bool isCtuUnsafeArrayIndex(const Settings *settings, const Token *argtok, MathLib::bigint *offset); - static bool isCtuUnsafePointerArith(const Settings *settings, const Token *argtok, MathLib::bigint *offset); + static bool isCtuUnsafeBufferUsage(const Settings &settings, const Token *argtok, MathLib::bigint *offset, int type); + static bool isCtuUnsafeArrayIndex(const Settings &settings, const Token *argtok, MathLib::bigint *offset); + static bool isCtuUnsafePointerArith(const Settings &settings, const Token *argtok, MathLib::bigint *offset); Check::FileInfo * loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement) const override; static bool analyseWholeProgram1(const std::map> &callsMap, const CTU::FileInfo::UnsafeUsage &unsafeUsage, int type, ErrorLogger &errorLogger); diff --git a/lib/checkclass.cpp b/lib/checkclass.cpp index ab5f9b77a55..7dc6c3f1468 100644 --- a/lib/checkclass.cpp +++ b/lib/checkclass.cpp @@ -3533,14 +3533,14 @@ namespace }; } -Check::FileInfo *CheckClass::getFileInfo(const Tokenizer *tokenizer, const Settings *settings) const +Check::FileInfo *CheckClass::getFileInfo(const Tokenizer &tokenizer, const Settings& /*settings*/) const { - if (!tokenizer->isCPP()) + if (!tokenizer.isCPP()) return nullptr; - (void)settings; + // One definition rule std::vector classDefinitions; - for (const Scope * classScope : tokenizer->getSymbolDatabase()->classAndStructScopes) { + for (const Scope * classScope : tokenizer.getSymbolDatabase()->classAndStructScopes) { if (classScope->isAnonymous()) continue; @@ -3575,7 +3575,7 @@ Check::FileInfo *CheckClass::getFileInfo(const Tokenizer *tokenizer, const Setti MyFileInfo::NameLoc nameLoc; nameLoc.className = std::move(name); - nameLoc.fileName = tokenizer->list.file(classScope->classDef); + nameLoc.fileName = tokenizer.list.file(classScope->classDef); nameLoc.lineNumber = classScope->classDef->linenr(); nameLoc.column = classScope->classDef->column(); diff --git a/lib/checkclass.h b/lib/checkclass.h index ac81b698a54..820b14ab858 100644 --- a/lib/checkclass.h +++ b/lib/checkclass.h @@ -168,7 +168,7 @@ class CPPCHECKLIB CheckClass : public Check { void checkUnsafeClassRefMember(); /** @brief Parse current TU and extract file info */ - Check::FileInfo *getFileInfo(const Tokenizer *tokenizer, const Settings *settings) const override; + Check::FileInfo *getFileInfo(const Tokenizer &tokenizer, const Settings &settings) const override; Check::FileInfo * loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement) const override; diff --git a/lib/checkleakautovar.cpp b/lib/checkleakautovar.cpp index 266da5c50b7..de06c9f28aa 100644 --- a/lib/checkleakautovar.cpp +++ b/lib/checkleakautovar.cpp @@ -834,7 +834,7 @@ const Token * CheckLeakAutoVar::checkTokenInsideExpression(const Token * const t const std::map::const_iterator var = varInfo.alloctype.find(tok->varId()); if (var != varInfo.alloctype.end()) { bool unknown = false; - if (var->second.status == VarInfo::DEALLOC && CheckNullPointer::isPointerDeRef(tok, unknown, mSettings) && !unknown) { + if (var->second.status == VarInfo::DEALLOC && CheckNullPointer::isPointerDeRef(tok, unknown, *mSettings) && !unknown) { deallocUseError(tok, tok->str()); } else if (Token::simpleMatch(tok->tokAt(-2), "= &")) { varInfo.erase(tok->varId()); diff --git a/lib/checknullpointer.cpp b/lib/checknullpointer.cpp index cec36ee06dd..12c8b5ea4b1 100644 --- a/lib/checknullpointer.cpp +++ b/lib/checknullpointer.cpp @@ -62,28 +62,26 @@ static bool checkNullpointerFunctionCallPlausibility(const Function* func, unsig * @param var variables that the function read / write. * @param library --library files data */ -void CheckNullPointer::parseFunctionCall(const Token &tok, std::list &var, const Library *library) +void CheckNullPointer::parseFunctionCall(const Token &tok, std::list &var, const Library &library) { if (Token::Match(&tok, "%name% ( )") || !tok.tokAt(2)) return; const std::vector args = getArguments(&tok); - if (library || tok.function() != nullptr) { - for (int argnr = 1; argnr <= args.size(); ++argnr) { - const Token *param = args[argnr - 1]; - if (library && library->isnullargbad(&tok, argnr) && checkNullpointerFunctionCallPlausibility(tok.function(), argnr)) + for (int argnr = 1; argnr <= args.size(); ++argnr) { + const Token *param = args[argnr - 1]; + if (library.isnullargbad(&tok, argnr) && checkNullpointerFunctionCallPlausibility(tok.function(), argnr)) + var.push_back(param); + else if (tok.function()) { + const Variable* argVar = tok.function()->getArgumentVar(argnr-1); + if (argVar && argVar->isStlStringType() && !argVar->isArrayOrPointer()) var.push_back(param); - else if (tok.function()) { - const Variable* argVar = tok.function()->getArgumentVar(argnr-1); - if (argVar && argVar->isStlStringType() && !argVar->isArrayOrPointer()) - var.push_back(param); - } } } - if (library && library->formatstr_function(&tok)) { - const int formatStringArgNr = library->formatstr_argno(&tok); + if (library.formatstr_function(&tok)) { + const int formatStringArgNr = library.formatstr_argno(&tok); if (formatStringArgNr < 0 || formatStringArgNr >= args.size()) return; @@ -95,7 +93,7 @@ void CheckNullPointer::parseFunctionCall(const Token &tok, std::liststrValue(); int argnr = formatStringArgNr + 1; - const bool scan = library->formatstr_scan(&tok); + const bool scan = library.formatstr_scan(&tok); bool percent = false; for (std::string::const_iterator i = formatString.cbegin(); i != formatString.cend(); ++i) { @@ -148,15 +146,15 @@ namespace { */ bool CheckNullPointer::isPointerDeRef(const Token *tok, bool &unknown) const { - return isPointerDeRef(tok, unknown, mSettings); + return isPointerDeRef(tok, unknown, *mSettings); } -bool CheckNullPointer::isPointerDeRef(const Token *tok, bool &unknown, const Settings *settings) +bool CheckNullPointer::isPointerDeRef(const Token *tok, bool &unknown, const Settings &settings) { unknown = false; // Is pointer used as function parameter? - if (Token::Match(tok->previous(), "[(,] %name% [,)]") && settings) { + if (Token::Match(tok->previous(), "[(,] %name% [,)]")) { const Token *ftok = tok->previous(); while (ftok && ftok->str() != "(") { if (ftok->str() == ")") @@ -165,7 +163,7 @@ bool CheckNullPointer::isPointerDeRef(const Token *tok, bool &unknown, const Set } if (ftok && ftok->previous()) { std::list varlist; - parseFunctionCall(*ftok->previous(), varlist, &settings->library); + parseFunctionCall(*ftok->previous(), varlist, settings.library); if (std::find(varlist.cbegin(), varlist.cend(), tok) != varlist.cend()) { return true; } @@ -263,7 +261,7 @@ bool CheckNullPointer::isPointerDeRef(const Token *tok, bool &unknown, const Set } -static bool isNullablePointer(const Token* tok, const Settings* settings) +static bool isNullablePointer(const Token* tok) { if (!tok) return false; @@ -274,7 +272,7 @@ static bool isNullablePointer(const Token* tok, const Settings* settings) if (astIsSmartPointer(tok)) return true; if (Token::simpleMatch(tok, ".")) - return isNullablePointer(tok->astOperand2(), settings); + return isNullablePointer(tok->astOperand2()); if (const Variable* var = tok->variable()) { return (var->isPointer() || var->isSmartPointer()); } @@ -294,8 +292,8 @@ void CheckNullPointer::nullPointerByDeRefAndChec() if (Token::Match(tok, "%num%|%char%|%str%")) continue; - if (!isNullablePointer(tok, mSettings) || - (tok->str() == "." && isNullablePointer(tok->astOperand2(), mSettings) && tok->astOperand2()->getValue(0))) // avoid duplicate warning + if (!isNullablePointer(tok) || + (tok->str() == "." && isNullablePointer(tok->astOperand2()) && tok->astOperand2()->getValue(0))) // avoid duplicate warning continue; // Can pointer be NULL? @@ -367,7 +365,7 @@ void CheckNullPointer::nullConstantDereference() nullPointerError(tok); } else { // function call std::list var; - parseFunctionCall(*tok, var, &mSettings->library); + parseFunctionCall(*tok, var, mSettings->library); // is one of the var items a NULL pointer? for (const Token *vartok : var) { @@ -551,7 +549,7 @@ void CheckNullPointer::redundantConditionWarning(const Token* tok, const ValueFl } // NOLINTNEXTLINE(readability-non-const-parameter) - used as callback so we need to preserve the signature -static bool isUnsafeUsage(const Settings *settings, const Token *vartok, MathLib::bigint *value) +static bool isUnsafeUsage(const Settings &settings, const Token *vartok, MathLib::bigint *value) { (void)value; bool unknown = false; @@ -580,7 +578,7 @@ namespace }; } -Check::FileInfo *CheckNullPointer::getFileInfo(const Tokenizer *tokenizer, const Settings *settings) const +Check::FileInfo *CheckNullPointer::getFileInfo(const Tokenizer &tokenizer, const Settings &settings) const { const std::list &unsafeUsage = CTU::getUnsafeUsage(tokenizer, settings, isUnsafeUsage); if (unsafeUsage.empty()) diff --git a/lib/checknullpointer.h b/lib/checknullpointer.h index 19171e337eb..53e3c98f26a 100644 --- a/lib/checknullpointer.h +++ b/lib/checknullpointer.h @@ -67,7 +67,7 @@ class CPPCHECKLIB CheckNullPointer : public Check { */ bool isPointerDeRef(const Token *tok, bool &unknown) const; - static bool isPointerDeRef(const Token *tok, bool &unknown, const Settings *settings); + static bool isPointerDeRef(const Token *tok, bool &unknown, const Settings &settings); private: /** @@ -78,7 +78,7 @@ class CPPCHECKLIB CheckNullPointer : public Check { */ static void parseFunctionCall(const Token &tok, std::list &var, - const Library *library); + const Library &library); /** @brief This constructor is used when running checks. */ CheckNullPointer(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) @@ -106,7 +106,7 @@ class CPPCHECKLIB CheckNullPointer : public Check { void nullPointerError(const Token *tok, const std::string &varname, const ValueFlow::Value* value, bool inconclusive); /** @brief Parse current TU and extract file info */ - Check::FileInfo *getFileInfo(const Tokenizer *tokenizer, const Settings *settings) const override; + Check::FileInfo *getFileInfo(const Tokenizer &tokenizer, const Settings &settings) const override; Check::FileInfo * loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement) const override; diff --git a/lib/checkother.cpp b/lib/checkother.cpp index e4fcfa73c16..9823957e525 100644 --- a/lib/checkother.cpp +++ b/lib/checkother.cpp @@ -3363,7 +3363,7 @@ void CheckOther::checkAccessOfMovedVariable() else inconclusive = true; } else { - const ExprUsage usage = getExprUsage(tok, 0, mSettings); + const ExprUsage usage = getExprUsage(tok, 0, *mSettings); if (usage == ExprUsage::Used) accessOfMoved = true; if (usage == ExprUsage::PassedByReference) diff --git a/lib/checkstl.cpp b/lib/checkstl.cpp index 5eca694028f..35218e43a06 100644 --- a/lib/checkstl.cpp +++ b/lib/checkstl.cpp @@ -2479,7 +2479,7 @@ void CheckStl::checkDereferenceInvalidIterator2() emptyAdvance = tok->astParent(); } } - if (!CheckNullPointer::isPointerDeRef(tok, unknown, mSettings) && !isInvalidIterator && !emptyAdvance) { + if (!CheckNullPointer::isPointerDeRef(tok, unknown, *mSettings) && !isInvalidIterator && !emptyAdvance) { if (!unknown) continue; inconclusive = true; diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index 6e58f0acd54..2b8e566305b 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -1641,13 +1641,13 @@ void CheckUninitVar::valueFlowUninit() const bool isarray = tok->variable()->isArray(); if (isarray && tok->variable()->isMember()) continue; // Todo: this is a bailout - const bool deref = CheckNullPointer::isPointerDeRef(tok, unknown, mSettings); + const bool deref = CheckNullPointer::isPointerDeRef(tok, unknown, *mSettings); uninitderef = deref && v->indirect == 0; const bool isleaf = isLeafDot(tok) || uninitderef; if (!isleaf && Token::Match(tok->astParent(), ". %name%") && (tok->astParent()->next()->varId() || tok->astParent()->next()->isEnumerator())) continue; } - const ExprUsage usage = getExprUsage(tok, v->indirect, mSettings); + const ExprUsage usage = getExprUsage(tok, v->indirect, *mSettings); if (usage == ExprUsage::NotUsed || usage == ExprUsage::Inconclusive) continue; if (!v->subexpressions.empty() && usage == ExprUsage::PassedByReference) @@ -1670,10 +1670,10 @@ void CheckUninitVar::valueFlowUninit() } // NOLINTNEXTLINE(readability-non-const-parameter) - used as callback so we need to preserve the signature -static bool isVariableUsage(const Settings *settings, const Token *vartok, MathLib::bigint *value) +static bool isVariableUsage(const Settings &settings, const Token *vartok, MathLib::bigint *value) { (void)value; - return CheckUninitVar::isVariableUsage(vartok, settings->library, true, CheckUninitVar::Alloc::ARRAY); + return CheckUninitVar::isVariableUsage(vartok, settings.library, true, CheckUninitVar::Alloc::ARRAY); } // a Clang-built executable will crash when using the anonymous MyFileInfo later on - so put it in a unique namespace for now @@ -1698,7 +1698,7 @@ namespace }; } -Check::FileInfo *CheckUninitVar::getFileInfo(const Tokenizer *tokenizer, const Settings *settings) const +Check::FileInfo *CheckUninitVar::getFileInfo(const Tokenizer &tokenizer, const Settings &settings) const { const std::list &unsafeUsage = CTU::getUnsafeUsage(tokenizer, settings, ::isVariableUsage); if (unsafeUsage.empty()) diff --git a/lib/checkuninitvar.h b/lib/checkuninitvar.h index 025cc9f119f..d715b5352a7 100644 --- a/lib/checkuninitvar.h +++ b/lib/checkuninitvar.h @@ -106,7 +106,7 @@ class CPPCHECKLIB CheckUninitVar : public Check { void valueFlowUninit(); /** @brief Parse current TU and extract file info */ - Check::FileInfo *getFileInfo(const Tokenizer *tokenizer, const Settings *settings) const override; + Check::FileInfo *getFileInfo(const Tokenizer &tokenizer, const Settings &settings) const override; Check::FileInfo * loadFileInfoFromXml(const tinyxml2::XMLElement *xmlElement) const override; diff --git a/lib/cppcheck.cpp b/lib/cppcheck.cpp index db1df11cd54..cfe7b624fbe 100644 --- a/lib/cppcheck.cpp +++ b/lib/cppcheck.cpp @@ -1090,7 +1090,7 @@ void CppCheck::checkNormalTokens(const Tokenizer &tokenizer) if (mSettings.useSingleJob() || !mSettings.buildDir.empty()) { // Analyse the tokens.. - if (CTU::FileInfo * const fi1 = CTU::getFileInfo(&tokenizer)) { + if (CTU::FileInfo * const fi1 = CTU::getFileInfo(tokenizer)) { if (!mSettings.buildDir.empty()) mAnalyzerInformation.setFileInfo("ctu", fi1->toString()); if (mSettings.useSingleJob()) @@ -1102,7 +1102,7 @@ void CppCheck::checkNormalTokens(const Tokenizer &tokenizer) if (!doUnusedFunctionOnly) { // cppcheck-suppress shadowFunction - TODO: fix this for (const Check *check : Check::instances()) { - if (Check::FileInfo * const fi = check->getFileInfo(&tokenizer, &mSettings)) { + if (Check::FileInfo * const fi = check->getFileInfo(tokenizer, mSettings)) { if (!mSettings.buildDir.empty()) mAnalyzerInformation.setFileInfo(check->name(), fi->toString()); if (mSettings.useSingleJob()) diff --git a/lib/ctu.cpp b/lib/ctu.cpp index 789d0c675c8..41e8a5aa0ed 100644 --- a/lib/ctu.cpp +++ b/lib/ctu.cpp @@ -57,13 +57,13 @@ static constexpr char ATTR_VALUE[] = "value"; int CTU::maxCtuDepth = 2; -std::string CTU::getFunctionId(const Tokenizer *tokenizer, const Function *function) +std::string CTU::getFunctionId(const Tokenizer &tokenizer, const Function *function) { - return tokenizer->list.file(function->tokenDef) + ':' + std::to_string(function->tokenDef->linenr()) + ':' + std::to_string(function->tokenDef->column()); + return tokenizer.list.file(function->tokenDef) + ':' + std::to_string(function->tokenDef->linenr()) + ':' + std::to_string(function->tokenDef->column()); } -CTU::FileInfo::Location::Location(const Tokenizer *tokenizer, const Token *tok) - : fileName(tokenizer->list.file(tok)) +CTU::FileInfo::Location::Location(const Tokenizer &tokenizer, const Token *tok) + : fileName(tokenizer.list.file(tok)) , lineNumber(tok->linenr()) , column(tok->column()) {} @@ -156,13 +156,13 @@ std::string CTU::toString(const std::list &unsafeUsa return ret.str(); } -CTU::FileInfo::CallBase::CallBase(const Tokenizer *tokenizer, const Token *callToken) +CTU::FileInfo::CallBase::CallBase(const Tokenizer &tokenizer, const Token *callToken) : callId(getFunctionId(tokenizer, callToken->function())) , callFunctionName(callToken->next()->astOperand1()->expressionString()) , location(CTU::FileInfo::Location(tokenizer, callToken)) {} -CTU::FileInfo::NestedCall::NestedCall(const Tokenizer *tokenizer, const Function *myFunction, const Token *callToken) +CTU::FileInfo::NestedCall::NestedCall(const Tokenizer &tokenizer, const Function *myFunction, const Token *callToken) : CallBase(tokenizer, callToken) , myId(getFunctionId(tokenizer, myFunction)) {} @@ -306,9 +306,9 @@ static int isCallFunction(const Scope *scope, int argnr, const Token *&tok) } -CTU::FileInfo *CTU::getFileInfo(const Tokenizer *tokenizer) +CTU::FileInfo *CTU::getFileInfo(const Tokenizer &tokenizer) { - const SymbolDatabase * const symbolDatabase = tokenizer->getSymbolDatabase(); + const SymbolDatabase * const symbolDatabase = tokenizer.getSymbolDatabase(); auto *fileInfo = new FileInfo; @@ -346,7 +346,7 @@ CTU::FileInfo *CTU::getFileInfo(const Tokenizer *tokenizer) functionCall.callArgValue = value.intvalue; functionCall.warning = !value.errorSeverity(); for (const ErrorPathItem &i : value.errorPath) { - const std::string& file = tokenizer->list.file(i.first); + const std::string& file = tokenizer.list.file(i.first); const std::string& info = i.second; const int line = i.first->linenr(); const int column = i.first->column(); @@ -364,7 +364,7 @@ CTU::FileInfo *CTU::getFileInfo(const Tokenizer *tokenizer) functionCall.location = FileInfo::Location(tokenizer, tok); functionCall.callArgNr = argnr + 1; functionCall.callArgumentExpression = argtok->expressionString(); - const auto typeSize = argtok->valueType()->typeSize(tokenizer->getSettings().platform); + const auto typeSize = argtok->valueType()->typeSize(tokenizer.getSettings().platform); functionCall.callArgValue = typeSize > 0 ? argtok->variable()->dimension(0) * typeSize : -1; functionCall.warning = false; fileInfo->functionCalls.push_back(std::move(functionCall)); @@ -378,7 +378,7 @@ CTU::FileInfo *CTU::getFileInfo(const Tokenizer *tokenizer) functionCall.location = FileInfo::Location(tokenizer, tok); functionCall.callArgNr = argnr + 1; functionCall.callArgumentExpression = argtok->expressionString(); - functionCall.callArgValue = argtok->astOperand1()->valueType()->typeSize(tokenizer->getSettings().platform); + functionCall.callArgValue = argtok->astOperand1()->valueType()->typeSize(tokenizer.getSettings().platform); functionCall.warning = false; fileInfo->functionCalls.push_back(std::move(functionCall)); } @@ -437,7 +437,7 @@ CTU::FileInfo *CTU::getFileInfo(const Tokenizer *tokenizer) return fileInfo; } -static std::list> getUnsafeFunction(const Settings *settings, const Scope *scope, int argnr, bool (*isUnsafeUsage)(const Settings *settings, const Token *argtok, MathLib::bigint *value)) +static std::list> getUnsafeFunction(const Settings &settings, const Scope *scope, int argnr, bool (*isUnsafeUsage)(const Settings &settings, const Token *argtok, MathLib::bigint *value)) { std::list> ret; const Variable * const argvar = scope->function->getArgumentVar(argnr); @@ -451,7 +451,7 @@ static std::list> getUnsafeFunction(co int indirect = 0; if (argvar->valueType()) indirect = argvar->valueType()->pointer; - if (isVariableChanged(tok2->link(), tok2, indirect, argvar->declarationId(), false, settings)) + if (isVariableChanged(tok2->link(), tok2, indirect, argvar->declarationId(), false, &settings)) return ret; } if (Token::Match(tok2, "%oror%|&&|?")) { @@ -469,12 +469,12 @@ static std::list> getUnsafeFunction(co return ret; } -std::list CTU::getUnsafeUsage(const Tokenizer *tokenizer, const Settings *settings, bool (*isUnsafeUsage)(const Settings *settings, const Token *argtok, MathLib::bigint *value)) +std::list CTU::getUnsafeUsage(const Tokenizer &tokenizer, const Settings &settings, bool (*isUnsafeUsage)(const Settings &settings, const Token *argtok, MathLib::bigint *value)) { std::list unsafeUsage; // Parse all functions in TU - const SymbolDatabase * const symbolDatabase = tokenizer->getSymbolDatabase(); + const SymbolDatabase * const symbolDatabase = tokenizer.getSymbolDatabase(); for (const Scope &scope : symbolDatabase->scopeList) { if (!scope.isExecutable() || scope.type != Scope::eFunction || !scope.function) diff --git a/lib/ctu.h b/lib/ctu.h index 28e4421871c..af2cd6b07f0 100644 --- a/lib/ctu.h +++ b/lib/ctu.h @@ -57,7 +57,7 @@ namespace CTU { struct Location { Location() = default; - Location(const Tokenizer *tokenizer, const Token *tok); + Location(const Tokenizer &tokenizer, const Token *tok); Location(std::string fileName, nonneg int lineNumber, nonneg int column) : fileName(std::move(fileName)), lineNumber(lineNumber), column(column) {} std::string fileName; nonneg int lineNumber{}; @@ -81,7 +81,7 @@ namespace CTU { CallBase(std::string callId, int callArgNr, std::string callFunctionName, Location loc) : callId(std::move(callId)), callArgNr(callArgNr), callFunctionName(std::move(callFunctionName)), location(std::move(loc)) {} - CallBase(const Tokenizer *tokenizer, const Token *callToken); + CallBase(const Tokenizer &tokenizer, const Token *callToken); virtual ~CallBase() = default; CallBase(const CallBase&) = default; std::string callId; @@ -114,7 +114,7 @@ namespace CTU { myId(std::move(myId)), myArgNr(myArgNr) {} - NestedCall(const Tokenizer *tokenizer, const Function *myFunction, const Token *callToken); + NestedCall(const Tokenizer &tokenizer, const Function *myFunction, const Token *callToken); std::string toXmlString() const; bool loadFromXml(const tinyxml2::XMLElement *xmlElement); @@ -141,12 +141,12 @@ namespace CTU { CPPCHECKLIB std::string toString(const std::list &unsafeUsage); - CPPCHECKLIB std::string getFunctionId(const Tokenizer *tokenizer, const Function *function); + CPPCHECKLIB std::string getFunctionId(const Tokenizer &tokenizer, const Function *function); /** @brief Parse current TU and extract file info */ - CPPCHECKLIB FileInfo *getFileInfo(const Tokenizer *tokenizer); + CPPCHECKLIB FileInfo *getFileInfo(const Tokenizer &tokenizer); - CPPCHECKLIB std::list getUnsafeUsage(const Tokenizer *tokenizer, const Settings *settings, bool (*isUnsafeUsage)(const Settings *settings, const Token *argtok, MathLib::bigint *value)); + CPPCHECKLIB std::list getUnsafeUsage(const Tokenizer &tokenizer, const Settings &settings, bool (*isUnsafeUsage)(const Settings &settings, const Token *argtok, MathLib::bigint *value)); CPPCHECKLIB std::list loadUnsafeUsageListFromXml(const tinyxml2::XMLElement *xmlElement); } diff --git a/lib/summaries.cpp b/lib/summaries.cpp index c35f66f8f49..e4dddc1e365 100644 --- a/lib/summaries.cpp +++ b/lib/summaries.cpp @@ -34,10 +34,10 @@ -std::string Summaries::create(const Tokenizer *tokenizer, const std::string &cfg) +std::string Summaries::create(const Tokenizer &tokenizer, const std::string &cfg) { - const SymbolDatabase *symbolDatabase = tokenizer->getSymbolDatabase(); - const Settings &settings = tokenizer->getSettings(); + const SymbolDatabase *symbolDatabase = tokenizer.getSymbolDatabase(); + const Settings &settings = tokenizer.getSettings(); std::ostringstream ostr; for (const Scope *scope : symbolDatabase->functionScopes) { @@ -82,7 +82,7 @@ std::string Summaries::create(const Tokenizer *tokenizer, const std::string &cfg } if (!settings.buildDir.empty()) { - std::string filename = AnalyzerInformation::getAnalyzerInfoFile(settings.buildDir, tokenizer->list.getSourceFilePath(), cfg); + std::string filename = AnalyzerInformation::getAnalyzerInfoFile(settings.buildDir, tokenizer.list.getSourceFilePath(), cfg); const std::string::size_type pos = filename.rfind(".a"); if (pos != std::string::npos) { filename[pos+1] = 's'; diff --git a/lib/summaries.h b/lib/summaries.h index 0d9bd1da8b7..11a370c0f5f 100644 --- a/lib/summaries.h +++ b/lib/summaries.h @@ -29,7 +29,7 @@ class Tokenizer; namespace Summaries { - CPPCHECKLIB std::string create(const Tokenizer *tokenizer, const std::string &cfg); + CPPCHECKLIB std::string create(const Tokenizer &tokenizer, const std::string &cfg); CPPCHECKLIB void loadReturn(const std::string &buildDir, std::set &summaryReturn); } diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 77d797eb0a4..007ab36e3fd 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -3400,7 +3400,7 @@ bool Tokenizer::simplifyTokens1(const std::string &configuration) } if (!mSettings.buildDir.empty()) - Summaries::create(this, configuration); + Summaries::create(*this, configuration); // TODO: do not run valueflow if no checks are being performed at all - e.g. unusedFunctions only const char* disableValueflowEnv = std::getenv("DISABLE_VALUEFLOW"); @@ -5232,7 +5232,7 @@ void Tokenizer::setVarIdPass2() } } -static void linkBrackets(const Tokenizer * const tokenizer, std::stack& type, std::stack& links, Token * const token, const char open, const char close) +static void linkBrackets(const Tokenizer & tokenizer, std::stack& type, std::stack& links, Token * const token, const char open, const char close) { if (token->str()[0] == open) { links.push(token); @@ -5240,10 +5240,10 @@ static void linkBrackets(const Tokenizer * const tokenizer, std::stackstr()[0] == close) { if (links.empty()) { // Error, { and } don't match. - tokenizer->unmatchedToken(token); + tokenizer.unmatchedToken(token); } if (type.top()->str()[0] != open) { - tokenizer->unmatchedToken(type.top()); + tokenizer.unmatchedToken(type.top()); } type.pop(); @@ -5263,11 +5263,11 @@ void Tokenizer::createLinks() token->link(nullptr); } - linkBrackets(this, type, links1, token, '{', '}'); + linkBrackets(*this, type, links1, token, '{', '}'); - linkBrackets(this, type, links2, token, '(', ')'); + linkBrackets(*this, type, links2, token, '(', ')'); - linkBrackets(this, type, links3, token, '[', ']'); + linkBrackets(*this, type, links3, token, '[', ']'); } if (!links1.empty()) { diff --git a/test/testbufferoverrun.cpp b/test/testbufferoverrun.cpp index 7c845c82722..82471879321 100644 --- a/test/testbufferoverrun.cpp +++ b/test/testbufferoverrun.cpp @@ -5163,12 +5163,12 @@ class TestBufferOverrun : public TestFixture { SimpleTokenizer tokenizer(settings0, *this); ASSERT_LOC(tokenizer.tokenize(code), file, line); - CTU::FileInfo *ctu = CTU::getFileInfo(&tokenizer); + CTU::FileInfo *ctu = CTU::getFileInfo(tokenizer); // Check code.. std::list fileInfo; Check& c = getCheck(); - fileInfo.push_back(c.getFileInfo(&tokenizer, &settings0)); + fileInfo.push_back(c.getFileInfo(tokenizer, settings0)); c.analyseWholeProgram(ctu, fileInfo, settings0, *this); while (!fileInfo.empty()) { delete fileInfo.back(); diff --git a/test/testclass.cpp b/test/testclass.cpp index a6ba8a202b1..c9dde77fae5 100644 --- a/test/testclass.cpp +++ b/test/testclass.cpp @@ -8854,7 +8854,7 @@ class TestClass : public TestFixture { const std::string filename = std::to_string(fileInfo.size()) + ".cpp"; ASSERT(tokenizer.list.createTokens(istr, filename)); ASSERT(tokenizer.simplifyTokens1("")); - fileInfo.push_back(check.getFileInfo(&tokenizer, &settingsDefault)); + fileInfo.push_back(check.getFileInfo(tokenizer, settingsDefault)); } // Check code.. @@ -8898,7 +8898,7 @@ class TestClass : public TestFixture { // Check.. const Check& c = getCheck(); - Check::FileInfo * fileInfo = (c.getFileInfo)(&tokenizer, &settings1); + Check::FileInfo * fileInfo = (c.getFileInfo)(tokenizer, settings1); delete fileInfo; } diff --git a/test/testnullpointer.cpp b/test/testnullpointer.cpp index 3dfaefb06c5..fadc729caf6 100644 --- a/test/testnullpointer.cpp +++ b/test/testnullpointer.cpp @@ -4153,7 +4153,7 @@ class TestNullPointer : public TestFixture { library.functions["x"].argumentChecks[3] = arg; std::list null; - CheckNullPointer::parseFunctionCall(*xtok, null, &library); + CheckNullPointer::parseFunctionCall(*xtok, null, library); ASSERT_EQUALS(0U, null.size()); } @@ -4167,7 +4167,7 @@ class TestNullPointer : public TestFixture { library.functions["x"].argumentChecks[1].notnull = true; std::list null; - CheckNullPointer::parseFunctionCall(*xtok, null, &library); + CheckNullPointer::parseFunctionCall(*xtok, null, library); ASSERT_EQUALS(1U, null.size()); ASSERT_EQUALS("a", null.front()->str()); } @@ -4483,12 +4483,12 @@ class TestNullPointer : public TestFixture { SimpleTokenizer tokenizer(settings, *this); ASSERT_LOC(tokenizer.tokenize(code), file, line); - CTU::FileInfo *ctu = CTU::getFileInfo(&tokenizer); + CTU::FileInfo *ctu = CTU::getFileInfo(tokenizer); // Check code.. std::list fileInfo; Check& c = getCheck(); - fileInfo.push_back(c.getFileInfo(&tokenizer, &settings)); + fileInfo.push_back(c.getFileInfo(tokenizer, settings)); c.analyseWholeProgram(ctu, fileInfo, settings, *this); while (!fileInfo.empty()) { delete fileInfo.back(); diff --git a/test/testsummaries.cpp b/test/testsummaries.cpp index a133d3eab38..6f5b198e255 100644 --- a/test/testsummaries.cpp +++ b/test/testsummaries.cpp @@ -39,7 +39,7 @@ class TestSummaries : public TestFixture { // tokenize.. SimpleTokenizer tokenizer(settingsDefault, *this); ASSERT_LOC(tokenizer.tokenize(code, cpp), file, line); - return Summaries::create(&tokenizer, ""); + return Summaries::create(tokenizer, ""); } void createSummaries1() { diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index ade4a61cbd6..f86f0acc0ce 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -7763,12 +7763,12 @@ class TestUninitVar : public TestFixture { SimpleTokenizer tokenizer(settings, *this); ASSERT_LOC(tokenizer.tokenize(code), file, line); - CTU::FileInfo *ctu = CTU::getFileInfo(&tokenizer); + CTU::FileInfo *ctu = CTU::getFileInfo(tokenizer); // Check code.. std::list fileInfo; Check& c = getCheck(); - fileInfo.push_back(c.getFileInfo(&tokenizer, &settings)); + fileInfo.push_back(c.getFileInfo(tokenizer, settings)); c.analyseWholeProgram(ctu, fileInfo, settings, *this); while (!fileInfo.empty()) { delete fileInfo.back();