diff --git a/.clang-tidy b/.clang-tidy index 6852de45b..49e2d7458 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -1,5 +1,5 @@ --- -Checks: '*,-abseil-*,-altera-*,-android-*,-boost-*,-cert-*,-cppcoreguidelines-*,-darwin-*,-fuchsia-*,-google-*,-hicpp-*,-linuxkernel-*,-llvm-*,-llvmlibc-*,-mpi-*,-objc-*,-openmp-*,-zircon-*,-readability-braces-around-statements,-readability-magic-numbers,-bugprone-macro-parentheses,-readability-isolate-declaration,-readability-function-size,-modernize-use-trailing-return-type,-readability-implicit-bool-conversion,-readability-uppercase-literal-suffix,-modernize-use-auto,-readability-else-after-return,-modernize-use-default-member-init,-readability-named-parameter,-readability-redundant-member-init,-performance-faster-string-find,-modernize-avoid-c-arrays,-modernize-use-equals-default,-readability-container-size-empty,-readability-simplify-boolean-expr,-bugprone-branch-clone,-bugprone-narrowing-conversions,-modernize-raw-string-literal,-readability-convert-member-functions-to-static,-modernize-loop-convert,-readability-const-return-type,-performance-unnecessary-value-param,-modernize-return-braced-init-list,-performance-inefficient-string-concatenation,-misc-throw-by-value-catch-by-reference,-readability-avoid-const-params-in-decls,-readability-non-const-parameter,-misc-non-private-member-variables-in-classes,-bugprone-suspicious-string-compare,-clang-analyzer-*,-bugprone-signed-char-misuse,-misc-no-recursion,-readability-use-anyofallof,-performance-no-automatic-move,-bugprone-suspicious-include,-modernize-replace-random-shuffle,-readability-function-cognitive-complexity,-readability-redundant-access-specifiers,-performance-noexcept-move-constructor,-concurrency-mt-unsafe,-bugprone-easily-swappable-parameters,-readability-suspicious-call-argument,-readability-identifier-length,-readability-container-data-pointer,-bugprone-assignment-in-if-condition,-misc-const-correctness,-portability-std-allocator-const,-modernize-deprecated-ios-base-aliases,-bugprone-unchecked-optional-access,-modernize-replace-auto-ptr,-readability-identifier-naming,-portability-simd-intrinsics' +Checks: '*,-abseil-*,-altera-*,-android-*,-boost-*,-cert-*,-cppcoreguidelines-*,-darwin-*,-fuchsia-*,-google-*,-hicpp-*,-linuxkernel-*,-llvm-*,-llvmlibc-*,-mpi-*,-objc-*,-openmp-*,-zircon-*,-readability-braces-around-statements,-readability-magic-numbers,-bugprone-macro-parentheses,-readability-isolate-declaration,-readability-function-size,-modernize-use-trailing-return-type,-readability-implicit-bool-conversion,-readability-uppercase-literal-suffix,-modernize-use-auto,-readability-else-after-return,-modernize-use-default-member-init,-readability-named-parameter,-readability-redundant-member-init,-performance-faster-string-find,-modernize-avoid-c-arrays,-modernize-use-equals-default,-readability-container-size-empty,-readability-simplify-boolean-expr,-bugprone-branch-clone,-bugprone-narrowing-conversions,-modernize-raw-string-literal,-readability-convert-member-functions-to-static,-modernize-loop-convert,-readability-const-return-type,-modernize-return-braced-init-list,-performance-inefficient-string-concatenation,-misc-throw-by-value-catch-by-reference,-readability-avoid-const-params-in-decls,-misc-non-private-member-variables-in-classes,-clang-analyzer-*,-bugprone-signed-char-misuse,-misc-no-recursion,-readability-use-anyofallof,-performance-no-automatic-move,-bugprone-suspicious-include,-readability-function-cognitive-complexity,-readability-redundant-access-specifiers,-performance-noexcept-move-constructor,-concurrency-mt-unsafe,-bugprone-easily-swappable-parameters,-readability-suspicious-call-argument,-readability-identifier-length,-readability-container-data-pointer,-bugprone-assignment-in-if-condition,-misc-const-correctness,-portability-std-allocator-const,-modernize-deprecated-ios-base-aliases,-bugprone-unchecked-optional-access,-modernize-replace-auto-ptr,-readability-identifier-naming,-portability-simd-intrinsics' WarningsAsErrors: '*' CheckOptions: - key: misc-non-private-member-variables-in-classes.IgnoreClassesWithAllMemberVariablesBeingPublic diff --git a/clang-tidy.md b/clang-tidy.md index 56ae37a40..d21742723 100644 --- a/clang-tidy.md +++ b/clang-tidy.md @@ -110,24 +110,29 @@ Work in progress. Is reported for valid patterns we are using. +`readability-suspicious-call-argument`
+ +Produces a lot of false positives since it is too vague in its analysis. + +`performance-inefficient-string-concatenation`
+ +Produces many warnings which very much look like false ppsitives (needs to be reported upstream). + +`bugprone-suspicious-include`
+ +Causes warnings with `*.cpp` includes in Qt generated files. + `modernize-avoid-c-arrays`
`readability-container-size-empty`
`bugprone-branch-clone`
`readability-const-return-type`
-`performance-unnecessary-value-param`
`modernize-return-braced-init-list`
-`performance-inefficient-string-concatenation`
`misc-throw-by-value-catch-by-reference`
`readability-avoid-const-params-in-decls`
-`readability-non-const-parameter`
-`bugprone-suspicious-string-compare`
`bugprone-signed-char-misuse`
-`bugprone-suspicious-include`
-`modernize-replace-random-shuffle`
`readability-redundant-access-specifiers`
`performance-noexcept-move-constructor`
`concurrency-mt-unsafe`
-`readability-suspicious-call-argument`
To be evaluated. diff --git a/cli/cppcheckexecutor.cpp b/cli/cppcheckexecutor.cpp index 570571f14..1164d3529 100644 --- a/cli/cppcheckexecutor.cpp +++ b/cli/cppcheckexecutor.cpp @@ -575,8 +575,9 @@ bool CppCheckExecutor::tryLoadLibrary(Library& destination, const std::string& b /** * Execute a shell command and read the output from it. Returns true if command terminated successfully. */ -// cppcheck-suppress passedByValue - "exe" copy needed in _WIN32 code -bool CppCheckExecutor::executeCommand(std::string exe, std::vector args, const std::string &redirect, std::string *output_) +// cppcheck-suppress passedByValue - used as callback so we need to preserve the signature +// NOLINTNEXTLINE(performance-unnecessary-value-param) - used as callback so we need to preserve the signature +bool CppCheckExecutor::executeCommand(std::string exe, std::vector args, std::string redirect, std::string *output_) { output_->clear(); diff --git a/cli/cppcheckexecutor.h b/cli/cppcheckexecutor.h index dd7aaef9c..2750187e4 100644 --- a/cli/cppcheckexecutor.h +++ b/cli/cppcheckexecutor.h @@ -114,7 +114,7 @@ public: /** * Execute a shell command and read the output from it. Returns true if command terminated successfully. */ - static bool executeCommand(std::string exe, std::vector args, const std::string &redirect, std::string *output_); + static bool executeCommand(std::string exe, std::vector args, std::string redirect, std::string *output_); static bool reportSuppressions(const Settings &settings, bool unusedFunctionCheckEnabled, const std::map &files, ErrorLogger& errorLogger); diff --git a/gui/checkthread.cpp b/gui/checkthread.cpp index d0a3a550a..bc9fda7a7 100644 --- a/gui/checkthread.cpp +++ b/gui/checkthread.cpp @@ -44,6 +44,7 @@ #include #include +// NOLINTNEXTLINE(performance-unnecessary-value-param) - used as callback so we need to preserve the signature static bool executeCommand(std::string exe, std::vector args, std::string redirect, std::string *output) { output->clear(); diff --git a/gui/test/cppchecklibrarydata/testcppchecklibrarydata.cpp b/gui/test/cppchecklibrarydata/testcppchecklibrarydata.cpp index df8d0c471..e6ed15d58 100644 --- a/gui/test/cppchecklibrarydata/testcppchecklibrarydata.cpp +++ b/gui/test/cppchecklibrarydata/testcppchecklibrarydata.cpp @@ -589,7 +589,7 @@ void TestCppcheckLibraryData::containerValid() } } -void TestCppcheckLibraryData::loadCfgFile(QString filename, CppcheckLibraryData &data, QString &res, bool removeFile) +void TestCppcheckLibraryData::loadCfgFile(const QString &filename, CppcheckLibraryData &data, QString &res, bool removeFile) { QFile file(filename); QVERIFY(file.open(QIODevice::ReadOnly | QIODevice::Text)); @@ -600,7 +600,7 @@ void TestCppcheckLibraryData::loadCfgFile(QString filename, CppcheckLibraryData } } -void TestCppcheckLibraryData::saveCfgFile(QString filename, CppcheckLibraryData &data) +void TestCppcheckLibraryData::saveCfgFile(const QString &filename, CppcheckLibraryData &data) { QFile file(filename); QVERIFY(file.open(QIODevice::WriteOnly | QIODevice::Text)); diff --git a/gui/test/cppchecklibrarydata/testcppchecklibrarydata.h b/gui/test/cppchecklibrarydata/testcppchecklibrarydata.h index 1073fb7ac..70a237ecc 100644 --- a/gui/test/cppchecklibrarydata/testcppchecklibrarydata.h +++ b/gui/test/cppchecklibrarydata/testcppchecklibrarydata.h @@ -42,8 +42,8 @@ private slots: void containerValid(); private: - static void loadCfgFile(QString filename, CppcheckLibraryData &data, QString &res, bool removeFile = false); - static void saveCfgFile(QString filename, CppcheckLibraryData &data); + static void loadCfgFile(const QString &filename, CppcheckLibraryData &data, QString &res, bool removeFile = false); + static void saveCfgFile(const QString &filename, CppcheckLibraryData &data); CppcheckLibraryData libraryData; CppcheckLibraryData fileLibraryData; diff --git a/lib/astutils.cpp b/lib/astutils.cpp index 8b8bf9085..f81b0f565 100644 --- a/lib/astutils.cpp +++ b/lib/astutils.cpp @@ -1260,7 +1260,7 @@ static bool isSameLifetime(const Token * const tok1, const Token * const tok2) return v1.tokvalue == v2.tokvalue; } -static bool compareKnownValue(const Token * const tok1, const Token * const tok2, std::function compare) +static bool compareKnownValue(const Token * const tok1, const Token * const tok2, const std::function &compare) { static const auto isKnownFn = std::mem_fn(&ValueFlow::Value::isKnown); diff --git a/lib/checknullpointer.cpp b/lib/checknullpointer.cpp index b895c6bbd..2a1b21605 100644 --- a/lib/checknullpointer.cpp +++ b/lib/checknullpointer.cpp @@ -551,6 +551,7 @@ std::string CheckNullPointer::MyFileInfo::toString() const return CTU::toString(unsafeUsage); } +// NOLINTNEXTLINE(readability-non-const-parameter) - used as callback so we need to preserve the signature static bool isUnsafeUsage(const Check *check, const Token *vartok, MathLib::bigint *value) { (void)value; diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index bbc5a8fab..cbefb5d52 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -1659,6 +1659,7 @@ Check::FileInfo *CheckUninitVar::getFileInfo(const Tokenizer *tokenizer, const S return checker.getFileInfo(); } +// NOLINTNEXTLINE(readability-non-const-parameter) - used as callback so we need to preserve the signature static bool isVariableUsage(const Check *check, const Token *vartok, MathLib::bigint *value) { (void)value; diff --git a/lib/clangimport.cpp b/lib/clangimport.cpp index 671cb2e44..7e0b5ab31 100644 --- a/lib/clangimport.cpp +++ b/lib/clangimport.cpp @@ -638,7 +638,7 @@ void clangimport::AstNode::setValueType(Token *tok) Scope *clangimport::AstNode::createScope(TokenList *tokenList, Scope::ScopeType scopeType, AstNodePtr astNode, const Token *def) { - std::vector children2{astNode}; + std::vector children2{std::move(astNode)}; return createScope(tokenList, scopeType, children2, def); } diff --git a/lib/cppcheck.cpp b/lib/cppcheck.cpp index ac900dd7b..b325f0a38 100644 --- a/lib/cppcheck.cpp +++ b/lib/cppcheck.cpp @@ -276,7 +276,7 @@ static std::string executeAddon(const AddonInfo &addonInfo, const std::string &defaultPythonExe, const std::string &file, const std::string &premiumArgs, - std::function,std::string,std::string*)> executeCommand) + const std::function,std::string,std::string*)> &executeCommand) { const std::string redirect = "2>&1"; @@ -377,7 +377,7 @@ const char * CppCheck::extraVersion() return ExtraVersion; } -static bool reportClangErrors(std::istream &is, std::function reportErr, std::vector *warnings) +static bool reportClangErrors(std::istream &is, const std::function& reportErr, std::vector *warnings) { std::string line; while (std::getline(is, line)) { diff --git a/lib/token.cpp b/lib/token.cpp index 50bd41945..3dff266e7 100644 --- a/lib/token.cpp +++ b/lib/token.cpp @@ -627,7 +627,7 @@ bool Token::simpleMatch(const Token *tok, const char pattern[], size_t pattern_l while (*current) { const std::size_t length = next - current; - if (!tok || length != tok->mStr.length() || std::strncmp(current, tok->mStr.c_str(), length)) + if (!tok || length != tok->mStr.length() || std::strncmp(current, tok->mStr.c_str(), length) != 0) return false; current = next; @@ -2307,7 +2307,7 @@ std::string Token::typeStr(const Token* tok) void Token::scopeInfo(std::shared_ptr newScopeInfo) { - mImpl->mScopeInfo = newScopeInfo; + mImpl->mScopeInfo = std::move(newScopeInfo); } std::shared_ptr Token::scopeInfo() const { diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index ab6219551..51544b2cf 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -5471,7 +5471,7 @@ static std::string getExpression(const Token *tok) line = prev->str() + " " + line; line += "!!!" + tok->str() + "!!!"; for (const Token *next = tok->next(); next && !Token::Match(next, "[;{}]"); next = next->next()) - line = line + " " + next->str(); + line += " " + next->str(); return line; } diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index a02fde18d..b77aa9481 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -1990,7 +1990,7 @@ static void valueFlowReverse(TokenList* tokenlist, const Settings* = nullptr, SourceLocation loc = SourceLocation::current()) { - std::list values = {val}; + std::list values = {std::move(val)}; if (val2.varId != 0) values.push_back(val2); valueFlowReverse(tok, nullptr, varToken, values, tokenlist, loc); @@ -4504,7 +4504,7 @@ static void valueFlowLifetime(TokenList *tokenlist, SymbolDatabase*, ErrorLogger }; bool update = false; - auto captureVariable = [&](const Token* tok2, LifetimeCapture c, std::function pred) { + auto captureVariable = [&](const Token* tok2, LifetimeCapture c, const std::function &pred) { if (varids.count(tok->varId()) > 0) return; if (c == LifetimeCapture::ByReference) { @@ -6405,7 +6405,7 @@ ValueFlow::Value inferCondition(const std::string& op, const Token* varTok, Math return ValueFlow::Value{}; } -ValueFlow::Value inferCondition(std::string op, MathLib::bigint val, const Token* varTok) +ValueFlow::Value inferCondition(const std::string &op, MathLib::bigint val, const Token* varTok) { if (!varTok) return ValueFlow::Value{}; @@ -8928,7 +8928,7 @@ std::string ValueFlow::eitherTheConditionIsRedundant(const Token *condition) const ValueFlow::Value* ValueFlow::findValue(const std::list& values, const Settings* settings, - std::function pred) + const std::function &pred) { const ValueFlow::Value* ret = nullptr; for (const ValueFlow::Value& v : values) { diff --git a/lib/valueflow.h b/lib/valueflow.h index 6b141ef17..cddbbf8ea 100644 --- a/lib/valueflow.h +++ b/lib/valueflow.h @@ -461,7 +461,7 @@ namespace ValueFlow { const ValueFlow::Value* findValue(const std::list& values, const Settings* settings, - std::function pred); + const std::function &pred); std::vector isOutOfBounds(const Value& size, const Token* indexTok, bool possible = true); } @@ -502,7 +502,7 @@ struct LifetimeToken { const Token *parseCompareInt(const Token *tok, ValueFlow::Value &true_value, ValueFlow::Value &false_value, const std::function(const Token*)>& evaluate); const Token *parseCompareInt(const Token *tok, ValueFlow::Value &true_value, ValueFlow::Value &false_value); -ValueFlow::Value inferCondition(std::string op, MathLib::bigint val, const Token* varTok); +ValueFlow::Value inferCondition(const std::string& op, MathLib::bigint val, const Token* varTok); ValueFlow::Value inferCondition(const std::string& op, const Token* varTok, MathLib::bigint val); CPPCHECKLIB ValuePtr makeIntegralInferModel(); diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index 3f1bb7732..bc86eec3f 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -5856,7 +5856,7 @@ private: if (tok->astOperand1() && astTop.find(tok->astTop()) == astTop.end()) { astTop.insert(tok->astTop()); if (!ret.empty()) - ret = ret + " "; + ret += " "; ret += tok->astTop()->astString(); } } diff --git a/tools/triage/mainwindow.cpp b/tools/triage/mainwindow.cpp index f6ac96621..3a74a3970 100644 --- a/tools/triage/mainwindow.cpp +++ b/tools/triage/mainwindow.cpp @@ -22,6 +22,7 @@ #include #include +#include #include #include @@ -173,7 +174,7 @@ void MainWindow::filter(const QString& filter) if (allErrors[i].indexOf("test") > 0) allErrors.removeAt(i); } - std::random_shuffle(allErrors.begin(), allErrors.end()); + std::shuffle(allErrors.begin(), allErrors.end(), std::mt19937(std::random_device()())); ui->results->addItems(allErrors.mid(0, MAX_ERRORS)); ui->results->sortItems(); } else {