From 3b4d416eeab1472791aa5b756aec21a4b9af8170 Mon Sep 17 00:00:00 2001 From: firewave Date: Fri, 21 Apr 2023 16:54:39 +0200 Subject: [PATCH 1/2] avoid redundant `simplecpp::Output::type` switch blocks --- lib/cppcheck.cpp | 18 +----------------- lib/preprocessor.cpp | 41 +++++++++++++++++++---------------------- lib/preprocessor.h | 2 ++ 3 files changed, 22 insertions(+), 39 deletions(-) diff --git a/lib/cppcheck.cpp b/lib/cppcheck.cpp index 12eed1044ef..2af43f2a37e 100644 --- a/lib/cppcheck.cpp +++ b/lib/cppcheck.cpp @@ -671,23 +671,7 @@ unsigned int CppCheck::checkFile(const std::string& filename, const std::string // If there is a syntax error, report it and stop for (const simplecpp::Output &output : outputList) { - bool err; - switch (output.type) { - case simplecpp::Output::ERROR: - case simplecpp::Output::INCLUDE_NESTED_TOO_DEEPLY: - case simplecpp::Output::SYNTAX_ERROR: - case simplecpp::Output::UNHANDLED_CHAR_ERROR: - case simplecpp::Output::EXPLICIT_INCLUDE_NOT_FOUND: - err = true; - break; - case simplecpp::Output::WARNING: - case simplecpp::Output::MISSING_HEADER: - case simplecpp::Output::PORTABILITY_BACKSLASH: - err = false; - break; - } - - if (err) { + if (Preprocessor::hasErrors(output)) { std::string file = Path::fromNativeSeparators(output.location.file()); if (mSettings.relativePaths) file = Path::getRelativePath(file, mSettings.basePaths); diff --git a/lib/preprocessor.cpp b/lib/preprocessor.cpp index 9ec8506db4b..a5985ea9f03 100644 --- a/lib/preprocessor.cpp +++ b/lib/preprocessor.cpp @@ -627,21 +627,28 @@ static simplecpp::DUI createDUI(const Settings &mSettings, const std::string &cf return dui; } +bool Preprocessor::hasErrors(const simplecpp::Output &output) +{ + switch (output.type) { + case simplecpp::Output::ERROR: + case simplecpp::Output::INCLUDE_NESTED_TOO_DEEPLY: + case simplecpp::Output::SYNTAX_ERROR: + case simplecpp::Output::UNHANDLED_CHAR_ERROR: + case simplecpp::Output::EXPLICIT_INCLUDE_NOT_FOUND: + return true; + case simplecpp::Output::WARNING: + case simplecpp::Output::MISSING_HEADER: + case simplecpp::Output::PORTABILITY_BACKSLASH: + break; + } + return false; +} + bool Preprocessor::hasErrors(const simplecpp::OutputList &outputList) { for (simplecpp::OutputList::const_iterator it = outputList.cbegin(); it != outputList.cend(); ++it) { - switch (it->type) { - case simplecpp::Output::ERROR: - case simplecpp::Output::INCLUDE_NESTED_TOO_DEEPLY: - case simplecpp::Output::SYNTAX_ERROR: - case simplecpp::Output::UNHANDLED_CHAR_ERROR: - case simplecpp::Output::EXPLICIT_INCLUDE_NOT_FOUND: + if (hasErrors(*it)) return true; - case simplecpp::Output::WARNING: - case simplecpp::Output::MISSING_HEADER: - case simplecpp::Output::PORTABILITY_BACKSLASH: - break; - } } return false; } @@ -652,18 +659,8 @@ void Preprocessor::handleErrors(const simplecpp::OutputList& outputList, bool th reportOutput(outputList, showerror); if (throwError) { for (const simplecpp::Output& output : outputList) { - switch (output.type) { - case simplecpp::Output::ERROR: - case simplecpp::Output::INCLUDE_NESTED_TOO_DEEPLY: - case simplecpp::Output::SYNTAX_ERROR: - case simplecpp::Output::UNHANDLED_CHAR_ERROR: - case simplecpp::Output::EXPLICIT_INCLUDE_NOT_FOUND: + if (hasErrors(output)) throw output; - case simplecpp::Output::WARNING: - case simplecpp::Output::MISSING_HEADER: - case simplecpp::Output::PORTABILITY_BACKSLASH: - break; - } } } } diff --git a/lib/preprocessor.h b/lib/preprocessor.h index 5f63f6d48c6..bea2b0d275d 100644 --- a/lib/preprocessor.h +++ b/lib/preprocessor.h @@ -180,6 +180,8 @@ class CPPCHECKLIB Preprocessor { void reportOutput(const simplecpp::OutputList &outputList, bool showerror); + static bool hasErrors(const simplecpp::Output &output); + private: void missingInclude(const std::string &filename, unsigned int linenr, const std::string &header, HeaderTypes headerType); void error(const std::string &filename, unsigned int linenr, const std::string &msg); From 1768cd3b1a6df93158351462871751165377a14c Mon Sep 17 00:00:00 2001 From: firewave Date: Fri, 21 Apr 2023 17:00:49 +0200 Subject: [PATCH 2/2] fixed `useStlAlgorithm` warnings --- lib/cppcheck.cpp | 42 ++++++++++++++++++++++-------------------- lib/preprocessor.cpp | 17 +++++++++-------- 2 files changed, 31 insertions(+), 28 deletions(-) diff --git a/lib/cppcheck.cpp b/lib/cppcheck.cpp index 2af43f2a37e..94191c39c81 100644 --- a/lib/cppcheck.cpp +++ b/lib/cppcheck.cpp @@ -670,24 +670,26 @@ unsigned int CppCheck::checkFile(const std::string& filename, const std::string simplecpp::TokenList tokens1(fileStream, files, filename, &outputList); // If there is a syntax error, report it and stop - for (const simplecpp::Output &output : outputList) { - if (Preprocessor::hasErrors(output)) { - std::string file = Path::fromNativeSeparators(output.location.file()); - if (mSettings.relativePaths) - file = Path::getRelativePath(file, mSettings.basePaths); - - const ErrorMessage::FileLocation loc1(file, output.location.line, output.location.col); - std::list callstack(1, loc1); - - ErrorMessage errmsg(callstack, - "", - Severity::error, - output.msg, - "syntaxError", - Certainty::normal); - reportErr(errmsg); - return mExitCode; - } + const auto output_it = std::find_if(outputList.cbegin(), outputList.cend(), [](const simplecpp::Output &output){ + return Preprocessor::hasErrors(output); + }); + if (output_it != outputList.cend()) { + const simplecpp::Output &output = *output_it; + std::string file = Path::fromNativeSeparators(output.location.file()); + if (mSettings.relativePaths) + file = Path::getRelativePath(file, mSettings.basePaths); + + const ErrorMessage::FileLocation loc1(file, output.location.line, output.location.col); + std::list callstack(1, loc1); + + ErrorMessage errmsg(callstack, + "", + Severity::error, + output.msg, + "syntaxError", + Certainty::normal); + reportErr(errmsg); + return mExitCode; } if (!preprocessor.loadFiles(tokens1, files)) @@ -785,10 +787,10 @@ unsigned int CppCheck::checkFile(const std::string& filename, const std::string } // Run define rules on raw code - const auto it = std::find_if(mSettings.rules.cbegin(), mSettings.rules.cend(), [](const Settings::Rule& rule) { + const auto rules_it = std::find_if(mSettings.rules.cbegin(), mSettings.rules.cend(), [](const Settings::Rule& rule) { return rule.tokenlist == "define"; }); - if (it != mSettings.rules.cend()) { + if (rules_it != mSettings.rules.cend()) { std::string code; const std::list &directives = preprocessor.getDirectives(); for (const Directive &dir : directives) { diff --git a/lib/preprocessor.cpp b/lib/preprocessor.cpp index a5985ea9f03..622095ee8a8 100644 --- a/lib/preprocessor.cpp +++ b/lib/preprocessor.cpp @@ -646,11 +646,10 @@ bool Preprocessor::hasErrors(const simplecpp::Output &output) bool Preprocessor::hasErrors(const simplecpp::OutputList &outputList) { - for (simplecpp::OutputList::const_iterator it = outputList.cbegin(); it != outputList.cend(); ++it) { - if (hasErrors(*it)) - return true; - } - return false; + const auto it = std::find_if(outputList.cbegin(), outputList.cend(), [](const simplecpp::Output &output) { + return hasErrors(output); + }); + return it != outputList.cend(); } void Preprocessor::handleErrors(const simplecpp::OutputList& outputList, bool throwError) @@ -658,9 +657,11 @@ void Preprocessor::handleErrors(const simplecpp::OutputList& outputList, bool th const bool showerror = (!mSettings.userDefines.empty() && !mSettings.force); reportOutput(outputList, showerror); if (throwError) { - for (const simplecpp::Output& output : outputList) { - if (hasErrors(output)) - throw output; + const auto it = std::find_if(outputList.cbegin(), outputList.cend(), [](const simplecpp::Output &output){ + return hasErrors(output); + }); + if (it != outputList.cend()) { + throw *it; } } }