From 604d1767022660d57387c1a503e73203596c7c10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Sun, 8 Dec 2024 15:43:50 +0100 Subject: [PATCH 1/4] Fix #13402 (Clang import: Pass --include options to clang) --- lib/cppcheck.cpp | 50 +++++++++++++++++++++++++++---------------- lib/cppcheck.h | 7 ++++++ test/testcppcheck.cpp | 8 +++++++ 3 files changed, 47 insertions(+), 18 deletions(-) diff --git a/lib/cppcheck.cpp b/lib/cppcheck.cpp index d82cda987cc..2e6d7ab3e53 100644 --- a/lib/cppcheck.cpp +++ b/lib/cppcheck.cpp @@ -424,6 +424,35 @@ std::string CppCheck::getLibraryDumpData() const { return out; } +std::string CppCheck::getClangFlags(Standards::Language fileLang) const { + std::string flags; + + const Standards::Language lang = mSettings.enforcedLang != Standards::None ? mSettings.enforcedLang : fileLang; + + switch (lang) { + case Standards::Language::C: + flags = "-x c "; + if (!mSettings.standards.stdValueC.empty()) + flags += "-std=" + mSettings.standards.stdValueC + " "; + break; + case Standards::Language::CPP: + flags += "-x c++ "; + if (!mSettings.standards.stdValueCPP.empty()) + flags += "-std=" + mSettings.standards.stdValueCPP + " "; + break; + }; + + for (const std::string &i: mSettings.includePaths) + flags += "-I" + i + " "; + + flags += getDefinesFlags(mSettings.userDefines); + + for (const std::string &i: mSettings.userIncludes) + flags += "--include " + cmdFileName(i) + " "; + + return flags; +} + unsigned int CppCheck::checkClang(const FileWithDetails &file) { if (mSettings.checks.isEnabled(Checks::unusedFunction) && !mUnusedFunctionsCheck) @@ -433,12 +462,6 @@ unsigned int CppCheck::checkClang(const FileWithDetails &file) mErrorLogger.reportOut(std::string("Checking ") + file.spath() + " ...", Color::FgGreen); // TODO: get language from FileWithDetails object - bool isCpp; - if (mSettings.enforcedLang != Standards::None) - isCpp = (mSettings.enforcedLang == Standards::CPP); - else - isCpp = Path::identify(file.spath(), mSettings.cppHeaderProbe) == Standards::Language::CPP; - const std::string langOpt = isCpp ? "-x c++" : "-x c"; const std::string analyzerInfo = mSettings.buildDir.empty() ? std::string() : AnalyzerInformation::getAnalyzerInfoFile(mSettings.buildDir, file.spath(), emptyString); const std::string clangcmd = analyzerInfo + ".clang-cmd"; const std::string clangStderr = analyzerInfo + ".clang-stderr"; @@ -451,18 +474,9 @@ unsigned int CppCheck::checkClang(const FileWithDetails &file) } #endif - std::string flags(langOpt + " "); - if (isCpp && !mSettings.standards.stdValueCPP.empty()) - flags += "-std=" + mSettings.standards.stdValueCPP + " "; - if (!isCpp && !mSettings.standards.stdValueC.empty()) - flags += "-std=" + mSettings.standards.stdValueC + " "; - - for (const std::string &i: mSettings.includePaths) - flags += "-I" + i + " "; - - flags += getDefinesFlags(mSettings.userDefines); - - const std::string args2 = "-fsyntax-only -Xclang -ast-dump -fno-color-diagnostics " + flags + file.spath(); + const std::string args2 = "-fsyntax-only -Xclang -ast-dump -fno-color-diagnostics " + + getClangFlags(Path::identify(file.spath(), mSettings.cppHeaderProbe)) + + file.spath(); const std::string redirect2 = analyzerInfo.empty() ? std::string("2>&1") : ("2> " + clangStderr); if (!mSettings.buildDir.empty()) { std::ofstream fout(clangcmd); diff --git a/lib/cppcheck.h b/lib/cppcheck.h index fee5eccedac..e0c5288f366 100644 --- a/lib/cppcheck.h +++ b/lib/cppcheck.h @@ -160,6 +160,13 @@ class CPPCHECKLIB CppCheck : ErrorLogger { std::string getLibraryDumpData() const; + /** + * @brief Get the clang command line flags using the Settings + * @param fileLang language guessed from filename + * @return Clang command line flags + */ + std::string getClangFlags(Standards::Language fileLang) const; + private: #ifdef HAVE_RULES /** Are there "simple" rules */ diff --git a/test/testcppcheck.cpp b/test/testcppcheck.cpp index 776893d74c4..ecbb3e97b67 100644 --- a/test/testcppcheck.cpp +++ b/test/testcppcheck.cpp @@ -60,6 +60,7 @@ class TestCppcheck : public TestFixture { TEST_CASE(isPremiumCodingStandardId); TEST_CASE(getDumpFileContentsRawTokens); TEST_CASE(getDumpFileContentsLibrary); + TEST_CASE(getClangFlagsIncludeFile); } void getErrorMessages() const { @@ -243,6 +244,13 @@ class TestCppcheck : public TestFixture { ASSERT_EQUALS(expected2, cppcheck.getLibraryDumpData()); } + void getClangFlagsIncludeFile() { + ErrorLogger2 errorLogger; + CppCheck cppcheck(errorLogger, false, {}); + cppcheck.settings().userIncludes.emplace_back("1.h"); + ASSERT_EQUALS("-x c --include 1.h ", cppcheck.getClangFlags(Standards::Language::C)); + } + // TODO: test suppressions // TODO: test all with FS }; From 267d1a1a2cc29d587ae36366f85496c6b4f9d46c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Sun, 8 Dec 2024 17:34:16 +0100 Subject: [PATCH 2/4] fix --- lib/cppcheck.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/cppcheck.cpp b/lib/cppcheck.cpp index 2e6d7ab3e53..e1416c1c2a6 100644 --- a/lib/cppcheck.cpp +++ b/lib/cppcheck.cpp @@ -430,6 +430,7 @@ std::string CppCheck::getClangFlags(Standards::Language fileLang) const { const Standards::Language lang = mSettings.enforcedLang != Standards::None ? mSettings.enforcedLang : fileLang; switch (lang) { + case Standards::Language::None: case Standards::Language::C: flags = "-x c "; if (!mSettings.standards.stdValueC.empty()) From 5fff48fd92a2dd150cc96d2b9c87c64a4d665cf6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Sun, 8 Dec 2024 18:26:30 +0100 Subject: [PATCH 3/4] selfcheck --- test/testcppcheck.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/testcppcheck.cpp b/test/testcppcheck.cpp index ecbb3e97b67..3377c3d31e8 100644 --- a/test/testcppcheck.cpp +++ b/test/testcppcheck.cpp @@ -244,7 +244,7 @@ class TestCppcheck : public TestFixture { ASSERT_EQUALS(expected2, cppcheck.getLibraryDumpData()); } - void getClangFlagsIncludeFile() { + void getClangFlagsIncludeFile() const { ErrorLogger2 errorLogger; CppCheck cppcheck(errorLogger, false, {}); cppcheck.settings().userIncludes.emplace_back("1.h"); From 29017f2fa06e1b5dd87af511d8ee8ce96c582dc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Sun, 8 Dec 2024 19:50:04 +0100 Subject: [PATCH 4/4] clang-tidy --- lib/cppcheck.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/cppcheck.cpp b/lib/cppcheck.cpp index e1416c1c2a6..f5db30e6428 100644 --- a/lib/cppcheck.cpp +++ b/lib/cppcheck.cpp @@ -441,7 +441,7 @@ std::string CppCheck::getClangFlags(Standards::Language fileLang) const { if (!mSettings.standards.stdValueCPP.empty()) flags += "-std=" + mSettings.standards.stdValueCPP + " "; break; - }; + } for (const std::string &i: mSettings.includePaths) flags += "-I" + i + " ";