From e12013e04251f0be7232a484c31a80f4c8a128d7 Mon Sep 17 00:00:00 2001 From: firewave Date: Tue, 25 Mar 2025 14:12:57 +0100 Subject: [PATCH] cleaned up and test some `enforcedLang` handling --- lib/cppcheck.cpp | 24 +++++------ lib/cppcheck.h | 4 +- test/cli/clang-import_test.py | 1 - test/cli/dumpfile_test.py | 75 ++++++++++++++++++++++++++++++++++- 4 files changed, 85 insertions(+), 19 deletions(-) diff --git a/lib/cppcheck.cpp b/lib/cppcheck.cpp index 7024969117a..aeb7a420efa 100644 --- a/lib/cppcheck.cpp +++ b/lib/cppcheck.cpp @@ -366,9 +366,11 @@ static void createDumpFile(const Settings& settings, std::ofstream fout(getCtuInfoFileName(dumpFile)); } - // TODO: enforcedLang should be already applied in FileWithDetails object std::string language; - switch (settings.enforcedLang) { + + assert(file.lang() != Standards::Language::None); + + switch (file.lang()) { case Standards::Language::C: language = " language=\"c\""; break; @@ -376,17 +378,8 @@ static void createDumpFile(const Settings& settings, language = " language=\"cpp\""; break; case Standards::Language::None: - { - // TODO: get language from FileWithDetails object - // TODO: error out on unknown language? - const Standards::Language lang = Path::identify(file.spath(), settings.cppHeaderProbe); - if (lang == Standards::Language::CPP) - language = " language=\"cpp\""; - else if (lang == Standards::Language::C) - language = " language=\"c\""; break; } - } fdump << "\n"; fdump << "\n"; @@ -619,13 +612,12 @@ std::string CppCheck::getLibraryDumpData() const { return out; } -std::string CppCheck::getClangFlags(Standards::Language fileLang) const { +std::string CppCheck::getClangFlags(Standards::Language lang) const { std::string flags; - const Standards::Language lang = mSettings.enforcedLang != Standards::None ? mSettings.enforcedLang : fileLang; + assert(lang != Standards::Language::None); switch (lang) { - case Standards::Language::None: case Standards::Language::C: flags = "-x c "; if (!mSettings.standards.stdValueC.empty()) @@ -636,6 +628,8 @@ std::string CppCheck::getClangFlags(Standards::Language fileLang) const { if (!mSettings.standards.stdValueCPP.empty()) flags += "-std=" + mSettings.standards.stdValueCPP + " "; break; + case Standards::Language::None: + break; } for (const std::string &i: mSettings.includePaths) @@ -674,7 +668,7 @@ unsigned int CppCheck::checkClang(const FileWithDetails &file) #endif const std::string args2 = "-fsyntax-only -Xclang -ast-dump -fno-color-diagnostics " + - getClangFlags(Path::identify(file.spath(), mSettings.cppHeaderProbe)) + + getClangFlags(file.lang()) + file.spath(); const std::string redirect2 = clangStderr.empty() ? "2>&1" : ("2> " + clangStderr); if (mSettings.verbose && !mSettings.quiet) { diff --git a/lib/cppcheck.h b/lib/cppcheck.h index ea7feeebd55..1b33a2d83f2 100644 --- a/lib/cppcheck.h +++ b/lib/cppcheck.h @@ -153,10 +153,10 @@ class CPPCHECKLIB CppCheck { /** * @brief Get the clang command line flags using the Settings - * @param fileLang language guessed from filename + * @param lang language guessed from filename * @return Clang command line flags */ - std::string getClangFlags(Standards::Language fileLang) const; + std::string getClangFlags(Standards::Language lang) const; private: #ifdef HAVE_RULES diff --git a/test/cli/clang-import_test.py b/test/cli/clang-import_test.py index 168a31bb45f..42e5f7ecb93 100644 --- a/test/cli/clang-import_test.py +++ b/test/cli/clang-import_test.py @@ -174,7 +174,6 @@ def test_cmd_cpp(tmp_path): # files with unknown extensions are treated as C++ -@pytest.mark.xfail(strict=True) def test_cmd_unk(tmp_path): __test_cmd(tmp_path, 'test.cplusplus', [], '-x c++') diff --git a/test/cli/dumpfile_test.py b/test/cli/dumpfile_test.py index 89842fc9924..9593e2a1660 100644 --- a/test/cli/dumpfile_test.py +++ b/test/cli/dumpfile_test.py @@ -1,9 +1,10 @@ - # python -m pytest dumpfile_test.py import os +import pathlib from testutils import cppcheck +import xml.etree.ElementTree as ET def test_libraries(tmpdir): #13701 @@ -20,3 +21,75 @@ def test_libraries(tmpdir): #13701 dump = f.read() assert '' in dump assert dump.find('') < dump.find('