From fa7e2291642504a2076ce88a071f7d8ae08b5273 Mon Sep 17 00:00:00 2001 From: firewave Date: Wed, 2 Aug 2023 12:16:04 +0200 Subject: [PATCH 1/3] TestFixture: improved message about redundant severity --- test/fixture.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/fixture.h b/test/fixture.h index 788b301c542..039faff63c5 100644 --- a/test/fixture.h +++ b/test/fixture.h @@ -162,7 +162,7 @@ class TestFixture : public ErrorLogger { SettingsBuilder& severity(Severity sev, bool b = true) { if (REDUNDANT_CHECK && settings.severity.isEnabled(sev) == b) - throw std::runtime_error("redundant setting: severity"); + throw std::runtime_error("redundant setting: severity - " + severityToString(sev)); settings.severity.setEnabled(sev, b); return *this; } From ea7ba7285db0718c6e8069bcef30d0e6d6dbe8d8 Mon Sep 17 00:00:00 2001 From: firewave Date: Wed, 2 Aug 2023 16:21:13 +0200 Subject: [PATCH 2/3] testrunner: avoid some `TestFixture::settingsBuilder()` invocations --- test/testautovariables.cpp | 3 ++- test/testclass.cpp | 3 ++- test/testcondition.cpp | 5 ++--- test/testincompletestatement.cpp | 3 ++- test/testleakautovar.cpp | 11 ++++------- test/testnullpointer.cpp | 4 +--- test/testsimplifytemplate.cpp | 11 ++++++----- test/testuninitvar.cpp | 7 ++----- test/testvalueflow.cpp | 3 +-- 9 files changed, 22 insertions(+), 28 deletions(-) diff --git a/test/testautovariables.cpp b/test/testautovariables.cpp index 57fc43f80ce..3b098e58908 100644 --- a/test/testautovariables.cpp +++ b/test/testautovariables.cpp @@ -30,6 +30,7 @@ class TestAutoVariables : public TestFixture { private: const Settings settings = settingsBuilder().severity(Severity::warning).severity(Severity::style).library("std.cfg").library("qt.cfg").build(); + const Settings settings_i = settingsBuilder(settings).certainty(Certainty::inconclusive).build(); struct CheckOptions { @@ -41,7 +42,7 @@ class TestAutoVariables : public TestFixture { #define check(...) check_(__FILE__, __LINE__, __VA_ARGS__) template void check_(const char* file, int line, const char (&code)[size], const CheckOptions& options = make_default_obj()) { - const Settings settings1 = settingsBuilder(settings).certainty(Certainty::inconclusive, options.inconclusive).build(); + const Settings &settings1 = options.inconclusive ? settings_i : settings; // Tokenize.. SimpleTokenizer tokenizer(settings1, *this, options.cpp); diff --git a/test/testclass.cpp b/test/testclass.cpp index f64ae216741..2b87cfd842b 100644 --- a/test/testclass.cpp +++ b/test/testclass.cpp @@ -38,6 +38,7 @@ class TestClass : public TestFixture { const Settings settings1 = settingsBuilder().severity(Severity::warning).library("std.cfg").build(); const Settings settings2 = settingsBuilder().severity(Severity::style).library("std.cfg").certainty(Certainty::inconclusive).build(); const Settings settings3 = settingsBuilder().severity(Severity::style).library("std.cfg").severity(Severity::warning).build(); + const Settings settings3_i = settingsBuilder(settings3).certainty(Certainty::inconclusive).build(); void run() override { mNewTemplate = true; @@ -2640,7 +2641,7 @@ class TestClass : public TestFixture { #define checkVirtualDestructor(...) checkVirtualDestructor_(__FILE__, __LINE__, __VA_ARGS__) template void checkVirtualDestructor_(const char* file, int line, const char (&code)[size], const CheckVirtualDestructorOptions& options = make_default_obj()) { - const Settings s = settingsBuilder(settings0).certainty(Certainty::inconclusive, options.inconclusive).severity(Severity::warning).build(); + const Settings& s = options.inconclusive ? settings3_i : settings3; // Tokenize.. SimpleTokenizer tokenizer(s, *this); diff --git a/test/testcondition.cpp b/test/testcondition.cpp index 219894ea9b1..d1b7137377f 100644 --- a/test/testcondition.cpp +++ b/test/testcondition.cpp @@ -34,6 +34,7 @@ class TestCondition : public TestFixture { private: const Settings settings0 = settingsBuilder().library("qt.cfg").library("std.cfg").severity(Severity::style).severity(Severity::warning).build(); /*const*/ Settings settings1 = settingsBuilder().severity(Severity::style).severity(Severity::warning).build(); + const Settings settings2 = settingsBuilder(settings0).severity(Severity::performance).certainty(Certainty::inconclusive).build(); void run() override { const char cfg[] = "\n" @@ -153,9 +154,7 @@ class TestCondition : public TestFixture { template void checkP_(const char* file, int line, const char (&code)[size]) { - const Settings settings = settingsBuilder(settings0).severity(Severity::performance).certainty(Certainty::inconclusive).build(); - - SimpleTokenizer2 tokenizer(settings, *this, code, "test.cpp"); + SimpleTokenizer2 tokenizer(settings2, *this, code, "test.cpp"); // Tokenizer.. ASSERT_LOC(tokenizer.simplifyTokens1(""), file, line); diff --git a/test/testincompletestatement.cpp b/test/testincompletestatement.cpp index 5f864c2d980..1ac971b3497 100644 --- a/test/testincompletestatement.cpp +++ b/test/testincompletestatement.cpp @@ -30,6 +30,7 @@ class TestIncompleteStatement : public TestFixture { private: const Settings settings = settingsBuilder().severity(Severity::warning).library("std.cfg").build(); + const Settings settings_i = settingsBuilder(settings).certainty(Certainty::inconclusive).build(); struct CheckOptions { @@ -41,7 +42,7 @@ class TestIncompleteStatement : public TestFixture { #define check(...) check_(__FILE__, __LINE__, __VA_ARGS__) template void check_(const char* file, int line, const char (&code)[size], const CheckOptions& options = make_default_obj()) { - const Settings settings1 = settingsBuilder(settings).certainty(Certainty::inconclusive, options.inconclusive).build(); + const Settings &settings1 = options.inconclusive ? settings_i : settings; SimpleTokenizer2 tokenizer(settings1, *this, code, options.cpp ? "test.cpp" : "test.c"); diff --git a/test/testleakautovar.cpp b/test/testleakautovar.cpp index 097543fbe39..043771ce471 100644 --- a/test/testleakautovar.cpp +++ b/test/testleakautovar.cpp @@ -646,20 +646,18 @@ class TestLeakAutoVar : public TestFixture { } void memcpy1() { // #11542 - const Settings s = settingsBuilder().library("std.cfg").build(); check("void f(char** old, char* value) {\n" " char *str = strdup(value);\n" " memcpy(old, &str, sizeof(char*));\n" - "}\n", dinit(CheckOptions, $.s = &s)); + "}\n"); ASSERT_EQUALS("", errout_str()); } void memcpy2() { - const Settings s = settingsBuilder().library("std.cfg").build(); check("void f(char* old, char* value, size_t len) {\n" " char *str = strdup(value);\n" " memcpy(old, str, len);\n" - "}\n", dinit(CheckOptions, $.cpp = true, $.s = &s)); + "}\n", dinit(CheckOptions, $.cpp = true)); ASSERT_EQUALS("[test.cpp:4:1]: (error) Memory leak: str [memleak]\n", errout_str()); } @@ -1894,20 +1892,19 @@ class TestLeakAutoVar : public TestFixture { "}\n"); ASSERT_EQUALS("", errout_str()); - const Settings s = settingsBuilder().library("std.cfg").build(); check("struct S {};\n" "void f(int i, std::vector> &v) {\n" " if (i < 1) {\n" " auto s = new S;\n" " v.push_back(std::unique_ptr(s));\n" " }\n" - "}\n", dinit(CheckOptions, $.cpp = true, $.s = &s)); + "}\n", dinit(CheckOptions, $.cpp = true)); ASSERT_EQUALS("", errout_str()); // don't crash check("void g(size_t len) {\n" // #12365 " char* b = new char[len + 1]{};\n" " std::string str = std::string(b);\n" - "}", dinit(CheckOptions, $.cpp = true, $.s = &s)); + "}", dinit(CheckOptions, $.cpp = true)); ASSERT_EQUALS("[test.cpp:4:1]: (error) Memory leak: b [memleak]\n", errout_str()); } diff --git a/test/testnullpointer.cpp b/test/testnullpointer.cpp index 638d0a3adf9..88338447ade 100644 --- a/test/testnullpointer.cpp +++ b/test/testnullpointer.cpp @@ -202,9 +202,7 @@ class TestNullPointer : public TestFixture { #define checkP(...) checkP_(__FILE__, __LINE__, __VA_ARGS__) template void checkP_(const char* file, int line, const char (&code)[size]) { - const Settings settings1 = settingsBuilder(settings).certainty(Certainty::inconclusive, false).build(); - - SimpleTokenizer2 tokenizer(settings1, *this, code, "test.cpp"); + SimpleTokenizer2 tokenizer(settings, *this, code, "test.cpp"); // Tokenizer.. ASSERT_LOC(tokenizer.simplifyTokens1(""), file, line); diff --git a/test/testsimplifytemplate.cpp b/test/testsimplifytemplate.cpp index df7d1f99be5..a1bd0023921 100644 --- a/test/testsimplifytemplate.cpp +++ b/test/testsimplifytemplate.cpp @@ -37,8 +37,9 @@ class TestSimplifyTemplate : public TestFixture { TestSimplifyTemplate() : TestFixture("TestSimplifyTemplate") {} private: - // If there are unused templates, keep those const Settings settings = settingsBuilder().severity(Severity::portability).build(); + const Settings settings1 = settingsBuilder(settings).library("std.cfg").build(); + const Settings settings1_d = settingsBuilder(settings1).debugwarnings().build(); void run() override { TEST_CASE(template1); @@ -327,8 +328,8 @@ class TestSimplifyTemplate : public TestFixture { #define tok(...) tok_(__FILE__, __LINE__, __VA_ARGS__) template std::string tok_(const char* file, int line, const char (&code)[size], const CheckOptions& options = make_default_obj()) { - const Settings settings1 = settingsBuilder(settings).library("std.cfg").debugwarnings(options.debugwarnings).build(); - SimpleTokenizer tokenizer(settings1, *this); + const Settings& s = options.debugwarnings ? settings1_d : settings1; + SimpleTokenizer tokenizer(s, *this); ASSERT_LOC(tokenizer.tokenize(code), file, line); @@ -338,8 +339,8 @@ class TestSimplifyTemplate : public TestFixture { #define dump(...) dump_(__FILE__, __LINE__, __VA_ARGS__) template std::string dump_(const char* file, int line, const char (&code)[size], const CheckOptions& options = make_default_obj()) { - const Settings settings1 = settingsBuilder(settings).library("std.cfg").debugwarnings(options.debugwarnings).build(); - SimpleTokenizer tokenizer(settings1, *this); + const Settings& s = options.debugwarnings ? settings1_d : settings1; + SimpleTokenizer tokenizer(s, *this); ASSERT_LOC(tokenizer.tokenize(code), file, line); diff --git a/test/testuninitvar.cpp b/test/testuninitvar.cpp index 4fba5b660a7..9652bbc5e59 100644 --- a/test/testuninitvar.cpp +++ b/test/testuninitvar.cpp @@ -5471,14 +5471,11 @@ class TestUninitVar : public TestFixture { template void valueFlowUninit_(const char* file, int line, const char (&code)[size], bool cpp = true) { - // Tokenize.. - const Settings s = settingsBuilder(settings).debugwarnings(false).build(); - - SimpleTokenizer tokenizer(s, *this, cpp); + SimpleTokenizer tokenizer(settings, *this, cpp); ASSERT_LOC(tokenizer.tokenize(code), file, line); // Check for redundant code.. - CheckUninitVar checkuninitvar(&tokenizer, &s, this); + CheckUninitVar checkuninitvar(&tokenizer, &settings, this); (checkuninitvar.valueFlowUninit)(); } diff --git a/test/testvalueflow.cpp b/test/testvalueflow.cpp index fe0ea225b5b..5046f88c560 100644 --- a/test/testvalueflow.cpp +++ b/test/testvalueflow.cpp @@ -7535,10 +7535,9 @@ class TestValueFlow : public TestFixture { void valueFlowUnknownFunctionReturnMalloc() { // #4626 const char *code; - const Settings s = settingsBuilder().library("std.cfg").build(); code = "ptr = malloc(10);"; - const auto& values = tokenValues(code, "(", &s); + const auto& values = tokenValues(code, "("); ASSERT_EQUALS(1, values.size()); ASSERT_EQUALS(true, values.front().isIntValue()); ASSERT_EQUALS(true, values.front().isPossible()); From c764b69062a0cfa1abccbea0930cb01286fafd75 Mon Sep 17 00:00:00 2001 From: firewave Date: Mon, 22 Sep 2025 14:37:08 +0200 Subject: [PATCH 3/3] made `TestFixture::SettingsBuilder::REDUNDANT_CHECK` a `constexpr` --- test/fixture.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/fixture.h b/test/fixture.h index 039faff63c5..7aec8066d43 100644 --- a/test/fixture.h +++ b/test/fixture.h @@ -252,7 +252,7 @@ class TestFixture : public ErrorLogger { const TestFixture &fixture; Settings settings; - const bool REDUNDANT_CHECK = false; + static constexpr bool REDUNDANT_CHECK = false; }; SettingsBuilder settingsBuilder() const {