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 {