diff --git a/cli/cmdlineparser.cpp b/cli/cmdlineparser.cpp index 18ae132bbc0..156bded627d 100644 --- a/cli/cmdlineparser.cpp +++ b/cli/cmdlineparser.cpp @@ -232,6 +232,7 @@ bool CmdLineParser::fillSettingsFromArgs(int argc, const char* const argv[]) { if (mSettings.library.markupFile(fs.filename())) continue; + assert(fs.file.lang() == Standards::Language::None); bool header = false; fs.file.setLang(Path::identify(fs.filename(), mSettings.cppHeaderProbe, &header)); // unknown extensions default to C++ @@ -244,6 +245,7 @@ bool CmdLineParser::fillSettingsFromArgs(int argc, const char* const argv[]) for (auto& fs : fileSettings) { if (mSettings.library.markupFile(fs.filename())) { + assert(fs.file.lang() == Standards::Language::None); fs.file.setLang(Standards::Language::C); } } diff --git a/democlient/democlient.cpp b/democlient/democlient.cpp index 859882e0ce6..59746788163 100644 --- a/democlient/democlient.cpp +++ b/democlient/democlient.cpp @@ -67,7 +67,7 @@ class CppcheckExecutor : public ErrorLogger { {} void run(const char code[]) { - cppcheck.check(FileWithDetails("test.cpp"), code); + cppcheck.check(FileWithDetails("test.cpp", Standards::Language::CPP, 0), code); } void reportOut(const std::string & /*outmsg*/, Color /*c*/) override {} diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp index 3db9c0c9f0e..2e31009b392 100644 --- a/gui/mainwindow.cpp +++ b/gui/mainwindow.cpp @@ -35,6 +35,7 @@ #include "helpdialog.h" #include "importproject.h" #include "librarydialog.h" +#include "path.h" #include "platform.h" #include "projectfile.h" #include "projectfiledialog.h" @@ -702,7 +703,7 @@ void MainWindow::analyzeCode(const QString& code, const QString& filename) checkLockDownUI(); clearResults(); mUI->mResults->checkingStarted(1); - cppcheck.check(FileWithDetails(filename.toStdString()), code.toStdString()); + cppcheck.check(FileWithDetails(filename.toStdString(), Path::identify(filename.toStdString(), false), 0), code.toStdString()); analysisDone(); // Expand results diff --git a/lib/filesettings.h b/lib/filesettings.h index b04f4a1af9e..601aceea4f1 100644 --- a/lib/filesettings.h +++ b/lib/filesettings.h @@ -33,10 +33,6 @@ class FileWithDetails { public: - explicit FileWithDetails(std::string path) - : FileWithDetails(std::move(path), Standards::Language::None, 0) - {} - FileWithDetails(std::string path, Standards::Language lang, std::size_t size) : mPath(std::move(path)) , mPathSimplified(Path::simplifyPath(mPath)) @@ -80,10 +76,6 @@ class FileWithDetails /** File settings. Multiple configurations for a file is allowed. */ struct CPPCHECKLIB FileSettings { - explicit FileSettings(std::string path) - : file(std::move(path)) - {} - FileSettings(std::string path, Standards::Language lang, std::size_t size) : file(std::move(path), lang, size) {} diff --git a/lib/importproject.cpp b/lib/importproject.cpp index 61fbf51cf19..e3105144ef8 100644 --- a/lib/importproject.cpp +++ b/lib/importproject.cpp @@ -420,7 +420,7 @@ bool ImportProject::importCompileCommands(std::istream &istr) printError("'" + path + "' from compilation database does not exist"); return false; } - FileSettings fs{std::move(path)}; + FileSettings fs{std::move(path), Standards::Language::None, 0}; // file will be identified later on fsParseCommand(fs, command); // read settings; -D, -I, -U, -std, -m*, -f* std::map variables; fsSetIncludePaths(fs, directory, fs.includePaths, variables); @@ -833,7 +833,7 @@ bool ImportProject::importVcxproj(const std::string &filename, std::map basePaths{Path::fromNativeSeparators(Path::getCurrentPath())}; for (auto &fs: fileSettings) { - fs.file = FileWithDetails{Path::getRelativePath(fs.filename(), basePaths)}; + fs.file = FileWithDetails{Path::getRelativePath(fs.filename(), basePaths), Standards::Language::None, 0}; // file will be identified later on for (auto &includePath: fs.includePaths) includePath = Path::getRelativePath(includePath, basePaths); } diff --git a/oss-fuzz/main.cpp b/oss-fuzz/main.cpp index dd8f77a80b1..f7bad77adb9 100644 --- a/oss-fuzz/main.cpp +++ b/oss-fuzz/main.cpp @@ -57,7 +57,7 @@ static Settings create_settings() } static const Settings s_settings = create_settings(); static DummyErrorLogger s_errorLogger; -static const FileWithDetails s_file("test.cpp"); +static const FileWithDetails s_file("test.cpp", Standards::Language::CPP, 0); static void doCheck(const std::string& code) { diff --git a/test/testcppcheck.cpp b/test/testcppcheck.cpp index 66c316fec0b..175e158ed5c 100644 --- a/test/testcppcheck.cpp +++ b/test/testcppcheck.cpp @@ -22,6 +22,7 @@ #include "filesettings.h" #include "fixture.h" #include "helpers.h" +#include "path.h" #include "settings.h" #include "suppressions.h" @@ -116,7 +117,7 @@ class TestCppcheck : public TestFixture { Suppressions supprs; ErrorLogger2 errorLogger; CppCheck cppcheck(s, supprs, errorLogger, false, {}); - ASSERT_EQUALS(1, cppcheck.check(FileWithDetails(file.path()))); + ASSERT_EQUALS(1, cppcheck.check(FileWithDetails(file.path(), Path::identify(file.path(), false), 0))); // TODO: how to properly disable these warnings? errorLogger.ids.erase(std::remove_if(errorLogger.ids.begin(), errorLogger.ids.end(), [](const std::string& id) { return id == "logChecker"; @@ -138,7 +139,7 @@ class TestCppcheck : public TestFixture { Suppressions supprs; ErrorLogger2 errorLogger; CppCheck cppcheck(s, supprs, errorLogger, false, {}); - FileSettings fs{file.path()}; + FileSettings fs{file.path(), Path::identify(file.path(), false), 0}; ASSERT_EQUALS(1, cppcheck.check(fs)); // TODO: how to properly disable these warnings? errorLogger.ids.erase(std::remove_if(errorLogger.ids.begin(), errorLogger.ids.end(), [](const std::string& id) { @@ -162,7 +163,7 @@ class TestCppcheck : public TestFixture { Suppressions supprs; ErrorLogger2 errorLogger; CppCheck cppcheck(s, supprs, errorLogger, false, {}); - ASSERT_EQUALS(0, cppcheck.check(FileWithDetails(file.path()))); + ASSERT_EQUALS(0, cppcheck.check(FileWithDetails(file.path(), Path::identify(file.path(), false), 0))); // TODO: how to properly disable these warnings? errorLogger.ids.erase(std::remove_if(errorLogger.ids.begin(), errorLogger.ids.end(), [](const std::string& id) { return id == "logChecker"; @@ -188,8 +189,8 @@ class TestCppcheck : public TestFixture { Suppressions supprs; ErrorLogger2 errorLogger; CppCheck cppcheck(s, supprs, errorLogger, false, {}); - ASSERT_EQUALS(1, cppcheck.check(FileWithDetails(test_file_a.path()))); - ASSERT_EQUALS(1, cppcheck.check(FileWithDetails(test_file_b.path()))); + ASSERT_EQUALS(1, cppcheck.check(FileWithDetails(test_file_a.path(), Path::identify(test_file_a.path(), false), 0))); + ASSERT_EQUALS(1, cppcheck.check(FileWithDetails(test_file_b.path(), Path::identify(test_file_b.path(), false), 0))); // TODO: how to properly disable these warnings? errorLogger.errmsgs.erase(std::remove_if(errorLogger.errmsgs.begin(), errorLogger.errmsgs.end(), [](const ErrorMessage& msg) { return msg.id == "logChecker"; @@ -220,7 +221,7 @@ class TestCppcheck : public TestFixture { Suppressions supprs; ErrorLogger2 errorLogger; CppCheck cppcheck(s, supprs, errorLogger, false, {}); - ASSERT_EQUALS(1, cppcheck.check(FileWithDetails(test_file.path()))); + ASSERT_EQUALS(1, cppcheck.check(FileWithDetails(test_file.path(), Path::identify(test_file.path(), false), 0))); // TODO: how to properly disable these warnings? errorLogger.errmsgs.erase(std::remove_if(errorLogger.errmsgs.begin(), errorLogger.errmsgs.end(), [](const ErrorMessage& msg) { return msg.id == "logChecker"; diff --git a/test/testexecutor.cpp b/test/testexecutor.cpp index 030f3e7394d..ab4b4778a33 100644 --- a/test/testexecutor.cpp +++ b/test/testexecutor.cpp @@ -58,7 +58,7 @@ class TestExecutor : public TestFixture { } void hasToLogSimple() { - const std::list files{FileWithDetails{"test.c"}}; + const std::list files{FileWithDetails{"test.c", Standards::Language::C, 0}}; const std::list fileSettings; // this is the "simple" format const auto settings = dinit(Settings, diff --git a/test/testfilesettings.cpp b/test/testfilesettings.cpp index bd5265c8901..c815cb8aa01 100644 --- a/test/testfilesettings.cpp +++ b/test/testfilesettings.cpp @@ -31,46 +31,46 @@ class TestFileSettings : public TestFixture { void test() const { { - const FileWithDetails p{"file.cpp"}; - ASSERT_EQUALS("file.cpp", p.path()); - ASSERT_EQUALS("file.cpp", p.spath()); - ASSERT_EQUALS_ENUM(Standards::Language::None, p.lang()); - ASSERT_EQUALS(0, p.size()); + const FileWithDetails p{"file.c", Standards::Language::C, 456}; + ASSERT_EQUALS("file.c", p.path()); + ASSERT_EQUALS("file.c", p.spath()); + ASSERT_EQUALS_ENUM(Standards::Language::C, p.lang()); + ASSERT_EQUALS(456, p.size()); } { - const FileWithDetails p{"file.cpp", Standards::Language::C, 123}; + const FileWithDetails p{"file.cpp", Standards::Language::CPP, 123}; ASSERT_EQUALS("file.cpp", p.path()); ASSERT_EQUALS("file.cpp", p.spath()); - ASSERT_EQUALS_ENUM(Standards::Language::C, p.lang()); + ASSERT_EQUALS_ENUM(Standards::Language::CPP, p.lang()); ASSERT_EQUALS(123, p.size()); } { - const FileWithDetails p{"in/file.cpp"}; + const FileWithDetails p{"in/file.cpp", Standards::Language::CPP, 123}; ASSERT_EQUALS("in/file.cpp", p.path()); ASSERT_EQUALS("in/file.cpp", p.spath()); - ASSERT_EQUALS_ENUM(Standards::Language::None, p.lang()); - ASSERT_EQUALS(0, p.size()); + ASSERT_EQUALS_ENUM(Standards::Language::CPP, p.lang()); + ASSERT_EQUALS(123, p.size()); } { - const FileWithDetails p{"in\\file.cpp"}; + const FileWithDetails p{"in\\file.cpp", Standards::Language::CPP, 123}; ASSERT_EQUALS("in\\file.cpp", p.path()); ASSERT_EQUALS("in/file.cpp", p.spath()); - ASSERT_EQUALS_ENUM(Standards::Language::None, p.lang()); - ASSERT_EQUALS(0, p.size()); + ASSERT_EQUALS_ENUM(Standards::Language::CPP, p.lang()); + ASSERT_EQUALS(123, p.size()); } { - const FileWithDetails p{"in/../file.cpp"}; + const FileWithDetails p{"in/../file.cpp", Standards::Language::CPP, 123}; ASSERT_EQUALS("in/../file.cpp", p.path()); ASSERT_EQUALS("file.cpp", p.spath()); - ASSERT_EQUALS_ENUM(Standards::Language::None, p.lang()); - ASSERT_EQUALS(0, p.size()); + ASSERT_EQUALS_ENUM(Standards::Language::CPP, p.lang()); + ASSERT_EQUALS(123, p.size()); } { - const FileWithDetails p{"in\\..\\file.cpp"}; + const FileWithDetails p{"in\\..\\file.cpp", Standards::Language::CPP, 123}; ASSERT_EQUALS("in\\..\\file.cpp", p.path()); ASSERT_EQUALS("file.cpp", p.spath()); - ASSERT_EQUALS_ENUM(Standards::Language::None, p.lang()); - ASSERT_EQUALS(0, p.size()); + ASSERT_EQUALS_ENUM(Standards::Language::CPP, p.lang()); + ASSERT_EQUALS(123, p.size()); } } }; diff --git a/test/testimportproject.cpp b/test/testimportproject.cpp index 237c761a617..ca84d13cf44 100644 --- a/test/testimportproject.cpp +++ b/test/testimportproject.cpp @@ -71,7 +71,7 @@ class TestImportProject : public TestFixture { } void setDefines() const { - FileSettings fs{"test.cpp"}; + FileSettings fs{"test.cpp", Standards::Language::CPP, 0}; ImportProject::fsSetDefines(fs, "A"); ASSERT_EQUALS("A=1", fs.defines); @@ -87,7 +87,7 @@ class TestImportProject : public TestFixture { } void setIncludePaths1() const { - FileSettings fs{"test.cpp"}; + FileSettings fs{"test.cpp", Standards::Language::CPP, 0}; std::list in(1, "../include"); std::map variables; ImportProject::fsSetIncludePaths(fs, "abc/def/", in, variables); @@ -96,7 +96,7 @@ class TestImportProject : public TestFixture { } void setIncludePaths2() const { - FileSettings fs{"test.cpp"}; + FileSettings fs{"test.cpp", Standards::Language::CPP, 0}; std::list in(1, "$(SolutionDir)other"); std::map variables; variables["SolutionDir"] = "c:/abc/"; @@ -106,7 +106,7 @@ class TestImportProject : public TestFixture { } void setIncludePaths3() const { // macro names are case insensitive - FileSettings fs{"test.cpp"}; + FileSettings fs{"test.cpp", Standards::Language::CPP, 0}; std::list in(1, "$(SOLUTIONDIR)other"); std::map variables; variables["SolutionDir"] = "c:/abc/"; @@ -393,8 +393,8 @@ class TestImportProject : public TestFixture { } void ignorePaths() const { - FileSettings fs1{"foo/bar"}; - FileSettings fs2{"qwe/rty"}; + FileSettings fs1{"foo/bar", Standards::Language::CPP, 0}; + FileSettings fs2{"qwe/rty", Standards::Language::CPP, 0}; TestImporter project; project.fileSettings = {std::move(fs1), std::move(fs2)}; diff --git a/test/testsuppressions.cpp b/test/testsuppressions.cpp index ca7e081be10..5176f2b60d6 100644 --- a/test/testsuppressions.cpp +++ b/test/testsuppressions.cpp @@ -1232,7 +1232,7 @@ class TestSuppressions : public TestFixture { CppCheck cppCheck(settings, supprs, *this, false, nullptr); // <- do not "use global suppressions". pretend this is a thread that just checks a file. const char code[] = "int f() { int a; return a; }"; - ASSERT_EQUALS(0, cppCheck.check(FileWithDetails("test.c"), code)); // <- no unsuppressed error is seen + ASSERT_EQUALS(0, cppCheck.check(FileWithDetails("test.c", Standards::Language::C, 0), code)); // <- no unsuppressed error is seen ASSERT_EQUALS("[test.c:1:25]: (error) Uninitialized variable: a [uninitvar]\n", errout_str()); // <- report error so ThreadExecutor can suppress it and make sure the global suppression is matched. } @@ -1241,9 +1241,9 @@ class TestSuppressions : public TestFixture { SuppressionList::Suppression suppression("unusedFunction", "test.c", 3); suppression.checked = true; // have to do this because fixes for #5704 ASSERT_EQUALS("", suppressions.addSuppression(std::move(suppression))); - ASSERT_EQUALS(true, !suppressions.getUnmatchedLocalSuppressions(FileWithDetails("test.c"), true).empty()); + ASSERT_EQUALS(true, !suppressions.getUnmatchedLocalSuppressions(FileWithDetails("test.c", Standards::Language::C, 0), true).empty()); ASSERT_EQUALS(false, !suppressions.getUnmatchedGlobalSuppressions(true).empty()); - ASSERT_EQUALS(false, !suppressions.getUnmatchedLocalSuppressions(FileWithDetails("test.c"), false).empty()); + ASSERT_EQUALS(false, !suppressions.getUnmatchedLocalSuppressions(FileWithDetails("test.c", Standards::Language::C, 0), false).empty()); ASSERT_EQUALS(false, !suppressions.getUnmatchedGlobalSuppressions(false).empty()); } @@ -1251,9 +1251,9 @@ class TestSuppressions : public TestFixture { SuppressionList suppressions; ASSERT_EQUALS("", suppressions.addSuppressionLine("unusedFunction:*")); ASSERT_EQUALS(false, suppressions.isSuppressed(errorMessage("errorid"))); - ASSERT_EQUALS(false, !suppressions.getUnmatchedLocalSuppressions(FileWithDetails("test.c"), true).empty()); + ASSERT_EQUALS(false, !suppressions.getUnmatchedLocalSuppressions(FileWithDetails("test.c", Standards::Language::C, 0), true).empty()); ASSERT_EQUALS(true, !suppressions.getUnmatchedGlobalSuppressions(true).empty()); - ASSERT_EQUALS(false, !suppressions.getUnmatchedLocalSuppressions(FileWithDetails("test.c"), false).empty()); + ASSERT_EQUALS(false, !suppressions.getUnmatchedLocalSuppressions(FileWithDetails("test.c", Standards::Language::C, 0), false).empty()); ASSERT_EQUALS(false, !suppressions.getUnmatchedGlobalSuppressions(false).empty()); } @@ -1276,7 +1276,7 @@ class TestSuppressions : public TestFixture { " int y;\n" "};"; CppCheck cppCheck(settings, supprs, *this, true, nullptr); - ASSERT_EQUALS(0, cppCheck.check(FileWithDetails("/somewhere/test.cpp"), code)); + ASSERT_EQUALS(0, cppCheck.check(FileWithDetails("/somewhere/test.cpp", Standards::Language::CPP, 0), code)); ASSERT_EQUALS("",errout_str()); }