From 06d10b7474bae39a0ed26f7ea40773b4ccc20424 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Oliver=20St=C3=B6neberg?= Date: Sat, 12 Feb 2022 08:20:45 +0100 Subject: [PATCH] fixed and enabled performance-for-range-copy clang-tidy warning (#3682) --- .clang-tidy | 2 +- gui/checkthread.cpp | 2 +- gui/helpdialog.cpp | 2 +- gui/mainwindow.cpp | 2 +- gui/projectfile.cpp | 2 +- lib/bughuntingchecks.cpp | 2 +- lib/clangimport.cpp | 24 ++++++++++++------------ lib/exprengine.cpp | 34 +++++++++++++++++----------------- lib/importproject.cpp | 2 +- lib/summaries.cpp | 2 +- lib/tokenize.cpp | 2 +- 11 files changed, 38 insertions(+), 38 deletions(-) diff --git a/.clang-tidy b/.clang-tidy index 608b8ad50..b59c025d1 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -1,5 +1,5 @@ --- -Checks: '*,-abseil-*,-altera-*,-android-*,-cert-*,-cppcoreguidelines-*,-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,-modernize-use-override,-modernize-pass-by-value,-bugprone-branch-clone,-bugprone-narrowing-conversions,-modernize-raw-string-literal,-readability-convert-member-functions-to-static,-modernize-loop-convert,-misc-unused-using-decls,-modernize-use-emplace,-readability-const-return-type,-performance-unnecessary-value-param,-modernize-return-braced-init-list,-performance-inefficient-string-concatenation,-performance-for-range-copy,-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,-readability-misleading-indentation,-clang-analyzer-*,-bugprone-signed-char-misuse,-readability-make-member-function-const,-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,-modernize-use-equals-delete,-performance-noexcept-move-constructor,-concurrency-mt-unsafe,-bugprone-easily-swappable-parameters,-readability-suspicious-call-argument' +Checks: '*,-abseil-*,-altera-*,-android-*,-cert-*,-cppcoreguidelines-*,-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,-modernize-use-override,-modernize-pass-by-value,-bugprone-branch-clone,-bugprone-narrowing-conversions,-modernize-raw-string-literal,-readability-convert-member-functions-to-static,-modernize-loop-convert,-misc-unused-using-decls,-modernize-use-emplace,-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,-readability-misleading-indentation,-clang-analyzer-*,-bugprone-signed-char-misuse,-readability-make-member-function-const,-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,-modernize-use-equals-delete,-performance-noexcept-move-constructor,-concurrency-mt-unsafe,-bugprone-easily-swappable-parameters,-readability-suspicious-call-argument' WarningsAsErrors: '*' CheckOptions: - key: misc-non-private-member-variables-in-classes.IgnoreClassesWithAllMemberVariablesBeingPublic diff --git a/gui/checkthread.cpp b/gui/checkthread.cpp index df7b8862f..c88118233 100644 --- a/gui/checkthread.cpp +++ b/gui/checkthread.cpp @@ -34,7 +34,7 @@ static bool executeCommand(std::string exe, std::vector args, std:: output->clear(); QStringList args2; - for (std::string arg: args) + for (const std::string &arg: args) args2 << QString::fromStdString(arg); QProcess process; diff --git a/gui/helpdialog.cpp b/gui/helpdialog.cpp index d386c0707..110d4769c 100644 --- a/gui/helpdialog.cpp +++ b/gui/helpdialog.cpp @@ -58,7 +58,7 @@ static QString getHelpFile() paths << (filesdir + "/help") << filesdir; #endif - for (QString p: paths) { + for (const QString &p: paths) { QString filename = p + "/online-help.qhc"; if (QFileInfo(filename).exists()) return filename; diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp index 30eb1833e..a70df30f0 100644 --- a/gui/mainwindow.cpp +++ b/gui/mainwindow.cpp @@ -624,7 +624,7 @@ void MainWindow::updateVariableContractsTab() { QStringList added; if (mProjectFile) { - for (auto vc: mProjectFile->getVariableContracts()) { + for (const auto &vc: mProjectFile->getVariableContracts()) { QString line = vc.first; if (!vc.second.minValue.empty()) line += " min:" + QString::fromStdString(vc.second.minValue); diff --git a/gui/projectfile.cpp b/gui/projectfile.cpp index 04077ff9b..26ad963e5 100644 --- a/gui/projectfile.cpp +++ b/gui/projectfile.cpp @@ -973,7 +973,7 @@ bool ProjectFile::write(const QString &filename) if (!mVariableContracts.empty()) { xmlWriter.writeStartElement(CppcheckXml::VariableContractsElementName); - for (auto vc: mVariableContracts) { + for (const auto &vc: mVariableContracts) { xmlWriter.writeStartElement(CppcheckXml::VariableContractItemElementName); xmlWriter.writeAttribute(CppcheckXml::VariableContractVarName, vc.first); xmlWriter.writeAttribute(CppcheckXml::VariableContractMin, QString::fromStdString(vc.second.minValue)); diff --git a/lib/bughuntingchecks.cpp b/lib/bughuntingchecks.cpp index ddf2795d8..6102f28e8 100644 --- a/lib/bughuntingchecks.cpp +++ b/lib/bughuntingchecks.cpp @@ -121,7 +121,7 @@ static void bufferOverflow(const Token *tok, const ExprEngine::Value &value, Exp int overflowArgument = 0; bool bailout = false; - for (auto argNrChecks: func->argumentChecks) { + for (const auto &argNrChecks: func->argumentChecks) { const int argnr = argNrChecks.first; const Library::ArgumentChecks &checks = argNrChecks.second; if (argnr <= 0 || argnr > arguments.size() || checks.minsizes.empty()) diff --git a/lib/clangimport.cpp b/lib/clangimport.cpp index 1f794538d..fe85ebdf5 100644 --- a/lib/clangimport.cpp +++ b/lib/clangimport.cpp @@ -277,7 +277,7 @@ namespace clangimport { std::vector getVariableList() const { std::vector ret; ret.resize(mVarId + 1, nullptr); - for (auto it: mDeclMap) { + for (const auto& it: mDeclMap) { if (it.second.var) ret[it.second.var->declarationId()] = it.second.var; } @@ -467,7 +467,7 @@ std::string clangimport::AstNode::getTemplateParameters() const if (children.empty() || children[0]->nodeType != TemplateArgument) return ""; std::string templateParameters; - for (AstNodePtr child: children) { + for (const AstNodePtr& child: children) { if (child->nodeType == TemplateArgument) { if (templateParameters.empty()) templateParameters = "<"; @@ -483,7 +483,7 @@ void clangimport::AstNode::dumpAst(int num, int indent) const { (void)num; std::cout << std::string(indent, ' ') << nodeType; - for (auto tok: mExtTokens) + for (const auto& tok: mExtTokens) std::cout << " " << tok; std::cout << std::endl; for (int c = 0; c < children.size(); ++c) { @@ -513,7 +513,7 @@ void clangimport::AstNode::setLocations(TokenList *tokenList, int file, int line mFile = file; mLine = line; mCol = col; - for (auto child: children) { + for (const auto& child: children) { if (child) child->setLocations(tokenList, file, line, col); } @@ -678,7 +678,7 @@ Scope *clangimport::AstNode::createScope(TokenList *tokenList, Scope::ScopeType tokenList->back()->scope(scope); mData->scopeAccessControl[scope] = scope->defaultAccess(); if (!children2.empty()) { - for (AstNodePtr astNode: children2) { + for (const AstNodePtr &astNode: children2) { if (astNode->nodeType == "VisibilityAttr") continue; if (astNode->nodeType == AccessSpecDecl) { @@ -756,7 +756,7 @@ Token *clangimport::AstNode::createTokens(TokenList *tokenList) return nullptr; } if (nodeType == ClassTemplateDecl) { - for (AstNodePtr child: children) { + for (const AstNodePtr& child: children) { if (child->nodeType == ClassTemplateSpecializationDecl) child->createTokens(tokenList); } @@ -787,7 +787,7 @@ Token *clangimport::AstNode::createTokens(TokenList *tokenList) return assign; } if (nodeType == CompoundStmt) { - for (AstNodePtr child: children) { + for (const AstNodePtr& child: children) { child->createTokens(tokenList); if (!Token::Match(tokenList->back(), "[;{}]")) child->addtoken(tokenList, ";"); @@ -1043,7 +1043,7 @@ Token *clangimport::AstNode::createTokens(TokenList *tokenList) } if (nodeType == FunctionTemplateDecl) { bool first = true; - for (AstNodePtr child: children) { + for (const AstNodePtr& child: children) { if (child->nodeType == FunctionDecl) { if (!first) child->createTokens(tokenList); @@ -1095,7 +1095,7 @@ Token *clangimport::AstNode::createTokens(TokenList *tokenList) const Scope *scope = tokenList->back()->scope(); Token *start = addtoken(tokenList, "{"); start->scope(scope); - for (AstNodePtr child: children) { + for (const AstNodePtr& child: children) { if (tokenList->back()->str() != "{") addtoken(tokenList, ","); child->createTokens(tokenList); @@ -1112,7 +1112,7 @@ Token *clangimport::AstNode::createTokens(TokenList *tokenList) if (nodeType == LabelStmt) { addtoken(tokenList, unquote(mExtTokens.back())); addtoken(tokenList, ":"); - for (auto child: children) + for (const auto& child: children) child->createTokens(tokenList); return nullptr; } @@ -1430,7 +1430,7 @@ void clangimport::AstNode::createTokensForCXXRecord(TokenList *tokenList) /*Token *nameToken =*/ addtoken(tokenList, className); // base classes bool firstBase = true; - for (AstNodePtr child: children) { + for (const AstNodePtr &child: children) { if (child->nodeType == "public" || child->nodeType == "protected" || child->nodeType == "private") { addtoken(tokenList, firstBase ? ":" : ","); addtoken(tokenList, child->nodeType); @@ -1441,7 +1441,7 @@ void clangimport::AstNode::createTokensForCXXRecord(TokenList *tokenList) // definition if (isDefinition()) { std::vector children2; - for (AstNodePtr child: children) { + for (const AstNodePtr &child: children) { if (child->nodeType == CXXConstructorDecl || child->nodeType == CXXDestructorDecl || child->nodeType == CXXMethodDecl || diff --git a/lib/exprengine.cpp b/lib/exprengine.cpp index 207d621f9..b1ed2d935 100644 --- a/lib/exprengine.cpp +++ b/lib/exprengine.cpp @@ -297,7 +297,7 @@ namespace { void print(std::ostream &out) { std::set> locations; - for (auto it : mMap) { + for (const auto& it : mMap) { locations.insert(std::pair(it.first->linenr(), it.first->column())); } for (const std::pair &loc : locations) { @@ -553,7 +553,7 @@ namespace { std::ostringstream s; s << "D" << mDataIndex << ":" << "memory:{"; bool first = true; - for (auto mem : memory) { + for (const auto &mem : memory) { ExprEngine::ValuePtr value = mem.second; const Variable *var = symbolDatabase->getVariableFromVarId(mem.first); if (!var) @@ -574,7 +574,7 @@ namespace { if (!constraints.empty()) { s << " constraints:{"; first = true; - for (auto constraint: constraints) { + for (const auto &constraint: constraints) { if (!first) s << " "; first = false; @@ -693,7 +693,7 @@ namespace { return; std::map symbols; - for (auto mem: memory) { + for (const auto &mem: memory) { getSymbols(symbols, mem.second); } @@ -811,15 +811,15 @@ namespace { return; symbols[val->name] = val; if (auto arrayValue = std::dynamic_pointer_cast(val)) { - for (auto sizeValue: arrayValue->size) + for (const auto &sizeValue: arrayValue->size) getSymbols(symbols, sizeValue); - for (auto indexValue: arrayValue->data) { + for (const auto &indexValue: arrayValue->data) { getSymbols(symbols, indexValue.index); getSymbols(symbols, indexValue.value); } } if (auto structValue = std::dynamic_pointer_cast(val)) { - for (auto memberNameValue: structValue->member) + for (const auto &memberNameValue: structValue->member) getSymbols(symbols, memberNameValue.second); } } @@ -1053,7 +1053,7 @@ std::string ExprEngine::ConditionalValue::getSymbolicExpression() const std::ostringstream ostr; ostr << "{"; bool first = true; - for (auto condvalue : values) { + for (const auto& condvalue : values) { ValuePtr cond = condvalue.first; ValuePtr value = condvalue.second; @@ -1134,12 +1134,12 @@ public: AssertionList assertionList; void addAssertions(z3::solver &solver) const { - for (auto assertExpr : assertionList) + for (const auto &assertExpr : assertionList) solver.add(assertExpr); } void addConstraints(z3::solver &solver, const Data* data) { - for (auto constraint : data->constraints) { + for (const auto &constraint : data->constraints) { try { solver.add(getConstraintExpr(constraint)); } catch (const BailoutValueException &) {} @@ -1765,7 +1765,7 @@ static ExprEngine::ValuePtr getValueRangeFromValueType(const ValueType *valueTyp static void call(const std::vector &callbacks, const Token *tok, ExprEngine::ValuePtr value, Data *dataBase) { if (value) { - for (ExprEngine::Callback f : callbacks) { + for (const ExprEngine::Callback& f : callbacks) { try { f(tok, *value, dataBase); } catch (const ExprEngineException &e) { @@ -2014,7 +2014,7 @@ static void checkContract(Data &data, const Token *tok, const Function *function } if (!bailoutValue) { - for (auto constraint : data.constraints) + for (const auto &constraint : data.constraints) solver.add(exprData.getConstraintExpr(constraint)); exprData.addAssertions(solver); @@ -2192,7 +2192,7 @@ static ExprEngine::ValuePtr executeArrayIndex(const Token *tok, Data &data) if (arrayValue) { auto indexValue = calculateArrayIndex(tok, data, *arrayValue); auto conditionalValues = arrayValue->read(indexValue); - for (auto value: conditionalValues) + for (const auto& value: conditionalValues) call(data.callbacks, tok, value.second, &data); if (conditionalValues.size() == 1 && !conditionalValues[0].first) return conditionalValues[0].second; @@ -2257,7 +2257,7 @@ static ExprEngine::ValuePtr executeDot(const Token *tok, Data &data) call(data.callbacks, tok->astOperand1(), pointerValue, &data); auto indexValue = std::make_shared("0", 0, 0); ExprEngine::ValuePtr ret; - for (auto val: pointerValue->read(indexValue)) { + for (const auto& val: pointerValue->read(indexValue)) { structValue = std::dynamic_pointer_cast(val.second); if (structValue) { auto memberValue = structValue->getValueOfMember(tok->astOperand2()->str()); @@ -2386,7 +2386,7 @@ static ExprEngine::ValuePtr executeDeref(const Token *tok, Data &data) if (pointer) { auto indexValue = std::make_shared("0", 0, 0); auto conditionalValues = pointer->read(indexValue); - for (auto value: conditionalValues) + for (const auto& value: conditionalValues) call(data.callbacks, tok, value.second, &data); if (conditionalValues.size() == 1 && !conditionalValues[0].first) return conditionalValues[0].second; @@ -2803,7 +2803,7 @@ static std::string execute(const Token *start, const Token *end, Data &data) if (auto structPtr = std::dynamic_pointer_cast(structVal1)) { if (structPtr->pointer && !structPtr->data.empty()) { auto indexValue = std::make_shared("0", 0, 0); - for (auto val: structPtr->read(indexValue)) { + for (const auto &val: structPtr->read(indexValue)) { structVal = std::dynamic_pointer_cast(val.second); } } @@ -3131,7 +3131,7 @@ static void dumpRecursive(ExprEngine::ValuePtr val) case ExprEngine::ValueType::FunctionCallArgumentValues: { std::cout << "FunctionCallArgumentValues("; const char *sep = ""; - for (auto arg: std::dynamic_pointer_cast(val)->argValues) { + for (const auto &arg: std::dynamic_pointer_cast(val)->argValues) { std::cout << sep; sep = ","; if (!arg) diff --git a/lib/importproject.cpp b/lib/importproject.cpp index 085bab60f..5760e4654 100644 --- a/lib/importproject.cpp +++ b/lib/importproject.cpp @@ -775,7 +775,7 @@ bool ImportProject::importVcxproj(const std::string &filename, std::map &data) -> std::string { std::string ret; const char *sep = ""; - for (std::string d: data) + for (const std::string &d: data) { ret += sep + d; sep = ","; diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 336e5f7ec..f13917896 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -2134,7 +2134,7 @@ namespace { if (tempScope->usingNamespaces.find(scope) != tempScope->usingNamespaces.end()) return true; } else { - for (auto ns : tempScope->usingNamespaces) { + for (const auto &ns : tempScope->usingNamespaces) { if (scope == ns + " :: " + qualification) return true; }