diff --git a/test/fixture.cpp b/test/fixture.cpp index 30acf65935f0..d3dac1895352 100644 --- a/test/fixture.cpp +++ b/test/fixture.cpp @@ -115,14 +115,11 @@ void TestFixture::teardownTest() { teardownTestInternal(); - // TODO: enable - /* - { - const std::string s = errout.str(); + { + const std::string s = errout_str(); if (!s.empty()) throw std::runtime_error("unconsumed ErrorLogger err: " + s); - } - */ + } { const std::string s = output_str(); if (!s.empty()) @@ -429,7 +426,7 @@ void TestFixture::reportErr(const ErrorMessage &msg) if (msg.severity == Severity::information && msg.id == "normalCheckLevelMaxBranches") return; const std::string errormessage(msg.toString(mVerbose, mTemplateFormat, mTemplateLocation)); - errout << errormessage << std::endl; + mErrout << errormessage << std::endl; } void TestFixture::setTemplateFormat(const std::string &templateFormat) diff --git a/test/fixture.h b/test/fixture.h index e151e520ed8e..7527f3261bd3 100644 --- a/test/fixture.h +++ b/test/fixture.h @@ -254,12 +254,17 @@ class TestFixture : public ErrorLogger { return s; } - std::ostringstream errout; + std::string errout_str() { + std::string s = mErrout.str(); + mErrout.str(""); + return s; + } const Settings settingsDefault; private: std::ostringstream mOutput; + std::ostringstream mErrout; void reportOut(const std::string &outmsg, Color c = Color::Reset) override; void reportErr(const ErrorMessage &msg) override; diff --git a/test/test64bit.cpp b/test/test64bit.cpp index 04ae74d5a5e3..97ba363c01d5 100644 --- a/test/test64bit.cpp +++ b/test/test64bit.cpp @@ -44,9 +44,6 @@ class Test64BitPortability : public TestFixture { #define check(code) check_(code, __FILE__, __LINE__) void check_(const char code[], const char* file, int line) { - // Clear the error buffer.. - errout.str(""); - // Tokenize.. Tokenizer tokenizer(settings, this); std::istringstream istr(code); @@ -63,13 +60,13 @@ class Test64BitPortability : public TestFixture { "void f() {\n" " CharArray foo = \"\";\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct T { std::vector*a[2][2]; };\n" // #11560 "void f(T& t, int i, int j) {\n" " t.a[i][j] = new std::vector;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void novardecl() { @@ -78,7 +75,7 @@ class Test64BitPortability : public TestFixture { "{\n" " a = p;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void functionpar() { @@ -87,65 +84,65 @@ class Test64BitPortability : public TestFixture { " int a = p;\n" " return a + 4;\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (portability) Assigning a pointer to an integer is not portable.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (portability) Assigning a pointer to an integer is not portable.\n", errout_str()); check("int foo(int p[])\n" "{\n" " int a = p;\n" " return a + 4;\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (portability) Assigning a pointer to an integer is not portable.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (portability) Assigning a pointer to an integer is not portable.\n", errout_str()); check("int foo(int p[])\n" "{\n" " int *a = p;\n" " return a;\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (portability) Returning an address value in a function with integer return type is not portable.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (portability) Returning an address value in a function with integer return type is not portable.\n", errout_str()); check("void foo(int x)\n" "{\n" " int *p = x;\n" " *p = 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (portability) Assigning an integer to a pointer is not portable.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (portability) Assigning an integer to a pointer is not portable.\n", errout_str()); check("int f(const char *p) {\n" // #4659 " return 6 + p[2] * 256;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int foo(int *p) {\n" // #6096 " bool a = p;\n" " return a;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("std::array f();\n" "void g() {\n" " std::array a = f();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("std::array f(int x);\n" "void g(int i) {\n" " std::array a = f(i);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("typedef std::array Array;\n" "Array f(int x);\n" "void g(int i) {\n" " Array a = f(i);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("typedef std::array Array;\n" "Array f();\n" "void g(int i) {\n" " Array a = f();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S {\n" // #9951 " enum E { E0 };\n" @@ -154,12 +151,12 @@ class Test64BitPortability : public TestFixture { "void f() {\n" " std::array a = S::g(S::E::E0);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("char* f(char* p) {\n" " return p ? p : 0;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void structmember() { @@ -167,7 +164,7 @@ class Test64BitPortability : public TestFixture { "void f(struct Foo *foo) {\n" " int i = foo->p;\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (portability) Assigning a pointer to an integer is not portable.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (portability) Assigning a pointer to an integer is not portable.\n", errout_str()); check("struct S {\n" // #10145 " enum class E { e1, e2 };\n" @@ -177,7 +174,7 @@ class Test64BitPortability : public TestFixture { "void f(S& s) {\n" " s.e = S::E::e1;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void ptrcompare() { @@ -185,7 +182,7 @@ class Test64BitPortability : public TestFixture { check("void foo(int *p) {\n" " int a = (p != NULL);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void ptrarithmetic() { @@ -194,74 +191,74 @@ class Test64BitPortability : public TestFixture { " int x = 10;\n" " int *a = p + x;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(int *p) {\n" " int x = 10;\n" " int *a = x + p;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(int *p) {\n" " int x = 10;\n" " int *a = x * x;\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (portability) Assigning an integer to a pointer is not portable.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (portability) Assigning an integer to a pointer is not portable.\n", errout_str()); check("void foo(int *start, int *end) {\n" " int len;\n" " int len = end + 10 - start;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void returnIssues() { check("void* foo(int i) {\n" " return i;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (portability) Returning an integer in a function with pointer return type is not portable.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (portability) Returning an integer in a function with pointer return type is not portable.\n", errout_str()); check("void* foo(int* i) {\n" " return i;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void* foo() {\n" " return 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int foo(int i) {\n" " return i;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct Foo {};\n" "\n" "int* dostuff(Foo foo) {\n" " return foo;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int foo(char* c) {\n" " return c;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (portability) Returning an address value in a function with integer return type is not portable.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (portability) Returning an address value in a function with integer return type is not portable.\n", errout_str()); check("int foo(char* c) {\n" " return 1+c;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (portability) Returning an address value in a function with integer return type is not portable.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (portability) Returning an address value in a function with integer return type is not portable.\n", errout_str()); check("std::string foo(char* c) {\n" " return c;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int foo(char *a, char *b) {\n" // #4486 " return a + 1 - b;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct s {\n" // 4642 " int i;\n" @@ -269,13 +266,13 @@ class Test64BitPortability : public TestFixture { "int func(struct s *p) {\n" " return 1 + p->i;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("static void __iomem *f(unsigned int port_no) {\n" " void __iomem *mmio = hpriv->mmio;\n" " return mmio + (port_no * 0x80);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #7247: don't check return statements in nested functions.. check("int foo() {\n" @@ -283,7 +280,7 @@ class Test64BitPortability : public TestFixture { " const char * name() { return \"abc\"; }\n" " } table;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #7451: Lambdas check("const int* test(std::vector outputs, const std::string& text) {\n" @@ -291,7 +288,7 @@ class Test64BitPortability : public TestFixture { " [&](int ele) { return \"test\" == text; });\n" " return nullptr;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S {\n" // #12159 " std::future f() const {\n" @@ -303,7 +300,7 @@ class Test64BitPortability : public TestFixture { " auto x = s->f();\n" " return x.get();\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } }; diff --git a/test/testassert.cpp b/test/testassert.cpp index 735d87dddfad..e6beeb33a053 100644 --- a/test/testassert.cpp +++ b/test/testassert.cpp @@ -35,9 +35,6 @@ class TestAssert : public TestFixture { #define check(...) check_(__FILE__, __LINE__, __VA_ARGS__) void check_(const char* file, int line, const char code[], const char *filename = "test.cpp") { - // Clear the error buffer.. - errout.str(""); - // Tokenize.. Tokenizer tokenizer(settings, this); std::istringstream istr(code); @@ -65,7 +62,7 @@ class TestAssert : public TestFixture { " return a;\n" "}\n" "assert(foo() == 3);"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check( "int foo(int a) {\n" @@ -73,7 +70,7 @@ class TestAssert : public TestFixture { " return b;\n" "}\n" "assert(foo(1) == 2);"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void functionCallInAssert() { @@ -84,7 +81,7 @@ class TestAssert : public TestFixture { " return a;\n" "}\n" "assert(foo() == 3);"); - ASSERT_EQUALS("[test.cpp:6]: (warning) Assert statement calls a function which may have desired side effects: 'foo'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (warning) Assert statement calls a function which may have desired side effects: 'foo'.\n", errout_str()); // Ticket #4937 "false positive: Assert calls a function which may have desired side effects" check("struct SquarePack {\n" @@ -96,7 +93,7 @@ class TestAssert : public TestFixture { "void foo() {\n" " assert( !SquarePack::isRank1Or8(push2) );\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct SquarePack {\n" " static bool isRank1Or8( Square &sq ) {\n" @@ -107,7 +104,7 @@ class TestAssert : public TestFixture { "void foo() {\n" " assert( !SquarePack::isRank1Or8(push2) );\n" "}"); - ASSERT_EQUALS("[test.cpp:8]: (warning) Assert statement calls a function which may have desired side effects: 'isRank1Or8'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8]: (warning) Assert statement calls a function which may have desired side effects: 'isRank1Or8'.\n", errout_str()); check("struct SquarePack {\n" " static bool isRank1Or8( Square *sq ) {\n" @@ -118,7 +115,7 @@ class TestAssert : public TestFixture { "void foo() {\n" " assert( !SquarePack::isRank1Or8(push2) );\n" "}"); - ASSERT_EQUALS("[test.cpp:8]: (warning) Assert statement calls a function which may have desired side effects: 'isRank1Or8'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8]: (warning) Assert statement calls a function which may have desired side effects: 'isRank1Or8'.\n", errout_str()); check("struct SquarePack {\n" " static bool isRank1Or8( Square *sq ) {\n" @@ -129,7 +126,7 @@ class TestAssert : public TestFixture { "void foo() {\n" " assert( !SquarePack::isRank1Or8(push2) );\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct Geometry {\n" " int nbv;\n" @@ -140,7 +137,7 @@ class TestAssert : public TestFixture { "void Geometry::ReadGeometry() {\n" " assert(empty());\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void memberFunctionCallInAssert() { @@ -150,7 +147,7 @@ class TestAssert : public TestFixture { "void foo(SquarePack s) {\n" " assert( s.Foo() );\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (warning) Assert statement calls a function which may have desired side effects: 'Foo'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (warning) Assert statement calls a function which may have desired side effects: 'Foo'.\n", errout_str()); check("struct SquarePack {\n" " int Foo() const;\n" @@ -158,7 +155,7 @@ class TestAssert : public TestFixture { "void foo(SquarePack* s) {\n" " assert( s->Foo() );\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct SquarePack {\n" " static int Foo();\n" @@ -166,14 +163,14 @@ class TestAssert : public TestFixture { "void foo(SquarePack* s) {\n" " assert( s->Foo() );\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct SquarePack {\n" "};\n" "void foo(SquarePack* s) {\n" " assert( s->Foo() );\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void assignmentInAssert() { @@ -182,54 +179,54 @@ class TestAssert : public TestFixture { " assert(a = 2);\n" " return a;\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Assert statement modifies 'a'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Assert statement modifies 'a'.\n", errout_str()); check("void f(int a) {\n" " assert(a == 2);\n" " return a;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int a, int b) {\n" " assert(a == 2 && (b = 1));\n" " return a;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Assert statement modifies 'b'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Assert statement modifies 'b'.\n", errout_str()); check("void f() {\n" " int a; a = 0;\n" " assert(a += 2);\n" " return a;\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Assert statement modifies 'a'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Assert statement modifies 'a'.\n", errout_str()); check("void f() {\n" " int a; a = 0;\n" " assert(a *= 2);\n" " return a;\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Assert statement modifies 'a'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Assert statement modifies 'a'.\n", errout_str()); check("void f() {\n" " int a; a = 0;\n" " assert(a -= 2);\n" " return a;\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Assert statement modifies 'a'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Assert statement modifies 'a'.\n", errout_str()); check("void f() {\n" " int a = 0;\n" " assert(a--);\n" " return a;\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Assert statement modifies 'a'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Assert statement modifies 'a'.\n", errout_str()); check("void f() {\n" " int a = 0;\n" " assert(--a);\n" " return a;\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Assert statement modifies 'a'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Assert statement modifies 'a'.\n", errout_str()); check("void f() {\n" " assert(std::all_of(first, last, []() {\n" @@ -238,19 +235,19 @@ class TestAssert : public TestFixture { " return tmp == expected;\n" " }));\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void crash() { check("void foo() {\n" " assert(sizeof(struct { int a[x++]; })==sizeof(int));\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() {\n" // #9790 " assert(kad_bucket_hash(&(kad_guid) { .bytes = { 0 } }, & (kad_guid){.bytes = { 0 }}) == -1);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } }; diff --git a/test/testautovariables.cpp b/test/testautovariables.cpp index 4cc23f727c6a..6a4a6254defd 100644 --- a/test/testautovariables.cpp +++ b/test/testautovariables.cpp @@ -34,9 +34,6 @@ class TestAutoVariables : public TestFixture { #define check(...) check_(__FILE__, __LINE__, __VA_ARGS__) void check_(const char* file, int line, const char code[], bool inconclusive = true, const char* filename = "test.cpp") { - // Clear the error buffer.. - errout.str(""); - const Settings settings1 = settingsBuilder(settings).certainty(Certainty::inconclusive, inconclusive).build(); // Tokenize.. @@ -169,21 +166,21 @@ class TestAutoVariables : public TestFixture { " int num = 2;\n" " *res = #\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Address of local auto-variable assigned to a function parameter.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Address of local auto-variable assigned to a function parameter.\n", errout_str()); check("void func1(int **res)\n" "{\n" " int num = 2;\n" " res = #\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (warning) Assignment of function parameter has no effect outside the function. Did you forget dereferencing it?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (warning) Assignment of function parameter has no effect outside the function. Did you forget dereferencing it?\n", errout_str()); check("void func1(int **res)\n" "{\n" " int num = 2;\n" " foo.res = #\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void testautovar2() { @@ -195,7 +192,7 @@ class TestAutoVariables : public TestFixture { " int num = 2;\n" " *res = #\n" "}"); - ASSERT_EQUALS("[test.cpp:7]: (error) Address of local auto-variable assigned to a function parameter.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (error) Address of local auto-variable assigned to a function parameter.\n", errout_str()); check("class Fred {\n" " void func1(int **res);\n" @@ -205,7 +202,7 @@ class TestAutoVariables : public TestFixture { " int num = 2;\n" " res = #\n" "}"); - ASSERT_EQUALS("[test.cpp:7]: (warning) Assignment of function parameter has no effect outside the function. Did you forget dereferencing it?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (warning) Assignment of function parameter has no effect outside the function. Did you forget dereferencing it?\n", errout_str()); check("class Fred {\n" " void func1(int **res);\n" @@ -215,7 +212,7 @@ class TestAutoVariables : public TestFixture { " int num = 2;\n" " foo.res = #\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void testautovar3() { // ticket #2925 @@ -224,7 +221,7 @@ class TestAutoVariables : public TestFixture { " int x[100];\n" " *p = x;\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Address of local auto-variable assigned to a function parameter.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Address of local auto-variable assigned to a function parameter.\n", errout_str()); } void testautovar4() { // ticket #2928 @@ -233,7 +230,7 @@ class TestAutoVariables : public TestFixture { " static int x[100];\n" " *p = x;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void testautovar5() { // ticket #2926 @@ -242,7 +239,7 @@ class TestAutoVariables : public TestFixture { " char a;\n" " ab->a = &a;\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error, inconclusive) Address of local auto-variable assigned to a function parameter.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error, inconclusive) Address of local auto-variable assigned to a function parameter.\n", errout_str()); } void testautovar6() { // ticket #2931 @@ -251,14 +248,14 @@ class TestAutoVariables : public TestFixture { " char a[10];\n" " x->str = a;\n" "}", false); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(struct X *x)\n" "{\n" " char a[10];\n" " x->str = a;\n" "}", true); - ASSERT_EQUALS("[test.cpp:4]: (error, inconclusive) Address of local auto-variable assigned to a function parameter.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error, inconclusive) Address of local auto-variable assigned to a function parameter.\n", errout_str()); } void testautovar7() { // ticket #3066 @@ -268,7 +265,7 @@ class TestAutoVariables : public TestFixture { " target->parent = &scrollpane->widget;\n" " return scrollpane;\n" "}", false); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void testautovar8() { @@ -276,12 +273,12 @@ class TestAutoVariables : public TestFixture { " int i = 0;\n" " p = &i;\n" "}", false); - ASSERT_EQUALS("[test.cpp:3]: (error) Address of local auto-variable assigned to a function parameter.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Address of local auto-variable assigned to a function parameter.\n", errout_str()); check("void foo(std::string& s) {\n" " s = foo;\n" "}", false); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void testautovar9() { @@ -292,7 +289,7 @@ class TestAutoVariables : public TestFixture { " FP fp;\n" " p = &fn.i;\n" "}", false); - ASSERT_EQUALS("[test.cpp:6]: (error) Address of local auto-variable assigned to a function parameter.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (error) Address of local auto-variable assigned to a function parameter.\n", errout_str()); check("struct FN {int i;};\n" "struct FP {FN* f};\n" @@ -301,7 +298,7 @@ class TestAutoVariables : public TestFixture { " FP fp;\n" " p = &p_fp->i;\n" "}", false); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct FN {int i;};\n" "struct FP {FN* f};\n" @@ -310,100 +307,100 @@ class TestAutoVariables : public TestFixture { " FP fp;\n" " p = &fp.f->i;\n" "}", false); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void testautovar10() { // #2930 - assignment of function parameter check("void foo(char* p) {\n" " p = 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Assignment of function parameter has no effect outside the function. Did you forget dereferencing it?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Assignment of function parameter has no effect outside the function. Did you forget dereferencing it?\n", errout_str()); check("void foo(int b) {\n" " b = foo(b);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Assignment of function parameter has no effect outside the function.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Assignment of function parameter has no effect outside the function.\n", errout_str()); check("void foo(int b) {\n" " b += 1;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Assignment of function parameter has no effect outside the function.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Assignment of function parameter has no effect outside the function.\n", errout_str()); check("void foo(std::string s) {\n" " s = foo(b);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Assignment of function parameter has no effect outside the function.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Assignment of function parameter has no effect outside the function.\n", errout_str()); check("void foo(char* p) {\n" // don't warn for self assignment, there is another warning for this " p = p;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(char* p) {\n" " if (!p) p = buf;\n" " *p = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(char* p) {\n" " if (!p) p = buf;\n" " do_something(p);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(char* p) {\n" " while (!p) p = buf;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(char* p) {\n" " p = 0;\n" " asm(\"somecmd\");\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(Foo* p) {\n" " p = 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Assignment of function parameter has no effect outside the function. Did you forget dereferencing it?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Assignment of function parameter has no effect outside the function. Did you forget dereferencing it?\n", errout_str()); check("class Foo {};\n" "void foo(Foo p) {\n" " p = 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Assignment of function parameter has no effect outside the function.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Assignment of function parameter has no effect outside the function.\n", errout_str()); check("void foo(Foo p) {\n" " p = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(int& p) {\n" " p = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("double foo(double d) {\n" // #5005 " int i = d;\n" " d = i;\n" " return d;" "}",false); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(int* ptr) {\n" // #4793 " ptr++;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Assignment of function parameter has no effect outside the function. Did you forget dereferencing it?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Assignment of function parameter has no effect outside the function. Did you forget dereferencing it?\n", errout_str()); check("void foo(int* ptr) {\n" // #3177 " --ptr;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Assignment of function parameter has no effect outside the function. Did you forget dereferencing it?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Assignment of function parameter has no effect outside the function. Did you forget dereferencing it?\n", errout_str()); check("void foo(struct S* const x) {\n" // #7839 " ++x->n;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void testautovar11() { // #4641 - fp, assign local struct member address to function parameter @@ -414,7 +411,7 @@ class TestAutoVariables : public TestFixture { " struct A a = bar();\n" " *p = &(*a.data)[0];\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A {\n" " char data[10];\n" @@ -423,26 +420,26 @@ class TestAutoVariables : public TestFixture { " struct A a = bar();\n" " *p = &a.data[0];\n" "}"); - ASSERT_EQUALS("[test.cpp:6]: (error) Address of local auto-variable assigned to a function parameter.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (error) Address of local auto-variable assigned to a function parameter.\n", errout_str()); check("void f(char **out) {\n" " struct S *p = glob;\n" " *out = &p->data;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #4998 check("void f(s8**out) {\n" " s8 *p;\n" // <- p is pointer => no error " *out = &p[1];\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(s8**out) {\n" " s8 p[10];\n" // <- p is array => error " *out = &p[1];\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Address of local auto-variable assigned to a function parameter.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Address of local auto-variable assigned to a function parameter.\n", errout_str()); } void testautovar12() { // Ticket #5024, #5050 - Crash on invalid input @@ -472,7 +469,7 @@ class TestAutoVariables : public TestFixture { " goto label;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void testautovar15() { // Ticket #6538 @@ -485,7 +482,7 @@ class TestAutoVariables : public TestFixture { " return &darkOutline;\n" " return 0;\n" "}", false); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void testautovar16() { // Ticket #8114 @@ -493,7 +490,7 @@ class TestAutoVariables : public TestFixture { " int dummy;\n" " *result = (&dummy < ptr);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void testautovar_array1() { @@ -502,7 +499,7 @@ class TestAutoVariables : public TestFixture { " int num=2;" " arr[0]=#\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Address of local auto-variable assigned to a function parameter.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Address of local auto-variable assigned to a function parameter.\n", errout_str()); } void testautovar_array2() { @@ -514,7 +511,7 @@ class TestAutoVariables : public TestFixture { " int num=2;" " arr[0]=#\n" "}"); - ASSERT_EQUALS("[test.cpp:6]: (error) Address of local auto-variable assigned to a function parameter.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (error) Address of local auto-variable assigned to a function parameter.\n", errout_str()); } void testautovar_array3() { @@ -522,7 +519,7 @@ class TestAutoVariables : public TestFixture { " std::string a = \"abc\";\n" " argv[0] = &a[0];\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(char* c[]) {\n" " char a[] = \"abc\";\n" @@ -534,7 +531,7 @@ class TestAutoVariables : public TestFixture { "}\n"); ASSERT_EQUALS("[test.cpp:3]: (error) Address of local auto-variable assigned to a function parameter.\n" "[test.cpp:7]: (error) Address of local auto-variable assigned to a function parameter.\n", - errout.str()); + errout_str()); check("struct String {\n" " String& operator=(const char* c) { m = c; return *this; }\n" @@ -549,7 +546,7 @@ class TestAutoVariables : public TestFixture { " char a[] = \"abc\";\n" " *s = &a[0];\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void testautovar_normal() { @@ -558,7 +555,7 @@ class TestAutoVariables : public TestFixture { " XPoint DropPoint;\n" " ds->location_data = (XtPointer *)&DropPoint;\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error, inconclusive) Address of local auto-variable assigned to a function parameter.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error, inconclusive) Address of local auto-variable assigned to a function parameter.\n", errout_str()); } void testautovar_ptrptr() { // #6596 @@ -566,7 +563,7 @@ class TestAutoVariables : public TestFixture { " char dead_slot;\n" " matches[0] = (char *)&dead_slot;\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Address of local auto-variable assigned to a function parameter.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Address of local auto-variable assigned to a function parameter.\n", errout_str()); } void testautovar_return1() { @@ -575,7 +572,7 @@ class TestAutoVariables : public TestFixture { " int num=2;" " return #" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:3] -> [test.cpp:3]: (error) Returning pointer to local variable 'num' that will be invalid when returning.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:3] -> [test.cpp:3]: (error) Returning pointer to local variable 'num' that will be invalid when returning.\n", errout_str()); } void testautovar_return2() { @@ -587,7 +584,7 @@ class TestAutoVariables : public TestFixture { " int num=2;" " return #" "}"); - ASSERT_EQUALS("[test.cpp:6] -> [test.cpp:6] -> [test.cpp:6]: (error) Returning pointer to local variable 'num' that will be invalid when returning.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6] -> [test.cpp:6] -> [test.cpp:6]: (error) Returning pointer to local variable 'num' that will be invalid when returning.\n", errout_str()); } void testautovar_return3() { @@ -597,7 +594,7 @@ class TestAutoVariables : public TestFixture { " void *&value = tls[id];" " return &value;" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void testautovar_return4() { @@ -606,7 +603,7 @@ class TestAutoVariables : public TestFixture { " int cond2;\n" " dostuff([&cond2]() { return &cond2; });\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void testautovar_return5() { // #11465 @@ -614,7 +611,7 @@ class TestAutoVariables : public TestFixture { "const std::type_info* f() {\n" " return &typeid(S);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void testautovar_extern() { @@ -623,7 +620,7 @@ class TestAutoVariables : public TestFixture { " extern struct foo f;\n" " return &f;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void testautovar_reassigned() { @@ -633,7 +630,7 @@ class TestAutoVariables : public TestFixture { " dostuff(pcb);\n" " pcb->root0 = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(cb* pcb) {\n" " int root0;\n" @@ -642,7 +639,7 @@ class TestAutoVariables : public TestFixture { " if (condition) return;\n" // <- not reassigned => error " pcb->root0 = 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error, inconclusive) Address of local auto-variable assigned to a function parameter.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error, inconclusive) Address of local auto-variable assigned to a function parameter.\n", errout_str()); check("void foo(cb* pcb) {\n" " int root0;\n" @@ -651,7 +648,7 @@ class TestAutoVariables : public TestFixture { " if (condition)\n" " pcb->root0 = 0;\n" // <- conditional reassign => error "}"); - ASSERT_EQUALS("[test.cpp:3]: (error, inconclusive) Address of local auto-variable assigned to a function parameter.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error, inconclusive) Address of local auto-variable assigned to a function parameter.\n", errout_str()); check("struct S { int *p; };\n" "void g(struct S* s) {\n" @@ -666,7 +663,7 @@ class TestAutoVariables : public TestFixture { ASSERT_EQUALS( "[test.cpp:4]: (error) Address of local auto-variable assigned to a function parameter.\n" "[test.cpp:4]: (error) Address of local auto-variable assigned to a function parameter.\n", // duplicate - errout.str()); + errout_str()); } void testinvaliddealloc() { @@ -686,33 +683,33 @@ class TestAutoVariables : public TestFixture { "[test.cpp:5]: (error) Deallocation of an auto-variable results in undefined behaviour.\n" "[test.cpp:7]: (error) Deallocation of an auto-variable results in undefined behaviour.\n" "[test.cpp:9]: (error) Deallocation of an auto-variable results in undefined behaviour.\n" - "[test.cpp:11]: (error) Deallocation of an auto-variable results in undefined behaviour.\n", errout.str()); + "[test.cpp:11]: (error) Deallocation of an auto-variable results in undefined behaviour.\n", errout_str()); check("void func1(char * ptr) {\n" " free(ptr);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void func1() {\n" " char* tmp1[256];\n" " init(tmp1);\n" " delete tmp1[34];\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void func1() {\n" " static char tmp1[256];\n" " char *p = tmp1;\n" " free(p);\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Deallocation of a static variable (tmp1) results in undefined behaviour.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Deallocation of a static variable (tmp1) results in undefined behaviour.\n", errout_str()); check("char tmp1[256];\n" "void func1() {\n" " char *p; if (x) p = tmp1;\n" " free(p);\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Deallocation of a global variable (tmp1) results in undefined behaviour.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Deallocation of a global variable (tmp1) results in undefined behaviour.\n", errout_str()); check("void f()\n" "{\n" @@ -723,7 +720,7 @@ class TestAutoVariables : public TestFixture { " free(psz_title);\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #2298 new check: passing stack-address to free() check("int main() {\n" @@ -731,44 +728,44 @@ class TestAutoVariables : public TestFixture { " free(&p);\n" " return 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Deallocation of an auto-variable results in undefined behaviour.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Deallocation of an auto-variable results in undefined behaviour.\n", errout_str()); check("int main() {\n" " int i;\n" " free(&i);\n" " return 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Deallocation of an auto-variable results in undefined behaviour.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Deallocation of an auto-variable results in undefined behaviour.\n", errout_str()); // #5732 check("int main() {\n" " long (*pKoeff)[256] = new long[9][256];\n" " delete[] pKoeff;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int main() {\n" " long *pKoeff[256];\n" " delete[] pKoeff;\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Deallocation of an auto-variable results in undefined behaviour.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Deallocation of an auto-variable results in undefined behaviour.\n", errout_str()); check("int main() {\n" " long *pKoeff[256];\n" " free (pKoeff);\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Deallocation of an auto-variable results in undefined behaviour.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Deallocation of an auto-variable results in undefined behaviour.\n", errout_str()); check("void foo() {\n" " const intPtr& intref = Getter();\n" " delete intref;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void test() {\n" " MyObj& obj = *new MyObj;\n" " delete &obj;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #6506 check("struct F {\n" @@ -780,7 +777,7 @@ class TestAutoVariables : public TestFixture { " char *c2 = 0;\n" " F().free(&c2);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class foo {\n" " void free(void* );\n" @@ -789,14 +786,14 @@ class TestAutoVariables : public TestFixture { " free(&dst_copy);\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #6551 check("bool foo( ) {\n" " SwTxtFld * pTxtFld = GetFldTxtAttrAt();\n" " delete static_cast(&pTxtFld->GetAttr());\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #8910 check("void f() {\n" @@ -806,14 +803,14 @@ class TestAutoVariables : public TestFixture { " else data = (RGNDATA *)stack;\n" " if ((char *)data != stack) free (data);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #8923 check("void f(char **args1, char *args2[]) {\n" " free((char **)args1);\n" " free((char **)args2);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #10097 check("struct Array {\n" @@ -821,7 +818,7 @@ class TestAutoVariables : public TestFixture { " std::array* m_Arr{};\n" "};\n" "Array arr;\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #8174 check("struct S {};\n" @@ -830,7 +827,7 @@ class TestAutoVariables : public TestFixture { " S* p = &s;\n" " free(p);\n" "}\n"); - ASSERT_EQUALS("[test.cpp:5]: (error) Deallocation of an auto-variable (s) results in undefined behaviour.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Deallocation of an auto-variable (s) results in undefined behaviour.\n", errout_str()); check("void f(bool b, int* q) {\n" " int i;\n" @@ -838,7 +835,7 @@ class TestAutoVariables : public TestFixture { " if (!b)\n" " free(p);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct E { int* i; };\n" // #11768 "struct C { E e; };\n" @@ -848,13 +845,13 @@ class TestAutoVariables : public TestFixture { " delete[] e->i;\n" " return 0;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " S* p = &g();\n" " delete p;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void testinvaliddealloc_input() { @@ -862,12 +859,12 @@ class TestAutoVariables : public TestFixture { check("void f(int* a[]) {\n" " free(a);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int a[]) {\n" " free(a);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int* a[]) {\n" " int * p = *a;\n" @@ -875,13 +872,13 @@ class TestAutoVariables : public TestFixture { " int ** q = a;\n" " free(q);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int a[]) {\n" " int * p = a;\n" " free(p);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void testinvaliddealloc_string() { @@ -901,7 +898,7 @@ class TestAutoVariables : public TestFixture { "[test.cpp:5]: (error) Deallocation of a pointer pointing to a string literal (\"a\") results in undefined behaviour.\n" "[test.cpp:6]: (error) Deallocation of a pointer pointing to a string literal (\"a\") results in undefined behaviour.\n" "[test.cpp:9]: (error) Deallocation of a pointer pointing to a string literal (\"abc\") results in undefined behaviour.\n", - errout.str()); + errout_str()); check("void f() {\n" " char *ptr = malloc(10);\n" @@ -911,7 +908,7 @@ class TestAutoVariables : public TestFixture { " if (ptr != empty_str)\n" " free(ptr);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void testinvaliddealloc_C() { @@ -920,7 +917,7 @@ class TestAutoVariables : public TestFixture { " struct context c;\n" " SVN_ERR(delete(&c, root_baton, src_entry, pool));\n" "}\n", false, "test.c"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void testassign1() { // Ticket #1819 @@ -928,7 +925,7 @@ class TestAutoVariables : public TestFixture { " EventPtr event = *eventP;\n" " *actionsP = &event->actions;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void testassign2() { // Ticket #2765 @@ -936,7 +933,7 @@ class TestAutoVariables : public TestFixture { " struct my_s *mr = global_structure_pointer;\n" " *datap = &mr->value;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void assignAddressOfLocalArrayToGlobalPointer() { @@ -945,7 +942,7 @@ class TestAutoVariables : public TestFixture { " int x[10];\n" " p = x;\n" "}"); - ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:3] -> [test.cpp:4]: (error) Non-local variable 'p' will use pointer to local variable 'x'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:3] -> [test.cpp:4]: (error) Non-local variable 'p' will use pointer to local variable 'x'.\n", errout_str()); check("int *p;\n" "void f() {\n" @@ -953,7 +950,7 @@ class TestAutoVariables : public TestFixture { " p = x;\n" " p = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void assignAddressOfLocalVariableToGlobalPointer() { @@ -962,7 +959,7 @@ class TestAutoVariables : public TestFixture { " int x;\n" " p = &x;\n" "}"); - ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:3] -> [test.cpp:4]: (error) Non-local variable 'p' will use pointer to local variable 'x'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:3] -> [test.cpp:4]: (error) Non-local variable 'p' will use pointer to local variable 'x'.\n", errout_str()); check("int *p;\n" "void f() {\n" @@ -970,7 +967,7 @@ class TestAutoVariables : public TestFixture { " p = &x;\n" " p = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void assignAddressOfLocalVariableToMemberVariable() { @@ -981,7 +978,7 @@ class TestAutoVariables : public TestFixture { " }\n" " int *ptr;\n" "};"); - ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:3] -> [test.cpp:4]: (error) Non-local variable 'ptr' will use pointer to local variable 'x'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:3] -> [test.cpp:4]: (error) Non-local variable 'ptr' will use pointer to local variable 'x'.\n", errout_str()); check("struct A {\n" " void f() {\n" @@ -991,7 +988,7 @@ class TestAutoVariables : public TestFixture { " }\n" " int *ptr;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void returnLocalVariable1() { @@ -1002,7 +999,7 @@ class TestAutoVariables : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:4] -> [test.cpp:3] -> [test.cpp:4]: (error) Returning pointer to local variable 'str' that will be invalid when returning.\n", - errout.str()); + errout_str()); check("char *foo()\n" // use ValueFlow "{\n" @@ -1012,7 +1009,7 @@ class TestAutoVariables : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:4] -> [test.cpp:3] -> [test.cpp:5]: (error) Returning pointer to local variable 'str' that will be invalid when returning.\n", - errout.str()); + errout_str()); check("class Fred {\n" " char *foo();\n" @@ -1024,7 +1021,7 @@ class TestAutoVariables : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:7] -> [test.cpp:6] -> [test.cpp:7]: (error) Returning pointer to local variable 'str' that will be invalid when returning.\n", - errout.str()); + errout_str()); check("char * format_reg(char *outbuffer_start) {\n" " return outbuffer_start;\n" @@ -1034,7 +1031,7 @@ class TestAutoVariables : public TestFixture { " char *tp = temp;\n" " tp = format_reg(tp);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void returnLocalVariable2() { @@ -1043,7 +1040,7 @@ class TestAutoVariables : public TestFixture { " char str[100] = {0};\n" " return str;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class Fred {\n" " std::string foo();\n" @@ -1053,7 +1050,7 @@ class TestAutoVariables : public TestFixture { " char str[100] = {0};\n" " return str;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } @@ -1063,14 +1060,14 @@ class TestAutoVariables : public TestFixture { " char q[] = \"AAAAAAAAAAAA\";\n" " return &q[1];\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2] -> [test.cpp:3]: (error) Returning pointer to local variable 'q' that will be invalid when returning.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2] -> [test.cpp:3]: (error) Returning pointer to local variable 'q' that will be invalid when returning.\n", errout_str()); check("char *foo()\n" "{\n" " static char q[] = \"AAAAAAAAAAAA\";\n" " return &q[1];\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("char *foo()\n" "{\n" @@ -1079,7 +1076,7 @@ class TestAutoVariables : public TestFixture { "p = &q[1];\n" "return p;\n" "}"); - ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:3] -> [test.cpp:6]: (error) Returning pointer to local variable 'q' that will be invalid when returning.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:3] -> [test.cpp:6]: (error) Returning pointer to local variable 'q' that will be invalid when returning.\n", errout_str()); } void returnLocalVariable4() { // x+y @@ -1089,7 +1086,7 @@ class TestAutoVariables : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:3] -> [test.cpp:2] -> [test.cpp:3]: (error) Returning pointer to local variable 'x' that will be invalid when returning.\n", - errout.str()); + errout_str()); check("char *foo(int y) {\n" " char x[10] = {0};\n" @@ -1097,7 +1094,7 @@ class TestAutoVariables : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:3] -> [test.cpp:2] -> [test.cpp:3]: (error) Returning pointer to local variable 'x' that will be invalid when returning.\n", - errout.str()); + errout_str()); } void returnLocalVariable5() { // cast @@ -1107,7 +1104,7 @@ class TestAutoVariables : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:3] -> [test.cpp:2] -> [test.cpp:3]: (error) Returning pointer to local variable 'x' that will be invalid when returning.\n", - errout.str()); + errout_str()); } void returnLocalVariable6() { // valueflow @@ -1116,7 +1113,7 @@ class TestAutoVariables : public TestFixture { " int p = &x;\n" " return p;\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2] -> [test.cpp:4]: (error) Returning object that points to local variable 'x' that will be invalid when returning.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2] -> [test.cpp:4]: (error) Returning object that points to local variable 'x' that will be invalid when returning.\n", errout_str()); } void returnReference1() { @@ -1126,35 +1123,35 @@ class TestAutoVariables : public TestFixture { " int& x = s;\n" " return x;\n" "}"); - ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:5]: (error) Reference to local variable returned.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:5]: (error) Reference to local variable returned.\n", errout_str()); check("std::string &foo()\n" "{\n" " std::string s;\n" " return s;\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Reference to local variable returned.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Reference to local variable returned.\n", errout_str()); check("std::vector &foo()\n" "{\n" " std::vector v;\n" " return v;\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Reference to local variable returned.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Reference to local variable returned.\n", errout_str()); check("std::vector &foo()\n" "{\n" " static std::vector v;\n" " return v;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("std::vector &foo()\n" "{\n" " thread_local std::vector v;\n" " return v;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("std::string hello()\n" "{\n" @@ -1165,7 +1162,7 @@ class TestAutoVariables : public TestFixture { "{\n" " return hello();\n" "}"); - ASSERT_EQUALS("[test.cpp:8]: (error) Reference to temporary returned.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8]: (error) Reference to temporary returned.\n", errout_str()); // make sure scope is used in function lookup check("class Fred {\n" @@ -1176,7 +1173,7 @@ class TestAutoVariables : public TestFixture { "std::string &f() {\n" " return hello();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("std::string hello() {\n" " return std::string();\n" @@ -1185,7 +1182,7 @@ class TestAutoVariables : public TestFixture { "std::string &f() {\n" " return hello();\n" "}"); - ASSERT_EQUALS("[test.cpp:6]: (error) Reference to temporary returned.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (error) Reference to temporary returned.\n", errout_str()); check("std::string hello() {\n" " return \"foo\";\n" @@ -1194,7 +1191,7 @@ class TestAutoVariables : public TestFixture { "std::string &f() {\n" " return hello().substr(1);\n" "}"); - ASSERT_EQUALS("[test.cpp:6]: (error) Reference to temporary returned.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (error) Reference to temporary returned.\n", errout_str()); check("class Foo;\n" "Foo hello() {\n" @@ -1204,7 +1201,7 @@ class TestAutoVariables : public TestFixture { "Foo& f() {\n" " return hello();\n" "}"); - ASSERT_EQUALS("[test.cpp:7]: (error) Reference to temporary returned.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (error) Reference to temporary returned.\n", errout_str()); // make sure function overloads are handled properly check("class Foo;\n" @@ -1219,7 +1216,7 @@ class TestAutoVariables : public TestFixture { "Foo& f() {\n" " return hello(true);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("Foo hello() {\n" " return Foo();\n" @@ -1228,7 +1225,7 @@ class TestAutoVariables : public TestFixture { "Foo& f() {\n" // Unknown type - might be a reference " return hello();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void returnReference2() { @@ -1240,7 +1237,7 @@ class TestAutoVariables : public TestFixture { " std::string s;\n" " return s;\n" "}"); - ASSERT_EQUALS("[test.cpp:7]: (error) Reference to local variable returned.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (error) Reference to local variable returned.\n", errout_str()); check("class Fred {\n" " std::vector &foo();\n" @@ -1250,7 +1247,7 @@ class TestAutoVariables : public TestFixture { " std::vector v;\n" " return v;\n" "}"); - ASSERT_EQUALS("[test.cpp:7]: (error) Reference to local variable returned.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (error) Reference to local variable returned.\n", errout_str()); check("class Fred {\n" " std::vector &foo();\n" @@ -1260,7 +1257,7 @@ class TestAutoVariables : public TestFixture { " static std::vector v;\n" " return v;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class Fred {\n" " std::string &f();\n" @@ -1273,7 +1270,7 @@ class TestAutoVariables : public TestFixture { "{\n" " return hello();\n" "}"); - ASSERT_EQUALS("[test.cpp:10]: (error) Reference to temporary returned.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:10]: (error) Reference to temporary returned.\n", errout_str()); check("class Fred {\n" " std::string hello();\n" @@ -1287,7 +1284,7 @@ class TestAutoVariables : public TestFixture { "{\n" " return hello();\n" "}"); - ASSERT_EQUALS("[test.cpp:11]: (error) Reference to temporary returned.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:11]: (error) Reference to temporary returned.\n", errout_str()); check("class Bar;\n" "Bar foo() {\n" @@ -1296,7 +1293,7 @@ class TestAutoVariables : public TestFixture { "Bar& bar() {\n" " return foo();\n" "}"); - ASSERT_EQUALS("[test.cpp:6]: (error) Reference to temporary returned.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (error) Reference to temporary returned.\n", errout_str()); check("std::map foo() {\n" " return something;\n" @@ -1304,7 +1301,7 @@ class TestAutoVariables : public TestFixture { "std::map& bar() {\n" " return foo();\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (error) Reference to temporary returned.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Reference to temporary returned.\n", errout_str()); check("Bar foo() {\n" " return something;\n" @@ -1312,7 +1309,7 @@ class TestAutoVariables : public TestFixture { "Bar& bar() {\n" // Unknown type - might be a typedef to a reference type " return foo();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Don't crash with function in unknown scope (#4076) check("X& a::Bar() {}" "X& foo() {" @@ -1326,7 +1323,7 @@ class TestAutoVariables : public TestFixture { " rd = ret;\n" " return rd;\n" "}", false); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } // Returning reference to global variable @@ -1335,7 +1332,7 @@ class TestAutoVariables : public TestFixture { "double & f() {\n" " return a;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void returnReference5() { @@ -1355,7 +1352,7 @@ class TestAutoVariables : public TestFixture { " return ra;\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void returnReference6() { @@ -1363,7 +1360,7 @@ class TestAutoVariables : public TestFixture { " Fred &fred(*new Fred);\n" " return fred;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void returnReference7() { // 3791 - false positive for overloaded function @@ -1372,14 +1369,14 @@ class TestAutoVariables : public TestFixture { "std::string &b() {\n" " return a(12);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("std::string &a(int);\n" "std::string a();\n" "std::string &b() {\n" " return a(12);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void returnReference8() { @@ -1388,14 +1385,14 @@ class TestAutoVariables : public TestFixture { " int& value = *it;\n" " return value;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void returnReference9() { check("int& f(bool b, int& x, int& y) {\n" " return b ? x : y;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void returnReference10() { @@ -1404,14 +1401,14 @@ class TestAutoVariables : public TestFixture { " A a;\n" " return a.f();\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Reference to temporary returned.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Reference to temporary returned.\n", errout_str()); check("class A { int& f() const; };\n" "int& g() {\n" " A a;\n" " return a.f();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void returnReference11() { @@ -1419,19 +1416,19 @@ class TestAutoVariables : public TestFixture { "int& g() {\n" " return A::f();\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Reference to temporary returned.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Reference to temporary returned.\n", errout_str()); check("class A { static int& f(); };\n" "int& g() {\n" " return A::f();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("namespace A { int& f(); }\n" "int& g() {\n" " return A::f();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void returnReference12() { @@ -1439,14 +1436,14 @@ class TestAutoVariables : public TestFixture { "auto g() {\n" " return &A::f;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class A { static int& f(); };\n" "auto g() {\n" " auto x = &A::f;\n" " return x;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void returnReference13() { @@ -1455,14 +1452,14 @@ class TestAutoVariables : public TestFixture { "int& foo(size_t i) {\n" " return ((std::vector*)vp)->at(i);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("std::vector v;\n" "void* vp = &v;\n" "int& foo(size_t i) {\n" " return static_cast*>(vp)->at(i);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void returnReference14() { @@ -1475,7 +1472,7 @@ class TestAutoVariables : public TestFixture { "void* &A::f() {\n" " return g()->m;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void returnReference15() { @@ -1488,7 +1485,7 @@ class TestAutoVariables : public TestFixture { "const int& f(const T&) {\n" " return f();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("template \n" "int g();\n" @@ -1496,19 +1493,19 @@ class TestAutoVariables : public TestFixture { "const int& f(const T&) {\n" " return g();\n" "}"); - TODO_ASSERT_EQUALS("error", "", errout.str()); + TODO_ASSERT_EQUALS("error", "", errout_str()); } void returnReference16() { check("int& f(std::tuple& x) {\n" " return std::get<0>(x);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int& f(int x) {\n" " return std::get<0>(std::make_tuple(x));\n" "}"); - TODO_ASSERT_EQUALS("error", "", errout.str()); + TODO_ASSERT_EQUALS("error", "", errout_str()); } void returnReference17() { @@ -1516,7 +1513,7 @@ class TestAutoVariables : public TestFixture { "int& f() {\n" " return g();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void returnReference18() { @@ -1525,7 +1522,7 @@ class TestAutoVariables : public TestFixture { "int& g(int* x) {\n" " return f(*x);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } // #9597 @@ -1533,7 +1530,7 @@ class TestAutoVariables : public TestFixture { check("struct C : B {\n" " const B &f() const { return (const B &)*this; }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } // #9536 @@ -1544,7 +1541,7 @@ class TestAutoVariables : public TestFixture { "int& b() {\n" " return a()();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("auto a() {\n" " return []() -> int& {\n" @@ -1555,20 +1552,20 @@ class TestAutoVariables : public TestFixture { "const int& c() {\n" " return a()();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("std::function a();\n" "int& b() {\n" " return a()();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #9889 check("int f(std::vector>& v, int i) {\n" " auto& j = v[i]();\n" " return j;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } // #9530 @@ -1576,7 +1573,7 @@ class TestAutoVariables : public TestFixture { check("int& f(int& x) {\n" " return {x};\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void returnReference22() { @@ -1584,7 +1581,7 @@ class TestAutoVariables : public TestFixture { " std::unique_ptr p = std::make_unique(1);\n" " return *p;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:3]: (error) Reference to local variable returned.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Reference to local variable returned.\n", errout_str()); check("void g(const std::unique_ptr&);\n" "int& f() {\n" @@ -1592,7 +1589,7 @@ class TestAutoVariables : public TestFixture { " g(p);\n" " return *p;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:5]: (error) Reference to local variable returned.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Reference to local variable returned.\n", errout_str()); check("void g(std::shared_ptr);\n" "int& f() {\n" @@ -1600,26 +1597,26 @@ class TestAutoVariables : public TestFixture { " g(p);\n" " return *p;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("std::shared_ptr g();\n" "int& f() {\n" " return *g();\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("std::unique_ptr g();\n" "int& f() {\n" " return *g();\n" "}\n"); - ASSERT_EQUALS("[test.cpp:3]: (error) Reference to temporary returned.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Reference to temporary returned.\n", errout_str()); check("struct A { int x; };\n" "int& f() {\n" " std::unique_ptr p = std::make_unique();\n" " return p->x;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:4]: (error) Reference to local variable returned.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Reference to local variable returned.\n", errout_str()); } void returnReference23() { @@ -1627,7 +1624,7 @@ class TestAutoVariables : public TestFixture { "const std::vector& f() {\n" " return *g();\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void returnReference24() @@ -1638,7 +1635,7 @@ class TestAutoVariables : public TestFixture { "const A& a() {\n" " return A();\n" "}\n"); - ASSERT_EQUALS("[test.cpp:5]: (error) Reference to temporary returned.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Reference to temporary returned.\n", errout_str()); } void returnReference25() @@ -1650,7 +1647,7 @@ class TestAutoVariables : public TestFixture { "int& h() {\n" " return g();\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void returnReference26() @@ -1660,7 +1657,7 @@ class TestAutoVariables : public TestFixture { " int& s{ x };\n" " return s;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (error) Reference to local variable returned.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (error) Reference to local variable returned.\n", errout_str()); } void returnReferenceFunction() { @@ -1673,7 +1670,7 @@ class TestAutoVariables : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:1] -> [test.cpp:2] -> [test.cpp:6] -> [test.cpp:6]: (error) Reference to local variable returned.\n", - errout.str()); + errout_str()); check("int& f(int& a) {\n" " return a;\n" @@ -1684,7 +1681,7 @@ class TestAutoVariables : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:1] -> [test.cpp:2] -> [test.cpp:6] -> [test.cpp:6] -> [test.cpp:5] -> [test.cpp:6]: (error) Returning pointer to local variable 'x' that will be invalid when returning.\n", - errout.str()); + errout_str()); check("int* f(int * x) {\n" " return x;\n" @@ -1692,7 +1689,7 @@ class TestAutoVariables : public TestFixture { "int * g(int x) {\n" " return f(&x);\n" "}"); - ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:5] -> [test.cpp:4] -> [test.cpp:5]: (error) Returning pointer to local variable 'x' that will be invalid when returning.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:5] -> [test.cpp:4] -> [test.cpp:5]: (error) Returning pointer to local variable 'x' that will be invalid when returning.\n", errout_str()); check("int* f(int * x) {\n" " x = nullptr;\n" @@ -1701,7 +1698,7 @@ class TestAutoVariables : public TestFixture { "int * g(int x) {\n" " return f(&x);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f(int& a) {\n" " return a;\n" @@ -1710,7 +1707,7 @@ class TestAutoVariables : public TestFixture { " int x = 0;\n" " return f(x);\n" "}"); - ASSERT_EQUALS("[test.cpp:6]: (error) Reference to temporary returned.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (error) Reference to temporary returned.\n", errout_str()); check("int& f(int a) {\n" " return a;\n" @@ -1719,7 +1716,7 @@ class TestAutoVariables : public TestFixture { " int x = 0;\n" " return f(x);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (error) Reference to local variable returned.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (error) Reference to local variable returned.\n", errout_str()); check("int f(int a) {\n" " return a;\n" @@ -1728,14 +1725,14 @@ class TestAutoVariables : public TestFixture { " int x = 0;\n" " return f(x);\n" "}"); - ASSERT_EQUALS("[test.cpp:6]: (error) Reference to temporary returned.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (error) Reference to temporary returned.\n", errout_str()); check("template\n" "int& f(int& x, T y) {\n" " x += y;\n" " return x;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void returnReferenceContainer() { @@ -1743,31 +1740,31 @@ class TestAutoVariables : public TestFixture { " std::vector x;\n" " return x[0];\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Reference to local variable returned.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Reference to local variable returned.\n", errout_str()); check("auto& f() {\n" " std::vector x;\n" " return x.front();\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:3]: (error) Reference to local variable returned.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:3]: (error) Reference to local variable returned.\n", errout_str()); check("std::vector g();\n" "auto& f() {\n" " return g().front();\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:3]: (error) Reference to temporary returned.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:3]: (error) Reference to temporary returned.\n", errout_str()); check("auto& f() {\n" " return std::vector{1}.front();\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:2]: (error) Reference to temporary returned.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:2]: (error) Reference to temporary returned.\n", errout_str()); check("struct A { int foo; };\n" "int& f(std::vector v) {\n" " auto it = v.begin();\n" " return it->foo;\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (error) Reference to local variable returned.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (error) Reference to local variable returned.\n", errout_str()); check("template \n" "const V& get_default(const T& t, const K& k, const V& v) {\n" @@ -1782,7 +1779,7 @@ class TestAutoVariables : public TestFixture { true); ASSERT_EQUALS( "[test.cpp:2] -> [test.cpp:4] -> [test.cpp:9] -> [test.cpp:9]: (error, inconclusive) Reference to local variable returned.\n", - errout.str()); + errout_str()); check("template \n" "const V& get_default(const T& t, const K& k, const V& v) {\n" @@ -1796,33 +1793,33 @@ class TestAutoVariables : public TestFixture { true); ASSERT_EQUALS( "[test.cpp:2] -> [test.cpp:4] -> [test.cpp:8] -> [test.cpp:8]: (error, inconclusive) Reference to temporary returned.\n", - errout.str()); + errout_str()); check("struct A { int foo; };\n" "int& f(std::vector& v) {\n" " auto it = v.begin();\n" " return it->foo;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("static std::vector A[2];\n" "static std::vector B;\n" "std::vector& g(int i) {\n" " return i ? A[i] : B;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void returnReferenceLiteral() { check("const std::string &a() {\n" " return \"foo\";\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (error) Reference to temporary returned.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (error) Reference to temporary returned.\n", errout_str()); check("const std::string a() {\n" " return \"foo\";\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("const std::string& f(const std::string& x) { return x; }\n" "const std::string &a() {\n" @@ -1830,65 +1827,65 @@ class TestAutoVariables : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:1] -> [test.cpp:1] -> [test.cpp:3] -> [test.cpp:3]: (error) Reference to temporary returned.\n", - errout.str()); + errout_str()); check("const char * f(const char * x) { return x; }\n" "const std::string &a() {\n" " return f(\"foo\");\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Reference to temporary returned.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Reference to temporary returned.\n", errout_str()); } void returnReferenceCalculation() { check("const std::string &a(const std::string& str) {\n" " return \"foo\" + str;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (error) Reference to temporary returned.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (error) Reference to temporary returned.\n", errout_str()); check("int& operator<<(int out, int path) {\n" " return out << path;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (error) Reference to temporary returned.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (error) Reference to temporary returned.\n", errout_str()); check("std::ostream& operator<<(std::ostream& out, const std::string& path) {\n" " return out << path;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("std::ostream& operator<<(std::ostream* out, const std::string& path) {\n" " return *out << path;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("Unknown1& operator<<(Unknown1 out, Unknown2 path) {\n" " return out << path;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int& a(int b) {\n" " return 2*(b+1);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (error) Reference to temporary returned.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (error) Reference to temporary returned.\n", errout_str()); check("const std::string &a(const std::string& str) {\n" " return str;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("const std::string &a(int bar) {\n" " return foo(bar + 1);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("const std::string a(const std::string& str) {\n" " return \"foo\" + str;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int& incValue(int& value) {\n" " return ++value;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void returnReferenceLambda() { @@ -1899,7 +1896,7 @@ class TestAutoVariables : public TestFixture { " return false;\n" " });\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #5844 check("map const &getVariableTable() {\n" @@ -1909,13 +1906,13 @@ class TestAutoVariables : public TestFixture { " }();\n" "return s_var;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #7583 check("Command& foo() {\n" " return f([]() -> int { return 1; });\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void returnReferenceInnerScope() { @@ -1928,16 +1925,16 @@ class TestAutoVariables : public TestFixture { " };\n" " return _make(_Wrapper::call, pmf);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void returnReferenceRecursive() { check("int& f() { return f(); }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int& g(int& i) { return i; }\n" "int& f() { return g(f()); }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void extendedLifetime() { @@ -1947,7 +1944,7 @@ class TestAutoVariables : public TestFixture { " const int& x = h();\n" " return [&] { return x; };\n" "}"); - ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:5] -> [test.cpp:4] -> [test.cpp:5]: (error) Returning lambda that captures local variable 'x' that will be invalid when returning.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:5] -> [test.cpp:4] -> [test.cpp:5]: (error) Returning lambda that captures local variable 'x' that will be invalid when returning.\n", errout_str()); check("void g(int*);\n" "int h();\n" @@ -1955,7 +1952,7 @@ class TestAutoVariables : public TestFixture { " const int& x = h();\n" " return &x;\n" "}"); - ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:5] -> [test.cpp:4] -> [test.cpp:5]: (error) Returning pointer to local variable 'x' that will be invalid when returning.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:5] -> [test.cpp:4] -> [test.cpp:5]: (error) Returning pointer to local variable 'x' that will be invalid when returning.\n", errout_str()); check("void g(int*);\n" "int h();\n" @@ -1966,7 +1963,7 @@ class TestAutoVariables : public TestFixture { ASSERT_EQUALS( "[test.cpp:4] -> [test.cpp:5] -> [test.cpp:4] -> [test.cpp:5]: (error) Using pointer that is a temporary.\n" "[test.cpp:4] -> [test.cpp:5]: (error) Using reference to dangling temporary.\n", - errout.str()); + errout_str()); check("void g(int*);\n" "int h();\n" @@ -1974,7 +1971,7 @@ class TestAutoVariables : public TestFixture { " const int& x = h();\n" " g(&x);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct Data {\n" " std::string path;\n" @@ -1983,7 +1980,7 @@ class TestAutoVariables : public TestFixture { " const Data& data = getData();\n" " return data.path.c_str();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void danglingReference() { @@ -1993,14 +1990,14 @@ class TestAutoVariables : public TestFixture { " return r;\n" "}"); ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:3]: (error) Non-local reference variable 'r' to local variable 'k'\n", - errout.str()); + errout_str()); check("int &f( int & k )\n" "{\n" " static int &r = k;\n" " return r;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void danglingTempReference() { @@ -2011,7 +2008,7 @@ class TestAutoVariables : public TestFixture { " const auto& str_cref2 = g(std::string(\"hello\"));\n" " std::cout << str_cref2 << std::endl;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:1] -> [test.cpp:2] -> [test.cpp:5] -> [test.cpp:6]: (error) Using reference to dangling temporary.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:1] -> [test.cpp:2] -> [test.cpp:5] -> [test.cpp:6]: (error) Using reference to dangling temporary.\n", errout_str()); // Lifetime extended check("std::string g(const std::string& str_cref) {\n" @@ -2021,14 +2018,14 @@ class TestAutoVariables : public TestFixture { " const auto& str_cref2 = g(std::string(\"hello\"));\n" " std::cout << str_cref2 << std::endl;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("char f() {\n" " char c = 0;\n" " char&& cr = std::move(c);\n" " return cr;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #9987 check("void g(std::vector);\n" @@ -2036,7 +2033,7 @@ class TestAutoVariables : public TestFixture { " std::vector&& v = {};\n" " g(std::move(v));\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void g(std::vector);\n" "std::vector h();\n" @@ -2044,7 +2041,7 @@ class TestAutoVariables : public TestFixture { " std::vector&& v = h();\n" " g(std::move(v));\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #11087 check("struct S1 {\n" @@ -2057,7 +2054,7 @@ class TestAutoVariables : public TestFixture { "}\n"); ASSERT_EQUALS( "[test.cpp:6] -> [test.cpp:2] -> [test.cpp:6] -> [test.cpp:7]: (error) Using reference to dangling temporary.\n", - errout.str()); + errout_str()); check("struct A {\n" " const int& g() const { return i; }\n" @@ -2068,7 +2065,7 @@ class TestAutoVariables : public TestFixture { " const int& i = a()->g();\n" " return i;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A {\n" " const int& g() const { return i; }\n" @@ -2081,7 +2078,7 @@ class TestAutoVariables : public TestFixture { "}\n"); ASSERT_EQUALS( "[test.cpp:7] -> [test.cpp:2] -> [test.cpp:7] -> [test.cpp:8]: (error) Using reference to dangling temporary.\n", - errout.str()); + errout_str()); check("struct S1 {\n" " auto get() -> auto& { return val; }\n" @@ -2099,7 +2096,7 @@ class TestAutoVariables : public TestFixture { "}\n"); ASSERT_EQUALS( "[test.cpp:11] -> [test.cpp:2] -> [test.cpp:11] -> [test.cpp:12]: (error) Using reference to dangling temporary.\n", - errout.str()); + errout_str()); check("struct C {\n" " std::vector> v;\n" @@ -2117,14 +2114,14 @@ class TestAutoVariables : public TestFixture { " auto e = (*it)->v.begin();\n" " const int& x = (*e)[1];\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int* g();\n" // #11188 "void f() {\n" " const auto& p = g();\n" " if (p != nullptr) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("template\n" "void f(const std::vector& v) {\n" @@ -2134,7 +2131,7 @@ class TestAutoVariables : public TestFixture { " a = b;\n" " }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("using namespace std;\n" // #10971 "struct S { int i = 3; };\n" @@ -2146,7 +2143,7 @@ class TestAutoVariables : public TestFixture { " const S& s = *g();\n" " (void)s.i;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:8] -> [test.cpp:9]: (error) Using reference to dangling temporary.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8] -> [test.cpp:9]: (error) Using reference to dangling temporary.\n", errout_str()); check("std::string f() {\n" // #12173 " std::string s;\n" @@ -2155,7 +2152,7 @@ class TestAutoVariables : public TestFixture { " }\n" " return s;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void testglobalnamespace() { @@ -2169,7 +2166,7 @@ class TestAutoVariables : public TestFixture { " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void returnParameterAddress() { @@ -2178,28 +2175,28 @@ class TestAutoVariables : public TestFixture { " return &y;\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:1] -> [test.cpp:3]: (error) Returning pointer to local variable 'y' that will be invalid when returning.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:1] -> [test.cpp:3]: (error) Returning pointer to local variable 'y' that will be invalid when returning.\n", errout_str()); check("int ** foo(int * y)\n" "{\n" " return &y;\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:1] -> [test.cpp:3]: (error) Returning pointer to local variable 'y' that will be invalid when returning.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:1] -> [test.cpp:3]: (error) Returning pointer to local variable 'y' that will be invalid when returning.\n", errout_str()); check("const int * foo(const int & y)\n" "{\n" " return &y;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int * foo(int * y)\n" "{\n" " return y;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct s { void *p; };\n" "extern struct s* f(void);\n" @@ -2209,7 +2206,7 @@ class TestAutoVariables : public TestFixture { " *q = &r->p;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void testconstructor() { // Ticket #5478 - crash while checking a constructor @@ -2219,6 +2216,7 @@ class TestAutoVariables : public TestFixture { " return const_tree_iterator(foo);\n" " }\n" "};"); + ASSERT_EQUALS("[test.cpp:4]: (error) Reference to temporary returned.\n", errout_str()); } void variableIsUsedInScope() { @@ -2237,30 +2235,30 @@ class TestAutoVariables : public TestFixture { " auto l = [&](){ return a; };\n" " return l;\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2] -> [test.cpp:4]: (error) Returning lambda that captures local variable 'a' that will be invalid when returning.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2] -> [test.cpp:4]: (error) Returning lambda that captures local variable 'a' that will be invalid when returning.\n", errout_str()); check("auto f() {\n" " int a = 1;\n" " return [&](){ return a; };\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2] -> [test.cpp:3]: (error) Returning lambda that captures local variable 'a' that will be invalid when returning.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2] -> [test.cpp:3]: (error) Returning lambda that captures local variable 'a' that will be invalid when returning.\n", errout_str()); check("auto f(int a) {\n" " return [&](){ return a; };\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:1] -> [test.cpp:2]: (error) Returning lambda that captures local variable 'a' that will be invalid when returning.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:1] -> [test.cpp:2]: (error) Returning lambda that captures local variable 'a' that will be invalid when returning.\n", errout_str()); check("auto f(int a) {\n" " auto p = &a;\n" " return [=](){ return p; };\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3] -> [test.cpp:1] -> [test.cpp:3]: (error) Returning lambda that captures local variable 'a' that will be invalid when returning.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3] -> [test.cpp:1] -> [test.cpp:3]: (error) Returning lambda that captures local variable 'a' that will be invalid when returning.\n", errout_str()); check("auto g(int& a) {\n" " int p = a;\n" " return [&](){ return p; };\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2] -> [test.cpp:3]: (error) Returning lambda that captures local variable 'p' that will be invalid when returning.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2] -> [test.cpp:3]: (error) Returning lambda that captures local variable 'p' that will be invalid when returning.\n", errout_str()); check("auto f() {\n" " return [=](){\n" @@ -2268,7 +2266,7 @@ class TestAutoVariables : public TestFixture { " return [&](){ return a; };\n" " };\n" "}"); - ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:3] -> [test.cpp:4]: (error) Returning lambda that captures local variable 'a' that will be invalid when returning.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:3] -> [test.cpp:4]: (error) Returning lambda that captures local variable 'a' that will be invalid when returning.\n", errout_str()); check("auto f(int b) {\n" " return [=](int a){\n" @@ -2276,30 +2274,30 @@ class TestAutoVariables : public TestFixture { " return [&](){ return a; };\n" " };\n" "}"); - ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:2] -> [test.cpp:4]: (error) Returning lambda that captures local variable 'a' that will be invalid when returning.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:2] -> [test.cpp:4]: (error) Returning lambda that captures local variable 'a' that will be invalid when returning.\n", errout_str()); check("auto g(int& a) {\n" " return [&](){ return a; };\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("auto g(int a) {\n" " auto p = a;\n" " return [=](){ return p; };\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("auto g(int& a) {\n" " auto p = a;\n" " return [=](){ return p; };\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("auto g(int& a) {\n" " int& p = a;\n" " return [&](){ return p; };\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("template\n" "void g(F);\n" @@ -2307,51 +2305,51 @@ class TestAutoVariables : public TestFixture { " int x;\n" " return g([&]() { return x; });\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("auto f() {\n" " int i = 0;\n" " return [&i] {};\n" "}\n"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2] -> [test.cpp:3]: (error) Returning lambda that captures local variable 'i' that will be invalid when returning.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2] -> [test.cpp:3]: (error) Returning lambda that captures local variable 'i' that will be invalid when returning.\n", errout_str()); check("auto f() {\n" " int i = 0;\n" " return [i] {};\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("auto f() {\n" " int i = 0;\n" " return [=, &i] {};\n" "}\n"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2] -> [test.cpp:3]: (error) Returning lambda that captures local variable 'i' that will be invalid when returning.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2] -> [test.cpp:3]: (error) Returning lambda that captures local variable 'i' that will be invalid when returning.\n", errout_str()); check("auto f() {\n" " int i = 0;\n" " int j = 0;\n" " return [=, &i] { return j; };\n" "}\n"); - ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:2] -> [test.cpp:4]: (error) Returning lambda that captures local variable 'i' that will be invalid when returning.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:2] -> [test.cpp:4]: (error) Returning lambda that captures local variable 'i' that will be invalid when returning.\n", errout_str()); check("auto f() {\n" " int i = 0;\n" " return [&, i] {};\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("auto f() {\n" " int i = 0;\n" " int j = 0;\n" " return [&, i] { return j; };\n" "}\n"); - ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:3] -> [test.cpp:4]: (error) Returning lambda that captures local variable 'j' that will be invalid when returning.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:3] -> [test.cpp:4]: (error) Returning lambda that captures local variable 'j' that will be invalid when returning.\n", errout_str()); check("auto f(int& i) {\n" " int j = 0;\n" " return [=, &i] { return j; };\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int*);\n" "auto g(int y) {\n" @@ -2360,7 +2358,7 @@ class TestAutoVariables : public TestFixture { " g(&x);\n" " };\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A {\n" " int x;\n" @@ -2372,7 +2370,7 @@ class TestAutoVariables : public TestFixture { " ap->x;\n" " };\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void danglingLifetimeContainer() { @@ -2380,21 +2378,21 @@ class TestAutoVariables : public TestFixture { " auto it = x.begin();\n" " return it;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("std::vector::iterator f() {\n" " std::vector x;\n" " auto it = x.begin();\n" " return it;\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2] -> [test.cpp:4]: (error) Returning iterator to local container 'x' that will be invalid when returning.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2] -> [test.cpp:4]: (error) Returning iterator to local container 'x' that will be invalid when returning.\n", errout_str()); check("auto f() {\n" " std::vector x;\n" " auto it = std::begin(x);\n" " return it;\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2] -> [test.cpp:4]: (error) Returning iterator to local container 'x' that will be invalid when returning.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2] -> [test.cpp:4]: (error) Returning iterator to local container 'x' that will be invalid when returning.\n", errout_str()); check("int* f() {\n" " std::vector x;\n" @@ -2403,7 +2401,7 @@ class TestAutoVariables : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:3] -> [test.cpp:2] -> [test.cpp:4]: (error) Returning pointer to local variable 'x' that will be invalid when returning.\n", - errout.str()); + errout_str()); check("auto f() {\n" " std::vector x;\n" @@ -2412,7 +2410,7 @@ class TestAutoVariables : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:3] -> [test.cpp:2] -> [test.cpp:4]: (error) Returning pointer to local variable 'x' that will be invalid when returning.\n", - errout.str()); + errout_str()); check("struct A { int foo; };\n" "int* f(std::vector v) {\n" @@ -2421,13 +2419,13 @@ class TestAutoVariables : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:3] -> [test.cpp:4] -> [test.cpp:2] -> [test.cpp:4]: (error) Returning pointer to local variable 'v' that will be invalid when returning.\n", - errout.str()); + errout_str()); check("std::vector::iterator f(std::vector x) {\n" " auto it = x.begin();\n" " return it;\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:1] -> [test.cpp:3]: (error) Returning iterator to local container 'x' that will be invalid when returning.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:1] -> [test.cpp:3]: (error) Returning iterator to local container 'x' that will be invalid when returning.\n", errout_str()); check("auto f() {\n" " std::vector x;\n" @@ -2436,7 +2434,7 @@ class TestAutoVariables : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:3] -> [test.cpp:4] -> [test.cpp:2] -> [test.cpp:4]: (error) Returning object that points to local variable 'x' that will be invalid when returning.\n", - errout.str()); + errout_str()); check("auto f() {\n" " std::vector x;\n" @@ -2445,7 +2443,7 @@ class TestAutoVariables : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:3] -> [test.cpp:2] -> [test.cpp:4]: (error) Returning iterator to local container 'x' that will be invalid when returning.\n", - errout.str()); + errout_str()); check("auto f() {\n" " std::vector x;\n" @@ -2454,7 +2452,7 @@ class TestAutoVariables : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:3] -> [test.cpp:4] -> [test.cpp:2] -> [test.cpp:4]: (error) Returning object that points to local variable 'x' that will be invalid when returning.\n", - errout.str()); + errout_str()); check("std::vector f() {\n" " int i = 0;\n" @@ -2464,7 +2462,7 @@ class TestAutoVariables : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:4] -> [test.cpp:4] -> [test.cpp:2] -> [test.cpp:5]: (error) Returning object that points to local variable 'i' that will be invalid when returning.\n", - errout.str()); + errout_str()); check("std::vector f() {\n" " std::vector r;\n" @@ -2476,7 +2474,7 @@ class TestAutoVariables : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:5] -> [test.cpp:5] -> [test.cpp:5] -> [test.cpp:3] -> [test.cpp:7]: (error) Returning object that points to local variable 'i' that will be invalid when returning.\n", - errout.str()); + errout_str()); check("struct A {\n" " std::vector v;\n" @@ -2487,7 +2485,7 @@ class TestAutoVariables : public TestFixture { "};"); ASSERT_EQUALS( "[test.cpp:5] -> [test.cpp:5] -> [test.cpp:4] -> [test.cpp:5]: (error) Non-local variable 'v' will use object that points to local variable 'i'.\n", - errout.str()); + errout_str()); check("struct A {\n" " std::vector v;\n" @@ -2499,7 +2497,7 @@ class TestAutoVariables : public TestFixture { "};"); ASSERT_EQUALS( "[test.cpp:5] -> [test.cpp:6] -> [test.cpp:4] -> [test.cpp:6]: (error) Non-local variable 'v' will use object that points to local variable 'i'.\n", - errout.str()); + errout_str()); check("struct A {\n" " std::vector m;\n" @@ -2513,7 +2511,7 @@ class TestAutoVariables : public TestFixture { ASSERT_EQUALS( "[test.cpp:6] -> [test.cpp:6] -> [test.cpp:6] -> [test.cpp:4] -> [test.cpp:7]: (error) Non-local variable 'm' will use object that points to local variable 'x'.\n" "[test.cpp:6] -> [test.cpp:6] -> [test.cpp:6] -> [test.cpp:4] -> [test.cpp:7]: (error) Non-local variable 'm' will use object that points to local variable 'x'.\n", // duplicate - errout.str()); + errout_str()); check("std::vector::iterator f(std::vector v) {\n" " for(auto it = v.begin();it != v.end();it++) {\n" @@ -2523,7 +2521,7 @@ class TestAutoVariables : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:2] -> [test.cpp:1] -> [test.cpp:3]: (error) Returning iterator to local container 'v' that will be invalid when returning.\n", - errout.str()); + errout_str()); check("const char * f() {\n" " std::string ba(\"hello\");\n" @@ -2531,7 +2529,7 @@ class TestAutoVariables : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:3] -> [test.cpp:2] -> [test.cpp:3]: (error) Returning pointer to local variable 'ba' that will be invalid when returning.\n", - errout.str()); + errout_str()); check("template \n" "const V* get_default(const T& t, const K& k, const V* v) {\n" @@ -2546,14 +2544,14 @@ class TestAutoVariables : public TestFixture { true); ASSERT_EQUALS( "[test.cpp:9] -> [test.cpp:9] -> [test.cpp:8] -> [test.cpp:9]: (error, inconclusive) Returning pointer to local variable 'x' that will be invalid when returning.\n", - errout.str()); + errout_str()); check("std::vector g();\n" "auto f() {\n" " return g().begin();\n" "}"); ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:3]: (error) Returning iterator that will be invalid when returning.\n", - errout.str()); + errout_str()); check("std::vector g();\n" "std::vector::iterator f() {\n" @@ -2562,13 +2560,13 @@ class TestAutoVariables : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:3] -> [test.cpp:4]: (error) Using iterator that is a temporary.\n" "[test.cpp:3] -> [test.cpp:4]: (error) Returning iterator that will be invalid when returning.\n", - errout.str()); + errout_str()); check("std::vector g();\n" "int& f() {\n" " return *g().begin();\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:3]: (error) Reference to temporary returned.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:3]: (error) Reference to temporary returned.\n", errout_str()); check("struct A {\n" " std::vector v;\n" @@ -2577,7 +2575,7 @@ class TestAutoVariables : public TestFixture { " v.push_back(s);\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("std::vector f() {\n" " const char * s = \"hello\";\n" @@ -2585,46 +2583,46 @@ class TestAutoVariables : public TestFixture { " v.push_back(s);\n" " return v;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("auto f() {\n" " static std::vector x;\n" " return x.begin();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("std::string g() {\n" " std::vector v;\n" " return v.data();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("std::vector::iterator f(std::vector* v) {\n" " return v->begin();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("std::vector::iterator f(std::vector* v) {\n" " std::vector* v = new std::vector();\n" " return v->begin();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f(std::vector v) {\n" " return *v.begin();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f(std::vector v) {\n" " return v.end() - v.begin();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("auto g() {\n" " std::vector v;\n" " return {v, [v]() { return v.data(); }};\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("template\n" "void g(F);\n" @@ -2632,7 +2630,7 @@ class TestAutoVariables : public TestFixture { " std::vector v;\n" " return g([&]() { return v.data(); });\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("std::vector g();\n" "struct A {\n" @@ -2642,7 +2640,7 @@ class TestAutoVariables : public TestFixture { " m.insert(m.end(), v.begin(), v.end());\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(bool b) {\n" " std::vector v = {1};\n" @@ -2652,7 +2650,7 @@ class TestAutoVariables : public TestFixture { " }\n" " return v.back() == 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class A {\n" " int f( P p ) {\n" @@ -2663,7 +2661,7 @@ class TestAutoVariables : public TestFixture { " std::map< S, B > m1;\n" " std::map< S, B > m2;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A {\n" " std::vector v;\n" @@ -2672,47 +2670,47 @@ class TestAutoVariables : public TestFixture { " v.push_back(&x);\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("size_t f(const std::string& x) {\n" " std::string y = \"x\";\n" " return y.find(x);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("std::string* f();\n" "const char* g() {\n" " std::string* var = f();\n" " return var->c_str();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("std::string f() {\n" " std::vector data{};\n" " data.push_back('a');\n" " return std::string{ data.data(), data.size() };\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("std::vector f() {\n" " char a = 0;\n" " return std::vector{&a};\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:3] -> [test.cpp:2] -> [test.cpp:3]: (error) Returning object that points to local variable 'a' that will be invalid when returning.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:3] -> [test.cpp:2] -> [test.cpp:3]: (error) Returning object that points to local variable 'a' that will be invalid when returning.\n", errout_str()); check("std::vector* g();\n" "int& f() {\n" " auto* p = g();\n" " return p->front();\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("std::vector> g();\n" "void f() {\n" " for(auto& x:g())\n" " std::sort(x.begin(), x.end());\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A {\n" " std::vector v;\n" @@ -2726,7 +2724,7 @@ class TestAutoVariables : public TestFixture { "};\n"); ASSERT_EQUALS( "[test.cpp:8] -> [test.cpp:8] -> [test.cpp:4] -> [test.cpp:7] -> [test.cpp:4]: (error) Non-local variable 'v' will use object that points to local variable 'i'.\n", - errout.str()); + errout_str()); check("struct A {\n" " std::vector v;\n" @@ -2739,7 +2737,7 @@ class TestAutoVariables : public TestFixture { " int i = 0;\n" " a.add(&i);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A {\n" " std::vector v;\n" @@ -2752,7 +2750,7 @@ class TestAutoVariables : public TestFixture { " a.add(&i);\n" " }\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f() {\n" " int i;\n" @@ -2763,7 +2761,7 @@ class TestAutoVariables : public TestFixture { " }\n" " return i;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int* get(std::vector& container) {\n" " Sequence seq(container);\n" @@ -2772,20 +2770,20 @@ class TestAutoVariables : public TestFixture { " }\n" " return &*seq.begin();\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("std::string f(std::string Str, int first, int last) {\n" " return { Str.begin() + first, Str.begin() + last + 1 };\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("std::string f(std::string s) {\n" " std::string r = { s.begin(), s.end() };\n" " return r;\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A {\n" " std::vector> mA;\n" @@ -2794,7 +2792,7 @@ class TestAutoVariables : public TestFixture { " mA.push_back(std::move(a));\n" " }\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A {\n" " std::map m;\n" @@ -2803,20 +2801,20 @@ class TestAutoVariables : public TestFixture { " return &(r.first->second);\n" " }\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " std::queue q;\n" " auto& h = q.emplace();\n" " h = 1;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("std::string f(std::string s) {\n" " std::string ss = (\":\" + s).c_str();\n" " return ss;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void danglingLifetimeContainerView() @@ -2827,7 +2825,7 @@ class TestAutoVariables : public TestFixture { "}\n"); ASSERT_EQUALS( "[test.cpp:3] -> [test.cpp:2] -> [test.cpp:3]: (error) Returning object that points to local variable 's' that will be invalid when returning.\n", - errout.str()); + errout_str()); check("std::string_view f() {\n" " std::string s = \"\";\n" @@ -2836,7 +2834,7 @@ class TestAutoVariables : public TestFixture { "}\n"); ASSERT_EQUALS( "[test.cpp:3] -> [test.cpp:2] -> [test.cpp:4]: (error) Returning object that points to local variable 's' that will be invalid when returning.\n", - errout.str()); + errout_str()); check("std::string_view f() {\n" " std::string s = \"\";\n" @@ -2844,7 +2842,7 @@ class TestAutoVariables : public TestFixture { "}\n"); ASSERT_EQUALS( "[test.cpp:3] -> [test.cpp:2] -> [test.cpp:3]: (error) Returning object that points to local variable 's' that will be invalid when returning.\n", - errout.str()); + errout_str()); check("std::string_view f(std::string_view s) {\n" " return s;\n" @@ -2855,7 +2853,7 @@ class TestAutoVariables : public TestFixture { "}\n"); ASSERT_EQUALS( "[test.cpp:6] -> [test.cpp:6] -> [test.cpp:5] -> [test.cpp:6]: (error) Returning object that points to local variable 's' that will be invalid when returning.\n", - errout.str()); + errout_str()); check("const char * f() {\n" " std::string s;\n" @@ -2864,7 +2862,7 @@ class TestAutoVariables : public TestFixture { "}\n"); ASSERT_EQUALS( "[test.cpp:4] -> [test.cpp:2] -> [test.cpp:4]: (error) Returning iterator to local container 's' that will be invalid when returning.\n", - errout.str()); + errout_str()); check("const char * f() {\n" " std::string s;\n" @@ -2872,7 +2870,7 @@ class TestAutoVariables : public TestFixture { "}\n"); ASSERT_EQUALS( "[test.cpp:3] -> [test.cpp:2] -> [test.cpp:3]: (error) Returning iterator to local container 's' that will be invalid when returning.\n", - errout.str()); + errout_str()); check("const char * f() {\n" " std::string s;\n" @@ -2881,12 +2879,12 @@ class TestAutoVariables : public TestFixture { TODO_ASSERT_EQUALS( "[test.cpp:3] -> [test.cpp:2] -> [test.cpp:3]: (error) Returning iterator to local container 's' that will be invalid when returning.\n", "", - errout.str()); + errout_str()); check("const char * f(std::string_view sv) {\n" " return sv.begin();\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("const char * f(std::string s) {\n" " std::string_view sv = s;\n" @@ -2894,31 +2892,31 @@ class TestAutoVariables : public TestFixture { "}\n"); ASSERT_EQUALS( "[test.cpp:3] -> [test.cpp:1] -> [test.cpp:3]: (error) Returning iterator to local container 's' that will be invalid when returning.\n", - errout.str()); + errout_str()); check("std::string_view f(std::string s) {\n" " return s;\n" "}\n"); ASSERT_EQUALS( "[test.cpp:2] -> [test.cpp:1] -> [test.cpp:2]: (error) Returning object that points to local variable 's' that will be invalid when returning.\n", - errout.str()); + errout_str()); check("const char * f(const std::string& s) {\n" " std::string_view sv = s;\n" " return sv.begin();\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("std::string_view f(const std::string_view& sv) {\n" " return sv;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" // #10993 " std::string_view v = std::string();\n" " v.data();\n" "}\n"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:2] -> [test.cpp:3]: (error) Using object that is a temporary.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:2] -> [test.cpp:3]: (error) Using object that is a temporary.\n", errout_str()); check("std::string convert(std::string_view sv) { return std::string{ sv }; }\n" // #11374 "auto f() {\n" @@ -2926,7 +2924,7 @@ class TestAutoVariables : public TestFixture { " v.push_back(convert(\"foo\"));\n" " return v[0];\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #10532 check("std::string f(std::string ss) {\n" @@ -2935,14 +2933,14 @@ class TestAutoVariables : public TestFixture { " return s;\n" "}\n"); ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:2] -> [test.cpp:3]: (error) Using object that is a temporary.\n", - errout.str()); + errout_str()); // #10833 check("struct A { std::string s; };\n" "const std::string& f(A* a) {\n" " return a ? a->s : \"\";\n" "}\n"); - ASSERT_EQUALS("[test.cpp:3]: (error) Reference to temporary returned.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Reference to temporary returned.\n", errout_str()); check("std::span f() {\n" " std::vector v{};\n" @@ -2950,7 +2948,7 @@ class TestAutoVariables : public TestFixture { "}\n"); ASSERT_EQUALS( "[test.cpp:3] -> [test.cpp:2] -> [test.cpp:3]: (error) Returning object that points to local variable 'v' that will be invalid when returning.\n", - errout.str()); + errout_str()); check("std::span f() {\n" " std::vector v;\n" @@ -2959,7 +2957,7 @@ class TestAutoVariables : public TestFixture { "}\n"); ASSERT_EQUALS( "[test.cpp:3] -> [test.cpp:2] -> [test.cpp:4]: (error) Returning object that points to local variable 'v' that will be invalid when returning.\n", - errout.str()); + errout_str()); check("std::span f() {\n" " std::vector v;\n" @@ -2967,7 +2965,7 @@ class TestAutoVariables : public TestFixture { "}\n"); ASSERT_EQUALS( "[test.cpp:3] -> [test.cpp:2] -> [test.cpp:3]: (error) Returning object that points to local variable 'v' that will be invalid when returning.\n", - errout.str()); + errout_str()); check("int f() {\n" " std::span s;\n" @@ -2979,7 +2977,7 @@ class TestAutoVariables : public TestFixture { "}\n"); ASSERT_EQUALS( "[test.cpp:4] -> [test.cpp:4] -> [test.cpp:6]: (error) Using object that points to local variable 'v' that is out of scope.\n", - errout.str()); + errout_str()); check("int f() {\n" " std::span s;\n" @@ -2991,7 +2989,7 @@ class TestAutoVariables : public TestFixture { "}\n"); ASSERT_EQUALS( "[test.cpp:4] -> [test.cpp:4] -> [test.cpp:6]: (error) Using object that points to local variable 'v' that is out of scope.\n", - errout.str()); + errout_str()); check("int f() {\n" " std::span s;\n" @@ -3003,7 +3001,7 @@ class TestAutoVariables : public TestFixture { "}\n"); ASSERT_EQUALS( "[test.cpp:4] -> [test.cpp:4] -> [test.cpp:6]: (error) Using object that points to local variable 'v' that is out of scope.\n", - errout.str()); + errout_str()); check("int f() {\n" " std::span s;\n" @@ -3015,7 +3013,7 @@ class TestAutoVariables : public TestFixture { "}\n"); ASSERT_EQUALS( "[test.cpp:4] -> [test.cpp:4] -> [test.cpp:6]: (error) Using object that points to local variable 'v' that is out of scope.\n", - errout.str()); + errout_str()); check("int f() {\n" " std::span s;\n" @@ -3027,7 +3025,7 @@ class TestAutoVariables : public TestFixture { "}\n"); ASSERT_EQUALS( "[test.cpp:4] -> [test.cpp:4] -> [test.cpp:6]: (error) Using object that points to local variable 'v' that is out of scope.\n", - errout.str()); + errout_str()); } void danglingLifetimeUniquePtr() @@ -3038,14 +3036,14 @@ class TestAutoVariables : public TestFixture { "}\n"); ASSERT_EQUALS( "[test.cpp:2] -> [test.cpp:1] -> [test.cpp:3]: (error) Returning pointer to local variable 'p' that will be invalid when returning.\n", - errout.str()); + errout_str()); check("int* f();\n" // #11406 "bool g() {\n" " std::unique_ptr ptr(f());\n" " return ptr.get();\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int* f();\n" "int* g() {\n" @@ -3054,7 +3052,7 @@ class TestAutoVariables : public TestFixture { "}\n"); ASSERT_EQUALS( "[test.cpp:4] -> [test.cpp:3] -> [test.cpp:4]: (error) Returning pointer to local variable 'ptr' that will be invalid when returning.\n", - errout.str()); + errout_str()); } void danglingLifetime() { check("auto f() {\n" @@ -3062,13 +3060,13 @@ class TestAutoVariables : public TestFixture { " auto it = a.begin();\n" " return [=](){ return it; };\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4] -> [test.cpp:2] -> [test.cpp:4]: (error) Returning lambda that captures local variable 'a' that will be invalid when returning.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4] -> [test.cpp:2] -> [test.cpp:4]: (error) Returning lambda that captures local variable 'a' that will be invalid when returning.\n", errout_str()); check("auto f(std::vector a) {\n" " auto it = a.begin();\n" " return [=](){ return it; };\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3] -> [test.cpp:1] -> [test.cpp:3]: (error) Returning lambda that captures local variable 'a' that will be invalid when returning.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3] -> [test.cpp:1] -> [test.cpp:3]: (error) Returning lambda that captures local variable 'a' that will be invalid when returning.\n", errout_str()); check("struct e {};\n" "e * j() {\n" @@ -3077,18 +3075,18 @@ class TestAutoVariables : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:4] -> [test.cpp:3] -> [test.cpp:4]: (error) Returning pointer to local variable 'c' that will be invalid when returning.\n", - errout.str()); + errout_str()); check("auto f(std::vector& a) {\n" " auto it = a.begin();\n" " return [=](){ return it; };\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int * f(int a[]) {\n" " return a;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " struct b {\n" @@ -3096,14 +3094,14 @@ class TestAutoVariables : public TestFixture { " } d;\n" " uint32_t *a = d.f;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Don't decay std::array check("std::array f() {\n" " std::array x;\n" " return x;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Make sure we don't hang check("struct A;\n" @@ -3111,7 +3109,7 @@ class TestAutoVariables : public TestFixture { " using T = A[3];\n" " A &&a = T{1, 2, 3}[1];\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Make sure we don't hang check("struct A;\n" @@ -3119,7 +3117,7 @@ class TestAutoVariables : public TestFixture { " using T = A[3];\n" " A &&a = T{1, 2, 3}[1]();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Make sure we don't hang check("struct A;\n" @@ -3127,7 +3125,7 @@ class TestAutoVariables : public TestFixture { " using T = A[3];\n" " A &&a = T{1, 2, 3}[1];\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Make sure we don't hang check("struct A;\n" @@ -3135,7 +3133,7 @@ class TestAutoVariables : public TestFixture { " using T = A[3];\n" " A &&a = T{1, 2, 3}[1]();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Crash #8872 check("struct a {\n" @@ -3143,14 +3141,14 @@ class TestAutoVariables : public TestFixture { " d(c, [&] { c->e });\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct a {\n" " void operator()(b c) override {\n" " d(c, [=] { c->e });\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct a {\n" " a(char* b) {}\n" @@ -3159,7 +3157,7 @@ class TestAutoVariables : public TestFixture { " char c[20];\n" " return c;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct a {\n" " a(char* b) {}\n" @@ -3169,7 +3167,7 @@ class TestAutoVariables : public TestFixture { " a d = c;\n" " return d;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " struct a {\n" @@ -3177,14 +3175,14 @@ class TestAutoVariables : public TestFixture { " auto g() { return v.end(); }\n" " };\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int * f(std::vector& v) {\n" " for(int & x : v)\n" " return &x;\n" " return nullptr;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #9275 check("struct S {\n" @@ -3196,7 +3194,7 @@ class TestAutoVariables : public TestFixture { " const char* msg = buf;\n" " m = msg;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #9201 check("int* f() {\n" @@ -3204,14 +3202,14 @@ class TestAutoVariables : public TestFixture { " static a b{0};\n" " return &b.m;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #9453 check("int *ptr;\n" "void foo(int arr[]) {\n" " ptr = &arr[2];\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #9639 check("struct Fred {\n" @@ -3222,7 +3220,7 @@ class TestAutoVariables : public TestFixture { " const Fred &fred = getFred();\n" " return fred.s.c_str();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #9534 check("struct A {\n" @@ -3232,14 +3230,14 @@ class TestAutoVariables : public TestFixture { " A& y = v[i];\n" " return &y.x[i];\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #9712 check("std::string f(const char *str) {\n" " char value[256];\n" " return value;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #9770 check("class C {\n" @@ -3249,7 +3247,7 @@ class TestAutoVariables : public TestFixture { " const char data[] = \"x\";\n" " return data;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #9899 check("struct A {\n" @@ -3261,14 +3259,14 @@ class TestAutoVariables : public TestFixture { " f(std::move(w));\n" " }\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); //Make sure we can still take the address of a reference without warning check("int* foo() {\n" " int& x = getX();\n" " return &x;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct C {\n" " int* m_x;\n" " void foo() {\n" @@ -3276,7 +3274,7 @@ class TestAutoVariables : public TestFixture { " m_x = &x;\n" " }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #10090 check("struct a {\n" @@ -3294,7 +3292,7 @@ class TestAutoVariables : public TestFixture { " e.c = &e.d->b;\n" " return e;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #10214 check("struct A {\n" @@ -3307,7 +3305,7 @@ class TestAutoVariables : public TestFixture { " [key](const auto &v) { return v.key == key; });\n" " return (entry == lookup.end()) ? \"\" : entry->value;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #9811 check("struct Base {\n" @@ -3318,7 +3316,7 @@ class TestAutoVariables : public TestFixture { " auto get() -> int & override { return z; }\n" " auto getMore() -> int & { return get(); }\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #10575 check("struct Data {\n" @@ -3337,21 +3335,21 @@ class TestAutoVariables : public TestFixture { "};\n"); ASSERT_EQUALS( "[test.cpp:11] -> [test.cpp:10] -> [test.cpp:11]: (error) Non-local variable 'mMoreData.data1' will use pointer to local variable 'data'.\n", - errout.str()); + errout_str()); // #10784 check("template \n" "auto f(int i, Ts&... xs) {\n" " return std::tie(xs[i]...);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #11362 check("int* f() {\n" " static struct { int x; } a[] = { { 1 } };\n" " return &a[0].x;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #11666 check("template \n" @@ -3373,7 +3371,7 @@ class TestAutoVariables : public TestFixture { "Matrix O() {\n" " return { {}, {} };\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #11729 check("struct T {\n" @@ -3386,7 +3384,7 @@ class TestAutoVariables : public TestFixture { " }\n" " std::vector v;\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void danglingLifetimeFunction() { @@ -3396,7 +3394,7 @@ class TestAutoVariables : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:3] -> [test.cpp:2] -> [test.cpp:3]: (error) Returning object that points to local variable 'a' that will be invalid when returning.\n", - errout.str()); + errout_str()); check("auto f() {\n" " int a;\n" @@ -3404,7 +3402,7 @@ class TestAutoVariables : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:3] -> [test.cpp:3] -> [test.cpp:2] -> [test.cpp:3]: (error) Returning object that points to local variable 'a' that will be invalid when returning.\n", - errout.str()); + errout_str()); check("template\n" "auto by_value(T x) {\n" @@ -3416,7 +3414,7 @@ class TestAutoVariables : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:7] -> [test.cpp:7] -> [test.cpp:3] -> [test.cpp:3] -> [test.cpp:6] -> [test.cpp:7]: (error) Returning object that points to local variable 'v' that will be invalid when returning.\n", - errout.str()); + errout_str()); check("template\n" "auto by_value(const T& x) {\n" @@ -3428,7 +3426,7 @@ class TestAutoVariables : public TestFixture { "}\n"); ASSERT_EQUALS( "[test.cpp:7] -> [test.cpp:7] -> [test.cpp:3] -> [test.cpp:3] -> [test.cpp:6] -> [test.cpp:7]: (error) Returning object that points to local variable 'v' that will be invalid when returning.\n", - errout.str()); + errout_str()); check("auto by_ref(int& x) {\n" " return [&] { return x; };\n" @@ -3439,7 +3437,7 @@ class TestAutoVariables : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:2] -> [test.cpp:1] -> [test.cpp:2] -> [test.cpp:6] -> [test.cpp:5] -> [test.cpp:6]: (error) Returning object that points to local variable 'i' that will be invalid when returning.\n", - errout.str()); + errout_str()); check("auto by_ref(const int& x) {\n" " return [=] { return x; };\n" @@ -3448,14 +3446,14 @@ class TestAutoVariables : public TestFixture { " int i = 0;\n" " return by_ref(i);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("auto f(int x) {\n" " int a;\n" " std::tie(a) = x;\n" " return a;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("std::pair\n" "str_pair(std::string const & a, std::string const & b) {\n" @@ -3468,7 +3466,7 @@ class TestAutoVariables : public TestFixture { " par.push_back(str_pair(\"param3\", \"prop_c\"));\n" " return par;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void danglingLifetimeUserConstructor() @@ -3486,7 +3484,7 @@ class TestAutoVariables : public TestFixture { "}\n"); ASSERT_EQUALS( "[test.cpp:9] -> [test.cpp:8] -> [test.cpp:10]: (error) Returning object that points to local variable 'i' that will be invalid when returning.\n", - errout.str()); + errout_str()); check("struct A {\n" " int* i;\n" @@ -3500,7 +3498,7 @@ class TestAutoVariables : public TestFixture { true); ASSERT_EQUALS( "[test.cpp:7] -> [test.cpp:6] -> [test.cpp:8]: (error, inconclusive) Returning object that points to local variable 'i' that will be invalid when returning.\n", - errout.str()); + errout_str()); check("struct A {\n" " int* i;\n" @@ -3512,7 +3510,7 @@ class TestAutoVariables : public TestFixture { " return a;\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A {\n" " int& i;\n" @@ -3527,7 +3525,7 @@ class TestAutoVariables : public TestFixture { "}\n"); ASSERT_EQUALS( "[test.cpp:9] -> [test.cpp:8] -> [test.cpp:10]: (error) Returning object that points to local variable 'i' that will be invalid when returning.\n", - errout.str()); + errout_str()); check("struct A {\n" " int& i;\n" @@ -3542,7 +3540,7 @@ class TestAutoVariables : public TestFixture { "}\n"); ASSERT_EQUALS( "[test.cpp:9] -> [test.cpp:8] -> [test.cpp:10]: (error) Returning object that points to local variable 'v' that will be invalid when returning.\n", - errout.str()); + errout_str()); check("struct A {\n" " int* i;\n" @@ -3557,7 +3555,7 @@ class TestAutoVariables : public TestFixture { "}\n"); ASSERT_EQUALS( "[test.cpp:9] -> [test.cpp:8] -> [test.cpp:10]: (error) Returning object that points to local variable 'v' that will be invalid when returning.\n", - errout.str()); + errout_str()); check("struct A {\n" " const int* i;\n" @@ -3570,7 +3568,7 @@ class TestAutoVariables : public TestFixture { " return a;\n" "}\n"); ASSERT_EQUALS("[test.cpp:8] -> [test.cpp:9]: (error) Returning object that will be invalid when returning.\n", - errout.str()); + errout_str()); check("struct A {\n" " const int* i;\n" @@ -3584,7 +3582,7 @@ class TestAutoVariables : public TestFixture { "}\n"); ASSERT_EQUALS( "[test.cpp:9] -> [test.cpp:8] -> [test.cpp:9]: (error) Returning object that points to local variable 'i' that will be invalid when returning.\n", - errout.str()); + errout_str()); check("struct A {\n" " std::string v;\n" @@ -3596,7 +3594,7 @@ class TestAutoVariables : public TestFixture { " std::string s;\n" " return A{s};\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A {\n" " std::string_view v;\n" @@ -3610,7 +3608,7 @@ class TestAutoVariables : public TestFixture { "}\n"); ASSERT_EQUALS( "[test.cpp:9] -> [test.cpp:8] -> [test.cpp:9]: (error) Returning object that points to local variable 's' that will be invalid when returning.\n", - errout.str()); + errout_str()); check("struct A {\n" " const int* i;\n" @@ -3622,7 +3620,7 @@ class TestAutoVariables : public TestFixture { " return A{0};\n" "}\n"); ASSERT_EQUALS("[test.cpp:8] -> [test.cpp:8]: (error) Returning object that will be invalid when returning.\n", - errout.str()); + errout_str()); check("struct A {\n" " int n;\n" @@ -3632,7 +3630,7 @@ class TestAutoVariables : public TestFixture { " A m(4);\n" " return m;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct B {};\n" "struct A {\n" @@ -3643,7 +3641,7 @@ class TestAutoVariables : public TestFixture { " A m(B{});\n" " return m;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A {\n" " A(std::vector &filenames)\n" @@ -3656,7 +3654,7 @@ class TestAutoVariables : public TestFixture { "}\n"); ASSERT_EQUALS( "[test.cpp:8] -> [test.cpp:7] -> [test.cpp:8]: (error) Returning object that points to local variable 'files' that will be invalid when returning.\n", - errout.str()); + errout_str()); check("struct S {\n" " explicit S(std::string& s);\n" @@ -3666,7 +3664,7 @@ class TestAutoVariables : public TestFixture { " return S(m);\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S {\n" " std::string msg;\n" @@ -3677,7 +3675,7 @@ class TestAutoVariables : public TestFixture { " return S(s.c_str());\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S {\n" " explicit S(const char* p) { m = p; }\n" @@ -3690,7 +3688,7 @@ class TestAutoVariables : public TestFixture { " s.g();\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void danglingLifetimeAggegrateConstructor() { @@ -3704,7 +3702,7 @@ class TestAutoVariables : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:7] -> [test.cpp:6] -> [test.cpp:7]: (error) Returning object that points to local variable 'i' that will be invalid when returning.\n", - errout.str()); + errout_str()); check("struct A {\n" " const int& x;\n" @@ -3716,7 +3714,7 @@ class TestAutoVariables : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:7] -> [test.cpp:6] -> [test.cpp:7]: (error) Returning object that points to local variable 'i' that will be invalid when returning.\n", - errout.str()); + errout_str()); check("struct A {\n" " const int& x;\n" @@ -3729,7 +3727,7 @@ class TestAutoVariables : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:7] -> [test.cpp:6] -> [test.cpp:8]: (error) Returning object that points to local variable 'i' that will be invalid when returning.\n", - errout.str()); + errout_str()); check("struct A {\n" " const int& x;\n" @@ -3742,7 +3740,7 @@ class TestAutoVariables : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:7] -> [test.cpp:6] -> [test.cpp:8]: (error) Returning object that points to local variable 'i' that will be invalid when returning.\n", - errout.str()); + errout_str()); check("struct A {\n" " const int& x;\n" @@ -3754,7 +3752,7 @@ class TestAutoVariables : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:7] -> [test.cpp:6] -> [test.cpp:7]: (error) Returning object that points to local variable 'i' that will be invalid when returning.\n", - errout.str()); + errout_str()); check("struct A {\n" " const int& x;\n" @@ -3764,7 +3762,7 @@ class TestAutoVariables : public TestFixture { " int i = 0;\n" " return A{x, i};\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A {\n" " const int& x;\n" @@ -3773,14 +3771,14 @@ class TestAutoVariables : public TestFixture { "A f(int& x) {\n" " return A{x, x};\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A { int i; const int& j; };\n" "A f(int& x) {\n" " int y = 0;\n" " return A{y, x};\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct a {\n" " std::string m;\n" @@ -3789,7 +3787,7 @@ class TestAutoVariables : public TestFixture { " std::array m {};\n" " return { m.data() };\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void danglingLifetimeInitList() { @@ -3801,7 +3799,7 @@ class TestAutoVariables : public TestFixture { ASSERT_EQUALS( "[test.cpp:3] -> [test.cpp:3] -> [test.cpp:2] -> [test.cpp:4]: (error) Returning object that points to local variable 'i' that will be invalid when returning.\n" "[test.cpp:3] -> [test.cpp:3] -> [test.cpp:2] -> [test.cpp:4]: (error) Returning object that points to local variable 'i' that will be invalid when returning.\n", // duplicate - errout.str()); + errout_str()); check("std::vector f() {\n" " int i = 0;\n" @@ -3811,7 +3809,7 @@ class TestAutoVariables : public TestFixture { ASSERT_EQUALS( "[test.cpp:3] -> [test.cpp:3] -> [test.cpp:2] -> [test.cpp:4]: (error) Returning object that points to local variable 'i' that will be invalid when returning.\n" "[test.cpp:3] -> [test.cpp:3] -> [test.cpp:2] -> [test.cpp:4]: (error) Returning object that points to local variable 'i' that will be invalid when returning.\n", // duplicate - errout.str()); + errout_str()); check("std::vector f() {\n" " int i = 0;\n" @@ -3820,12 +3818,12 @@ class TestAutoVariables : public TestFixture { ASSERT_EQUALS( "[test.cpp:3] -> [test.cpp:3] -> [test.cpp:2] -> [test.cpp:3]: (error) Returning object that points to local variable 'i' that will be invalid when returning.\n" "[test.cpp:3] -> [test.cpp:3] -> [test.cpp:2] -> [test.cpp:3]: (error) Returning object that points to local variable 'i' that will be invalid when returning.\n", // duplicate - errout.str()); + errout_str()); check("std::vector f(int& x) {\n" " return {&x, &x};\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("std::vector f() {\n" " std::set x;\n" @@ -3833,7 +3831,7 @@ class TestAutoVariables : public TestFixture { " x.insert(\"2\");\n" " return { x.begin(), x.end() };\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void danglingLifetimeImplicitConversion() { @@ -3842,7 +3840,7 @@ class TestAutoVariables : public TestFixture { " std::string ba(\"hello\");\n" " return ba.c_str();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A { A(const char *a); };\n" "A f() {\n" @@ -3850,7 +3848,7 @@ class TestAutoVariables : public TestFixture { " A bp = ba.c_str();\n" " return bp;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A { A(const char *a); };\n" "std::vector f() {\n" @@ -3859,7 +3857,7 @@ class TestAutoVariables : public TestFixture { " v.push_back(ba.c_str());\n" " return v;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("std::string f(const std::string& x) {\n" " const char c[] = \"\";\n" @@ -3867,7 +3865,7 @@ class TestAutoVariables : public TestFixture { " return x + c;\n" " return \"\";\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("std::string f(const std::string& x) {\n" " const char c[] = \"123\";\n" @@ -3875,7 +3873,7 @@ class TestAutoVariables : public TestFixture { " return c + 1;\n" " return \"\";\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void danglingTemporaryLifetime() { @@ -3889,7 +3887,7 @@ class TestAutoVariables : public TestFixture { " C c(\"\");\n" " while (c.f()) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("const int& g(const int& x) {\n" " return x;\n" @@ -3900,7 +3898,7 @@ class TestAutoVariables : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:1] -> [test.cpp:2] -> [test.cpp:5] -> [test.cpp:5] -> [test.cpp:5] -> [test.cpp:6]: (error) Using pointer that is a temporary.\n", - errout.str()); + errout_str()); check("QString f() {\n" " QString a(\"dummyValue\");\n" @@ -3909,7 +3907,7 @@ class TestAutoVariables : public TestFixture { " return c;\n" "}"); ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:3] -> [test.cpp:4]: (error) Using pointer that is a temporary.\n", - errout.str()); + errout_str()); check("auto f(std::string s) {\n" " const char *x = s.substr(1,2).c_str();\n" @@ -3917,21 +3915,21 @@ class TestAutoVariables : public TestFixture { " return *i;\n" "}"); ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:3] -> [test.cpp:4]: (error) Using iterator that is a temporary.\n", - errout.str()); + errout_str()); check("std::string f() {\n" " std::stringstream tmp;\n" " const std::string &str = tmp.str();\n" " return std::string(str.c_str(), 1);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int get_value();\n" "const int &get_reference1() {\n" " const int &x = get_value();\n" " return x;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (error) Reference to temporary returned.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (error) Reference to temporary returned.\n", errout_str()); check("int get_value();\n" "const int &get_reference2() {\n" @@ -3940,13 +3938,13 @@ class TestAutoVariables : public TestFixture { " return x2;\n" "}\n"); ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:3] -> [test.cpp:5]: (error) Reference to temporary returned.\n", - errout.str()); + errout_str()); check("const std::string& getState() {\n" " static const std::string& state = \"\";\n" " return state;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct var {\n" " void fun();\n" @@ -3959,7 +3957,7 @@ class TestAutoVariables : public TestFixture { " auto a = T(GetTemp().c_str());\n" " a->fun();\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A {\n" " std::map m_;\n" @@ -3973,7 +3971,7 @@ class TestAutoVariables : public TestFixture { " (void)m->first;\n" "}\n"); ASSERT_EQUALS("[test.cpp:9] -> [test.cpp:9] -> [test.cpp:10]: (error) Using iterator that is a temporary.\n", - errout.str()); + errout_str()); check("void f(bool b) {\n" " std::vector ints = g();\n" @@ -3983,7 +3981,7 @@ class TestAutoVariables : public TestFixture { " for (auto it = ptr->begin(); it != ptr->end(); ++it)\n" " {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct String {\n" // #10469 " void Append(uint8_t Val);\n" @@ -3995,7 +3993,7 @@ class TestAutoVariables : public TestFixture { " Append(Val);\n" " }\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #11057 check("struct S {\n" @@ -4005,7 +4003,7 @@ class TestAutoVariables : public TestFixture { " const S a[] = { { i } };\n" " for (const auto& s : a) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("std::vector f(const std::vector& args) {\n" // #9773 " std::vector cargs;\n" @@ -4018,7 +4016,7 @@ class TestAutoVariables : public TestFixture { " std::vector cargs = f({ \"0\", \"0\" });\n" " (void)cargs;\n" "};\n"); - ASSERT_EQUALS("[test.cpp:6] -> [test.cpp:4] -> [test.cpp:3] -> [test.cpp:1] -> [test.cpp:4] -> [test.cpp:9] -> [test.cpp:9] -> [test.cpp:10]: (error) Using object that is a temporary.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6] -> [test.cpp:4] -> [test.cpp:3] -> [test.cpp:1] -> [test.cpp:4] -> [test.cpp:9] -> [test.cpp:9] -> [test.cpp:10]: (error) Using object that is a temporary.\n", errout_str()); check("struct C {\n" // #9194 " const int& m;\n" @@ -4029,7 +4027,7 @@ class TestAutoVariables : public TestFixture { " C c(42);\n" " return c.get();\n" "}\n"); - ASSERT_EQUALS("[test.cpp:7] -> [test.cpp:7] -> [test.cpp:8]: (error) Using object that is a temporary.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7] -> [test.cpp:7] -> [test.cpp:8]: (error) Using object that is a temporary.\n", errout_str()); // #11298 check("struct S {\n" @@ -4049,7 +4047,7 @@ class TestAutoVariables : public TestFixture { " if (u.h()) {}\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #11442 check("const std::string& f(const P< std::string >& value) {\n" @@ -4057,7 +4055,7 @@ class TestAutoVariables : public TestFixture { " return value.get() == nullptr ? empty : *value;\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #11472 check("namespace N {\n" @@ -4067,7 +4065,7 @@ class TestAutoVariables : public TestFixture { " return p != nullptr ? *p : *reinterpret_cast(&i);\n" " }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #11609 check("struct S {\n" @@ -4077,7 +4075,7 @@ class TestAutoVariables : public TestFixture { " }\n" " std::map m;\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #11628 check("std::vector* g();\n" @@ -4085,7 +4083,7 @@ class TestAutoVariables : public TestFixture { " std::unique_ptr> p(g());\n" " if (!p) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void danglingLifetimeBorrowedMembers() @@ -4108,7 +4106,7 @@ class TestAutoVariables : public TestFixture { " func1(&rech.dat);\n" " func2(rech.k);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A { int x; };\n" "A* g();\n" @@ -4117,7 +4115,7 @@ class TestAutoVariables : public TestFixture { " (*ap)->x;\n" "}\n"); ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:4] -> [test.cpp:5]: (error) Using pointer that is a temporary.\n", - errout.str()); + errout_str()); check("struct A { int* x; };\n" "A g();\n" @@ -4125,7 +4123,7 @@ class TestAutoVariables : public TestFixture { " int* x = g().x;\n" " (void)*x + 1;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A { int x; };\n" "struct B { A* a; }\n" @@ -4134,7 +4132,7 @@ class TestAutoVariables : public TestFixture { " int* x = &g()->a.x;\n" " (void)*x + 1;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A { int x; };\n" "struct B { A* g(); };\n" @@ -4144,7 +4142,7 @@ class TestAutoVariables : public TestFixture { " (*ap)->x;\n" "}\n"); ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:5] -> [test.cpp:6]: (error) Using pointer that is a temporary.\n", - errout.str()); + errout_str()); } void danglingLifetimeClassMemberFunctions() @@ -4159,7 +4157,7 @@ class TestAutoVariables : public TestFixture { "}\n"); ASSERT_EQUALS( "[test.cpp:4] -> [test.cpp:4] -> [test.cpp:7] -> [test.cpp:7]: (error) Returning pointer that will be invalid when returning.\n", - errout.str()); + errout_str()); check("struct Fred\n" "{\n" @@ -4178,7 +4176,7 @@ class TestAutoVariables : public TestFixture { "}\n"); ASSERT_EQUALS( "[test.cpp:9] -> [test.cpp:9] -> [test.cpp:14] -> [test.cpp:13] -> [test.cpp:14]: (error) Returning pointer to local variable 'fred' that will be invalid when returning.\n", - errout.str()); + errout_str()); check("struct A {\n" " int i;\n" @@ -4191,7 +4189,7 @@ class TestAutoVariables : public TestFixture { "}\n"); ASSERT_EQUALS( "[test.cpp:4] -> [test.cpp:4] -> [test.cpp:8] -> [test.cpp:8]: (error) Returning object that will be invalid when returning.\n", - errout.str()); + errout_str()); check("struct A {\n" " int i;\n" @@ -4202,7 +4200,7 @@ class TestAutoVariables : public TestFixture { "auto g() {\n" " return A().f();\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A {\n" " int* i;\n" @@ -4216,7 +4214,7 @@ class TestAutoVariables : public TestFixture { "}\n"); ASSERT_EQUALS( "[test.cpp:9] -> [test.cpp:9] -> [test.cpp:9] -> [test.cpp:4] -> [test.cpp:4] -> [test.cpp:8] -> [test.cpp:9]: (error) Returning object that points to local variable 'i' that will be invalid when returning.\n", - errout.str()); + errout_str()); check("struct S {\n" " int i{};\n" @@ -4233,7 +4231,7 @@ class TestAutoVariables : public TestFixture { " }\n" " *p = ret;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void invalidLifetime() { @@ -4245,7 +4243,7 @@ class TestAutoVariables : public TestFixture { " }\n" " f();\n" "}"); - ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:4] -> [test.cpp:7]: (error) Using lambda that captures local variable 'b' that is out of scope.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:4] -> [test.cpp:7]: (error) Using lambda that captures local variable 'b' that is out of scope.\n", errout_str()); check("void f(bool b) {\n" " int* x;\n" @@ -4257,7 +4255,7 @@ class TestAutoVariables : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:5] -> [test.cpp:4] -> [test.cpp:7]: (error) Using pointer to local variable 'y' that is out of scope.\n", - errout.str()); + errout_str()); check("void foo(int a) {\n" " std::function f;\n" @@ -4267,7 +4265,7 @@ class TestAutoVariables : public TestFixture { " f();\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct a {\n" " b();\n" @@ -4276,7 +4274,7 @@ class TestAutoVariables : public TestFixture { "void a::b() {\n" " c.end()\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void b(char f[], char c[]) {\n" " std::string d(c); {\n" @@ -4284,7 +4282,7 @@ class TestAutoVariables : public TestFixture { " b(f, e.c_str())\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(bool b) {\n" " std::string s;\n" @@ -4294,11 +4292,11 @@ class TestAutoVariables : public TestFixture { " }\n" " std::cout << s;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int &a[];\n" "void b(){int *c = a};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A {\n" " int x;\n" @@ -4312,7 +4310,7 @@ class TestAutoVariables : public TestFixture { " };\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("namespace test {\n" "class Foo {};\n" @@ -4331,7 +4329,7 @@ class TestAutoVariables : public TestFixture { " f(bar);\n" "}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class Foo {};\n" "struct Bar {\n" @@ -4348,7 +4346,7 @@ class TestAutoVariables : public TestFixture { " }\n" " f(bar);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("namespace test {\n" "class Foo {};\n" @@ -4366,7 +4364,7 @@ class TestAutoVariables : public TestFixture { " f(bar);\n" "}\n" "}\n"); - ASSERT_EQUALS("[test.cpp:12]: (error) Address of local auto-variable assigned to a function parameter.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:12]: (error) Address of local auto-variable assigned to a function parameter.\n", errout_str()); check("class Foo {};\n" "struct Bar {\n" @@ -4382,7 +4380,7 @@ class TestAutoVariables : public TestFixture { " }\n" " f(bar);\n" "}\n"); - ASSERT_EQUALS("[test.cpp:11]: (error) Address of local auto-variable assigned to a function parameter.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:11]: (error) Address of local auto-variable assigned to a function parameter.\n", errout_str()); check("class Foo {};\n" // #10750 "struct Bar {\n" @@ -4398,7 +4396,7 @@ class TestAutoVariables : public TestFixture { " }\n" " f(bar);\n" "}\n"); - ASSERT_EQUALS("[test.cpp:10]: (error) Address of local auto-variable assigned to a function parameter.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:10]: (error) Address of local auto-variable assigned to a function parameter.\n", errout_str()); check("void f(std::string_view text);\n" // #11508 "void g() {\n" @@ -4408,7 +4406,7 @@ class TestAutoVariables : public TestFixture { "void f(std::string_view text) {" " g(text.data());\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(std::span data);\n" // #11508 "void g() {\n" @@ -4418,7 +4416,7 @@ class TestAutoVariables : public TestFixture { "void f(std::span data) {" " g(data.begin());\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } @@ -4431,7 +4429,7 @@ class TestAutoVariables : public TestFixture { " }\n" " *p = 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:4] -> [test.cpp:7]: (error) Using pointer to local variable 'x' that is out of scope.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:4] -> [test.cpp:7]: (error) Using pointer to local variable 'x' that is out of scope.\n", errout_str()); // FP: don't warn in subfunction check("void f(struct KEY *key) {\n" @@ -4448,7 +4446,7 @@ class TestAutoVariables : public TestFixture { " }\n" " f(tmp);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Don't warn about references (#6399) check("void f() {\n" @@ -4460,7 +4458,7 @@ class TestAutoVariables : public TestFixture { " if (former_hover != pitem)\n" " dosth();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " wxAuiToolBarItem* former_hover = NULL;\n" @@ -4473,7 +4471,7 @@ class TestAutoVariables : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:5] -> [test.cpp:3] -> [test.cpp:4] -> [test.cpp:7]: (error) Using pointer to local variable 'item' that is out of scope.\n", - errout.str()); + errout_str()); // #6575 check("void trp_deliver_signal() {\n" @@ -4484,7 +4482,7 @@ class TestAutoVariables : public TestFixture { " EventReport * rep = &repData;\n" " rep->setEventType(NDB_LE_Connected);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #8785 check("int f(bool a, bool b) {\n" @@ -4497,7 +4495,7 @@ class TestAutoVariables : public TestFixture { " return *iPtr;\n" " return 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:4] -> [test.cpp:8]: (error) Using pointer to local variable 'x' that is out of scope.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:4] -> [test.cpp:8]: (error) Using pointer to local variable 'x' that is out of scope.\n", errout_str()); // #11753 check("int main(int argc, const char *argv[]) {\n" @@ -4508,13 +4506,13 @@ class TestAutoVariables : public TestFixture { " }\n" " std::cout << s;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:4] -> [test.cpp:7]: (error) Using pointer to local variable 'buff' that is out of scope.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:4] -> [test.cpp:7]: (error) Using pointer to local variable 'buff' that is out of scope.\n", errout_str()); check("char* f(char* dst) {\n" " const char* src = \"abc\";\n" " return strcpy(dst, src);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void splitNamespaceAuto() { // #10473 @@ -4526,7 +4524,7 @@ class TestAutoVariables : public TestFixture { "{\n" " int i;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } }; diff --git a/test/testbool.cpp b/test/testbool.cpp index 6f5402171dd9..b8fb09558815 100644 --- a/test/testbool.cpp +++ b/test/testbool.cpp @@ -78,9 +78,6 @@ class TestBool : public TestFixture { #define check(...) check_(__FILE__, __LINE__, __VA_ARGS__) void check_(const char* file, int line, const char code[], const char filename[] = "test.cpp") { - // Clear the error buffer.. - errout.str(""); - // Tokenize.. Tokenizer tokenizer(settings, this); std::istringstream istr(code); @@ -95,28 +92,28 @@ class TestBool : public TestFixture { check("void foo(bool *p) {\n" " p = false;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (error) Boolean value assigned to pointer.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (error) Boolean value assigned to pointer.\n", errout_str()); check("void foo(bool *p) {\n" " p = (x[rSize];\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // ticket #6588 (c mode) check("struct MpegEncContext { int *q_intra_matrix, *q_chroma_intra_matrix; };\n" @@ -151,7 +148,7 @@ class TestBool : public TestFixture { " ctx->q_intra_matrix :" " ctx->q_chroma_intra_matrix;\n" "}", "test.c"); - ASSERT_EQUALS("[test.c:3]: (error) Boolean value assigned to pointer.\n", errout.str()); + ASSERT_EQUALS("[test.c:3]: (error) Boolean value assigned to pointer.\n", errout_str()); // ticket #6588 (c++ mode) check("struct MpegEncContext { int *q_intra_matrix, *q_chroma_intra_matrix; };\n" @@ -161,7 +158,7 @@ class TestBool : public TestFixture { " ctx->q_intra_matrix :" " ctx->q_chroma_intra_matrix;\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Boolean value assigned to pointer.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Boolean value assigned to pointer.\n", errout_str()); // ticket #6665 check("void pivot_big(char *first, int compare(const void *, const void *)) {\n" @@ -170,37 +167,37 @@ class TestBool : public TestFixture { " ? (compare(b, c) < 0 ? b : (compare(a, c) < 0 ? c : a))\n" " : (compare(a, c) < 0 ? a : (compare(b, c) < 0 ? c : b));\n" "}", "test.c"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #7381 check("void foo(bool *p, bool b) {\n" " p = b;\n" " p = &b;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (error) Boolean value assigned to pointer.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (error) Boolean value assigned to pointer.\n", errout_str()); } void assignBoolToFloat() { check("void foo1() {\n" " double d = false;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Boolean value assigned to floating point variable.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Boolean value assigned to floating point variable.\n", errout_str()); check("void foo2() {\n" " float d = true;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Boolean value assigned to floating point variable.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Boolean value assigned to floating point variable.\n", errout_str()); check("void foo3() {\n" " long double d = (2>1);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Boolean value assigned to floating point variable.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Boolean value assigned to floating point variable.\n", errout_str()); // stability - don't crash: check("void foo4() {\n" " unknown = false;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S {\n" " float p;\n" @@ -209,7 +206,7 @@ class TestBool : public TestFixture { " S s = {0};\n" " s.p = true;\n" "}"); - ASSERT_EQUALS("[test.cpp:6]: (style) Boolean value assigned to floating point variable.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (style) Boolean value assigned to floating point variable.\n", errout_str()); check("struct S {\n" " float* p[1];\n" @@ -218,7 +215,7 @@ class TestBool : public TestFixture { " S s = {0};\n" " *s.p[0] = true;\n" "}"); - ASSERT_EQUALS("[test.cpp:6]: (style) Boolean value assigned to floating point variable.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (style) Boolean value assigned to floating point variable.\n", errout_str()); } void comparisonOfBoolExpressionWithInt1() { @@ -226,44 +223,44 @@ class TestBool : public TestFixture { " if ((x && 0x0f)==6)\n" " a++;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of a boolean expression with an integer other than 0 or 1.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of a boolean expression with an integer other than 0 or 1.\n", errout_str()); check("void f(int x) {\n" " if ((x && 0x0f)==0)\n" " a++;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x) {\n" " if ((x || 0x0f)==6)\n" " a++;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of a boolean expression with an integer other than 0 or 1.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of a boolean expression with an integer other than 0 or 1.\n", errout_str()); check("void f(int x) {\n" " if ((x || 0x0f)==0)\n" " a++;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x) {\n" " if ((x & 0x0f)==6)\n" " a++;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x) {\n" " if ((x | 0x0f)==6)\n" " a++;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x) {\n" " if ((5 && x)==3)\n" " a++;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of a boolean expression with an integer other than 0 or 1.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of a boolean expression with an integer other than 0 or 1.\n", errout_str()); check("void f(int x) {\n" " if ((5 && x)==3 || (8 && x)==9)\n" @@ -272,137 +269,137 @@ class TestBool : public TestFixture { ASSERT_EQUALS( "[test.cpp:2]: (warning) Comparison of a boolean expression with an integer other than 0 or 1.\n" "[test.cpp:2]: (warning) Comparison of a boolean expression with an integer other than 0 or 1.\n", // duplicate - errout.str()); + errout_str()); check("void f(int x) {\n" " if ((5 && x)!=3)\n" " a++;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of a boolean expression with an integer other than 0 or 1.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of a boolean expression with an integer other than 0 or 1.\n", errout_str()); check("void f(int x) {\n" " if ((5 && x) > 3)\n" " a++;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of a boolean expression with an integer other than 0 or 1.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of a boolean expression with an integer other than 0 or 1.\n", errout_str()); check("void f(int x) {\n" " if ((5 && x) > 0)\n" " a++;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x) {\n" " if ((5 && x) < 0)\n" " a++;\n" "}" ); - ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of a boolean expression with an integer.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of a boolean expression with an integer.\n", errout_str()); check("void f(int x) {\n" " if ((5 && x) < 1)\n" " a++;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x) {\n" " if ((5 && x) > 1)\n" " a++;\n" "}" ); - ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of a boolean expression with an integer.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of a boolean expression with an integer.\n", errout_str()); check("void f(int x) {\n" " if (0 < (5 && x))\n" " a++;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x) {\n" " if (0 > (5 && x))\n" " a++;\n" "}" ); - ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of a boolean expression with an integer.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of a boolean expression with an integer.\n", errout_str()); check("void f(int x) {\n" " if (1 > (5 && x))\n" " a++;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x) {\n" " if (1 < (5 && x))\n" " a++;\n" "}" ); - ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of a boolean expression with an integer.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of a boolean expression with an integer.\n", errout_str()); check("void f(bool x ) {\n" " if ( x > false )\n" " a++;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of a boolean value using relational operator (<, >, <= or >=).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of a boolean value using relational operator (<, >, <= or >=).\n", errout_str()); check("void f(bool x ) {\n" " if ( false < x )\n" " a++;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of a boolean value using relational operator (<, >, <= or >=).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of a boolean value using relational operator (<, >, <= or >=).\n", errout_str()); check("void f(bool x ) {\n" " if ( x < false )\n" " a++;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of a boolean value using relational operator (<, >, <= or >=).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of a boolean value using relational operator (<, >, <= or >=).\n", errout_str()); check("void f(bool x ) {\n" " if ( false > x )\n" " a++;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of a boolean value using relational operator (<, >, <= or >=).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of a boolean value using relational operator (<, >, <= or >=).\n", errout_str()); check("void f(bool x ) {\n" " if ( x >= false )\n" " a++;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of a boolean value using relational operator (<, >, <= or >=).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of a boolean value using relational operator (<, >, <= or >=).\n", errout_str()); check("void f(bool x ) {\n" " if ( false >= x )\n" " a++;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of a boolean value using relational operator (<, >, <= or >=).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of a boolean value using relational operator (<, >, <= or >=).\n", errout_str()); check("void f(bool x ) {\n" " if ( x <= false )\n" " a++;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of a boolean value using relational operator (<, >, <= or >=).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of a boolean value using relational operator (<, >, <= or >=).\n", errout_str()); check("void f(bool x ) {\n" " if ( false <= x )\n" " a++;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of a boolean value using relational operator (<, >, <= or >=).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of a boolean value using relational operator (<, >, <= or >=).\n", errout_str()); check("typedef int (*func)(bool invert);\n" "void x(int, func f);\n" "void foo(int error) {\n" " if (error == ABC) { }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f() { return !a+b1){} }"); - ASSERT_EQUALS("",errout.str()); + ASSERT_EQUALS("",errout_str()); check("void f(int a, int b, int c) { if (a != !b || c) {} }"); - ASSERT_EQUALS("",errout.str()); + ASSERT_EQUALS("",errout_str()); check("void f(int a, int b, int c) { if (1 < !!a + !!b + !!c) {} }"); - ASSERT_EQUALS("",errout.str()); + ASSERT_EQUALS("",errout_str()); check("void f(int a, int b, int c) { if (1 < !(a+b)) {} }"); - ASSERT_EQUALS("[test.cpp:1]: (warning) Comparison of a boolean expression with an integer.\n",errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (warning) Comparison of a boolean expression with an integer.\n",errout_str()); } void comparisonOfBoolExpressionWithInt3() { check("int f(int x) {\n" " return t<0>() && x;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void comparisonOfBoolExpressionWithInt4() { @@ -497,48 +494,48 @@ class TestBool : public TestFixture { check("void f() {\n" " for(int i = 4; i > -1 < 5 ; --i) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of a boolean expression with an integer other than 0 or 1.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of a boolean expression with an integer other than 0 or 1.\n", errout_str()); check("void f(int a, int b, int c) {\n" " return (a > b) < c;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int a, int b, int c) {\n" " return x(a > b) < c;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int a, int b, int c) {\n" " return a > b == c;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // templates check("struct Tokenizer { TokenList list; };\n" "void Tokenizer::f() {\n" " std::list locationList;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #5063 - or check("void f() {\n" " return a > b or c < d;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f() {\n" " return (a < b) != 0U;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f() {\n" " return (a < b) != 0x0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f() {\n" " return (a < b) != 42U;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of a boolean expression with an integer other than 0 or 1.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of a boolean expression with an integer other than 0 or 1.\n", errout_str()); } void checkComparisonOfFuncReturningBool1() { @@ -562,7 +559,7 @@ class TestBool : public TestFixture { " else\n" " return true;\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Comparison of two functions returning boolean value using relational (<, >, <= or >=) operator.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Comparison of two functions returning boolean value using relational (<, >, <= or >=) operator.\n", errout_str()); } void checkComparisonOfFuncReturningBool2() { @@ -588,7 +585,7 @@ class TestBool : public TestFixture { " return false;\n" "}"); ASSERT_EQUALS("[test.cpp:4]: (style) Comparison of a function returning boolean value using relational (<, >, <= or >=) operator.\n" - "[test.cpp:11]: (style) Comparison of a function returning boolean value using relational (<, >, <= or >=) operator.\n", errout.str()); + "[test.cpp:11]: (style) Comparison of a function returning boolean value using relational (<, >, <= or >=) operator.\n", errout_str()); } void checkComparisonOfFuncReturningBool3() { @@ -600,7 +597,7 @@ class TestBool : public TestFixture { "}\n" "bool compare(int temp);"); ASSERT_EQUALS("[test.cpp:3]: (warning) Comparison of a boolean expression with an integer other than 0 or 1.\n" - "[test.cpp:3]: (style) Comparison of a function returning boolean value using relational (<, >, <= or >=) operator.\n", errout.str()); + "[test.cpp:3]: (style) Comparison of a function returning boolean value using relational (<, >, <= or >=) operator.\n", errout_str()); } void checkComparisonOfFuncReturningBool4() { @@ -625,7 +622,7 @@ class TestBool : public TestFixture { " else\n" " return false;\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (style) Comparison of a function returning boolean value using relational (<, >, <= or >=) operator.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Comparison of a function returning boolean value using relational (<, >, <= or >=) operator.\n", errout_str()); } void checkComparisonOfFuncReturningBool5() { @@ -649,7 +646,7 @@ class TestBool : public TestFixture { " else\n" " return true;\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Comparison of two functions returning boolean value using relational (<, >, <= or >=) operator.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Comparison of two functions returning boolean value using relational (<, >, <= or >=) operator.\n", errout_str()); } void checkComparisonOfFuncReturningBool6() { @@ -663,7 +660,7 @@ class TestBool : public TestFixture { " printf(\"foo\");\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("namespace Foo {\n" " bool compare1(int temp);\n" @@ -675,7 +672,7 @@ class TestBool : public TestFixture { " printf(\"foo\");\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int compare1(int temp);\n" "namespace Foo {\n" @@ -687,7 +684,7 @@ class TestBool : public TestFixture { " }\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:6]: (style) Comparison of a function returning boolean value using relational (<, >, <= or >=) operator.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (style) Comparison of a function returning boolean value using relational (<, >, <= or >=) operator.\n", errout_str()); check("int compare1(int temp);\n" "namespace Foo {\n" @@ -699,7 +696,7 @@ class TestBool : public TestFixture { " }\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool compare1(int temp);\n" "void f(){\n" @@ -708,7 +705,7 @@ class TestBool : public TestFixture { " printf(\"foo\");\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void checkComparisonOfFuncReturningBool7() { // #7197 @@ -726,7 +723,7 @@ class TestBool : public TestFixture { "[test.cpp:7]: (style) Comparison of two functions returning boolean value using relational (<, >, <= or >=) operator.\n" "[test.cpp:8]: (style) Comparison of two functions returning boolean value using relational (<, >, <= or >=) operator.\n" "[test.cpp:9]: (style) Comparison of two functions returning boolean value using relational (<, >, <= or >=) operator.\n", - errout.str()); + errout_str()); } void checkComparisonOfFuncReturningBool8() { // #4103 @@ -738,7 +735,7 @@ class TestBool : public TestFixture { " ;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (style) Comparison of a variable having boolean value using relational (<, >, <= or >=) operator.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Comparison of a variable having boolean value using relational (<, >, <= or >=) operator.\n", errout_str()); // op: < check("int main(void){\n" " bool a = true;\n" @@ -747,7 +744,7 @@ class TestBool : public TestFixture { " ;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (style) Comparison of a variable having boolean value using relational (<, >, <= or >=) operator.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Comparison of a variable having boolean value using relational (<, >, <= or >=) operator.\n", errout_str()); // op: >= check("int main(void){\n" " bool a = true;\n" @@ -756,7 +753,7 @@ class TestBool : public TestFixture { " ;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (style) Comparison of a variable having boolean value using relational (<, >, <= or >=) operator.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Comparison of a variable having boolean value using relational (<, >, <= or >=) operator.\n", errout_str()); // op: <= check("int main(void){\n" " bool a = true;\n" @@ -765,7 +762,7 @@ class TestBool : public TestFixture { " ;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (style) Comparison of a variable having boolean value using relational (<, >, <= or >=) operator.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Comparison of a variable having boolean value using relational (<, >, <= or >=) operator.\n", errout_str()); } void checkComparisonOfFuncReturningBoolIntegrationTest1() { // #7798 @@ -777,7 +774,7 @@ class TestBool : public TestFixture { " return 1;\n" " return 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void checkComparisonOfBoolWithBool() { @@ -804,133 +801,133 @@ class TestBool : public TestFixture { " return false;\n" "}\n"; check(code); - ASSERT_EQUALS("[test.cpp:5]: (style) Comparison of a variable having boolean value using relational (<, >, <= or >=) operator.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (style) Comparison of a variable having boolean value using relational (<, >, <= or >=) operator.\n", errout_str()); } void bitwiseOnBoolean() { // 3062 check("void f(_Bool a, _Bool b) {\n" " if(a & b) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style, inconclusive) Boolean expression 'a' is used in bitwise operation. Did you mean '&&'?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style, inconclusive) Boolean expression 'a' is used in bitwise operation. Did you mean '&&'?\n", errout_str()); check("void f(_Bool a, _Bool b) {\n" " if(a | b) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style, inconclusive) Boolean expression 'a' is used in bitwise operation. Did you mean '||'?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style, inconclusive) Boolean expression 'a' is used in bitwise operation. Did you mean '||'?\n", errout_str()); check("void f(bool a, bool b) {\n" " if(a & !b) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style, inconclusive) Boolean expression 'a' is used in bitwise operation. Did you mean '&&'?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style, inconclusive) Boolean expression 'a' is used in bitwise operation. Did you mean '&&'?\n", errout_str()); check("void f(bool a, bool b) {\n" " if(a | !b) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style, inconclusive) Boolean expression 'a' is used in bitwise operation. Did you mean '||'?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style, inconclusive) Boolean expression 'a' is used in bitwise operation. Did you mean '||'?\n", errout_str()); check("bool a, b;\n" "void f() {\n" " if(a & b) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style, inconclusive) Boolean expression 'a' is used in bitwise operation. Did you mean '&&'?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style, inconclusive) Boolean expression 'a' is used in bitwise operation. Did you mean '&&'?\n", errout_str()); check("bool a, b;\n" "void f() {\n" " if(a & !b) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style, inconclusive) Boolean expression 'a' is used in bitwise operation. Did you mean '&&'?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style, inconclusive) Boolean expression 'a' is used in bitwise operation. Did you mean '&&'?\n", errout_str()); check("bool a, b;\n" "void f() {\n" " if(a | b) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style, inconclusive) Boolean expression 'a' is used in bitwise operation. Did you mean '||'?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style, inconclusive) Boolean expression 'a' is used in bitwise operation. Did you mean '||'?\n", errout_str()); check("bool a, b;\n" "void f() {\n" " if(a | !b) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style, inconclusive) Boolean expression 'a' is used in bitwise operation. Did you mean '||'?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style, inconclusive) Boolean expression 'a' is used in bitwise operation. Did you mean '||'?\n", errout_str()); check("void f(bool a, int b) {\n" " if(a & b) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style, inconclusive) Boolean expression 'a' is used in bitwise operation. Did you mean '&&'?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style, inconclusive) Boolean expression 'a' is used in bitwise operation. Did you mean '&&'?\n", errout_str()); check("void f(int a, bool b) {\n" " if(a & b) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style, inconclusive) Boolean expression 'b' is used in bitwise operation. Did you mean '&&'?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style, inconclusive) Boolean expression 'b' is used in bitwise operation. Did you mean '&&'?\n", errout_str()); check("void f(int a, int b) {\n" " if((a > 0) & (b < 0)) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style, inconclusive) Boolean expression 'a>0' is used in bitwise operation. Did you mean '&&'?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style, inconclusive) Boolean expression 'a>0' is used in bitwise operation. Did you mean '&&'?\n", errout_str()); check("void f(bool a, int b) {\n" " if(a | b) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style, inconclusive) Boolean expression 'a' is used in bitwise operation. Did you mean '||'?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style, inconclusive) Boolean expression 'a' is used in bitwise operation. Did you mean '||'?\n", errout_str()); check("void f(int a, bool b) {\n" " if(a | b) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style, inconclusive) Boolean expression 'b' is used in bitwise operation. Did you mean '||'?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style, inconclusive) Boolean expression 'b' is used in bitwise operation. Did you mean '||'?\n", errout_str()); check("int f(bool a, int b) {\n" " return a | b;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool f(bool a, int b) {\n" " return a | b;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style, inconclusive) Boolean expression 'a' is used in bitwise operation. Did you mean '||'?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style, inconclusive) Boolean expression 'a' is used in bitwise operation. Did you mean '||'?\n", errout_str()); check("void f(int a, int b) {\n" " if(a & b) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(bool b) {\n" " foo(bar, &b);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(bool b) {\n" // #9405 " class C { void foo(bool &b) {} };\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool f();\n" "bool g() {\n" " return f() | f();\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("uint8 outcode(float p) {\n" " float d = 0.;\n" " return ((p - xm >= d) << 1) | (x - p > d);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int g();\n" // #10655 "void f(bool b) {\n" " if (g() | b) {}\n" "}\n"); - ASSERT_EQUALS("[test.cpp:3]: (style, inconclusive) Boolean expression 'b' is used in bitwise operation. Did you mean '||'?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style, inconclusive) Boolean expression 'b' is used in bitwise operation. Did you mean '||'?\n", errout_str()); check("int g();\n" "void f(bool b) {\n" " if (b | g()) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int g();\n" "bool f(bool b, bool c) {\n" " return b | g() | c;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:3]: (style, inconclusive) Boolean expression 'c' is used in bitwise operation. Did you mean '||'?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style, inconclusive) Boolean expression 'c' is used in bitwise operation. Did you mean '||'?\n", errout_str()); check("void f(int i) {\n" // #4233 " bool b = true, c = false;\n" @@ -940,20 +937,20 @@ class TestBool : public TestFixture { "}\n"); ASSERT_EQUALS("[test.cpp:3]: (style, inconclusive) Boolean expression 'b' is used in bitwise operation.\n" "[test.cpp:4]: (style, inconclusive) Boolean expression 'c' is used in bitwise operation.\n", - errout.str()); + errout_str()); check("void f(int i, int j, bool b) {\n" " i &= b;\n" " j |= b;\n" " if (b || c) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool f(bool b, int i) {\n" " b &= (i == 5);\n" " return b;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S { bool b{}; };\n" // #12455 "void f(const std::unordered_map m) {\n" @@ -963,33 +960,33 @@ class TestBool : public TestFixture { " (void)s.b;\n" " }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void incrementBoolean() { check("bool bValue = true;\n" "void f() { bValue++; }"); - ASSERT_EQUALS("[test.cpp:2]: (style) Incrementing a variable of type 'bool' with postfix operator++ is deprecated by the C++ Standard. You should assign it the value 'true' instead.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Incrementing a variable of type 'bool' with postfix operator++ is deprecated by the C++ Standard. You should assign it the value 'true' instead.\n", errout_str()); check("void f(bool test){\n" " test++;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Incrementing a variable of type 'bool' with postfix operator++ is deprecated by the C++ Standard. You should assign it the value 'true' instead.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Incrementing a variable of type 'bool' with postfix operator++ is deprecated by the C++ Standard. You should assign it the value 'true' instead.\n", errout_str()); check("void f(bool* test){\n" " (*test)++;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Incrementing a variable of type 'bool' with postfix operator++ is deprecated by the C++ Standard. You should assign it the value 'true' instead.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Incrementing a variable of type 'bool' with postfix operator++ is deprecated by the C++ Standard. You should assign it the value 'true' instead.\n", errout_str()); check("void f(bool* test){\n" " test[0]++;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Incrementing a variable of type 'bool' with postfix operator++ is deprecated by the C++ Standard. You should assign it the value 'true' instead.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Incrementing a variable of type 'bool' with postfix operator++ is deprecated by the C++ Standard. You should assign it the value 'true' instead.\n", errout_str()); check("void f(int test){\n" " test++;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void comparisonOfBoolWithInt1() { @@ -998,51 +995,51 @@ class TestBool : public TestFixture { " printf(\"foo\");\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of a boolean expression with an integer other than 0 or 1.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of a boolean expression with an integer other than 0 or 1.\n", errout_str()); check("void f(bool x) {\n" " if (10 >= x) {\n" " printf(\"foo\");\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of a boolean expression with an integer other than 0 or 1.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of a boolean expression with an integer other than 0 or 1.\n", errout_str()); check("void f(bool x) {\n" " if (x != 0) {\n" " printf(\"foo\");\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(bool x) {\n" // #3356 " if (x == 1) {\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(bool x) {\n" " if (x != 10) {\n" " printf(\"foo\");\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of a boolean expression with an integer other than 0 or 1.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of a boolean expression with an integer other than 0 or 1.\n", errout_str()); check("void f(bool x) {\n" " if (x == 10) {\n" " printf(\"foo\");\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of a boolean expression with an integer other than 0 or 1.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of a boolean expression with an integer other than 0 or 1.\n", errout_str()); check("void f(bool x) {\n" " if (x == 0) {\n" " printf(\"foo\");\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("DensePropertyMap visited;"); // #4075 - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void comparisonOfBoolWithInt2() { @@ -1051,28 +1048,28 @@ class TestBool : public TestFixture { " printf(\"foo\");\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x, bool y) {\n" " if (x == y) {\n" " printf(\"foo\");\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(bool x, bool y) {\n" " if (x == y) {\n" " printf(\"foo\");\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(bool x, fooClass y) {\n" " if (x == y) {\n" " printf(\"foo\");\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void comparisonOfBoolWithInt3() { @@ -1081,35 +1078,35 @@ class TestBool : public TestFixture { " printf(\"foo\");\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of a boolean value using relational operator (<, >, <= or >=).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of a boolean value using relational operator (<, >, <= or >=).\n", errout_str()); check("void f(int y) {\n" " if (true == y) {\n" " printf(\"foo\");\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(bool y) {\n" " if (y == true) {\n" " printf(\"foo\");\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(bool y) {\n" " if (false < 5) {\n" " printf(\"foo\");\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of a boolean expression with an integer other than 0 or 1.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of a boolean expression with an integer other than 0 or 1.\n", errout_str()); } void comparisonOfBoolWithInt4() { check("void f(int x) {\n" " if (!x == 1) { }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void comparisonOfBoolWithInt5() { @@ -1117,21 +1114,21 @@ class TestBool : public TestFixture { " bool (SciTEBase::*ischarforsel)(char ch);\n" " if (visible != GetVisible(index)) { }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void comparisonOfBoolWithInt6() { // #4224 - integer is casted to bool check("void SetVisible(bool b, int i) {\n" " if (b == (bool)i) { }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void comparisonOfBoolWithInt7() { // #4846 - (!x==true) check("void f(int x) {\n" " if (!x == true) { }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void comparisonOfBoolWithInt8() { // #9165 @@ -1141,7 +1138,7 @@ class TestBool : public TestFixture { " if (expectedResult == res)\n" " throw 2;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int Fun();\n" "void Test(bool expectedResult) {\n" @@ -1149,7 +1146,7 @@ class TestBool : public TestFixture { " if (expectedResult == res)\n" " throw 2;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool Fun();\n" "void Test(bool expectedResult) {\n" @@ -1157,7 +1154,7 @@ class TestBool : public TestFixture { " if (5 + expectedResult == res)\n" " throw 2;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int Fun();\n" "void Test(bool expectedResult) {\n" @@ -1165,7 +1162,7 @@ class TestBool : public TestFixture { " if (5 + expectedResult == res)\n" " throw 2;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int Fun();\n" "void Test(bool expectedResult) {\n" @@ -1173,7 +1170,7 @@ class TestBool : public TestFixture { " if (expectedResult == res + 5)\n" " throw 2;\n" "}"); - TODO_ASSERT_EQUALS("error", "", errout.str()); + TODO_ASSERT_EQUALS("error", "", errout_str()); } void comparisonOfBoolWithInt9() { // #9304 @@ -1184,7 +1181,7 @@ class TestBool : public TestFixture { " }\n" " return b;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void comparisonOfBoolWithInt10() { // #10935 @@ -1193,7 +1190,7 @@ class TestBool : public TestFixture { "void f(bool v) {\n" " if (v == H) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("namespace N {\n" " enum class E { H = 2 };\n" @@ -1201,7 +1198,7 @@ class TestBool : public TestFixture { "void f(bool v) {\n" " if (v == N::H) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } @@ -1209,76 +1206,76 @@ class TestBool : public TestFixture { check("void f(char *p) {\n" " if (p+1){}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (error) Converting pointer arithmetic result to bool. The bool is always true unless there is undefined behaviour.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (error) Converting pointer arithmetic result to bool. The bool is always true unless there is undefined behaviour.\n", errout_str()); check("void f(char *p) {\n" " do {} while (p+1);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (error) Converting pointer arithmetic result to bool. The bool is always true unless there is undefined behaviour.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (error) Converting pointer arithmetic result to bool. The bool is always true unless there is undefined behaviour.\n", errout_str()); check("void f(char *p) {\n" " while (p-1) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (error) Converting pointer arithmetic result to bool. The bool is always true unless there is undefined behaviour.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (error) Converting pointer arithmetic result to bool. The bool is always true unless there is undefined behaviour.\n", errout_str()); check("void f(char *p) {\n" " for (int i = 0; p+1; i++) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (error) Converting pointer arithmetic result to bool. The bool is always true unless there is undefined behaviour.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (error) Converting pointer arithmetic result to bool. The bool is always true unless there is undefined behaviour.\n", errout_str()); check("void f(char *p) {\n" " if (p && p+1){}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (error) Converting pointer arithmetic result to bool. The bool is always true unless there is undefined behaviour.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (error) Converting pointer arithmetic result to bool. The bool is always true unless there is undefined behaviour.\n", errout_str()); check("void f(char *p) {\n" " if (p+2 || p) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (error) Converting pointer arithmetic result to bool. The bool is always true unless there is undefined behaviour.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (error) Converting pointer arithmetic result to bool. The bool is always true unless there is undefined behaviour.\n", errout_str()); } void returnNonBool() { check("bool f(void) {\n" " return 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool f(void) {\n" " return 1;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool f(void) {\n" " return 2;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Non-boolean value returned from function returning bool\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Non-boolean value returned from function returning bool\n", errout_str()); check("bool f(void) {\n" " return -1;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Non-boolean value returned from function returning bool\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Non-boolean value returned from function returning bool\n", errout_str()); check("bool f(void) {\n" " return 1 + 1;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Non-boolean value returned from function returning bool\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Non-boolean value returned from function returning bool\n", errout_str()); check("bool f(void) {\n" " int x = 0;\n" " return x;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool f(void) {\n" " int x = 10;\n" " return x;\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Non-boolean value returned from function returning bool\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Non-boolean value returned from function returning bool\n", errout_str()); check("bool f(void) {\n" " return 2 < 1;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool f(void) {\n" " int ret = 0;\n" @@ -1286,7 +1283,7 @@ class TestBool : public TestFixture { " ret = 1;\n" " return ret;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool f(void) {\n" " int ret = 0;\n" @@ -1294,7 +1291,7 @@ class TestBool : public TestFixture { " ret = 3;\n" " return ret;\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (style) Non-boolean value returned from function returning bool\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (style) Non-boolean value returned from function returning bool\n", errout_str()); check("bool f(void) {\n" " if (a)\n" @@ -1302,12 +1299,12 @@ class TestBool : public TestFixture { " return 4;\n" "}"); ASSERT_EQUALS("[test.cpp:3]: (style) Non-boolean value returned from function returning bool\n" - "[test.cpp:4]: (style) Non-boolean value returned from function returning bool\n", errout.str()); + "[test.cpp:4]: (style) Non-boolean value returned from function returning bool\n", errout_str()); check("bool f(void) {\n" " return;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void returnNonBoolLambda() { @@ -1315,42 +1312,42 @@ class TestBool : public TestFixture { " auto x = [](void) { return -1; };\n" " return false;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool f(void) {\n" " auto x = [](void) { return -1; };\n" " return 2;\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Non-boolean value returned from function returning bool\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Non-boolean value returned from function returning bool\n", errout_str()); check("bool f(void) {\n" " auto x = [](void) -> int { return -1; };\n" " return false;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool f(void) {\n" " auto x = [](void) -> int { return -1; };\n" " return 2;\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Non-boolean value returned from function returning bool\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Non-boolean value returned from function returning bool\n", errout_str()); } void returnNonBoolLogicalOp() { check("bool f(int x) {\n" " return x & 0x4;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool f(int x, int y) {\n" " return x | y;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool f(int x) {\n" " return (x & 0x2);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void returnNonBoolClass() { @@ -1358,7 +1355,7 @@ class TestBool : public TestFixture { " public:\n" " bool f() { return -1;}\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Non-boolean value returned from function returning bool\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Non-boolean value returned from function returning bool\n", errout_str()); check("bool f() {\n" " struct X {\n" @@ -1367,7 +1364,7 @@ class TestBool : public TestFixture { " };\n" " return false;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool f() {\n" " class X {\n" @@ -1376,7 +1373,7 @@ class TestBool : public TestFixture { " };\n" " return false;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool f() {\n" " class X {\n" @@ -1386,7 +1383,7 @@ class TestBool : public TestFixture { " return -1;\n" "}"); ASSERT_EQUALS("[test.cpp:6]: (style) Non-boolean value returned from function returning bool\n" - "[test.cpp:4]: (style) Non-boolean value returned from function returning bool\n", errout.str()); + "[test.cpp:4]: (style) Non-boolean value returned from function returning bool\n", errout_str()); } }; diff --git a/test/testboost.cpp b/test/testboost.cpp index 702f88c6808e..af09069eb706 100644 --- a/test/testboost.cpp +++ b/test/testboost.cpp @@ -38,9 +38,6 @@ class TestBoost : public TestFixture { #define check(code) check_(code, __FILE__, __LINE__) void check_(const char code[], const char* file, int line) { - // Clear the error buffer.. - errout.str(""); - // Tokenize.. Tokenizer tokenizer(settings, this); std::istringstream istr(code); @@ -57,7 +54,7 @@ class TestBoost : public TestFixture { " data.push_back(123);\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) BOOST_FOREACH caches the end() iterator. It's undefined behavior if you modify the container inside.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) BOOST_FOREACH caches the end() iterator. It's undefined behavior if you modify the container inside.\n", errout_str()); check("void f() {\n" " set data;\n" @@ -65,7 +62,7 @@ class TestBoost : public TestFixture { " data.insert(123);\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) BOOST_FOREACH caches the end() iterator. It's undefined behavior if you modify the container inside.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) BOOST_FOREACH caches the end() iterator. It's undefined behavior if you modify the container inside.\n", errout_str()); check("void f() {\n" " set data;\n" @@ -73,7 +70,7 @@ class TestBoost : public TestFixture { " data.erase(123);\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) BOOST_FOREACH caches the end() iterator. It's undefined behavior if you modify the container inside.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) BOOST_FOREACH caches the end() iterator. It's undefined behavior if you modify the container inside.\n", errout_str()); // Check single line usage check("void f() {\n" @@ -81,14 +78,14 @@ class TestBoost : public TestFixture { " BOOST_FOREACH(const int &i, data)\n" " data.clear();\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) BOOST_FOREACH caches the end() iterator. It's undefined behavior if you modify the container inside.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) BOOST_FOREACH caches the end() iterator. It's undefined behavior if you modify the container inside.\n", errout_str()); // Container returned as result of a function -> Be quiet check("void f() {\n" " BOOST_FOREACH(const int &i, get_data())\n" " data.insert(i);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Break after modification (#4788) check("void f() {\n" @@ -98,7 +95,7 @@ class TestBoost : public TestFixture { " break;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } }; diff --git a/test/testbufferoverrun.cpp b/test/testbufferoverrun.cpp index b487c39b08c5..0160c0849424 100644 --- a/test/testbufferoverrun.cpp +++ b/test/testbufferoverrun.cpp @@ -42,9 +42,6 @@ class TestBufferOverrun : public TestFixture { #define check(...) check_(__FILE__, __LINE__, __VA_ARGS__) void check_(const char* file, int line, const char code[], const char filename[] = "test.cpp") { - // Clear the error buffer.. - errout.str(""); - const Settings settings = settingsBuilder(settings0).certainty(Certainty::inconclusive).build(); // Tokenize.. @@ -61,9 +58,6 @@ class TestBufferOverrun : public TestFixture { std::istringstream istr(code); ASSERT_LOC(tokenizer.tokenize(istr, filename), file, line); - // Clear the error buffer.. - errout.str(""); - // Check for buffer overruns.. runChecks(tokenizer, this); } @@ -71,9 +65,6 @@ class TestBufferOverrun : public TestFixture { #define checkP(...) checkP_(__FILE__, __LINE__, __VA_ARGS__) void checkP_(const char* file, int line, const char code[], const char* filename = "test.cpp") { - // Clear the error buffer.. - errout.str(""); - const Settings settings = settingsBuilder(settings0).severity(Severity::performance) .c(Standards::CLatest).cpp(Standards::CPPLatest).certainty(Certainty::inconclusive).build(); @@ -325,7 +316,7 @@ class TestBufferOverrun : public TestFixture { " char str[50];\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } @@ -347,7 +338,7 @@ class TestBufferOverrun : public TestFixture { "{\n" " strcpy(buf, str);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } @@ -358,7 +349,7 @@ class TestBufferOverrun : public TestFixture { " char data[1];\n" " return abc.data[1];\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } @@ -368,7 +359,7 @@ class TestBufferOverrun : public TestFixture { " char data[100];\n" " const char *p = data + 100;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void sizeof3() { @@ -380,7 +371,7 @@ class TestBufferOverrun : public TestFixture { " struct group *gr;\n" " snprintf(group, 32, \"%u\", gr->gr_gid);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void array_index_1() { @@ -390,14 +381,14 @@ class TestBufferOverrun : public TestFixture { " str[15] = 0;\n" " str[16] = 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (error) Array 'str[16]' accessed at index 16, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Array 'str[16]' accessed at index 16, which is out of bounds.\n", errout_str()); check("char f()\n" "{\n" " char str[16] = {0};\n" " return str[16];\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Array 'str[16]' accessed at index 16, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Array 'str[16]' accessed at index 16, which is out of bounds.\n", errout_str()); // test stack array check("int f()\n" @@ -407,7 +398,7 @@ class TestBufferOverrun : public TestFixture { " y = x[ 4 ];\n" " return y;\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (error) Array 'x[3]' accessed at index 4, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Array 'x[3]' accessed at index 4, which is out of bounds.\n", errout_str()); check("int f()\n" "{\n" @@ -416,15 +407,15 @@ class TestBufferOverrun : public TestFixture { " y = x[ 2 ];\n" " return y;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int x[5] = {0};\n" "int a = x[10];"); - ASSERT_EQUALS("[test.cpp:2]: (error) Array 'x[5]' accessed at index 10, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (error) Array 'x[5]' accessed at index 10, which is out of bounds.\n", errout_str()); check("int x[5] = {0};\n" "int a = (x)[10];"); - ASSERT_EQUALS("[test.cpp:2]: (error) Array 'x[5]' accessed at index 10, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (error) Array 'x[5]' accessed at index 10, which is out of bounds.\n", errout_str()); } @@ -435,21 +426,21 @@ class TestBufferOverrun : public TestFixture { " str[i] = 0;\n" "}\n" "void b() { a(16); }"); - ASSERT_EQUALS("[test.cpp:4]: (error) Array 'str[16]' accessed at index 16, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Array 'str[16]' accessed at index 16, which is out of bounds.\n", errout_str()); } void array_index_4() { check("char c = \"abc\"[4];"); - ASSERT_EQUALS("[test.cpp:1]: (error) Array '\"abc\"[4]' accessed at index 4, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (error) Array '\"abc\"[4]' accessed at index 4, which is out of bounds.\n", errout_str()); check("p = &\"abc\"[4];"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("char c = \"\\0abc\"[2];"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("char c = L\"abc\"[4];"); - ASSERT_EQUALS("[test.cpp:1]: (error) Array 'L\"abc\"[4]' accessed at index 4, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (error) Array 'L\"abc\"[4]' accessed at index 4, which is out of bounds.\n", errout_str()); } void array_index_3() { @@ -460,7 +451,7 @@ class TestBufferOverrun : public TestFixture { " for (i = 0; i < 100; i++)\n" " sum += val[i];\n" "}"); - ASSERT_EQUALS("[test.cpp:6]: (error) Array 'val[50]' accessed at index 99, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (error) Array 'val[50]' accessed at index 99, which is out of bounds.\n", errout_str()); check("void f()\n" "{\n" @@ -469,7 +460,7 @@ class TestBufferOverrun : public TestFixture { " for (i = 1; i < 100; i++)\n" " sum += val[i];\n" "}"); - ASSERT_EQUALS("[test.cpp:6]: (error) Array 'val[50]' accessed at index 99, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (error) Array 'val[50]' accessed at index 99, which is out of bounds.\n", errout_str()); check("void f(int a)\n" "{\n" @@ -478,7 +469,7 @@ class TestBufferOverrun : public TestFixture { " for (i = a; i < 100; i++)\n" " sum += val[i];\n" "}"); - ASSERT_EQUALS("[test.cpp:6]: (error) Array 'val[50]' accessed at index 99, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (error) Array 'val[50]' accessed at index 99, which is out of bounds.\n", errout_str()); check("typedef struct g g2[3];\n" "void foo(char *a)\n" @@ -488,21 +479,21 @@ class TestBufferOverrun : public TestFixture { " a[i]=0;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(int argc)\n" "{\n" " char a[2];\n" " for (int i = 4; i < argc; i++){}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(int a[10]) {\n" " for (int i=0;i<50;++i) {\n" " a[i] = 0;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Array 'a[10]' accessed at index 49, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Array 'a[10]' accessed at index 49, which is out of bounds.\n", errout_str()); } void array_index_6() { @@ -516,7 +507,7 @@ class TestBufferOverrun : public TestFixture { " struct ABC abc;\n" " abc.str[10] = 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:9]: (error) Array 'abc.str[10]' accessed at index 10, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:9]: (error) Array 'abc.str[10]' accessed at index 10, which is out of bounds.\n", errout_str()); check("struct ABC\n" "{\n" @@ -528,7 +519,7 @@ class TestBufferOverrun : public TestFixture { " struct ABC abc;\n" " return abc.str[10];\n" "}"); - ASSERT_EQUALS("[test.cpp:9]: (error) Array 'abc.str[10]' accessed at index 10, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:9]: (error) Array 'abc.str[10]' accessed at index 10, which is out of bounds.\n", errout_str()); // This is not out of bounds because it is a variable length array check("struct ABC\n" @@ -541,7 +532,7 @@ class TestBufferOverrun : public TestFixture { " struct ABC* x = malloc(sizeof(struct ABC) + 10);\n" " x->str[1] = 0;" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // This is not out of bounds because it is not a variable length array check("struct ABC\n" @@ -555,7 +546,7 @@ class TestBufferOverrun : public TestFixture { " struct ABC* x = malloc(sizeof(struct ABC) + 10);\n" " x->str[1] = 0;" "}"); - TODO_ASSERT_EQUALS("error", "", errout.str()); + TODO_ASSERT_EQUALS("error", "", errout_str()); // This is not out of bounds because it is a variable length array // and the index is within the memory allocated. @@ -570,7 +561,7 @@ class TestBufferOverrun : public TestFixture { " struct ABC* x = malloc(sizeof(struct ABC) + 10);\n" " x->str[10] = 0;" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // This is out of bounds because it is outside the memory allocated. /** @todo this doesn't work because of a bug in sizeof(struct) */ @@ -584,7 +575,7 @@ class TestBufferOverrun : public TestFixture { " struct ABC* x = malloc(sizeof(struct ABC) + 10);\n" " x->str[11] = 0;" "}"); - TODO_ASSERT_EQUALS("[test.cpp:9]: (error) Array 'str[1]' accessed at index 11, which is out of bounds.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:9]: (error) Array 'str[1]' accessed at index 11, which is out of bounds.\n", "", errout_str()); // This is out of bounds if 'sizeof(ABC)' is 1 (No padding) check("struct ABC\n" @@ -597,7 +588,7 @@ class TestBufferOverrun : public TestFixture { " struct ABC* x = malloc(sizeof(ABC) + 10);\n" " x->str[11] = 0;" "}"); - TODO_ASSERT_EQUALS("error", "", errout.str()); + TODO_ASSERT_EQUALS("error", "", errout_str()); // This is out of bounds because it is outside the memory allocated /** @todo this doesn't work because of a bug in sizeof(struct) */ @@ -611,7 +602,7 @@ class TestBufferOverrun : public TestFixture { " struct ABC* x = malloc(sizeof(struct ABC));\n" " x->str[1] = 0;" "}"); - TODO_ASSERT_EQUALS("[test.cpp:9]: (error) Array 'str[1]' accessed at index 1, which is out of bounds.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:9]: (error) Array 'str[1]' accessed at index 1, which is out of bounds.\n", "", errout_str()); // This is out of bounds because it is outside the memory allocated // But only if 'sizeof(ABC)' is 1 (No padding) @@ -625,7 +616,7 @@ class TestBufferOverrun : public TestFixture { " struct ABC* x = malloc(sizeof(ABC));\n" " x->str[1] = 0;" "}"); - TODO_ASSERT_EQUALS("error", "", errout.str()); + TODO_ASSERT_EQUALS("error", "", errout_str()); // This is out of bounds because it is not a variable array check("struct ABC\n" @@ -638,7 +629,7 @@ class TestBufferOverrun : public TestFixture { " struct ABC x;\n" " x.str[1] = 0;" "}"); - ASSERT_EQUALS("[test.cpp:9]: (error) Array 'x.str[1]' accessed at index 1, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:9]: (error) Array 'x.str[1]' accessed at index 1, which is out of bounds.\n", errout_str()); check("struct foo\n" "{\n" @@ -651,19 +642,19 @@ class TestBufferOverrun : public TestFixture { " for ( unsigned int i = 0; i < 64; ++i )\n" " f.str[i] = 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:10]: (error) Array 'f.str[10]' accessed at index 63, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:10]: (error) Array 'f.str[10]' accessed at index 63, which is out of bounds.\n", errout_str()); check("struct AB { char a[NUM]; char b[NUM]; }\n" "void f(struct AB *ab) {\n" " ab->a[0] = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("union { char a[1]; int b; } ab;\n" "void f() {\n" " ab.a[2] = 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Array 'ab.a[1]' accessed at index 2, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Array 'ab.a[1]' accessed at index 2, which is out of bounds.\n", errout_str()); } @@ -677,7 +668,7 @@ class TestBufferOverrun : public TestFixture { "{\n" " abc->str[10] = 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:8]: (error) Array 'abc->str[10]' accessed at index 10, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8]: (error) Array 'abc->str[10]' accessed at index 10, which is out of bounds.\n", errout_str()); } void array_index_11() { @@ -696,7 +687,7 @@ class TestBufferOverrun : public TestFixture { " abc->str[10] = 0;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:13]: (error) Array 'abc->str[10]' accessed at index 10, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:13]: (error) Array 'abc->str[10]' accessed at index 10, which is out of bounds.\n", errout_str()); } void array_index_12() { @@ -711,7 +702,7 @@ class TestBufferOverrun : public TestFixture { "{\n" " str[10] = 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:10]: (error) Array 'str[10]' accessed at index 10, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:10]: (error) Array 'str[10]' accessed at index 10, which is out of bounds.\n", errout_str()); check("class Fred\n" "{\n" @@ -724,7 +715,7 @@ class TestBufferOverrun : public TestFixture { "{\n" " return str[10];\n" "}"); - ASSERT_EQUALS("[test.cpp:10]: (error) Array 'str[10]' accessed at index 10, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:10]: (error) Array 'str[10]' accessed at index 10, which is out of bounds.\n", errout_str()); } void array_index_13() { @@ -737,7 +728,7 @@ class TestBufferOverrun : public TestFixture { " int x = buf[i];\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void array_index_14() { @@ -747,7 +738,7 @@ class TestBufferOverrun : public TestFixture { " for (int i = 0; i < 10; i++)\n" " a[i+10] = i;\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (error) Array 'a[10]' accessed at index 19, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Array 'a[10]' accessed at index 19, which is out of bounds.\n", errout_str()); } void array_index_15() { @@ -757,7 +748,7 @@ class TestBufferOverrun : public TestFixture { " for (int i = 0; i < 10; i++)\n" " a[10+i] = i;\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (error) Array 'a[10]' accessed at index 19, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Array 'a[10]' accessed at index 19, which is out of bounds.\n", errout_str()); } void array_index_16() { @@ -767,7 +758,7 @@ class TestBufferOverrun : public TestFixture { " for (int i = 0; i < 10; i++)\n" " a[i+1] = i;\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (error) Array 'a[10]' accessed at index 10, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Array 'a[10]' accessed at index 10, which is out of bounds.\n", errout_str()); } void array_index_17() { @@ -777,7 +768,7 @@ class TestBufferOverrun : public TestFixture { " for (int i = 0; i < 10; i++)\n" " a[i*2] = i;\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (error) Array 'a[10]' accessed at index 18, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Array 'a[10]' accessed at index 18, which is out of bounds.\n", errout_str()); check("void f()\n" "{\n" @@ -785,7 +776,7 @@ class TestBufferOverrun : public TestFixture { " for (int i = 0; i < 12; i+=6)\n" " a[i+5] = i;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f()\n" "{\n" @@ -793,21 +784,21 @@ class TestBufferOverrun : public TestFixture { " for (int i = 0; i < 12; i+=6)\n" " a[i+6] = i;\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (error) Array 'a[12]' accessed at index 12, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Array 'a[12]' accessed at index 12, which is out of bounds.\n", errout_str()); check("void f() {\n" // #4398 " int a[2];\n" " for (int i = 0; i < 4; i+=2)\n" " a[i] = 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Array 'a[2]' accessed at index 2, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Array 'a[2]' accessed at index 2, which is out of bounds.\n", errout_str()); check("void f() {\n" // #4398 " int a[2];\n" " for (int i = 0; i < 4; i+=2)\n" " do_stuff(a+i);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void array_index_18() { @@ -820,7 +811,7 @@ class TestBufferOverrun : public TestFixture { " i+=1;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f()\n" "{\n" @@ -831,7 +822,7 @@ class TestBufferOverrun : public TestFixture { " i++;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f()\n" "{\n" @@ -842,7 +833,7 @@ class TestBufferOverrun : public TestFixture { " ++i;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f()\n" "{\n" @@ -853,7 +844,7 @@ class TestBufferOverrun : public TestFixture { " i=4;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:6]: (error) Array 'a[5]' accessed at index 5, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (error) Array 'a[5]' accessed at index 5, which is out of bounds.\n", errout_str()); check("void f()\n" "{\n" @@ -864,7 +855,7 @@ class TestBufferOverrun : public TestFixture { " i+=1;\n" " }\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:6]: (error) Buffer overrun\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:6]: (error) Buffer overrun\n", "", errout_str()); } void array_index_19() { @@ -874,7 +865,7 @@ class TestBufferOverrun : public TestFixture { " char a[2];\n" " char *end = &(a[2]);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Getting more than one past the end is not legal check("void f()\n" @@ -882,7 +873,7 @@ class TestBufferOverrun : public TestFixture { " char a[2];\n" " char *end = &(a[3]);\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Array 'a[2]' accessed at index 3, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Array 'a[2]' accessed at index 3, which is out of bounds.\n", errout_str()); } void array_index_20() { @@ -893,7 +884,7 @@ class TestBufferOverrun : public TestFixture { " for ( int i = 0; i < 9; i++ )\n" " b[i] = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void array_index_21() { @@ -907,7 +898,7 @@ class TestBufferOverrun : public TestFixture { " int b = indices[j];\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void array_index_22() { @@ -915,7 +906,7 @@ class TestBufferOverrun : public TestFixture { " size_t indices[2];\n" " int b = indices[2];\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Array 'indices[2]' accessed at index 2, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Array 'indices[2]' accessed at index 2, which is out of bounds.\n", errout_str()); } void array_index_23() { @@ -924,7 +915,7 @@ class TestBufferOverrun : public TestFixture { " char c[10];\n" " c[1<<23]='a';\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Array 'c[10]' accessed at index 8388608, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Array 'c[10]' accessed at index 8388608, which is out of bounds.\n", errout_str()); } void array_index_24() { @@ -936,7 +927,7 @@ class TestBufferOverrun : public TestFixture { " a[" + charMaxPlusOne + "] = 0;\n" // 128/256 > CHAR_MAX "}\n").c_str()); ASSERT_EQUALS("[test.cpp:3]: (error) Array 'a[" + charMaxPlusOne + "]' accessed at index -1, which is out of bounds.\n" - "[test.cpp:4]: (error) Array 'a[" + charMaxPlusOne + "]' accessed at index " + charMaxPlusOne + ", which is out of bounds.\n", errout.str()); + "[test.cpp:4]: (error) Array 'a[" + charMaxPlusOne + "]' accessed at index " + charMaxPlusOne + ", which is out of bounds.\n", errout_str()); check("void f(signed char n) {\n" " int a[n];\n" // n <= SCHAR_MAX @@ -944,7 +935,7 @@ class TestBufferOverrun : public TestFixture { " a[128] = 0;\n" // 128 > SCHAR_MAX "}"); ASSERT_EQUALS("[test.cpp:3]: (error) Array 'a[128]' accessed at index -1, which is out of bounds.\n" - "[test.cpp:4]: (error) Array 'a[128]' accessed at index 128, which is out of bounds.\n", errout.str()); + "[test.cpp:4]: (error) Array 'a[128]' accessed at index 128, which is out of bounds.\n", errout_str()); check("void f(unsigned char n) {\n" " int a[n];\n" // n <= UCHAR_MAX @@ -952,7 +943,7 @@ class TestBufferOverrun : public TestFixture { " a[256] = 0;\n" // 256 > UCHAR_MAX "}"); ASSERT_EQUALS("[test.cpp:3]: (error) Array 'a[256]' accessed at index -1, which is out of bounds.\n" - "[test.cpp:4]: (error) Array 'a[256]' accessed at index 256, which is out of bounds.\n", errout.str()); + "[test.cpp:4]: (error) Array 'a[256]' accessed at index 256, which is out of bounds.\n", errout_str()); check("void f(short n) {\n" " int a[n];\n" // n <= SHRT_MAX @@ -960,7 +951,7 @@ class TestBufferOverrun : public TestFixture { " a[32768] = 0;\n" // 32768 > SHRT_MAX "}"); ASSERT_EQUALS("[test.cpp:3]: (error) Array 'a[32768]' accessed at index -1, which is out of bounds.\n" - "[test.cpp:4]: (error) Array 'a[32768]' accessed at index 32768, which is out of bounds.\n", errout.str()); + "[test.cpp:4]: (error) Array 'a[32768]' accessed at index 32768, which is out of bounds.\n", errout_str()); check("void f(unsigned short n) {\n" " int a[n];\n" // n <= USHRT_MAX @@ -968,7 +959,7 @@ class TestBufferOverrun : public TestFixture { " a[65536] = 0;\n" // 65536 > USHRT_MAX "}"); ASSERT_EQUALS("[test.cpp:3]: (error) Array 'a[65536]' accessed at index -1, which is out of bounds.\n" - "[test.cpp:4]: (error) Array 'a[65536]' accessed at index 65536, which is out of bounds.\n", errout.str()); + "[test.cpp:4]: (error) Array 'a[65536]' accessed at index 65536, which is out of bounds.\n", errout_str()); check("void f(signed short n) {\n" " int a[n];\n" // n <= SHRT_MAX @@ -976,25 +967,25 @@ class TestBufferOverrun : public TestFixture { " a[32768] = 0;\n" // 32768 > SHRT_MAX "}"); ASSERT_EQUALS("[test.cpp:3]: (error) Array 'a[32768]' accessed at index -1, which is out of bounds.\n" - "[test.cpp:4]: (error) Array 'a[32768]' accessed at index 32768, which is out of bounds.\n", errout.str()); + "[test.cpp:4]: (error) Array 'a[32768]' accessed at index 32768, which is out of bounds.\n", errout_str()); check("void f(int n) {\n" " int a[n];\n" // n <= INT_MAX " a[-1] = 0;\n" // negative index "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Array 'a[2147483648]' accessed at index -1, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Array 'a[2147483648]' accessed at index -1, which is out of bounds.\n", errout_str()); check("void f(unsigned int n) {\n" " int a[n];\n" // n <= UINT_MAX " a[-1] = 0;\n" // negative index "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Array 'a[4294967296]' accessed at index -1, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Array 'a[4294967296]' accessed at index -1, which is out of bounds.\n", errout_str()); check("void f(signed int n) {\n" " int a[n];\n" // n <= INT_MAX " a[-1] = 0;\n" // negative index "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Array 'a[2147483648]' accessed at index -1, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Array 'a[2147483648]' accessed at index -1, which is out of bounds.\n", errout_str()); } void array_index_25() { // #1536 @@ -1002,7 +993,7 @@ class TestBufferOverrun : public TestFixture { "{\n" " long l[SOME_SIZE];\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void array_index_26() { @@ -1012,7 +1003,7 @@ class TestBufferOverrun : public TestFixture { " for (int i = 3; 0 <= i; i--)\n" " a[i] = i;\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (error) Array 'a[3]' accessed at index 3, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Array 'a[3]' accessed at index 3, which is out of bounds.\n", errout_str()); check("void f()\n" "{\n" @@ -1020,7 +1011,7 @@ class TestBufferOverrun : public TestFixture { " for (int i = 3; 0 <= i; i--)\n" " a[i] = i;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void array_index_27() { @@ -1030,7 +1021,7 @@ class TestBufferOverrun : public TestFixture { " for (int i = 0; i < 10; i++)\n" " a[i-1] = a[i];\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (error) Array 'a[10]' accessed at index -1, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Array 'a[10]' accessed at index -1, which is out of bounds.\n", errout_str()); } void array_index_28() { @@ -1041,7 +1032,7 @@ class TestBufferOverrun : public TestFixture { " int *ip = i + 1;\n" " ip[-10] = 1;\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:5]: (error) Array ip[-10] out of bounds.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:5]: (error) Array ip[-10] out of bounds.\n", "", errout_str()); } void array_index_29() { @@ -1053,7 +1044,7 @@ class TestBufferOverrun : public TestFixture { " int *ii = i + -5;" " ii[10] = 0;" "}"); - TODO_ASSERT_EQUALS("[test.cpp:6]: (error) Array ii[10] out of bounds.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:6]: (error) Array ii[10] out of bounds.\n", "", errout_str()); } void array_index_30() { @@ -1063,7 +1054,7 @@ class TestBufferOverrun : public TestFixture { " UINT8 x[2];\n" " x[5] = 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Array 'x[2]' accessed at index 5, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Array 'x[2]' accessed at index 5, which is out of bounds.\n", errout_str()); } void array_index_31() { @@ -1080,7 +1071,7 @@ class TestBufferOverrun : public TestFixture { " struct s1 obj;\n" " x(obj.delay, 123);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct s1 {\n" " unknown_type_t delay[3];\n" @@ -1096,7 +1087,7 @@ class TestBufferOverrun : public TestFixture { "}"); TODO_ASSERT_EQUALS("[test.cpp:11] -> [test.cpp:6]: (error) Array 'obj.delay[3]' accessed at index 4, which is out of bounds.\n", "", - errout.str()); + errout_str()); check("struct s1 {\n" " float a[0];\n" @@ -1105,7 +1096,7 @@ class TestBufferOverrun : public TestFixture { "void f() {\n" " struct s1 *obj;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void array_index_32() { @@ -1119,14 +1110,14 @@ class TestBufferOverrun : public TestFixture { " }\n" " int m_x[1];\n" "};"); - ASSERT_EQUALS("[test.cpp:7]: (error) Array 'm_x[1]' accessed at index 1, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (error) Array 'm_x[1]' accessed at index 1, which is out of bounds.\n", errout_str()); } void array_index_33() { check("void foo(char bar[][4]) {\n" " baz(bar[5]);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void array_index_34() { // ticket #3063 @@ -1136,7 +1127,7 @@ class TestBufferOverrun : public TestFixture { " y[0][0][2] = 0;\n" "}"); ASSERT_EQUALS("[test.cpp:3]: (error) Array 'y[2][2][2]' accessed at index y[0][2][0], which is out of bounds.\n" - "[test.cpp:4]: (error) Array 'y[2][2][2]' accessed at index y[0][0][2], which is out of bounds.\n", errout.str()); + "[test.cpp:4]: (error) Array 'y[2][2][2]' accessed at index y[0][0][2], which is out of bounds.\n", errout_str()); check("struct TEST\n" "{\n" @@ -1160,7 +1151,7 @@ class TestBufferOverrun : public TestFixture { "[test.cpp:11]: (error) Array 'test.b[10][5]' accessed at index test.b[0][19], which is out of bounds.\n" "[test.cpp:14]: (error) Array 'ptest->a[10]' accessed at index 10, which is out of bounds.\n" "[test.cpp:15]: (error) Array 'ptest->b[10][5]' accessed at index ptest->b[10][2], which is out of bounds.\n" - "[test.cpp:16]: (error) Array 'ptest->b[10][5]' accessed at index ptest->b[0][19], which is out of bounds.\n", errout.str()); + "[test.cpp:16]: (error) Array 'ptest->b[10][5]' accessed at index ptest->b[0][19], which is out of bounds.\n", errout_str()); check("struct TEST\n" "{\n" @@ -1179,7 +1170,7 @@ class TestBufferOverrun : public TestFixture { ASSERT_EQUALS("[test.cpp:8]: (error) Array 'test.a[10][5]' accessed at index test.a[9][5], which is out of bounds.\n" "[test.cpp:9]: (error) Array 'test.a[10][5]' accessed at index test.a[0][50], which is out of bounds.\n" "[test.cpp:12]: (error) Array 'ptest->a[10][5]' accessed at index ptest->a[9][5], which is out of bounds.\n" - "[test.cpp:13]: (error) Array 'ptest->a[10][5]' accessed at index ptest->a[0][50], which is out of bounds.\n", errout.str()); + "[test.cpp:13]: (error) Array 'ptest->a[10][5]' accessed at index ptest->a[0][50], which is out of bounds.\n", errout_str()); } void array_index_35() { // ticket #2889 @@ -1187,21 +1178,21 @@ class TestBufferOverrun : public TestFixture { " struct Struct { unsigned m_Var[1]; } s;\n" " s.m_Var[1] = 1;\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Array 's.m_Var[1]' accessed at index 1, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Array 's.m_Var[1]' accessed at index 1, which is out of bounds.\n", errout_str()); check("struct Struct { unsigned m_Var[1]; };\n" "void f() {\n" " struct Struct s;\n" " s.m_Var[1] = 1;\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Array 's.m_Var[1]' accessed at index 1, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Array 's.m_Var[1]' accessed at index 1, which is out of bounds.\n", errout_str()); check("struct Struct { unsigned m_Var[1]; };\n" "void f() {\n" " struct Struct * s = calloc(40);\n" " s->m_Var[1] = 1;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void array_index_36() { // ticket #2960 @@ -1214,7 +1205,7 @@ class TestBufferOverrun : public TestFixture { " m_b[2] = rhs.m_b[2];\n" "}"); ASSERT_EQUALS("[test.cpp:7]: (error) Array 'm_b[2]' accessed at index 2, which is out of bounds.\n" - "[test.cpp:7]: (error) Array 'rhs.m_b[2]' accessed at index 2, which is out of bounds.\n", errout.str()); + "[test.cpp:7]: (error) Array 'rhs.m_b[2]' accessed at index 2, which is out of bounds.\n", errout_str()); } void array_index_37() { @@ -1225,7 +1216,7 @@ class TestBufferOverrun : public TestFixture { " i;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void array_index_38() { //ticket #3273 @@ -1244,7 +1235,7 @@ class TestBufferOverrun : public TestFixture { " }\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void array_index_39() { // ticket 3387 @@ -1253,7 +1244,7 @@ class TestBufferOverrun : public TestFixture { " char a[10];\n" " a[10] = 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Array 'a[10]' accessed at index 10, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Array 'a[10]' accessed at index 10, which is out of bounds.\n", errout_str()); } void array_index_40() { @@ -1262,7 +1253,7 @@ class TestBufferOverrun : public TestFixture { " for (int i = 0; i < 10; ++i)\n" " f2(&a[i + 1]);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void array_index_41() { @@ -1275,7 +1266,7 @@ class TestBufferOverrun : public TestFixture { "void b() {\n" " struct Fred { char data[3]; } fred;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void a() {\n" " struct Fred { char data[6]; } fred;\n" @@ -1286,7 +1277,7 @@ class TestBufferOverrun : public TestFixture { " struct Fred { char data[3]; } fred;\n" " fred.data[4] = 0;\n" // <- error "}"); - ASSERT_EQUALS("[test.cpp:8]: (error) Array 'fred.data[3]' accessed at index 4, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8]: (error) Array 'fred.data[3]' accessed at index 4, which is out of bounds.\n", errout_str()); } void array_index_42() { // ticket #3569 @@ -1297,7 +1288,7 @@ class TestBufferOverrun : public TestFixture { " p[10] = 7;\n" " free(p);\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Array 'p[10]' accessed at index 10, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Array 'p[10]' accessed at index 10, which is out of bounds.\n", errout_str()); check("void f()\n" "{\n" @@ -1305,7 +1296,7 @@ class TestBufferOverrun : public TestFixture { " p[10] = 7;\n" " free(p);\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Array 'p[10]' accessed at index 10, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Array 'p[10]' accessed at index 10, which is out of bounds.\n", errout_str()); check("void f()\n" "{\n" @@ -1314,7 +1305,7 @@ class TestBufferOverrun : public TestFixture { " p[9] = 9;\n" " free(p);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f()\n" "{\n" @@ -1323,7 +1314,7 @@ class TestBufferOverrun : public TestFixture { " p[9] = 9;\n" " delete [] p;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f()\n" "{\n" @@ -1332,7 +1323,7 @@ class TestBufferOverrun : public TestFixture { " p[9] = 9;\n" " delete [] p;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f()\n" "{\n" @@ -1347,7 +1338,7 @@ class TestBufferOverrun : public TestFixture { " p[9] = 9;\n" " delete [] p;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void array_index_43() { // #3838 @@ -1364,7 +1355,7 @@ class TestBufferOverrun : public TestFixture { " y = var[ 0 ].arr[ 3 ];\n" // <-- array access out of bounds " return y;\n" "}"); - ASSERT_EQUALS("[test.cpp:10]: (error) Array 'var[0].arr[3]' accessed at index 3, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:10]: (error) Array 'var[0].arr[3]' accessed at index 3, which is out of bounds.\n", errout_str()); check("int f( )\n" "{\n" @@ -1378,7 +1369,7 @@ class TestBufferOverrun : public TestFixture { " y = var[ 0 ].arr[ 2 ];\n" " return y;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f( ){\n" @@ -1395,7 +1386,7 @@ class TestBufferOverrun : public TestFixture { "return y;\n" "}"); ASSERT_EQUALS("[test.cpp:10]: (error) Array 'var.arr[3]' accessed at index 3, which is out of bounds.\n" - "[test.cpp:11]: (error) Array 'var.arr[3]' accessed at index 3, which is out of bounds.\n", errout.str()); + "[test.cpp:11]: (error) Array 'var.arr[3]' accessed at index 3, which is out of bounds.\n", errout_str()); check("void f( ) {\n" @@ -1408,7 +1399,7 @@ class TestBufferOverrun : public TestFixture { "var[0].var[ 2 ] = 2;\n" "var[0].var[ 4 ] = 4;\n" // <-- array access out of bounds "}"); - ASSERT_EQUALS("[test.cpp:9]: (error) Array 'var[0].var[3]' accessed at index 4, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:9]: (error) Array 'var[0].var[3]' accessed at index 4, which is out of bounds.\n", errout_str()); check("void f( ) {\n" "struct S{\n" @@ -1419,7 +1410,7 @@ class TestBufferOverrun : public TestFixture { "var[0].var[ 1 ] = 1;\n" "var[0].var[ 2 ] = 2;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // avoid FPs (modified examples taken from #3838) check("struct AB { int a[10]; int b[10]; };\n" @@ -1428,7 +1419,7 @@ class TestBufferOverrun : public TestFixture { " int * p = &ab.a[10];\n" " return 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct AB { int a[10]; int b[10]; };\n" "int main() {\n" @@ -1436,7 +1427,7 @@ class TestBufferOverrun : public TestFixture { " int * p = &ab[0].a[10];\n" " return 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct AB { int a[10]; int b[10]; };\n" "int main() {\n" @@ -1444,7 +1435,7 @@ class TestBufferOverrun : public TestFixture { " int * p = &ab[10].a[0];\n" " return 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Array 'ab[1]' accessed at index 10, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Array 'ab[1]' accessed at index 10, which is out of bounds.\n", errout_str()); } void array_index_44() { // #3979 (false positive) @@ -1458,7 +1449,7 @@ class TestBufferOverrun : public TestFixture { " buf[i] = 1;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f()\n" "{\n" @@ -1468,7 +1459,7 @@ class TestBufferOverrun : public TestFixture { " buf[i] = 2.;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void array_index_45() { // #4207 - handling of function with variable number of parameters / unnamed arguments @@ -1481,7 +1472,7 @@ class TestBufferOverrun : public TestFixture { " CHAR buffer[1024];\n" " f(\"%s\", buffer);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Unnamed argument check("void f(char *) {\n" @@ -1491,7 +1482,7 @@ class TestBufferOverrun : public TestFixture { " char buffer[1024];\n" " f(buffer);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } // Two statement for-loop @@ -1503,7 +1494,7 @@ class TestBufferOverrun : public TestFixture { " printf(\"files(%i): %s\", 3-i, buffer[3-i]);\n" " }\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:4]: (error) Array 'buffer[3]' accessed at index 3, which is out of bounds.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:4]: (error) Array 'buffer[3]' accessed at index 3, which is out of bounds.\n", "", errout_str()); check("void f() {\n" " int buffer[9];\n" @@ -1512,7 +1503,7 @@ class TestBufferOverrun : public TestFixture { " buffer[i] = i;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (error) Array 'buffer[9]' accessed at index 9, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Array 'buffer[9]' accessed at index 9, which is out of bounds.\n", errout_str()); // Correct access limits -> i from 9 to 0 check("void f() {\n" @@ -1521,7 +1512,7 @@ class TestBufferOverrun : public TestFixture { " buffer[i] = i;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void array_index_47() { @@ -1531,7 +1522,7 @@ class TestBufferOverrun : public TestFixture { " for (int i = 2; i < 0; i++)\n" " s[i] = 5;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void array_index_48() { @@ -1544,7 +1535,7 @@ class TestBufferOverrun : public TestFixture { " array[i] = 0;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:6]: (error) Array 'array[4]' accessed at index 4, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (error) Array 'array[4]' accessed at index 4, which is out of bounds.\n", errout_str()); check("void test(void)\n" "{\n" @@ -1554,7 +1545,7 @@ class TestBufferOverrun : public TestFixture { " array[i] = 0;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void array_index_49() { @@ -1568,7 +1559,7 @@ class TestBufferOverrun : public TestFixture { " }\n" " arr[k];\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void array_index_50() { @@ -1580,7 +1571,7 @@ class TestBufferOverrun : public TestFixture { " f(\"12345678\");\n" " f(\"12345\");\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void array_index_51() { @@ -1588,7 +1579,7 @@ class TestBufferOverrun : public TestFixture { " int k=0, dd, d[1U] = {1};\n" " for (dd=d[k]; k<10; dd=d[++k]){;}\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Array 'd[1]' accessed at index 1, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Array 'd[1]' accessed at index 1, which is out of bounds.\n", errout_str()); } void array_index_52() { @@ -1599,7 +1590,7 @@ class TestBufferOverrun : public TestFixture { " buf[i] = 0;\n" " return buf[0];\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (error) Array 'buf[10]' accessed at index 10, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Array 'buf[10]' accessed at index 10, which is out of bounds.\n", errout_str()); } void array_index_53() { @@ -1611,7 +1602,7 @@ class TestBufferOverrun : public TestFixture { " for (int j = 0; j < 3; j++)\n" " M[i][j]=0.0;\n" "}"); - ASSERT_EQUALS("[test.cpp:7]: (error) Array 'M[3][1]' accessed at index M[*][2], which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (error) Array 'M[3][1]' accessed at index M[*][2], which is out of bounds.\n", errout_str()); } void array_index_54() { @@ -1625,7 +1616,7 @@ class TestBufferOverrun : public TestFixture { " b[i+1] = 0;\n" " }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void array_index_55() { @@ -1642,7 +1633,7 @@ class TestBufferOverrun : public TestFixture { "void f2() {\n" " make(\"false\");\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void array_index_56() { @@ -1654,7 +1645,7 @@ class TestBufferOverrun : public TestFixture { " foo.array[foo.index++] = 1;\n" " if (foo.index == 1) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void array_index_57() { @@ -1668,7 +1659,7 @@ class TestBufferOverrun : public TestFixture { " x = c;\n" " }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(std::vector& v) {\n" " int a[3] = { 1, 2, 3 };\n" @@ -1682,7 +1673,7 @@ class TestBufferOverrun : public TestFixture { "}\n"); ASSERT_EQUALS( "[test.cpp:6] -> [test.cpp:5]: (warning) Either the condition 'i==4' is redundant or the array 'a[3]' is accessed at index 3, which is out of bounds.\n", - errout.str()); + errout_str()); } void array_index_58() @@ -1697,7 +1688,7 @@ class TestBufferOverrun : public TestFixture { "}\n"); ASSERT_EQUALS( "[test.cpp:3] -> [test.cpp:6]: (warning) Either the condition 'x<2' is redundant or the array 'a[3]' is accessed at index 3, which is out of bounds.\n", - errout.str()); + errout_str()); check("void f() {\n" // #2199 " char a[5];\n" @@ -1715,7 +1706,7 @@ class TestBufferOverrun : public TestFixture { ASSERT_EQUALS( "[test.cpp:5]: (error) Array 'a[5]' accessed at index 8, which is out of bounds.\n" "[test.cpp:11]: (error) Array 'a[5]' accessed at index 11, which is out of bounds.\n", - errout.str()); + errout_str()); } void array_index_59() // #10413 @@ -1727,7 +1718,7 @@ class TestBufferOverrun : public TestFixture { " return 0;\n" " return a[b];\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int a, int b) {\n" " const int S[2] = {};\n" @@ -1737,13 +1728,13 @@ class TestBufferOverrun : public TestFixture { " else if (S[b] > S[a]) {}\n" " }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int a[2] = {};\n" "void f(int i) {\n" " g(i < 0 ? 0 : a[i]);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void array_index_60() @@ -1756,7 +1747,7 @@ class TestBufferOverrun : public TestFixture { " i = A[i];\n" " return i;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkP("#define ASSERT(expression, action) if (expression) {action;}\n" "int array[5];\n" @@ -1766,7 +1757,7 @@ class TestBufferOverrun : public TestFixture { "}\n"); ASSERT_EQUALS( "[test.cpp:4] -> [test.cpp:5]: (warning) Either the condition 'index>5' is redundant or the array 'array[5]' is accessed at index 5, which is out of bounds.\n", - errout.str()); + errout_str()); } void array_index_61() @@ -1779,7 +1770,7 @@ class TestBufferOverrun : public TestFixture { " return 0; \n" " return M[i];\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S { enum E { e0 }; };\n" "const S::E M[4] = { S::E:e0, S::E:e0, S::E:e0, S::E:e0 };\n" @@ -1790,7 +1781,7 @@ class TestBufferOverrun : public TestFixture { " return 0;\n" " return M[i]; \n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void array_index_62() @@ -1805,7 +1796,7 @@ class TestBufferOverrun : public TestFixture { " return buf[0];\n" "}\n"); ASSERT_EQUALS("[test.cpp:7]: (error) Array 'buf[10]' accessed at index 10, which is out of bounds.\n", - errout.str()); + errout_str()); } void array_index_63() @@ -1817,7 +1808,7 @@ class TestBufferOverrun : public TestFixture { " if (i >= 0 && i < sizeof(b) / sizeof((b)[0]))\n" " b[i] = 0;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void array_index_64() // #10878 @@ -1830,7 +1821,7 @@ class TestBufferOverrun : public TestFixture { " Array array = {};\n" " array.accessArrayRef(10);\n" "}\n"); - ASSERT_EQUALS("[test.cpp:3]: (error) Array 'x[10]' accessed at index 10, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Array 'x[10]' accessed at index 10, which is out of bounds.\n", errout_str()); check("int i = 10;\n" "struct Array {\n" @@ -1841,7 +1832,7 @@ class TestBufferOverrun : public TestFixture { " Array array = {};\n" " array.accessArrayRef(i);\n" "}\n"); - TODO_ASSERT_EQUALS("[test.cpp:3]: (error) Array 'x[10]' accessed at index 10, which is out of bounds.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:3]: (error) Array 'x[10]' accessed at index 10, which is out of bounds.\n", "", errout_str()); } void array_index_65() // #11066 @@ -1853,7 +1844,7 @@ class TestBufferOverrun : public TestFixture { " for (j = 0; j < 2; j++)\n" " c[j] = f[P[j] - 1];\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void array_index_66() @@ -1867,7 +1858,7 @@ class TestBufferOverrun : public TestFixture { "}\n"); ASSERT_EQUALS( "[test.cpp:4] -> [test.cpp:5]: (warning) Either the condition 'j>=256' is redundant or the array 'offsets[256]' is accessed at index 256, which is out of bounds.\n", - errout.str()); + errout_str()); } void array_index_67() { @@ -1886,7 +1877,7 @@ class TestBufferOverrun : public TestFixture { " type_cnt++;\n" " }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void array_index_68() { // #6655 @@ -1899,7 +1890,7 @@ class TestBufferOverrun : public TestFixture { " f(20);\n" " return 0;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:4]: (error) Array 'ia[10]' accessed at index 19, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Array 'ia[10]' accessed at index 19, which is out of bounds.\n", errout_str()); } // #6370 @@ -1911,7 +1902,7 @@ class TestBufferOverrun : public TestFixture { " for(int i = 0; i < 4; ++i)\n" " a[e[i]] = 0;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:5]: (error) Array 'a[4]' accessed at index 30, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Array 'a[4]' accessed at index 30, which is out of bounds.\n", errout_str()); } // #11355 @@ -1920,7 +1911,7 @@ class TestBufferOverrun : public TestFixture { " static const char a[] = ((\"test\"));\n" " printf(\"%c\", a[5]);\n" "}\n"); - ASSERT_EQUALS("[test.cpp:3]: (error) Array 'a[5]' accessed at index 5, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Array 'a[5]' accessed at index 5, which is out of bounds.\n", errout_str()); } // #11461 @@ -1933,7 +1924,7 @@ class TestBufferOverrun : public TestFixture { " int arr[64] = { 0 };\n" " return arr[Idx];\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } // #11784 @@ -1948,7 +1939,7 @@ class TestBufferOverrun : public TestFixture { " }\n" " return d[3];\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } // #11530 @@ -1959,7 +1950,7 @@ class TestBufferOverrun : public TestFixture { " std::function a[1] = {};\n" " a[k++](0);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } // #11088 @@ -1974,7 +1965,7 @@ class TestBufferOverrun : public TestFixture { "void bar() {\n" " foo(\"q\");\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } // #1644 @@ -1986,7 +1977,7 @@ class TestBufferOverrun : public TestFixture { " while (i >= 3)\n" " buf[i--] = 0;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:5]: (error) Array 'buf[10]' accessed at index 10, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Array 'buf[10]' accessed at index 10, which is out of bounds.\n", errout_str()); } void array_index_multidim() { @@ -1995,87 +1986,87 @@ class TestBufferOverrun : public TestFixture { " char a[2][2];\n" " a[1][1] = 'a';\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f()\n" "{\n" " char a[2][2][2];\n" " a[1][1][1] = 'a';\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f()\n" "{\n" " char a[2][2];\n" " a[2][1] = 'a';\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Array 'a[2][2]' accessed at index a[2][1], which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Array 'a[2][2]' accessed at index a[2][1], which is out of bounds.\n", errout_str()); check("void f()\n" "{\n" " char a[2][2];\n" " a[1][2] = 'a';\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Array 'a[2][2]' accessed at index a[1][2], which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Array 'a[2][2]' accessed at index a[1][2], which is out of bounds.\n", errout_str()); check("void f()\n" "{\n" " char a[2][2][2];\n" " a[2][1][1] = 'a';\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Array 'a[2][2][2]' accessed at index a[2][1][1], which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Array 'a[2][2][2]' accessed at index a[2][1][1], which is out of bounds.\n", errout_str()); check("void f()\n" "{\n" " char a[2][2][2];\n" " a[1][2][1] = 'a';\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Array 'a[2][2][2]' accessed at index a[1][2][1], which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Array 'a[2][2][2]' accessed at index a[1][2][1], which is out of bounds.\n", errout_str()); check("void f()\n" "{\n" " char a[2][2][2][2];\n" " a[1][2][1][1] = 'a';\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Array 'a[2][2][2][2]' accessed at index a[1][2][1][1], which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Array 'a[2][2][2][2]' accessed at index a[1][2][1][1], which is out of bounds.\n", errout_str()); check("void f()\n" "{\n" " char a[2][2][2];\n" " a[1][1][2] = 'a';\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Array 'a[2][2][2]' accessed at index a[1][1][2], which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Array 'a[2][2][2]' accessed at index a[1][1][2], which is out of bounds.\n", errout_str()); check("void f()\n" "{\n" " char a[10][10][10];\n" " a[2*3][4*3][2] = 'a';\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Array 'a[10][10][10]' accessed at index a[6][12][2], which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Array 'a[10][10][10]' accessed at index a[6][12][2], which is out of bounds.\n", errout_str()); check("void f() {\n" " char a[10][10][10];\n" " a[6][40][10] = 'a';\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Array 'a[10][10][10]' accessed at index a[6][40][10], which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Array 'a[10][10][10]' accessed at index a[6][40][10], which is out of bounds.\n", errout_str()); check("void f() {\n" " char a[1][1][1];\n" " a[2][2][2] = 'a';\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Array 'a[1][1][1]' accessed at index a[2][2][2], which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Array 'a[1][1][1]' accessed at index a[2][2][2], which is out of bounds.\n", errout_str()); check("void f() {\n" " char a[6][6][6];\n" " a[6][6][2] = 'a';\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Array 'a[6][6][6]' accessed at index a[6][6][2], which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Array 'a[6][6][6]' accessed at index a[6][6][2], which is out of bounds.\n", errout_str()); check("void f() {\n" " int a[2][2];\n" " p = &a[2][0];\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // unknown dim.. check("void f()\n" @@ -2083,7 +2074,7 @@ class TestBufferOverrun : public TestFixture { " int a[2][countof(x)] = {{1,2},{3,4}};\n" " a[0][0] = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void draw_quad(float z) {\n" " int i;\n" @@ -2105,7 +2096,7 @@ class TestBufferOverrun : public TestFixture { " vertices[i][1][3] = 5.0;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); { check("int foo() {\n" @@ -2114,7 +2105,7 @@ class TestBufferOverrun : public TestFixture { " extern int stuff[A][B];\n" " return stuff[0][1];\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // TODO: better handling of VLAs in symboldatabase. should be // possible to use ValueFlow values. @@ -2124,7 +2115,7 @@ class TestBufferOverrun : public TestFixture { " extern int stuff[A][B];\n" " return stuff[0][1];\n" "}"); - TODO_ASSERT_EQUALS("error", "", errout.str()); + TODO_ASSERT_EQUALS("error", "", errout_str()); } } @@ -2145,7 +2136,7 @@ class TestBufferOverrun : public TestFixture { " };\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f()\n" "{\n" @@ -2163,7 +2154,7 @@ class TestBufferOverrun : public TestFixture { " };\n" " }\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:12]: (error) Array index out of bounds.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:12]: (error) Array index out of bounds.\n", "", errout_str()); } void array_index_for_in_for() { @@ -2175,7 +2166,7 @@ class TestBufferOverrun : public TestFixture { " }\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void array_index_bounds() { @@ -2187,7 +2178,7 @@ class TestBufferOverrun : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (warning) Either the condition 'i<10' is redundant or the array 'a[10]' is accessed at index 10, which is out of bounds.\n" "[test.cpp:3] -> [test.cpp:4]: (warning) Either the condition 'i>=0' is redundant or the array 'a[10]' is accessed at index -1, which is out of bounds.\n", - errout.str()); + errout_str()); } void array_index_calculation() { @@ -2199,7 +2190,7 @@ class TestBufferOverrun : public TestFixture { " data[i/2] = 0;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (error) Array 'data[8]' accessed at index 17, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Array 'data[8]' accessed at index 17, which is out of bounds.\n", errout_str()); // #2199 - false negative: array out of bounds in loop when there is calculation check("void f()\n" @@ -2209,7 +2200,7 @@ class TestBufferOverrun : public TestFixture { " arr[i + 7] = 0;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (error) Array 'arr[5]' accessed at index 11, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Array 'arr[5]' accessed at index 11, which is out of bounds.\n", errout_str()); } void array_index_negative1() { @@ -2219,21 +2210,21 @@ class TestBufferOverrun : public TestFixture { " char data[8];\n" " data[-1] = 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Array 'data[8]' accessed at index -1, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Array 'data[8]' accessed at index -1, which is out of bounds.\n", errout_str()); check("void f()\n" "{\n" " char data[8][4];\n" " data[5][-1] = 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Array 'data[8][4]' accessed at index data[*][-1], which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Array 'data[8][4]' accessed at index data[*][-1], which is out of bounds.\n", errout_str()); // #1614 - negative index is ok for pointers check("void foo(char *p)\n" "{\n" " p[-1] = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo()\n" "{\n" @@ -2241,14 +2232,14 @@ class TestBufferOverrun : public TestFixture { " char *p = s + strlen(s);\n" " if (p[-1]);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // ticket #1850 check("int f(const std::map > &m)\n" "{\n" " return m[0][-1];\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void array_index_negative2() { // ticket #3063 @@ -2257,7 +2248,7 @@ class TestBufferOverrun : public TestFixture { " TEST test;\n" " test.a[-1] = 3;\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Array 'test.a[10]' accessed at index -1, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Array 'test.a[10]' accessed at index -1, which is out of bounds.\n", errout_str()); } void array_index_negative3() { @@ -2273,7 +2264,7 @@ class TestBufferOverrun : public TestFixture { " if( i == 0 )\n" " return f(i);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void array_index_negative4() @@ -2284,7 +2275,7 @@ class TestBufferOverrun : public TestFixture { " for(i=0; i <16; ++i){}\n" " for(; i < 24; ++i){ buf[i] = buf[i-16];}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void array_index_negative5() // #10526 @@ -2302,7 +2293,7 @@ class TestBufferOverrun : public TestFixture { " }\n" " return false;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } // #11349 @@ -2315,7 +2306,7 @@ class TestBufferOverrun : public TestFixture { " (void)a[k];\n" " if (i == -3) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } // #5685 @@ -2327,7 +2318,7 @@ class TestBufferOverrun : public TestFixture { " for (; i < 5; i++)\n" " a[i] = 1;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:5]: (error) Array 'a[5]' accessed at index -9, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Array 'a[5]' accessed at index -9, which is out of bounds.\n", errout_str()); } // #11651 @@ -2340,7 +2331,7 @@ class TestBufferOverrun : public TestFixture { " for (int i = u, j = sizeof(i); --i >= 0;)\n" " char c = buf[i];\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } // #8075 @@ -2355,7 +2346,7 @@ class TestBufferOverrun : public TestFixture { " int a[] = { 1, 2, 3 };\n" " printf(\"%d\\n\", a[g(4)]);\n" "}\n"); - ASSERT_EQUALS("[test.cpp:8]: (error) Array 'a[3]' accessed at index -1, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8]: (error) Array 'a[3]' accessed at index -1, which is out of bounds.\n", errout_str()); } // #11844 @@ -2369,7 +2360,7 @@ class TestBufferOverrun : public TestFixture { " for (int j = m + 1; j <= 4; j++)\n" " p->a[j-1];\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void array_index_for_decr() { @@ -2380,7 +2371,7 @@ class TestBufferOverrun : public TestFixture { " data[i] = 0;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (error) Array 'data[8]' accessed at index 10, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Array 'data[8]' accessed at index 10, which is out of bounds.\n", errout_str()); check("void f()\n" "{\n" @@ -2389,7 +2380,7 @@ class TestBufferOverrun : public TestFixture { " val[i+1] = val[i];\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f()\n" "{\n" @@ -2399,7 +2390,7 @@ class TestBufferOverrun : public TestFixture { " }\n" "}"); ASSERT_EQUALS("[test.cpp:5]: (error) Array 'val[5]' accessed at index -9994, which is out of bounds.\n" - "[test.cpp:5]: (error) Array 'val[5]' accessed at index -9995, which is out of bounds.\n", errout.str()); + "[test.cpp:5]: (error) Array 'val[5]' accessed at index -9995, which is out of bounds.\n", errout_str()); } @@ -2416,7 +2407,7 @@ class TestBufferOverrun : public TestFixture { " a.data[3] = 0;\n" " a.b.data[2] = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #1586 check("struct A {\n" @@ -2432,7 +2423,7 @@ class TestBufferOverrun : public TestFixture { " a.b.data[3] = 0;\n" "}"); ASSERT_EQUALS("[test.cpp:10]: (error) Array 'a.data[4]' accessed at index 4, which is out of bounds.\n" - "[test.cpp:11]: (error) Array 'a.b.data[3]' accessed at index 3, which is out of bounds.\n", errout.str()); + "[test.cpp:11]: (error) Array 'a.b.data[3]' accessed at index 3, which is out of bounds.\n", errout_str()); } void array_index_for_andand_oror() { // #3907 - using && or || @@ -2445,7 +2436,7 @@ class TestBufferOverrun : public TestFixture { " data[x] = 0;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (error) Array 'data[2]' accessed at index 9, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Array 'data[2]' accessed at index 9, which is out of bounds.\n", errout_str()); check("void f() {\n" " char data[2];\n" @@ -2454,7 +2445,7 @@ class TestBufferOverrun : public TestFixture { " data[x] = 0;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (error) Array 'data[2]' accessed at index 9, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Array 'data[2]' accessed at index 9, which is out of bounds.\n", errout_str()); check("void f() {\n" " char data[2];\n" @@ -2463,7 +2454,7 @@ class TestBufferOverrun : public TestFixture { " data[x] = 0;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (error) Array 'data[2]' accessed at index 10, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Array 'data[2]' accessed at index 10, which is out of bounds.\n", errout_str()); check("void f() {\n" " char data[2];\n" @@ -2472,7 +2463,7 @@ class TestBufferOverrun : public TestFixture { " data[x] = 0;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (error) Array 'data[2]' accessed at index 10, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Array 'data[2]' accessed at index 10, which is out of bounds.\n", errout_str()); check("int f() {\n" // #9126 " int i, c;\n" @@ -2484,7 +2475,7 @@ class TestBufferOverrun : public TestFixture { " }\n" " return c;\n" "}", "test.c"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void array_index_for_continue() { @@ -2498,7 +2489,7 @@ class TestBufferOverrun : public TestFixture { " a[i - 1] = 0;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // extracttests.start: int maybe(); check("void f() {\n" @@ -2510,7 +2501,7 @@ class TestBufferOverrun : public TestFixture { " a[i - 1] = 0;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:7]: (error) Array 'a[2]' accessed at index -1, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (error) Array 'a[2]' accessed at index -1, which is out of bounds.\n", errout_str()); } void array_index_for() { @@ -2523,7 +2514,7 @@ class TestBufferOverrun : public TestFixture { " a[i] = 0;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:6]: (error) Array 'a[10]' accessed at index 19, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (error) Array 'a[10]' accessed at index 19, which is out of bounds.\n", errout_str()); // Ticket #2385 - No false positive check("void f() {\n" @@ -2535,7 +2526,7 @@ class TestBufferOverrun : public TestFixture { " }\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Ticket #3893 - start value out of bounds // extracttests.start: int maybe(); int dostuff(); @@ -2545,7 +2536,7 @@ class TestBufferOverrun : public TestFixture { " a[i] = 0;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Array 'a[10]' accessed at index 10, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Array 'a[10]' accessed at index 10, which is out of bounds.\n", errout_str()); // #7686 check("char f() {\n" @@ -2555,7 +2546,7 @@ class TestBufferOverrun : public TestFixture { " buf[i] = 0;\n" " return buf[0];\n" "}\n"); - ASSERT_EQUALS("[test.cpp:5]: (error) Array 'buf[10]' accessed at index 10, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Array 'buf[10]' accessed at index 10, which is out of bounds.\n", errout_str()); } void array_index_for_neq() { @@ -2567,7 +2558,7 @@ class TestBufferOverrun : public TestFixture { " }\n" "}"); ASSERT_EQUALS("[test.cpp:4]: (error) Array 'a[5]' accessed at index 9, which is out of bounds.\n", - errout.str()); + errout_str()); } void array_index_for_question() { @@ -2578,7 +2569,7 @@ class TestBufferOverrun : public TestFixture { " i == 0 ? 0 : a[i-1];\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " int a[10];\n" @@ -2587,7 +2578,7 @@ class TestBufferOverrun : public TestFixture { " }\n" "}"); ASSERT_EQUALS("[test.cpp:4]: (error) Array 'a[10]' accessed at index -1, which is out of bounds.\n", - errout.str()); + errout_str()); check("void f() {\n" " int a[10];\n" @@ -2596,7 +2587,7 @@ class TestBufferOverrun : public TestFixture { " a[i-1] = 0;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (error) Array 'a[10]' accessed at index -1, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Array 'a[10]' accessed at index -1, which is out of bounds.\n", errout_str()); } void array_index_for_varid0() { // #4228: No varid for counter variable @@ -2604,7 +2595,7 @@ class TestBufferOverrun : public TestFixture { " char a[10];\n" " for (i=0; i<10; i++);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void array_index_vla_for() { @@ -2615,14 +2606,14 @@ class TestBufferOverrun : public TestFixture { " a[0] = 0;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void array_index_extern() { // Ticket #1684. FP when using 'extern'. check("extern char arr[15];\n" "char arr[15] = \"abc\";"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void array_index_cast() { @@ -2636,7 +2627,7 @@ class TestBufferOverrun : public TestFixture { " int x[2];\n" " f1(x);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Same type => error check("void f1(const char buf[]) {\n" @@ -2648,7 +2639,7 @@ class TestBufferOverrun : public TestFixture { "}"); TODO_ASSERT_EQUALS("[test.cpp:6] -> [test.cpp:2]: (error) Array 'x[2]' accessed at index 4, which is out of bounds.\n", "", - errout.str()); + errout_str()); } void array_index_string_literal() { @@ -2656,41 +2647,41 @@ class TestBufferOverrun : public TestFixture { " const char *str = \"abc\";\n" " bar(str[10]);\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Array 'str[4]' accessed at index 10, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Array 'str[4]' accessed at index 10, which is out of bounds.\n", errout_str()); check("void f()\n" "{\n" " const char *str = \"abc\";\n" " bar(str[4]);\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Array 'str[4]' accessed at index 4, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Array 'str[4]' accessed at index 4, which is out of bounds.\n", errout_str()); check("void f()\n" "{\n" " const char *str = \"abc\";\n" " bar(str[3]);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f()\n" "{\n" " const char *str = \"a\tc\";\n" " bar(str[4]);\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Array 'str[4]' accessed at index 4, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Array 'str[4]' accessed at index 4, which is out of bounds.\n", errout_str()); check("void f() {\n" // #6973 " const char *name = \"\";\n" " if ( name[0] == 'U' ? name[1] : 0) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int main(int argc, char **argv) {\n" " char str[6] = \"\\0\";\n" " unsigned short port = 65535;\n" " snprintf(str, sizeof(str), \"%hu\", port);\n" "}", settings0, "test.c"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f(int x) {\n" // #11020 " const char* p = (x == 0 ? \"12345\" : \"ABC\");\n" @@ -2699,7 +2690,7 @@ class TestBufferOverrun : public TestFixture { " s += p[i];\n" " return s;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void array_index_same_struct_and_var_name() { @@ -2712,7 +2703,7 @@ class TestBufferOverrun : public TestFixture { " struct tt *tt=x;\n" " tt->name;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // detect error check("struct tt {\n" @@ -2723,7 +2714,7 @@ class TestBufferOverrun : public TestFixture { " struct tt *tt=x;\n" " tt->name[22] = 123;\n" "}"); - ASSERT_EQUALS("[test.cpp:7]: (error) Array 'tt->name[21]' accessed at index 22, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (error) Array 'tt->name[21]' accessed at index 22, which is out of bounds.\n", errout_str()); } void array_index_valueflow() { @@ -2732,7 +2723,7 @@ class TestBufferOverrun : public TestFixture { " str[i] = 0;\n" " if (i==10) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:3]: (warning) Either the condition 'i==10' is redundant or the array 'str[3]' is accessed at index 10, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:3]: (warning) Either the condition 'i==10' is redundant or the array 'str[3]' is accessed at index 10, which is out of bounds.\n", errout_str()); check("void f(int i) {\n" " char str[3];\n" @@ -2741,31 +2732,31 @@ class TestBufferOverrun : public TestFixture { " case 10: break;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:3]: (warning) Either the switch case 'case 10' is redundant or the array 'str[3]' is accessed at index 10, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:3]: (warning) Either the switch case 'case 10' is redundant or the array 'str[3]' is accessed at index 10, which is out of bounds.\n", errout_str()); check("void f() {\n" " char str[3];\n" " str[((unsigned char)3) - 1] = 0;\n" "}", "test.cpp"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" // #5416 FP " char *str[3];\n" " do_something(&str[0][5]);\n" "}", "test.cpp"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class X { static const int x[100]; };\n" // #6070 "const int X::x[100] = {0};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("namespace { class X { static const int x[100]; };\n" // #6232 "const int X::x[100] = {0}; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class ActorSprite { static ImageSet * targetCursorImages[2][10]; };\n" "ImageSet *ActorSprite::targetCursorImages[2][10];"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f(const std::size_t s) {\n" // #10130 " const char a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };\n" @@ -2775,7 +2766,7 @@ class TestBufferOverrun : public TestFixture { " return f(16);\n" "}\n"); ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:3]: (warning) Either the condition 's>sizeof(a)' is redundant or the array 'a[16]' is accessed at index 16, which is out of bounds.\n", - errout.str()); + errout_str()); } @@ -2785,7 +2776,7 @@ class TestBufferOverrun : public TestFixture { " int *p = a;\n" " p[20] = 0;\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (error) Array 'a[10]' accessed at index 20, which is out of bounds.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (error) Array 'a[10]' accessed at index 20, which is out of bounds.\n", "", errout_str()); { // address of @@ -2794,14 +2785,14 @@ class TestBufferOverrun : public TestFixture { " int *p = a;\n" " p[10] = 0;\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (error) Array 'a[10]' accessed at index 10, which is out of bounds.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (error) Array 'a[10]' accessed at index 10, which is out of bounds.\n", "", errout_str()); check("void f() {\n" " int a[10];\n" " int *p = a;\n" " dostuff(&p[10]);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } check("void f() {\n" @@ -2809,33 +2800,33 @@ class TestBufferOverrun : public TestFixture { " int *p = a;\n" " p[20] = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " int a[2];\n" " char *p = (char *)a;\n" // cast " p[4] = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void array_index_function_parameter() { check("void f(char a[10]) {\n" " a[20] = 0;\n" // <- cppcheck warn here even though it's not a definite access out of bounds "}"); - ASSERT_EQUALS("[test.cpp:2]: (error) Array 'a[10]' accessed at index 20, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (error) Array 'a[10]' accessed at index 20, which is out of bounds.\n", errout_str()); check("void f(char a[10]) {\n" // #6353 - reassign 'a' " a += 4;\n" " a[-1] = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(char a[10]) {\n" " a[0] = 0;\n" " a[-1] = 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Array 'a[10]' accessed at index -1, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Array 'a[10]' accessed at index -1, which is out of bounds.\n", errout_str()); } void array_index_enum_array() { // #8439 @@ -2844,7 +2835,7 @@ class TestBufferOverrun : public TestFixture { " E arrE[] = { e1, e2 };\n" " arrE[sizeof(arrE)] = e1;\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Array 'arrE[2]' accessed at index 8, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Array 'arrE[2]' accessed at index 8, which is out of bounds.\n", errout_str()); } void array_index_container() { // #9386 @@ -2852,7 +2843,7 @@ class TestBufferOverrun : public TestFixture { "void foo(std::array& a) {\n" " a[2] = 2;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void array_index_two_for_loops() { @@ -2866,7 +2857,7 @@ class TestBufferOverrun : public TestFixture { " if (i < 50)\n" " sum -= val[i];\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool b();\n" "void f()\n" @@ -2880,7 +2871,7 @@ class TestBufferOverrun : public TestFixture { " break;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool b();\n" "void f()\n" @@ -2892,7 +2883,7 @@ class TestBufferOverrun : public TestFixture { " for (; i < 50; i++)\n" " sum -= val[i];\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void array_index_new() { // #7690 @@ -2902,7 +2893,7 @@ class TestBufferOverrun : public TestFixture { " z[n] = 0;\n" " delete[] z;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:4]: (error) Array 'z[1]' accessed at index 7, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Array 'z[1]' accessed at index 7, which is out of bounds.\n", errout_str()); check("void f() {\n" " int* z = new int(1);\n" @@ -2910,7 +2901,7 @@ class TestBufferOverrun : public TestFixture { " z[n] = 0;\n" " delete[] z;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:4]: (error) Array 'z[1]' accessed at index 7, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Array 'z[1]' accessed at index 7, which is out of bounds.\n", errout_str()); check("void f() {\n" " int* z = new int{};\n" @@ -2918,7 +2909,7 @@ class TestBufferOverrun : public TestFixture { " z[n] = 0;\n" " delete[] z;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:4]: (error) Array 'z[1]' accessed at index 7, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Array 'z[1]' accessed at index 7, which is out of bounds.\n", errout_str()); check("void f() {\n" " int* z = new int[5];\n" @@ -2926,7 +2917,7 @@ class TestBufferOverrun : public TestFixture { " z[n] = 0;\n" " delete[] z;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:4]: (error) Array 'z[5]' accessed at index 7, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Array 'z[5]' accessed at index 7, which is out of bounds.\n", errout_str()); check("void g() {\n" " int* z = new int[5]();\n" @@ -2934,7 +2925,7 @@ class TestBufferOverrun : public TestFixture { " z[n] = 1;\n" " delete[] z;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:4]: (error) Array 'z[5]' accessed at index 7, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Array 'z[5]' accessed at index 7, which is out of bounds.\n", errout_str()); check("void h() {\n" " int** z = new int* [5];\n" @@ -2942,7 +2933,7 @@ class TestBufferOverrun : public TestFixture { " z[n] = nullptr;\n" " delete[] z;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:4]: (error) Array 'z[5]' accessed at index 7, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Array 'z[5]' accessed at index 7, which is out of bounds.\n", errout_str()); check("void h() {\n" " int** z = new int* [5]();\n" @@ -2950,7 +2941,7 @@ class TestBufferOverrun : public TestFixture { " z[n] = nullptr;\n" " delete[] z;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:4]: (error) Array 'z[5]' accessed at index 7, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Array 'z[5]' accessed at index 7, which is out of bounds.\n", errout_str()); check("void h() {\n" " int** z = new int* [5]{};\n" @@ -2958,7 +2949,7 @@ class TestBufferOverrun : public TestFixture { " z[n] = nullptr;\n" " delete[] z;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:4]: (error) Array 'z[5]' accessed at index 7, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Array 'z[5]' accessed at index 7, which is out of bounds.\n", errout_str()); check("void h() {\n" " int** z = new int* [5]{ 0 };\n" @@ -2966,7 +2957,7 @@ class TestBufferOverrun : public TestFixture { " z[n] = nullptr;\n" " delete[] z;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:4]: (error) Array 'z[5]' accessed at index 7, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Array 'z[5]' accessed at index 7, which is out of bounds.\n", errout_str()); } void buffer_overrun_2_struct() { @@ -2979,7 +2970,7 @@ class TestBufferOverrun : public TestFixture { "{\n" " strcpy( abc->str, \"abcdef\" );\n" "}"); - ASSERT_EQUALS("[test.cpp:8]: (error) Buffer is accessed out of bounds: abc->str\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8]: (error) Buffer is accessed out of bounds: abc->str\n", errout_str()); check("struct ABC\n" "{\n" @@ -2991,7 +2982,7 @@ class TestBufferOverrun : public TestFixture { " struct ABC abc;\n" " strcpy( abc.str, \"abcdef\" );\n" "}"); - ASSERT_EQUALS("[test.cpp:9]: (error) Buffer is accessed out of bounds: abc.str\n", errout.str()); + ASSERT_EQUALS("[test.cpp:9]: (error) Buffer is accessed out of bounds: abc.str\n", errout_str()); check("struct ABC\n" "{\n" @@ -3002,7 +2993,7 @@ class TestBufferOverrun : public TestFixture { "{\n" " strcpy( abc.str, \"abcdef\" );\n" "}"); - ASSERT_EQUALS("[test.cpp:8]: (error) Buffer is accessed out of bounds: abc.str\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8]: (error) Buffer is accessed out of bounds: abc.str\n", errout_str()); check("static void f()\n" "{\n" @@ -3012,7 +3003,7 @@ class TestBufferOverrun : public TestFixture { " } abc;\n" " strcpy( abc.str, \"abcdef\" );\n" "}"); - ASSERT_EQUALS("[test.cpp:7]: (error) Buffer is accessed out of bounds: abc.str\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (error) Buffer is accessed out of bounds: abc.str\n", errout_str()); check("static void f()\n" "{\n" @@ -3024,7 +3015,7 @@ class TestBufferOverrun : public TestFixture { " strcpy( abc->str, \"abcdef\" );\n" " free(abc);\n" "}"); - ASSERT_EQUALS("[test.cpp:8]: (error) Buffer is accessed out of bounds: abc->str\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8]: (error) Buffer is accessed out of bounds: abc->str\n", errout_str()); } @@ -3037,11 +3028,11 @@ class TestBufferOverrun : public TestFixture { " for (i = 0; i <= 10; ++i)\n" " a[i] = 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:7]: (error) Array 'a[10]' accessed at index 10, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (error) Array 'a[10]' accessed at index 10, which is out of bounds.\n", errout_str()); check("struct S { int b; } static e[1];\n" // #11052 "int f() { return e[1].b; }\n"); - ASSERT_EQUALS("[test.cpp:2]: (error) Array 'e[1]' accessed at index 1, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (error) Array 'e[1]' accessed at index 1, which is out of bounds.\n", errout_str()); } @@ -3052,7 +3043,7 @@ class TestBufferOverrun : public TestFixture { " for (int i = 0; i < 8; ++i)\n" " p[i] = 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (error) Array 'p[2]' accessed at index 7, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Array 'p[2]' accessed at index 7, which is out of bounds.\n", errout_str()); // No false positive check("void foo(int x, int y)\n" @@ -3061,7 +3052,7 @@ class TestBufferOverrun : public TestFixture { " const char *s = y + p[1];\n" " p[1] = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // There is no error here check("void f1(char *s,int size)\n" @@ -3073,7 +3064,7 @@ class TestBufferOverrun : public TestFixture { " char s[3];\n" " f1(s,20);\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:8] -> [test.cpp:3]: (error) Buffer is accessed out of bounds.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:8] -> [test.cpp:3]: (error) Buffer is accessed out of bounds.\n", "", errout_str()); check("void f1(char *s,int size)\n" "{\n" @@ -3084,7 +3075,7 @@ class TestBufferOverrun : public TestFixture { " char s[3];\n" " f1(s,3);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void buffer_overrun_5() { @@ -3094,7 +3085,7 @@ class TestBufferOverrun : public TestFixture { " sprintf(n, \"d\");\n" " printf(\"hello!\");\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void buffer_overrun_6() { @@ -3104,7 +3095,7 @@ class TestBufferOverrun : public TestFixture { " strcat(n, \"abc\");\n" " strcat(n, \"def\");\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:5]: (error) Buffer is accessed out of bounds: n\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:5]: (error) Buffer is accessed out of bounds: n\n", "", errout_str()); } void buffer_overrun_7() { @@ -3114,7 +3105,7 @@ class TestBufferOverrun : public TestFixture { " char a[2];\n" " strcpy(a, \"a\\0\");\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void buffer_overrun_8() { @@ -3127,7 +3118,7 @@ class TestBufferOverrun : public TestFixture { " a[i] = 0;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f()\n" "{\n" @@ -3137,7 +3128,7 @@ class TestBufferOverrun : public TestFixture { " a[i] = 0;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void buffer_overrun_9() { @@ -3151,7 +3142,7 @@ class TestBufferOverrun : public TestFixture { " i += 100;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void buffer_overrun_10() { @@ -3164,7 +3155,7 @@ class TestBufferOverrun : public TestFixture { " char b = a[i];\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void buffer_overrun_11() { @@ -3175,7 +3166,7 @@ class TestBufferOverrun : public TestFixture { " {\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f()\n" "{\n" @@ -3184,7 +3175,7 @@ class TestBufferOverrun : public TestFixture { " {\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void buffer_overrun_15() { // ticket #1787 @@ -3196,7 +3187,7 @@ class TestBufferOverrun : public TestFixture { "{\n" " strcpy(val, \"ab\") ;\n" "}"); - ASSERT_EQUALS("[test.cpp:7]: (error) Buffer is accessed out of bounds: val\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (error) Buffer is accessed out of bounds: val\n", errout_str()); } void buffer_overrun_16() { @@ -3205,20 +3196,20 @@ class TestBufferOverrun : public TestFixture { " struct Foo foo[5];\n" " memset(foo, 0, sizeof(foo));\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" // ticket #2093 " gchar x[3];\n" " strcpy(x, \"12\");\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("extern char a[10];\n" "void f() {\n" " char b[25] = {0};\n" " std::memcpy(b, a, 10);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void buffer_overrun_18() { // ticket #2576 @@ -3232,7 +3223,7 @@ class TestBufferOverrun : public TestFixture { " b[i] = b[i+1];\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class A {\n" " void foo();\n" @@ -3244,7 +3235,7 @@ class TestBufferOverrun : public TestFixture { " b[i] = b[i+1];\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:8]: (error) Array 'b[7]' accessed at index 7, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8]: (error) Array 'b[7]' accessed at index 7, which is out of bounds.\n", errout_str()); } void buffer_overrun_19() { // #2597 - class member with unknown type @@ -3257,7 +3248,7 @@ class TestBufferOverrun : public TestFixture { "A::A() {\n" " memset(buf, 0, 10);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void buffer_overrun_21() { @@ -3268,7 +3259,7 @@ class TestBufferOverrun : public TestFixture { " for (size_t i = 0; i <= 4; i++)\n" " dst[i] = src[i];\n" "} } }"); - ASSERT_EQUALS("[test.cpp:6]: (error) Array 'dst[4]' accessed at index 4, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (error) Array 'dst[4]' accessed at index 4, which is out of bounds.\n", errout_str()); } void buffer_overrun_24() { // index variable is changed in for-loop @@ -3280,7 +3271,7 @@ class TestBufferOverrun : public TestFixture { " x += array[i];\n" " i++; }\n" "}"); - TODO_ASSERT_EQUALS("error", "", errout.str()); + TODO_ASSERT_EQUALS("error", "", errout_str()); // ticket #4096 check("void main() {\n" @@ -3290,7 +3281,7 @@ class TestBufferOverrun : public TestFixture { " x += array[i++];\n" " }\n" "}"); - TODO_ASSERT_EQUALS("error", "", errout.str()); + TODO_ASSERT_EQUALS("error", "", errout_str()); } void buffer_overrun_26() { // ticket #4432 (segmentation fault) @@ -3301,7 +3292,7 @@ class TestBufferOverrun : public TestFixture { " split(inbuf, f, 10, \"\t\t\");\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void buffer_overrun_27() { // ticket #4444 (segmentation fault) @@ -3311,7 +3302,7 @@ class TestBufferOverrun : public TestFixture { "abc(x);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } // #7083: false positive: typedef and initialization with strings @@ -3321,7 +3312,7 @@ class TestBufferOverrun : public TestFixture { " testChar tc1 = \"\";\n" " tc1[5]='a';\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } @@ -3331,14 +3322,14 @@ class TestBufferOverrun : public TestFixture { "int f(S * s) {\n" " return s->m[sizeof(s->m)];\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Array 's->m[9]' accessed at index 36, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Array 's->m[9]' accessed at index 36, which is out of bounds.\n", errout_str()); } void buffer_overrun_31() { check("void f(WhereInfo *pWInfo, int *aiCur) {\n" " memcpy(aiCur, pWInfo->aiCurOnePass, sizeof(int)*2);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void buffer_overrun_32() { @@ -3349,7 +3340,7 @@ class TestBufferOverrun : public TestFixture { " (void)strxfrm(dest,src,1);\n" " (void)strxfrm(dest,src,2);\n"// << "}"); - ASSERT_EQUALS("[test.cpp:5]: (error) Buffer is accessed out of bounds: dest\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Buffer is accessed out of bounds: dest\n", errout_str()); // destination size is too small check("void f(void) {\n" " const char src[3] = \"abc\";\n" @@ -3358,7 +3349,7 @@ class TestBufferOverrun : public TestFixture { " (void)strxfrm(dest,src,2);\n" " (void)strxfrm(dest,src,3);\n" // << "}"); - ASSERT_EQUALS("[test.cpp:6]: (error) Buffer is accessed out of bounds: dest\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (error) Buffer is accessed out of bounds: dest\n", errout_str()); // source size is too small check("void f(void) {\n" " const char src[2] = \"ab\";\n" @@ -3367,7 +3358,7 @@ class TestBufferOverrun : public TestFixture { " (void)strxfrm(dest,src,2);\n" " (void)strxfrm(dest,src,3);\n" // << "}"); - ASSERT_EQUALS("[test.cpp:6]: (error) Buffer is accessed out of bounds: src\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (error) Buffer is accessed out of bounds: src\n", errout_str()); // source size is too small check("void f(void) {\n" " const char src[1] = \"a\";\n" @@ -3375,7 +3366,7 @@ class TestBufferOverrun : public TestFixture { " (void)strxfrm(dest,src,1);\n" " (void)strxfrm(dest,src,2);\n" // << "}"); - ASSERT_EQUALS("[test.cpp:5]: (error) Buffer is accessed out of bounds: src\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Buffer is accessed out of bounds: src\n", errout_str()); } void buffer_overrun_33() { // #2019 @@ -3386,7 +3377,7 @@ class TestBufferOverrun : public TestFixture { " z[i] = 0;\n" " return z[0];\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (error) Array 'z[16]' accessed at index 19, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Array 'z[16]' accessed at index 19, which is out of bounds.\n", errout_str()); } void buffer_overrun_34() { // #11035 @@ -3400,7 +3391,7 @@ class TestBufferOverrun : public TestFixture { " return a[i];\n" " }\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void buffer_overrun_35() { // #2304 @@ -3410,7 +3401,7 @@ class TestBufferOverrun : public TestFixture { " strcpy(p, q);\n" " free(p);\n" "}\n"); - ASSERT_EQUALS("[test.cpp:4]: (error) Buffer is accessed out of bounds: p\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Buffer is accessed out of bounds: p\n", errout_str()); check("void f() {\n" " char* q = \"0123456789\";\n" @@ -3418,7 +3409,7 @@ class TestBufferOverrun : public TestFixture { " strcpy(p, q);\n" " free(p);\n" "}\n"); - ASSERT_EQUALS("[test.cpp:4]: (error) Buffer is accessed out of bounds: p\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Buffer is accessed out of bounds: p\n", errout_str()); check("typedef struct { char buf[1]; } S;\n" "S* f() {\n" @@ -3427,7 +3418,7 @@ class TestBufferOverrun : public TestFixture { " sprintf((char*)s->buf, \"abc\");\n" " return s;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void buffer_overrun_36() { // #11708 @@ -3435,7 +3426,7 @@ class TestBufferOverrun : public TestFixture { " char a[80];\n" " sprintf(a, \"%2.1f\", d);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void buffer_overrun_errorpath() { @@ -3449,7 +3440,7 @@ class TestBufferOverrun : public TestFixture { "}"); ASSERT_EQUALS("test.cpp:3:error:Buffer is accessed out of bounds: p\n" "test.cpp:2:note:Assign p, buffer with size 10\n" - "test.cpp:3:note:Buffer overrun\n", errout.str()); + "test.cpp:3:note:Buffer overrun\n", errout_str()); settings0 = settingsOld; } @@ -3464,7 +3455,7 @@ class TestBufferOverrun : public TestFixture { " char a[10];\n" " f1(a);" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // No false positive check("void f1(char *s) {\n" @@ -3476,7 +3467,7 @@ class TestBufferOverrun : public TestFixture { " char a[10];\n" " f1(a);" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // No false negative check("void f1(char *s) {\n" @@ -3488,7 +3479,7 @@ class TestBufferOverrun : public TestFixture { " char a[10];\n" " f1(a);" "}"); - TODO_ASSERT_EQUALS("[test.cpp:8] -> [test.cpp:3]: (error) Array 'a[10]' accessed at index 100, which is out of bounds.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:8] -> [test.cpp:3]: (error) Array 'a[10]' accessed at index 100, which is out of bounds.\n", "", errout_str()); } void buffer_overrun_function_array_argument() { @@ -3503,7 +3494,7 @@ class TestBufferOverrun : public TestFixture { "test.cpp:4:note:Function 'f' is called\n" "test.cpp:1:note:Declaration of 1st function argument.\n" "test.cpp:3:note:Passing buffer 'a' to function that is declared here\n" - "test.cpp:4:note:Buffer 'a' is too small, the function 'f' expects a bigger buffer in 1st argument\n", errout.str()); + "test.cpp:4:note:Buffer 'a' is too small, the function 'f' expects a bigger buffer in 1st argument\n", errout_str()); check("void f(float a[10][3]);\n" "void g() {\n" @@ -3514,7 +3505,7 @@ class TestBufferOverrun : public TestFixture { "test.cpp:4:note:Function 'f' is called\n" "test.cpp:1:note:Declaration of 1st function argument.\n" "test.cpp:3:note:Passing buffer 'a' to function that is declared here\n" - "test.cpp:4:note:Buffer 'a' is too small, the function 'f' expects a bigger buffer in 1st argument\n", errout.str()); + "test.cpp:4:note:Buffer 'a' is too small, the function 'f' expects a bigger buffer in 1st argument\n", errout_str()); check("void f(int a[20]);\n" "void g() {\n" @@ -3525,7 +3516,7 @@ class TestBufferOverrun : public TestFixture { "test.cpp:4:note:Function 'f' is called\n" "test.cpp:1:note:Declaration of 1st function argument.\n" "test.cpp:3:note:Passing buffer 'a' to function that is declared here\n" - "test.cpp:4:note:Buffer 'a' is too small, the function 'f' expects a bigger buffer in 1st argument\n", errout.str()); + "test.cpp:4:note:Buffer 'a' is too small, the function 'f' expects a bigger buffer in 1st argument\n", errout_str()); check("void f(int a[]) {\n" " switch (2) {\n" @@ -3536,14 +3527,14 @@ class TestBufferOverrun : public TestFixture { "int a[1];\n" "f(a);\n" ""); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void CreateLeafTex(unsigned char buf[256][2048][4]);\n" "void foo() {\n" " unsigned char(* tree)[2048][4] = new unsigned char[256][2048][4];\n" " CreateLeafTex(tree);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int a[10]) {\n" // #10069 " int i = 0;\n" @@ -3560,7 +3551,7 @@ class TestBufferOverrun : public TestFixture { "test.cpp:1:note:Declaration of 1st function argument.\n" "test.cpp:7:note:Passing buffer 'b' to function that is declared here\n" "test.cpp:8:note:Buffer 'b' is too small, the function 'f' expects a bigger buffer in 1st argument\n", - errout.str()); + errout_str()); } void possible_buffer_overrun_1() { // #3035 @@ -3571,7 +3562,7 @@ class TestBufferOverrun : public TestFixture { " src[99] = '\\0';\n" " strcat(data, src);\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:6]: (warning) Possible buffer overflow if strlen(src) is larger than sizeof(data)-strlen(data).\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:6]: (warning) Possible buffer overflow if strlen(src) is larger than sizeof(data)-strlen(data).\n", "", errout_str()); check("void foo() {\n" " char * data = (char *)alloca(100);\n" @@ -3580,19 +3571,19 @@ class TestBufferOverrun : public TestFixture { " src[99] = '\\0';\n" " strcat(data, src);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(char src[100]) {\n" " char * data = (char *)alloca(50);\n" " strcat(data, src);\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:3]: (warning) Possible buffer overflow if strlen(src) is larger than sizeof(data)-strlen(data).\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:3]: (warning) Possible buffer overflow if strlen(src) is larger than sizeof(data)-strlen(data).\n", "", errout_str()); check("void foo(char src[100]) {\n" " char * data = (char *)alloca(100);\n" " strcat(data, src);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() {\n" " char * data = (char *)alloca(50);\n" @@ -3601,7 +3592,7 @@ class TestBufferOverrun : public TestFixture { " src[99] = '\\0';\n" " strcpy(data, src);\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:6]: (warning) Possible buffer overflow if strlen(src) is larger than or equal to sizeof(data).\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:6]: (warning) Possible buffer overflow if strlen(src) is larger than or equal to sizeof(data).\n", "", errout_str()); check("void foo() {\n" " char * data = (char *)alloca(100);\n" @@ -3610,19 +3601,19 @@ class TestBufferOverrun : public TestFixture { " src[99] = '\\0';\n" " strcpy(data, src);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(char src[100]) {\n" " char * data = (char *)alloca(50);\n" " strcpy(data, src);\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:3]: (warning) Possible buffer overflow if strlen(src) is larger than or equal to sizeof(data).\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:3]: (warning) Possible buffer overflow if strlen(src) is larger than or equal to sizeof(data).\n", "", errout_str()); check("void foo(char src[100]) {\n" " char * data = (char *)alloca(100);\n" " strcpy(data, src);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void buffer_overrun_readSizeFromCfg() { @@ -3644,26 +3635,26 @@ class TestBufferOverrun : public TestFixture { " u8 str[256];\n" " mystrcpy(str, \"abcd\");\n" "}", settings); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " u8 str[2];\n" " mystrcpy(str, \"abcd\");\n" "}", settings); - ASSERT_EQUALS("[test.cpp:3]: (error) Buffer is accessed out of bounds: str\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Buffer is accessed out of bounds: str\n", errout_str()); // The same for structs, where the message comes from a different check check("void f() {\n" " struct { u8 str[256]; } ms;\n" " mystrcpy(ms.str, \"abcd\");\n" "}", settings); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " struct { u8 str[2]; } ms;\n" " mystrcpy(ms.str, \"abcd\");\n" "}", settings); - ASSERT_EQUALS("[test.cpp:3]: (error) Buffer is accessed out of bounds: ms.str\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Buffer is accessed out of bounds: ms.str\n", errout_str()); } void valueflow_string() { // using ValueFlow string values in checking @@ -3672,7 +3663,7 @@ class TestBufferOverrun : public TestFixture { " if (cond) x = \"abcde\";\n" " return x[20];\n" // <- array index out of bounds when x is "abcde" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Array 'x[6]' accessed at index 20, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Array 'x[6]' accessed at index 20, which is out of bounds.\n", errout_str()); } void pointer_out_of_bounds_1() { @@ -3682,40 +3673,40 @@ class TestBufferOverrun : public TestFixture { " char a[10];\n" " char *p = a + 100;\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (portability) Undefined behaviour, pointer arithmetic 'a+100' is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (portability) Undefined behaviour, pointer arithmetic 'a+100' is out of bounds.\n", errout_str()); check("char *f() {\n" " char a[10];\n" " return a + 100;\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (portability) Undefined behaviour, pointer arithmetic 'a+100' is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (portability) Undefined behaviour, pointer arithmetic 'a+100' is out of bounds.\n", errout_str()); check("void f(int i) {\n" " char x[10];\n" " if (i == 123) {}\n" " dostuff(x+i);\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (portability) Undefined behaviour, when 'i' is 123 the pointer arithmetic 'x+i' is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (portability) Undefined behaviour, when 'i' is 123 the pointer arithmetic 'x+i' is out of bounds.\n", errout_str()); check("void f(int i) {\n" " char x[10];\n" " if (i == -1) {}\n" " dostuff(x+i);\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (portability) Undefined behaviour, when 'i' is -1 the pointer arithmetic 'x+i' is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (portability) Undefined behaviour, when 'i' is -1 the pointer arithmetic 'x+i' is out of bounds.\n", errout_str()); check("void f() {\n" // #6350 - fp when there is cast of buffer " wchar_t buf[64];\n" " p = (unsigned char *) buf + sizeof (buf);\n" "}", "6350.c"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f() {\n" " const char d[] = \"0123456789\";\n" " char *cp = d + 3;\n" " return cp - d;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void pointer_out_of_bounds_2() { @@ -3724,7 +3715,7 @@ class TestBufferOverrun : public TestFixture { " p += 100;\n" " free(p);" "}"); - TODO_ASSERT_EQUALS("[test.cpp:3]: (portability) Undefined behaviour, pointer arithmetic 'p+100' is out of bounds.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:3]: (portability) Undefined behaviour, pointer arithmetic 'p+100' is out of bounds.\n", "", errout_str()); check("void f() {\n" " char *p = malloc(10);\n" @@ -3732,7 +3723,7 @@ class TestBufferOverrun : public TestFixture { " *p = 0;\n" " free(p);" "}"); - TODO_ASSERT_EQUALS("[test.cpp:4]: (error) p is out of bounds.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:4]: (error) p is out of bounds.\n", "", errout_str()); check("void f() {\n" " char *p = malloc(10);\n" @@ -3741,7 +3732,7 @@ class TestBufferOverrun : public TestFixture { " *p = 0;\n" " free(p);" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " char *p = malloc(10);\n" @@ -3750,7 +3741,7 @@ class TestBufferOverrun : public TestFixture { " *p = 0;\n" " free(p);" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void pointer_out_of_bounds_3() { @@ -3758,7 +3749,7 @@ class TestBufferOverrun : public TestFixture { "void f(struct S *s) {\n" " int *p = s->a + 100;\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (portability) Undefined behaviour, pointer arithmetic 's->a+100' is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (portability) Undefined behaviour, pointer arithmetic 's->a+100' is out of bounds.\n", errout_str()); check("template class Vector\n" "{\n" @@ -3774,36 +3765,36 @@ class TestBufferOverrun : public TestFixture { " const T* P1 = P2 - 1;\n" "}\n" "Vector> Foo;\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void pointer_out_of_bounds_4() { check("const char* f() {\n" " g(\"Hello\" + 6);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("const char* f() {\n" " g(\"Hello\" + 7);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (portability) Undefined behaviour, pointer arithmetic '\"Hello\"+7' is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (portability) Undefined behaviour, pointer arithmetic '\"Hello\"+7' is out of bounds.\n", errout_str()); check("const char16_t* f() {\n" " g(u\"Hello\" + 6);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("const char16_t* f() {\n" " g(u\"Hello\" + 7);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (portability) Undefined behaviour, pointer arithmetic 'u\"Hello\"+7' is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (portability) Undefined behaviour, pointer arithmetic 'u\"Hello\"+7' is out of bounds.\n", errout_str()); check("void f() {\n" // #4647 " int val = 5;\n" " std::string hi = \"hi\" + val;\n" " std::cout << hi << std::endl;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:3]: (portability) Undefined behaviour, pointer arithmetic '\"hi\"+val' is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (portability) Undefined behaviour, pointer arithmetic '\"hi\"+val' is out of bounds.\n", errout_str()); check("void f(const char* s, int len) {\n" // #11026 " const char* end = s + len;\n" @@ -3813,7 +3804,7 @@ class TestBufferOverrun : public TestFixture { " f(\"a\", 1);\n" " f(\"bbb\", 3);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int i, const char* a) {\n" // #11140 " (void)a[i];\n" @@ -3826,7 +3817,7 @@ class TestBufferOverrun : public TestFixture { " for (int i = 0; \"012\"[i]; ++i)\n" " f(i, \"345\");\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } @@ -3837,26 +3828,26 @@ class TestBufferOverrun : public TestFixture { " char x[10];\n" " return x-1;\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (portability) Undefined behaviour, pointer arithmetic 'x-1' is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (portability) Undefined behaviour, pointer arithmetic 'x-1' is out of bounds.\n", errout_str()); check("void f(int i) {\n" " char x[10];\n" " if (i == 123) {}\n" " dostuff(x-i);\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (portability) Undefined behaviour, when 'i' is 123 the pointer arithmetic 'x-i' is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (portability) Undefined behaviour, when 'i' is 123 the pointer arithmetic 'x-i' is out of bounds.\n", errout_str()); check("void f(int i) {\n" " char x[10];\n" " if (i == -20) {}\n" " dostuff(x-i);\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:4]: (portability) Undefined behaviour, when 'i' is -20 the pointer arithmetic 'x-i' is out of bounds.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:4]: (portability) Undefined behaviour, when 'i' is -20 the pointer arithmetic 'x-i' is out of bounds.\n", "", errout_str()); check("void f(const char *x[10]) {\n" " return x-4;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void strcat1() { @@ -3866,7 +3857,7 @@ class TestBufferOverrun : public TestFixture { " strcat(x.a, \"aa\");\n" " strcat(x.a, \"aa\");\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:5]: (error) Buffer is accessed out of bounds.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:5]: (error) Buffer is accessed out of bounds.\n", "", errout_str()); } void varid1() { @@ -3879,7 +3870,7 @@ class TestBufferOverrun : public TestFixture { " str[30] = 0;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void varid2() { // #4764 @@ -3887,7 +3878,7 @@ class TestBufferOverrun : public TestFixture { " void bar() { return; }\n" " type<> member[1];\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void assign1() { @@ -3897,7 +3888,7 @@ class TestBufferOverrun : public TestFixture { "{\n" " str[3] = 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (error) Array 'str[3]' accessed at index 3, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Array 'str[3]' accessed at index 3, which is out of bounds.\n", errout_str()); } void alloc_new() { @@ -3906,7 +3897,7 @@ class TestBufferOverrun : public TestFixture { " char *s; s = new char[10];\n" " s[10] = 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Array 's[10]' accessed at index 10, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Array 's[10]' accessed at index 10, which is out of bounds.\n", errout_str()); // ticket #1670 - false negative when using return check("char f()\n" @@ -3914,7 +3905,7 @@ class TestBufferOverrun : public TestFixture { " int *s; s = new int[10];\n" " return s[10];\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Array 's[10]' accessed at index 10, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Array 's[10]' accessed at index 10, which is out of bounds.\n", errout_str()); check("struct Fred { char c[10]; };\n" "char f()\n" @@ -3922,12 +3913,12 @@ class TestBufferOverrun : public TestFixture { " Fred *f; f = new Fred;\n" " return f->c[10];\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (error) Array 'f->c[10]' accessed at index 10, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Array 'f->c[10]' accessed at index 10, which is out of bounds.\n", errout_str()); check("static const size_t MAX_SIZE = UNAVAILABLE_TO_CPPCHECK;\n" "struct Thing { char data[MAX_SIZE]; };\n" "char f4(const Thing& t) { return !t.data[0]; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() {\n" " char * buf; buf = new char[8];\n" @@ -3937,7 +3928,7 @@ class TestBufferOverrun : public TestFixture { " buf[8] = 0;\n" " delete [] buf;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() {\n" " char * buf; buf = new char[8];\n" @@ -3947,7 +3938,7 @@ class TestBufferOverrun : public TestFixture { " buf[9] = 0;\n" " delete [] buf;\n" "}"); - ASSERT_EQUALS("[test.cpp:6]: (error) Array 'buf[9]' accessed at index 9, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (error) Array 'buf[9]' accessed at index 9, which is out of bounds.\n", errout_str()); check("void foo()\n" "{\n" @@ -3955,7 +3946,7 @@ class TestBufferOverrun : public TestFixture { " char *s; s = new char[Size];\n" " s[Size] = 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (error) Array 's[10]' accessed at index 10, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Array 's[10]' accessed at index 10, which is out of bounds.\n", errout_str()); check("void foo()\n" "{\n" @@ -3963,7 +3954,7 @@ class TestBufferOverrun : public TestFixture { " E *e; e = new E[10];\n" " e[10] = ZERO;\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (error) Array 'e[10]' accessed at index 10, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Array 'e[10]' accessed at index 10, which is out of bounds.\n", errout_str()); } // data is allocated with malloc @@ -3973,14 +3964,14 @@ class TestBufferOverrun : public TestFixture { " char *s; s = (char *)malloc(10);\n" " s[10] = 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Array 's[10]' accessed at index 10, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Array 's[10]' accessed at index 10, which is out of bounds.\n", errout_str()); // ticket #842 check("void f() {\n" " int *tab4 = (int *)malloc(20 * sizeof(int));\n" " tab4[20] = 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Array 'tab4[20]' accessed at index 20, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Array 'tab4[20]' accessed at index 20, which is out of bounds.\n", errout_str()); // ticket #1478 check("void foo() {\n" @@ -3989,7 +3980,7 @@ class TestBufferOverrun : public TestFixture { " p = (char *)malloc(10);\n" " p[10] = 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (error) Array 'p[10]' accessed at index 10, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Array 'p[10]' accessed at index 10, which is out of bounds.\n", errout_str()); // ticket #1134 check("void f() {\n" @@ -3997,7 +3988,7 @@ class TestBufferOverrun : public TestFixture { " x = (int *)malloc(10 * sizeof(int));\n" " x[10] = 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Array 'x[10]' accessed at index 10, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Array 'x[10]' accessed at index 10, which is out of bounds.\n", errout_str()); check("void f() {\n" " int *tab4; tab4 = malloc(20 * sizeof(int));\n" @@ -4007,7 +3998,7 @@ class TestBufferOverrun : public TestFixture { " tab4[20] = 0;\n" " free(tab4);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " int *tab4 = malloc(20 * sizeof(int));\n" @@ -4016,49 +4007,49 @@ class TestBufferOverrun : public TestFixture { " tab4[20] = 0;\n" " free(tab4);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " enum E { Size = 20 };\n" " E *tab4 = (E *)malloc(Size * 4);\n" " tab4[Size] = Size;\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Array 'tab4[20]' accessed at index 20, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Array 'tab4[20]' accessed at index 20, which is out of bounds.\n", errout_str()); check("void f() {\n" " enum E { Size = 20 };\n" " E *tab4 = (E *)malloc(4 * Size);\n" " tab4[Size] = Size;\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Array 'tab4[20]' accessed at index 20, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Array 'tab4[20]' accessed at index 20, which is out of bounds.\n", errout_str()); check("void f() {\n" " enum E { ZERO };\n" " E *tab4 = (E *)malloc(20 * sizeof(E));\n" " tab4[20] = ZERO;\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Array 'tab4[20]' accessed at index 20, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Array 'tab4[20]' accessed at index 20, which is out of bounds.\n", errout_str()); check("void f() {\n" // #8721 " unsigned char **cache = malloc(32);\n" " cache[i] = malloc(65536);\n" " cache[i][0xFFFF] = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " int **a = malloc(2 * sizeof(int*));\n" " for (int i = 0; i < 3; i++)\n" " a[i] = NULL;\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Array 'a[2]' accessed at index 2, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Array 'a[2]' accessed at index 2, which is out of bounds.\n", errout_str()); check("void f() {\n" " int **a = new int*[2];\n" " for (int i = 0; i < 3; i++)\n" " a[i] = NULL;\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Array 'a[2]' accessed at index 2, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Array 'a[2]' accessed at index 2, which is out of bounds.\n", errout_str()); } // statically allocated buffer @@ -4068,21 +4059,21 @@ class TestBufferOverrun : public TestFixture { " const char *s = \"123\";\n" " s[10] = 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Array 's[4]' accessed at index 10, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Array 's[4]' accessed at index 10, which is out of bounds.\n", errout_str()); check("void foo()\n" "{\n" " char *s; s = \"\";\n" " s[10] = 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Array 's[1]' accessed at index 10, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Array 's[1]' accessed at index 10, which is out of bounds.\n", errout_str()); check("void foo() {\n" " const char *s = \"\";\n" " s = y();\n" " s[10] = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo()\n" // #7718 "{\n" @@ -4090,7 +4081,7 @@ class TestBufferOverrun : public TestFixture { " s.resize(100);\n" " s[10] = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } // data is allocated with alloca @@ -4100,7 +4091,7 @@ class TestBufferOverrun : public TestFixture { " char *s = (char *)alloca(10);\n" " s[10] = 0;\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:4]: (error) Array 's[10]' accessed at index 10, which is out of bounds.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:4]: (error) Array 's[10]' accessed at index 10, which is out of bounds.\n", "", errout_str()); } /* void countSprintfLength() const { @@ -4196,13 +4187,13 @@ class TestBufferOverrun : public TestFixture { " char c[10];\n" " mymemset(c, 0, 10);\n" "}", settings); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " char c[10];\n" " mymemset(c, 0, 11);\n" "}", settings); - ASSERT_EQUALS("[test.cpp:3]: (error) Buffer is accessed out of bounds: c\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Buffer is accessed out of bounds: c\n", errout_str()); check("struct S {\n" " char a[5];\n" @@ -4211,79 +4202,79 @@ class TestBufferOverrun : public TestFixture { " S s;\n" " mymemset(s.a, 0, 10);\n" "}", settings); - ASSERT_EQUALS("[test.cpp:6]: (error) Buffer is accessed out of bounds: s.a\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (error) Buffer is accessed out of bounds: s.a\n", errout_str()); check("void foo() {\n" " char s[10];\n" " mymemset(s, 0, '*');\n" "}", settings); TODO_ASSERT_EQUALS("[test.cpp:3]: (warning) The size argument is given as a char constant.\n" - "[test.cpp:3]: (error) Buffer is accessed out of bounds: s\n", "[test.cpp:3]: (error) Buffer is accessed out of bounds: s\n", errout.str()); + "[test.cpp:3]: (error) Buffer is accessed out of bounds: s\n", "[test.cpp:3]: (error) Buffer is accessed out of bounds: s\n", errout_str()); // ticket #836 check("void f(void) {\n" " char a[10];\n" " mymemset(a+5, 0, 10);\n" "}", settings); - TODO_ASSERT_EQUALS("[test.cpp:3]: (error) Buffer is accessed out of bounds: a\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:3]: (error) Buffer is accessed out of bounds: a\n", "", errout_str()); // Ticket #909 check("void f(void) {\n" " char str[] = \"abcd\";\n" " mymemset(str, 0, 6);\n" "}", settings); - ASSERT_EQUALS("[test.cpp:3]: (error) Buffer is accessed out of bounds: str\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Buffer is accessed out of bounds: str\n", errout_str()); check("void f(void) {\n" " char str[] = \"abcd\";\n" " mymemset(str, 0, 5);\n" "}", settings); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(void) {\n" " wchar_t str[] = L\"abcd\";\n" " mymemset(str, 0, 21);\n" "}", settings); - ASSERT_EQUALS("[test.cpp:3]: (error) Buffer is accessed out of bounds: str\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Buffer is accessed out of bounds: str\n", errout_str()); check("void f(void) {\n" " wchar_t str[] = L\"abcd\";\n" " mymemset(str, 0, 20);\n" "}", settings); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // ticket #1659 - overflowing variable when using memcpy check("void f(void) {\n" " char c;\n" " mymemset(&c, 0, 4);\n" "}", settings); - TODO_ASSERT_EQUALS("[test.cpp:3]: (error) Buffer is accessed out of bounds: c\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:3]: (error) Buffer is accessed out of bounds: c\n", "", errout_str()); // ticket #2121 - buffer access out of bounds when using uint32_t check("void f(void) {\n" " unknown_type_t buf[4];\n" " mymemset(buf, 0, 100);\n" "}", settings); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #3124 - multidimensional array check("int main() {\n" " char b[5][6];\n" " mymemset(b, 0, 5 * 6);\n" "}", settings); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int main() {\n" " char b[5][6];\n" " mymemset(b, 0, 6 * 6);\n" "}", settings); - ASSERT_EQUALS("[test.cpp:3]: (error) Buffer is accessed out of bounds: b\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Buffer is accessed out of bounds: b\n", errout_str()); check("int main() {\n" " char b[5][6];\n" " mymemset(b, 0, 31);\n" "}", settings); - ASSERT_EQUALS("[test.cpp:3]: (error) Buffer is accessed out of bounds: b\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Buffer is accessed out of bounds: b\n", errout_str()); // #4968 - not standard function check("void f() {\n" @@ -4292,7 +4283,7 @@ class TestBufferOverrun : public TestFixture { " foo::mymemset(str, 0, 100);\n" " std::mymemset(str, 0, 100);\n" "}", settings); - TODO_ASSERT_EQUALS("[test.cpp:5]: (error) Buffer is accessed out of bounds: str\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:5]: (error) Buffer is accessed out of bounds: str\n", "", errout_str()); // #5257 - check strings check("void f() {\n" @@ -4300,18 +4291,18 @@ class TestBufferOverrun : public TestFixture { "}", settings); TODO_ASSERT_EQUALS("[test.cpp:2]: (error) Buffer is accessed out of bounds.\n", "", - errout.str()); + errout_str()); check("void f() {\n" " mymemset(temp, \"abc\", 4);\n" "}", settings); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" // #6816 - fp when array has known string value " char c[10] = \"c\";\n" " mymemset(c, 0, 10);\n" "}", settings); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void minsize_sizeof() { @@ -4333,36 +4324,36 @@ class TestBufferOverrun : public TestFixture { " char c[7];\n" " mystrncpy(c, \"hello\", 7);\n" "}", settings); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " char c[6];\n" " mystrncpy(c,\"hello\",6);\n" "}", settings); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " char c[5];\n" " mystrncpy(c,\"hello\",6);\n" "}", settings); - ASSERT_EQUALS("[test.cpp:3]: (error) Buffer is accessed out of bounds: c\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Buffer is accessed out of bounds: c\n", errout_str()); check("void f() {\n" " char c[6];\n" " mystrncpy(c,\"hello!\",7);\n" "}", settings); - ASSERT_EQUALS("[test.cpp:3]: (error) Buffer is accessed out of bounds: c\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Buffer is accessed out of bounds: c\n", errout_str()); check("void f(unsigned int addr) {\n" " memset((void *)addr, 0, 1000);\n" "}", settings0); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct AB { char a[10]; };\n" "void foo(AB *ab) {\n" " mystrncpy(x, ab->a, 100);\n" "}", settings); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void a(char *p) { mystrncpy(p,\"hello world!\",10); }\n" // #3168 "void b() {\n" @@ -4371,7 +4362,7 @@ class TestBufferOverrun : public TestFixture { "}", settings); TODO_ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:1]: (error) Buffer is accessed out of bounds: buf\n", "", - errout.str()); + errout_str()); } void minsize_strlen() { @@ -4395,13 +4386,13 @@ class TestBufferOverrun : public TestFixture { " char str[3];\n" " mysprintf(str, \"test\");\n" "}", settings); - ASSERT_EQUALS("[test.cpp:3]: (error) Buffer is accessed out of bounds: str\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Buffer is accessed out of bounds: str\n", errout_str()); check("void f() {\n" " char str[5];\n" " mysprintf(str, \"%s\", \"abcde\");\n" "}", settings); - ASSERT_EQUALS("[test.cpp:3]: (error) Buffer is accessed out of bounds: str\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Buffer is accessed out of bounds: str\n", errout_str()); check("int getnumber();\n" "void f()\n" @@ -4409,51 +4400,51 @@ class TestBufferOverrun : public TestFixture { " char str[5];\n" " mysprintf(str, \"%d: %s\", getnumber(), \"abcde\");\n" "}", settings); - ASSERT_EQUALS("[test.cpp:5]: (error) Buffer is accessed out of bounds: str\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Buffer is accessed out of bounds: str\n", errout_str()); check("void f() {\n" " char str[5];\n" " mysprintf(str, \"test%s\", \"\");\n" "}", settings); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " char *str = new char[5];\n" " mysprintf(str, \"abcde\");\n" "}", settings); - ASSERT_EQUALS("[test.cpp:3]: (error) Buffer is accessed out of bounds: str\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Buffer is accessed out of bounds: str\n", errout_str()); check("void f(int condition) {\n" " char str[5];\n" " mysprintf(str, \"test%s\", condition ? \"12\" : \"34\");\n" "}", settings); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int condition) {\n" " char str[5];\n" " mysprintf(str, \"test%s\", condition ? \"12\" : \"345\");\n" "}", settings); - TODO_ASSERT_EQUALS("error", "", errout.str()); + TODO_ASSERT_EQUALS("error", "", errout_str()); check("struct Foo { char a[1]; };\n" "void f() {\n" " struct Foo x;\n" " mysprintf(x.a, \"aa\");\n" "}", settings); - ASSERT_EQUALS("[test.cpp:4]: (error) Buffer is accessed out of bounds: x.a\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Buffer is accessed out of bounds: x.a\n", errout_str()); // ticket #900 check("void f() {\n" " char *a = new char(30);\n" " mysprintf(a, \"a\");\n" "}", settings); - ASSERT_EQUALS("[test.cpp:3]: (error) Buffer is accessed out of bounds: a\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Buffer is accessed out of bounds: a\n", errout_str()); check("void f(char value) {\n" " char *a = new char(value);\n" " mysprintf(a, \"a\");\n" "}", settings); - ASSERT_EQUALS("[test.cpp:3]: (error) Buffer is accessed out of bounds: a\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Buffer is accessed out of bounds: a\n", errout_str()); // This is out of bounds if 'sizeof(ABC)' is 1 (No padding) check("struct Foo { char a[1]; };\n" @@ -4461,21 +4452,21 @@ class TestBufferOverrun : public TestFixture { " struct Foo *x = malloc(sizeof(Foo));\n" " mysprintf(x->a, \"aa\");\n" "}", settings); - TODO_ASSERT_EQUALS("[test.cpp:4]: (error, inconclusive) Buffer is accessed out of bounds: x.a\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:4]: (error, inconclusive) Buffer is accessed out of bounds: x.a\n", "", errout_str()); check("struct Foo { char a[1]; };\n" "void f() {\n" " struct Foo *x = malloc(sizeof(Foo) + 10);\n" " mysprintf(x->a, \"aa\");\n" "}", settings); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct Foo { char a[1]; };\n" "void f() {\n" " struct Foo x;\n" " mysprintf(x.a, \"aa\");\n" "}", settings); - ASSERT_EQUALS("[test.cpp:4]: (error) Buffer is accessed out of bounds: x.a\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Buffer is accessed out of bounds: x.a\n", errout_str()); check("struct Foo {\n" // #6668 - unknown size " char a[LEN];\n" @@ -4484,7 +4475,7 @@ class TestBufferOverrun : public TestFixture { "void Foo::f() {\n" " mysprintf(a, \"abcd\");\n" "}", settings); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void minsize_mul() { @@ -4505,13 +4496,13 @@ class TestBufferOverrun : public TestFixture { " char c[5];\n" " myfread(c, 1, 5, stdin);\n" "}", settings); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " char c[5];\n" " myfread(c, 1, 6, stdin);\n" "}", settings); - ASSERT_EQUALS("[test.cpp:3]: (error) Buffer is accessed out of bounds: c\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Buffer is accessed out of bounds: c\n", errout_str()); } // extracttests.enable @@ -4521,7 +4512,7 @@ class TestBufferOverrun : public TestFixture { "{\n" " UnknownType *a = malloc(4);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } // extracttests.disable void terminateStrncpy1() { @@ -4533,26 +4524,26 @@ class TestBufferOverrun : public TestFixture { " strncpy(baz, bar, 100);\n" " baz[99] = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo ( char *bar ) {\n" " char baz[100];\n" " strncpy(baz, bar, 100);\n" " baz[99] = '\\0';\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo ( char *bar ) {\n" " char baz[100];\n" " strncpy(baz, bar, 100);\n" " baz[x+1] = '\\0';\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Test with invalid code that there is no segfault check("char baz[100];\n" "strncpy(baz, \"var\", 100)"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Test that there are no duplicate error messages check("void foo ( char *bar ) {\n" @@ -4561,7 +4552,7 @@ class TestBufferOverrun : public TestFixture { " foo(baz);\n" " foo(baz);\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning, inconclusive) The buffer 'baz' may not be null-terminated after the call to strncpy().\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning, inconclusive) The buffer 'baz' may not be null-terminated after the call to strncpy().\n", errout_str()); } void terminateStrncpy2() { @@ -4571,7 +4562,7 @@ class TestBufferOverrun : public TestFixture { " bar[99] = 0;\n" " return strdup(baz);\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning, inconclusive) The buffer 'baz' may not be null-terminated after the call to strncpy().\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning, inconclusive) The buffer 'baz' may not be null-terminated after the call to strncpy().\n", errout_str()); } void terminateStrncpy3() { @@ -4586,7 +4577,7 @@ class TestBufferOverrun : public TestFixture { "void bar(char *p) {\n" " strncpy(p, str, 100);\n" "}\n"); - ASSERT_EQUALS("[test.cpp:4]: (warning, inconclusive) The buffer 'str' may not be null-terminated after the call to strncpy().\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (warning, inconclusive) The buffer 'str' may not be null-terminated after the call to strncpy().\n", errout_str()); } void terminateStrncpy4() { @@ -4594,13 +4585,13 @@ class TestBufferOverrun : public TestFixture { " char buf[4];\n" " strncpy(buf, \"ab\", 4);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void bar() {\n" " char buf[4];\n" " strncpy(buf, \"abcde\", 4);\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning, inconclusive) The buffer 'buf' may not be null-terminated after the call to strncpy().\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning, inconclusive) The buffer 'buf' may not be null-terminated after the call to strncpy().\n", errout_str()); } void terminateStrncpy5() { // #9944 @@ -4610,14 +4601,14 @@ class TestBufferOverrun : public TestFixture { " return;\n" " strncpy(v, buf.c_str(), sizeof(v));\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(const std::string& buf) {\n" " char v[255];\n" " if (buf.size() >= sizeof(v))\n" " strncpy(v, buf.c_str(), sizeof(v));\n" "}\n"); - ASSERT_EQUALS("[test.cpp:4]: (warning, inconclusive) The buffer 'v' may not be null-terminated after the call to strncpy().\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (warning, inconclusive) The buffer 'v' may not be null-terminated after the call to strncpy().\n", errout_str()); } // extracttests.enable @@ -4646,7 +4637,7 @@ class TestBufferOverrun : public TestFixture { " char a[10];\n" " f2(a);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } @@ -4662,7 +4653,7 @@ class TestBufferOverrun : public TestFixture { " struct A *str;\n" " str = malloc(4);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void crash2() { @@ -4727,7 +4718,7 @@ class TestBufferOverrun : public TestFixture { " }\n" " return 0;\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:7]: (error) Buffer overrun possible for long command line arguments.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:7]: (error) Buffer overrun possible for long command line arguments.\n", "", errout_str()); check("int main(int argc, char *argv[])\n" "{\n" @@ -4740,112 +4731,112 @@ class TestBufferOverrun : public TestFixture { " }\n" " return 0;\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:7]: (error) Buffer overrun possible for long command line arguments.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:7]: (error) Buffer overrun possible for long command line arguments.\n", "", errout_str()); check("int main(const int argc, char* argv[])\n" "{\n" " char prog[10];\n" " strcpy(prog, argv[0]);\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:4]: (error) Buffer overrun possible for long command line arguments.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:4]: (error) Buffer overrun possible for long command line arguments.\n", "", errout_str()); check("int main(int argc, const char* argv[])\n" "{\n" " char prog[10];\n" " strcpy(prog, argv[0]);\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:4]: (error) Buffer overrun possible for long command line arguments.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:4]: (error) Buffer overrun possible for long command line arguments.\n", "", errout_str()); check("int main(const int argc, const char* argv[])\n" "{\n" " char prog[10];\n" " strcpy(prog, argv[0]);\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:4]: (error) Buffer overrun possible for long command line arguments.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:4]: (error) Buffer overrun possible for long command line arguments.\n", "", errout_str()); check("int main(int argc, char* argv[])\n" "{\n" " char prog[10] = {'\\0'};\n" " strcat(prog, argv[0]);\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:4]: (error) Buffer overrun possible for long command line arguments.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:4]: (error) Buffer overrun possible for long command line arguments.\n", "", errout_str()); check("int main(int argc, char **argv, char **envp)\n" "{\n" " char prog[10];\n" " strcpy(prog, argv[0]);\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:4]: (error) Buffer overrun possible for long command line arguments.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:4]: (error) Buffer overrun possible for long command line arguments.\n", "", errout_str()); check("int main(int argc, const char *const *const argv, char **envp)\n" "{\n" " char prog[10];\n" " strcpy(prog, argv[0]);\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:4]: (error) Buffer overrun possible for long command line arguments.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:4]: (error) Buffer overrun possible for long command line arguments.\n", "", errout_str()); check("int main(const int argc, const char *const *const argv, const char *const *const envp)\n" "{\n" " char prog[10];\n" " strcpy(prog, argv[0]);\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:4]: (error) Buffer overrun possible for long command line arguments.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:4]: (error) Buffer overrun possible for long command line arguments.\n", "", errout_str()); check("int main(int argc, char **argv, char **envp)\n" "{\n" " char prog[10] = {'\\0'};\n" " strcat(prog, argv[0]);\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:4]: (error) Buffer overrun possible for long command line arguments.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:4]: (error) Buffer overrun possible for long command line arguments.\n", "", errout_str()); check("int main(const int argc, const char **argv, char **envp)\n" "{\n" " char prog[10] = {'\\0'};\n" " strcat(prog, argv[0]);\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:4]: (error) Buffer overrun possible for long command line arguments.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:4]: (error) Buffer overrun possible for long command line arguments.\n", "", errout_str()); check("int main(int argc, const char **argv, char **envp)\n" "{\n" " char prog[10] = {'\\0'};\n" " strcat(prog, argv[0]);\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:4]: (error) Buffer overrun possible for long command line arguments.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:4]: (error) Buffer overrun possible for long command line arguments.\n", "", errout_str()); check("int main(const int argc, char **argv, char **envp)\n" "{\n" " char prog[10] = {'\\0'};\n" " strcat(prog, argv[0]);\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:4]: (error) Buffer overrun possible for long command line arguments.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:4]: (error) Buffer overrun possible for long command line arguments.\n", "", errout_str()); check("int main(int argc, char **options)\n" "{\n" " char prog[10];\n" " strcpy(prog, options[0]);\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:4]: (error) Buffer overrun possible for long command line arguments.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:4]: (error) Buffer overrun possible for long command line arguments.\n", "", errout_str()); check("int main(int argc, char **options)\n" "{\n" " char prog[10] = {'\\0'};\n" " strcat(prog, options[0]);\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:4]: (error) Buffer overrun possible for long command line arguments.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:4]: (error) Buffer overrun possible for long command line arguments.\n", "", errout_str()); check("int main(int argc, char **options)\n" "{\n" " char prog[10];\n" " strcpy(prog, *options);\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:4]: (error) Buffer overrun possible for long command line arguments.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:4]: (error) Buffer overrun possible for long command line arguments.\n", "", errout_str()); check("int main(int argc, char **options)\n" "{\n" " char prog[10];\n" " strcpy(prog+3, *options);\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:4]: (error) Buffer overrun possible for long command line arguments.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:4]: (error) Buffer overrun possible for long command line arguments.\n", "", errout_str()); check("int main(int argc, char **argv, char **envp)\n" "{\n" @@ -4853,7 +4844,7 @@ class TestBufferOverrun : public TestFixture { " if (strlen(argv[0]) < 10)\n" " strcpy(prog, argv[0]);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int main(int argc, char **argv, char **envp)\n" "{\n" @@ -4861,7 +4852,7 @@ class TestBufferOverrun : public TestFixture { " if (10 > strlen(argv[0]))\n" " strcat(prog, argv[0]);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int main(int argc, char **argv, char **envp)\n" "{\n" @@ -4869,7 +4860,7 @@ class TestBufferOverrun : public TestFixture { " argv[0][0] = '\\0';\n" " strcpy(prog, argv[0]);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #5835 check("int main(int argc, char* argv[]) {\n" @@ -4878,17 +4869,17 @@ class TestBufferOverrun : public TestFixture { " strcpy(prog, argv[0]);\n" "}"); TODO_ASSERT_EQUALS("[test.cpp:3]: (error) Buffer overrun possible for long command line arguments.\n" - "[test.cpp:4]: (error) Buffer overrun possible for long command line arguments.\n", "", errout.str()); + "[test.cpp:4]: (error) Buffer overrun possible for long command line arguments.\n", "", errout_str()); // #7964 check("int main(int argc, char *argv[]) {\n" " char *strcpy();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int main(int argc, char *argv[]) {\n" " char *strcat();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void checkBufferAllocatedWithStrlen() { @@ -4896,33 +4887,33 @@ class TestBufferOverrun : public TestFixture { " char *b = new char[strlen(a)];\n" " strcpy(b, a);\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:3]: (error) Buffer is accessed out of bounds.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:3]: (error) Buffer is accessed out of bounds.\n", "", errout_str()); check("void f(char *a) {\n" " char *b = new char[strlen(a) + 1];\n" " strcpy(b, a);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(char *a) {\n" " char *b = new char[strlen(a)];\n" " a[0] = '\\0';\n" " strcpy(b, a);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(char *a) {\n" " char *b = (char *)malloc(strlen(a));\n" " b = realloc(b, 10000);\n" " strcpy(b, a);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(char *a) {\n" " char *b = (char *)malloc(strlen(a));\n" " strcpy(b, a);\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:3]: (error) Buffer is accessed out of bounds.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:3]: (error) Buffer is accessed out of bounds.\n", "", errout_str()); check("void f(char *a) {\n" " char *b = (char *)malloc(strlen(a));\n" @@ -4930,31 +4921,31 @@ class TestBufferOverrun : public TestFixture { " strcpy(b, a);\n" " }\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:4]: (error) Buffer is accessed out of bounds.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:4]: (error) Buffer is accessed out of bounds.\n", "", errout_str()); check("void f(char *a) {\n" " char *b = (char *)malloc(strlen(a) + 1);\n" " strcpy(b, a);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(char *a, char *c) {\n" " char *b = (char *)realloc(c, strlen(a));\n" " strcpy(b, a);\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:3]: (error) Buffer is accessed out of bounds.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:3]: (error) Buffer is accessed out of bounds.\n", "", errout_str()); check("void f(char *a, char *c) {\n" " char *b = (char *)realloc(c, strlen(a) + 1);\n" " strcpy(b, a);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(char *a) {\n" " char *b = (char *)malloc(strlen(a));\n" " strcpy(b, a);\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:3]: (error) Buffer is accessed out of bounds.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:3]: (error) Buffer is accessed out of bounds.\n", "", errout_str()); } void scope() { @@ -4968,7 +4959,7 @@ class TestBufferOverrun : public TestFixture { " X x;\n" " x.buf[10] = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class A {\n" "public:\n" @@ -4980,13 +4971,15 @@ class TestBufferOverrun : public TestFixture { " A::X x;\n" " x.buf[10] = 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:9]: (error) Array 'x.buf[10]' accessed at index 10, which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:9]: (error) Array 'x.buf[10]' accessed at index 10, which is out of bounds.\n", errout_str()); } void getErrorMessages() { // Ticket #2292: segmentation fault when using --errorlist const Check& c = getCheck(); c.getErrorMessages(this, nullptr); + // we are not interested in the output - just consume it + (void)errout_str(); } void arrayIndexThenCheck() { @@ -4996,68 +4989,68 @@ class TestBufferOverrun : public TestFixture { " if (s[i] == 'x' && i < y) {\n" " }" "}"); - ASSERT_EQUALS("", errout.str()); // No message because i is unknown and thus gets no varid. Avoid an internalError here. + ASSERT_EQUALS("", errout_str()); // No message because i is unknown and thus gets no varid. Avoid an internalError here. check("void f(const char s[], int i) {\n" " if (s[i] == 'x' && i < y) {\n" " }" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Array index 'i' is used before limits check.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Array index 'i' is used before limits check.\n", errout_str()); check("void f(const char s[]) {\n" " for (int i = 0; s[i] == 'x' && i < y; ++i) {\n" " }" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Array index 'i' is used before limits check.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Array index 'i' is used before limits check.\n", errout_str()); check("void f(const int a[], unsigned i) {\n" " if((a[i] < 2) && (i <= 42)) {\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Array index 'i' is used before limits check.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Array index 'i' is used before limits check.\n", errout_str()); check("void f(const int a[], unsigned i) {\n" " if((a[i] < 2) && (42 >= i)) {\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Array index 'i' is used before limits check.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Array index 'i' is used before limits check.\n", errout_str()); // extracttests.start: int elen; check("void f(char* e, int y) {\n" " if (e[y] == '/' && elen > y + 1 && e[y + 1] == '?') {\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // extracttests.start: int foo(int); int func(int); check("void f(const int a[], unsigned i) {\n" " if(a[i] < func(i) && i <= 42) {\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Array index 'i' is used before limits check.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Array index 'i' is used before limits check.\n", errout_str()); check("void f(const int a[], unsigned i) {\n" " if (i <= 42 && a[i] < func(i)) {\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(const int a[], unsigned i) {\n" " if (foo(a[i] + 3) < func(i) && i <= 42) {\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Array index 'i' is used before limits check.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Array index 'i' is used before limits check.\n", errout_str()); check("void f(int i) {\n" // sizeof " sizeof(a)/sizeof(a[i]) && i < 10;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // extracttests.start: extern int buf[]; check("void f(int i) {\n" // ?: " if ((i < 10 ? buf[i] : 1) && (i < 5 ? buf[i] : 5)){}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void arrayIndexEarlyReturn() { // #6884 @@ -5072,7 +5065,7 @@ class TestBufferOverrun : public TestFixture { " }\n" " return name;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void bufferNotZeroTerminated() { @@ -5080,19 +5073,19 @@ class TestBufferOverrun : public TestFixture { " char c[6];\n" " strncpy(c,\"hello!\",6);\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning, inconclusive) The buffer 'c' may not be null-terminated after the call to strncpy().\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning, inconclusive) The buffer 'c' may not be null-terminated after the call to strncpy().\n", errout_str()); check("void f() {\n" " char c[6];\n" " memcpy(c,\"hello!\",6);\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:3]: (warning, inconclusive) The buffer 'c' may not be null-terminated after the call to memcpy().\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:3]: (warning, inconclusive) The buffer 'c' may not be null-terminated after the call to memcpy().\n", "", errout_str()); check("void f() {\n" " char c[6];\n" " memmove(c,\"hello!\",6);\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:3]: (warning, inconclusive) The buffer 'c' may not be null-terminated after the call to memmove().\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:3]: (warning, inconclusive) The buffer 'c' may not be null-terminated after the call to memmove().\n", "", errout_str()); } void negativeMemoryAllocationSizeError() { // #389 @@ -5102,7 +5095,7 @@ class TestBufferOverrun : public TestFixture { " a = new int[-1];\n" " delete [] a;\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Memory allocation size is negative.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Memory allocation size is negative.\n", errout_str()); check("void f()\n" "{\n" @@ -5110,7 +5103,7 @@ class TestBufferOverrun : public TestFixture { " a = (int *)malloc( -10 );\n" " free(a);\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:4]: (error) Memory allocation size is negative.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:4]: (error) Memory allocation size is negative.\n", "", errout_str()); check("void f()\n" "{\n" @@ -5118,14 +5111,14 @@ class TestBufferOverrun : public TestFixture { " a = (int *)malloc( -10);\n" " free(a);\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:4]: (error) Memory allocation size is negative.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:4]: (error) Memory allocation size is negative.\n", "", errout_str()); check("void f()\n" "{\n" " int *a;\n" " a = (int *)alloca( -10 );\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:4]: (error) Memory allocation size is negative.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:4]: (error) Memory allocation size is negative.\n", "", errout_str()); check("int* f(int n) {\n" // #11145 " int d = -1;\n" @@ -5134,7 +5127,7 @@ class TestBufferOverrun : public TestFixture { " int* p = new int[d];\n" " return p;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:5]: (warning, inconclusive) Memory allocation size is negative.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (warning, inconclusive) Memory allocation size is negative.\n", errout_str()); } void negativeArraySize() { @@ -5142,14 +5135,14 @@ class TestBufferOverrun : public TestFixture { " int a[sz];\n" "}\n" "void x() { f(-100); }"); - ASSERT_EQUALS("[test.cpp:2]: (error) Declaration of array 'a' with negative size is undefined behaviour\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (error) Declaration of array 'a' with negative size is undefined behaviour\n", errout_str()); // don't warn for constant sizes -> this is a compiler error so this is used for static assertions for instance check("int x, y;\n" "int a[-1];\n" "int b[x?1:-1];\n" "int c[x?y:-1];"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void pointerAddition1() { @@ -5157,21 +5150,18 @@ class TestBufferOverrun : public TestFixture { " char arr[10];\n" " char *p = arr + 20;\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (portability) Undefined behaviour, pointer arithmetic 'arr+20' is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (portability) Undefined behaviour, pointer arithmetic 'arr+20' is out of bounds.\n", errout_str()); check("char(*g())[1];\n" // #7950 "void f() {\n" " int a[2];\n" " int* b = a + sizeof(*g());\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } #define ctu(code) ctu_(code, __FILE__, __LINE__) void ctu_(const char code[], const char* file, int line) { - // Clear the error buffer.. - errout.str(""); - // Tokenize.. Tokenizer tokenizer(settings0, this); std::istringstream istr(code); @@ -5200,7 +5190,7 @@ class TestBufferOverrun : public TestFixture { " char *s = malloc(4);\n" " dostuff(s);\n" "}"); - ASSERT_EQUALS("[test.cpp:6] -> [test.cpp:7] -> [test.cpp:2]: (error) Array index out of bounds; buffer 'p' is accessed at offset -3.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6] -> [test.cpp:7] -> [test.cpp:2]: (error) Array index out of bounds; buffer 'p' is accessed at offset -3.\n", errout_str()); ctu("void dostuff(char *p) {\n" " p[4] = 0;\n" @@ -5210,7 +5200,7 @@ class TestBufferOverrun : public TestFixture { " char *s = malloc(4);\n" " dostuff(s);\n" "}"); - ASSERT_EQUALS("[test.cpp:6] -> [test.cpp:7] -> [test.cpp:2]: (error) Array index out of bounds; 'p' buffer size is 4 and it is accessed at offset 4.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6] -> [test.cpp:7] -> [test.cpp:2]: (error) Array index out of bounds; 'p' buffer size is 4 and it is accessed at offset 4.\n", errout_str()); ctu("void f(int* p) {\n" // #10415 " int b[1];\n" @@ -5222,7 +5212,7 @@ class TestBufferOverrun : public TestFixture { " a[0] = 5;\n" " f(a);\n" "}\n"); - ASSERT_EQUALS("[test.cpp:7] -> [test.cpp:9] -> [test.cpp:3]: (error) Array index out of bounds; 'p' buffer size is 4 and it is accessed at offset 20.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7] -> [test.cpp:9] -> [test.cpp:3]: (error) Array index out of bounds; 'p' buffer size is 4 and it is accessed at offset 20.\n", errout_str()); } void ctu_array() { @@ -5233,7 +5223,7 @@ class TestBufferOverrun : public TestFixture { " char str[4];\n" " dostuff(str);\n" "}"); - ASSERT_EQUALS("[test.cpp:6] -> [test.cpp:2]: (error) Array index out of bounds; 'p' buffer size is 4 and it is accessed at offset 10.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6] -> [test.cpp:2]: (error) Array index out of bounds; 'p' buffer size is 4 and it is accessed at offset 10.\n", errout_str()); ctu("static void memclr( char *data )\n" "{\n" @@ -5245,7 +5235,7 @@ class TestBufferOverrun : public TestFixture { " char str[5];\n" " memclr( str );\n" "}"); - ASSERT_EQUALS("[test.cpp:9] -> [test.cpp:3]: (error) Array index out of bounds; 'data' buffer size is 5 and it is accessed at offset 10.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:9] -> [test.cpp:3]: (error) Array index out of bounds; 'data' buffer size is 5 and it is accessed at offset 10.\n", errout_str()); ctu("static void memclr( int i, char *data )\n" "{\n" @@ -5257,7 +5247,7 @@ class TestBufferOverrun : public TestFixture { " char str[5];\n" " memclr( 0, str );\n" "}"); - ASSERT_EQUALS("[test.cpp:9] -> [test.cpp:3]: (error) Array index out of bounds; 'data' buffer size is 5 and it is accessed at offset 10.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:9] -> [test.cpp:3]: (error) Array index out of bounds; 'data' buffer size is 5 and it is accessed at offset 10.\n", errout_str()); ctu("static void memclr( int i, char *data )\n" "{\n" @@ -5270,7 +5260,7 @@ class TestBufferOverrun : public TestFixture { " memclr( 10, str );\n" "}"); TODO_ASSERT_EQUALS("[test.cpp:9] -> [test.cpp:3]: (possible error) Array index out of bounds.\n", - "", errout.str()); + "", errout_str()); // This is not an error ctu("static void memclr( char *data, int size )\n" @@ -5284,7 +5274,7 @@ class TestBufferOverrun : public TestFixture { " char str[5];\n" " memclr( str, 5 );\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #2097 ctu("void foo(int *p)\n" @@ -5298,7 +5288,7 @@ class TestBufferOverrun : public TestFixture { " int p[3];\n" " foo(p+1);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #9112 ctu("static void get_mac_address(const u8 *strbuf)\n" @@ -5311,7 +5301,7 @@ class TestBufferOverrun : public TestFixture { " u8 macstrbuf[17] = { 0 };\n" " get_mac_address(macstrbuf);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #9788 ctu("void f1(char *s) { s[2] = 'B'; }\n" @@ -5323,7 +5313,7 @@ class TestBufferOverrun : public TestFixture { "}\n"); ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:1]: (error) Array index out of bounds; 's' buffer size is 2 and it is accessed at offset 2.\n" "[test.cpp:6] -> [test.cpp:2]: (error) Array index out of bounds; 's' buffer size is 2 and it is accessed at offset 2.\n", - errout.str()); + errout_str()); // #5140 ctu("void g(const char* argv[]) { std::cout << \"argv: \" << argv[4] << std::endl; }\n" @@ -5332,7 +5322,7 @@ class TestBufferOverrun : public TestFixture { " g(argv);\n" "}\n"); ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:1]: (error) Array index out of bounds; 'argv' buffer size is 1 and it is accessed at offset 4.\n", - errout.str()); + errout_str()); ctu("void g(const char* argv[]) { std::cout << \"argv: \" << argv[5] << std::endl; }\n" "void f() {\n" @@ -5340,14 +5330,14 @@ class TestBufferOverrun : public TestFixture { " g(argv);\n" "}\n"); ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:1]: (error) Array index out of bounds; 'argv' buffer size is 1 and it is accessed at offset 5.\n", - errout.str()); + errout_str()); ctu("void g(int *b) { b[0] = 0; }\n" "void f() {\n" " GLint a[1];\n" " g(a);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); ctu("const int a[1] = { 1 };\n" // #11042 "void g(const int* d) {\n" @@ -5357,7 +5347,7 @@ class TestBufferOverrun : public TestFixture { " g(a);\n" "}\n"); ASSERT_EQUALS("[test.cpp:6] -> [test.cpp:3]: (error) Array index out of bounds; 'd' buffer size is 4 and it is accessed at offset 8.\n", - errout.str()); + errout_str()); } void ctu_variable() { @@ -5368,7 +5358,7 @@ class TestBufferOverrun : public TestFixture { " int x = 4;\n" " dostuff(&x);\n" "}"); - ASSERT_EQUALS("[test.cpp:6] -> [test.cpp:2]: (error) Array index out of bounds; 'p' buffer size is 4 and it is accessed at offset 40.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6] -> [test.cpp:2]: (error) Array index out of bounds; 'p' buffer size is 4 and it is accessed at offset 40.\n", errout_str()); } void ctu_arithmetic() { @@ -5377,7 +5367,7 @@ class TestBufferOverrun : public TestFixture { " int x[3];\n" " dostuff(x);\n" "}"); - ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:1]: (error) Pointer arithmetic overflow; 'p' buffer size is 12\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:1]: (error) Pointer arithmetic overflow; 'p' buffer size is 12\n", errout_str()); ctu("void f(const char *p) {\n" // #11361 " const char* c = p + 1;\n" @@ -5386,7 +5376,7 @@ class TestBufferOverrun : public TestFixture { " const char s[N] = \"ab\";\n" " f(s);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void objectIndex() { @@ -5396,7 +5386,7 @@ class TestBufferOverrun : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:3] -> [test.cpp:3]: (error) The address of variable 'i' is accessed at non-zero index.\n", - errout.str()); + errout_str()); check("int f(int j) {\n" " int i;\n" @@ -5404,40 +5394,40 @@ class TestBufferOverrun : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:3] -> [test.cpp:3]: (warning) The address of variable 'i' might be accessed at non-zero index.\n", - errout.str()); + errout_str()); check("int f() {\n" " int i;\n" " return (&i)[0];\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f(int * i) {\n" " return i[1];\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f(std::vector i) {\n" " return i[1];\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f(std::vector i) {\n" " return i.data()[1];\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int* f(std::vector& i) {\n" " return &(i[1]);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A { int i; int j; };\n" "int f() {\n" " A x;\n" " return (&x.i)[0];\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A { int i; int j; };\n" "int f() {\n" @@ -5445,7 +5435,7 @@ class TestBufferOverrun : public TestFixture { " int * i = &x.i;\n" " return i[0];\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " int x = 0;\n" @@ -5453,7 +5443,7 @@ class TestBufferOverrun : public TestFixture { " m[0] = &x;\n" " m[1] = &x;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f() {\n" " int x = 0;\n" @@ -5463,7 +5453,7 @@ class TestBufferOverrun : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:4] -> [test.cpp:5]: (error) The address of variable 'x' is accessed at non-zero index.\n", - errout.str()); + errout_str()); check("int x = 0;\n" "int f() {\n" @@ -5473,7 +5463,7 @@ class TestBufferOverrun : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:4] -> [test.cpp:5]: (error) The address of variable 'x' is accessed at non-zero index.\n", - errout.str()); + errout_str()); check("int f(int * y) {\n" " int x = 0;\n" @@ -5482,7 +5472,7 @@ class TestBufferOverrun : public TestFixture { " m[1] = y;\n" " return m[1][1];\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void print(char** test);\n" "int main(){\n" @@ -5497,7 +5487,7 @@ class TestBufferOverrun : public TestFixture { TODO_ASSERT_EQUALS( "[test.cpp:4] -> [test.cpp:4] -> [test.cpp:9]: (warning) The address of local variable 'test' might be accessed at non-zero index.\n", "", - errout.str()); + errout_str()); check("void Bar(uint8_t data);\n" "void Foo(const uint8_t * const data, const uint8_t length) {\n" @@ -5508,7 +5498,7 @@ class TestBufferOverrun : public TestFixture { " const uint8_t data = 0U;\n" " Foo(&data,1U);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int foo(int n, int* p) {\n" " int res = 0;\n" @@ -5520,7 +5510,7 @@ class TestBufferOverrun : public TestFixture { " int single_value = 0;\n" " return foo(1, &single_value);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(const char* app, size_t applen) {\n" // #10137 " char* tmp_de = NULL;\n" @@ -5533,7 +5523,7 @@ class TestBufferOverrun : public TestFixture { " }\n" " free(*str);\n" "}\n", "test.c"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("template \n" "using vector = Eigen::Matrix;\n" @@ -5542,7 +5532,7 @@ class TestBufferOverrun : public TestFixture { " vector* out_row = &out(r, 0);\n" " out_row[c] = vector(1,2);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(const uint8_t* d, const uint8_t L) {\n" // #10092 " for (uint8_t i = 0U; i < L; ++i)\n" @@ -5552,45 +5542,45 @@ class TestBufferOverrun : public TestFixture { " const uint8_t u = 4;\n" " f(&u, N);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("uint32_t f(uint32_t u) {\n" // #10154 " return ((uint8_t*)&u)[3];\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("uint32_t f(uint32_t u) {\n" " return ((uint8_t*)&u)[4];\n" "}\n"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:2]: (error) The address of variable 'u' is accessed at non-zero index.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:2]: (error) The address of variable 'u' is accessed at non-zero index.\n", errout_str()); check("uint32_t f(uint32_t u) {\n" " return reinterpret_cast(&u)[3];\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("uint32_t f(uint32_t u) {\n" " return reinterpret_cast(&u)[4];\n" "}\n"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:2]: (error) The address of variable 'u' is accessed at non-zero index.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:2]: (error) The address of variable 'u' is accessed at non-zero index.\n", errout_str()); check("uint32_t f(uint32_t u) {\n" " uint8_t* p = (uint8_t*)&u;\n" " return p[3];\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("uint32_t f(uint32_t u) {\n" " uint8_t* p = (uint8_t*)&u;\n" " return p[4];\n" "}\n"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (error) The address of variable 'u' is accessed at non-zero index.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (error) The address of variable 'u' is accessed at non-zero index.\n", errout_str()); check("uint32_t f(uint32_t* pu) {\n" " uint8_t* p = (uint8_t*)pu;\n" " return p[4];\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S { uint8_t padding[500]; };\n" // #10133 "S s = { 0 };\n" @@ -5598,7 +5588,7 @@ class TestBufferOverrun : public TestFixture { " uint8_t* p = (uint8_t*)&s;\n" " return p[10];\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct X {\n" // #2654 " int a;\n" @@ -5611,7 +5601,7 @@ class TestBufferOverrun : public TestFixture { " (void)y[1];\n" " (void)y[2];\n" "}\n"); - TODO_ASSERT_EQUALS("error", "", errout.str()); + TODO_ASSERT_EQUALS("error", "", errout_str()); } void checkPipeParameterSize() { // #3521 @@ -5624,7 +5614,7 @@ class TestBufferOverrun : public TestFixture { " return;\n" " }\n" "}", settings); - ASSERT_EQUALS("[test.cpp:3]: (error) Buffer is accessed out of bounds: pipefd\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Buffer is accessed out of bounds: pipefd\n", errout_str()); check("void f(){\n" "int pipefd[2];\n" @@ -5632,7 +5622,7 @@ class TestBufferOverrun : public TestFixture { " return;\n" " }\n" "}", settings); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(){\n" "char pipefd[2];\n" @@ -5640,7 +5630,7 @@ class TestBufferOverrun : public TestFixture { " return;\n" " }\n" "}", settings); - ASSERT_EQUALS("[test.cpp:3]: (error) Buffer is accessed out of bounds: (int*)pipefd\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Buffer is accessed out of bounds: (int*)pipefd\n", errout_str()); check("void f(){\n" "char pipefd[20];\n" // Strange, but large enough @@ -5648,7 +5638,7 @@ class TestBufferOverrun : public TestFixture { " return;\n" " }\n" "}", settings); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } }; diff --git a/test/testcharvar.cpp b/test/testcharvar.cpp index 115ebb7baffd..15198feb2247 100644 --- a/test/testcharvar.cpp +++ b/test/testcharvar.cpp @@ -41,9 +41,6 @@ class TestCharVar : public TestFixture { #define check(code) check_(code, __FILE__, __LINE__) void check_(const char code[], const char* file, int line) { - // Clear the error buffer.. - errout.str(""); - // Tokenize.. Tokenizer tokenizer(settings, this); std::istringstream istr(code); @@ -61,7 +58,7 @@ class TestCharVar : public TestFixture { " unsigned char ch = 0x80;\n" " buf[ch] = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int buf[256];\n" "void foo()\n" @@ -69,7 +66,7 @@ class TestCharVar : public TestFixture { " char ch = 0x80;\n" " buf[ch] = 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (portability) 'char' type used as array index.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (portability) 'char' type used as array index.\n", errout_str()); check("int buf[256];\n" "void foo()\n" @@ -77,7 +74,7 @@ class TestCharVar : public TestFixture { " char ch = 0;\n" " buf[ch] = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int buf[256];\n" "void foo()\n" @@ -85,7 +82,7 @@ class TestCharVar : public TestFixture { " signed char ch = 0;\n" " buf[ch] = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int buf[256];\n" "void foo()\n" @@ -93,67 +90,67 @@ class TestCharVar : public TestFixture { " char ch = 0x80;\n" " buf[ch] = 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (portability) 'char' type used as array index.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (portability) 'char' type used as array index.\n", errout_str()); check("int buf[256];\n" "void foo(signed char ch)\n" "{\n" " buf[ch] = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int buf[256];\n" "void foo(char ch)\n" "{\n" " buf[ch] = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(char* buf)\n" "{\n" " char ch = 0x80;" " buf[ch] = 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (portability) 'char' type used as array index.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (portability) 'char' type used as array index.\n", errout_str()); check("void foo(char* buf)\n" "{\n" " char ch = 0;" " buf[ch] = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(char* buf)\n" "{\n" " buf['A'] = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(char* buf, char ch)\n" "{\n" " buf[ch] = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int flags[256];\n" "void foo(const char* str)\n" "{\n" " flags[*str] = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int flags[256];\n" "void foo(const char* str)\n" "{\n" " flags[(unsigned char)*str] = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(const char str[])\n" "{\n" " map[str] = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void array_index_2() { @@ -163,7 +160,7 @@ class TestCharVar : public TestFixture { " const char *s = \"abcde\";\n" " foo(s[i]);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void bitop() { @@ -171,32 +168,32 @@ class TestCharVar : public TestFixture { " signed char ch = -1;\n" " *result = a | ch;\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) When using 'char' variables in bit operations, sign extension can generate unexpected results.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) When using 'char' variables in bit operations, sign extension can generate unexpected results.\n", errout_str()); check("void foo(int *result) {\n" " unsigned char ch = -1;\n" " *result = a | ch;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(char *result) {\n" " signed char ch = -1;\n" " *result = a | ch;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // 0x03 & .. check("void foo(int *result) {\n" " signed char ch = -1;\n" " *result = 0x03 | ch;\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) When using 'char' variables in bit operations, sign extension can generate unexpected results.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) When using 'char' variables in bit operations, sign extension can generate unexpected results.\n", errout_str()); check("void foo(int *result) {\n" " signed char ch = -1;\n" " *result = 0x03 & ch;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } }; diff --git a/test/testclass.cpp b/test/testclass.cpp index 06b441306448..c68ee5ca1bad 100644 --- a/test/testclass.cpp +++ b/test/testclass.cpp @@ -247,8 +247,6 @@ class TestClass : public TestFixture { #define checkCopyCtorAndEqOperator(code) checkCopyCtorAndEqOperator_(code, __FILE__, __LINE__) void checkCopyCtorAndEqOperator_(const char code[], const char* file, int line) { - // Clear the error log - errout.str(""); const Settings settings = settingsBuilder().severity(Severity::warning).build(); Preprocessor preprocessor(settings); @@ -269,25 +267,25 @@ class TestClass : public TestFixture { " A(const A& other) { }\n" " A& operator=(const A& other) { return *this; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkCopyCtorAndEqOperator("class A\n" "{\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkCopyCtorAndEqOperator("class A\n" "{\n" " A(const A& other) { }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkCopyCtorAndEqOperator("class A\n" "{\n" " A& operator=(const A& other) { return *this; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkCopyCtorAndEqOperator("class A\n" @@ -295,7 +293,7 @@ class TestClass : public TestFixture { " A(const A& other) { }\n" " int x;\n" "};"); - TODO_ASSERT_EQUALS("[test.cpp:1]: (warning) The class 'A' has 'copy constructor' but lack of 'operator='.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:1]: (warning) The class 'A' has 'copy constructor' but lack of 'operator='.\n", "", errout_str()); // TODO the error message should be clarified. It should say something like 'copy constructor is empty and will not assign i and therefore the behaviour is different to the default assignment operator' checkCopyCtorAndEqOperator("class A\n" @@ -303,7 +301,7 @@ class TestClass : public TestFixture { " A& operator=(const A& other) { return *this; }\n" " int x;\n" "};"); - TODO_ASSERT_EQUALS("[test.cpp:1]: (warning) The class 'A' has 'operator=' but lack of 'copy constructor'.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:1]: (warning) The class 'A' has 'operator=' but lack of 'copy constructor'.\n", "", errout_str()); // TODO the error message should be clarified. It should say something like 'assignment operator does not assign i and therefore the behaviour is different to the default copy constructor' checkCopyCtorAndEqOperator("class A\n" @@ -311,7 +309,7 @@ class TestClass : public TestFixture { " A& operator=(const int &x) { this->x = x; return *this; }\n" " int x;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkCopyCtorAndEqOperator("class A {\n" "public:\n" @@ -331,7 +329,7 @@ class TestClass : public TestFixture { "private:\n" " static int i;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #7987 - Don't show warning when there is a move constructor checkCopyCtorAndEqOperator("struct S {\n" @@ -342,21 +340,18 @@ class TestClass : public TestFixture { " return *this;\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #8337 - False positive in copy constructor detection checkCopyCtorAndEqOperator("struct StaticListNode {\n" " StaticListNode(StaticListNode*& prev) : m_next(0) {}\n" " StaticListNode* m_next;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } #define checkExplicitConstructors(code) checkExplicitConstructors_(code, __FILE__, __LINE__) void checkExplicitConstructors_(const char code[], const char* file, int line) { - // Clear the error log - errout.str(""); - Preprocessor preprocessor(settings0); // Tokenize.. @@ -378,7 +373,7 @@ class TestClass : public TestFixture { " explicit Class(const std::string&) { }\n" " Class(int a, int b) { }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkExplicitConstructors("class Class {\n" " Class() = delete;\n" @@ -386,7 +381,7 @@ class TestClass : public TestFixture { " explicit Class(Class&& other) { }\n" " virtual int i() = 0;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkExplicitConstructors("class Class {\n" " Class() = delete;\n" @@ -394,37 +389,37 @@ class TestClass : public TestFixture { " Class(Class&& other) = delete;\n" " virtual int i() = 0;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkExplicitConstructors("class Class {\n" " Class(int i) { }\n" "};"); - ASSERT_EQUALS("[test.cpp:2]: (style) Class 'Class' has a constructor with 1 argument that is not explicit.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Class 'Class' has a constructor with 1 argument that is not explicit.\n", errout_str()); checkExplicitConstructors("class Class {\n" " Class(const Class& other) { }\n" " virtual int i() = 0;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkExplicitConstructors("class Class {\n" " Class(Class&& other) { }\n" " virtual int i() = 0;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #6585 checkExplicitConstructors("class Class {\n" " private: Class(const Class&);\n" " virtual int i() = 0;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkExplicitConstructors("class Class {\n" " public: Class(const Class&);\n" " virtual int i() = 0;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #7465: Error properly reported in templates checkExplicitConstructors("template struct Test {\n" @@ -435,7 +430,7 @@ class TestClass : public TestFixture { " Test test;\n" " return 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Struct 'Test < int >' has a constructor with 1 argument that is not explicit.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Struct 'Test < int >' has a constructor with 1 argument that is not explicit.\n", errout_str()); // #7465: No error for copy or move constructors checkExplicitConstructors("template struct Test {\n" @@ -448,7 +443,7 @@ class TestClass : public TestFixture { " Test test;\n" " return 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #8600 checkExplicitConstructors("struct A { struct B; };\n" @@ -456,12 +451,12 @@ class TestClass : public TestFixture { " B() = default;\n" " B(const B&) {}\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkExplicitConstructors("struct A{" " A(int, int y=2) {}" "};"); - ASSERT_EQUALS("[test.cpp:1]: (style) Struct 'A' has a constructor with 1 argument that is not explicit.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (style) Struct 'A' has a constructor with 1 argument that is not explicit.\n", errout_str()); checkExplicitConstructors("struct Foo {\n" // #10515 " template \n" @@ -474,27 +469,27 @@ class TestClass : public TestFixture { "struct Baz {\n" " explicit constexpr Baz(int) {}\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkExplicitConstructors("class Token;\n" // #11126 "struct Branch {\n" " Branch(Token* tok = nullptr) : endBlock(tok) {}\n" " Token* endBlock = nullptr;\n" "};\n"); - ASSERT_EQUALS("[test.cpp:3]: (style) Struct 'Branch' has a constructor with 1 argument that is not explicit.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Struct 'Branch' has a constructor with 1 argument that is not explicit.\n", errout_str()); checkExplicitConstructors("struct S {\n" " S(std::initializer_list il) : v(il) {}\n" " std::vector v;\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkExplicitConstructors("template\n" // #10977 "struct A {\n" " template\n" " A(Ts&&... ts) {}\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkExplicitConstructors("class Color {\n" // #7176 "public:\n" @@ -503,14 +498,11 @@ class TestClass : public TestFixture { "};\n"); ASSERT_EQUALS("[test.cpp:3]: (style) Class 'Color' has a constructor with 1 argument that is not explicit.\n" "[test.cpp:4]: (style) Class 'Color' has a constructor with 1 argument that is not explicit.\n", - errout.str()); + errout_str()); } #define checkDuplInheritedMembers(code) checkDuplInheritedMembers_(code, __FILE__, __LINE__) void checkDuplInheritedMembers_(const char code[], const char* file, int line) { - // Clear the error log - errout.str(""); - Preprocessor preprocessor(settings1); // Tokenize.. @@ -530,7 +522,7 @@ class TestClass : public TestFixture { "struct Derived : Base {\n" " int x;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkDuplInheritedMembers("class Base {\n" " protected:\n" @@ -539,7 +531,7 @@ class TestClass : public TestFixture { "struct Derived : Base {\n" " int x;\n" "};"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:6]: (warning) The struct 'Derived' defines member variable with name 'x' also defined in its parent class 'Base'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:6]: (warning) The struct 'Derived' defines member variable with name 'x' also defined in its parent class 'Base'.\n", errout_str()); checkDuplInheritedMembers("class Base {\n" " protected:\n" @@ -548,7 +540,7 @@ class TestClass : public TestFixture { "struct Derived : public Base {\n" " int x;\n" "};"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:6]: (warning) The struct 'Derived' defines member variable with name 'x' also defined in its parent class 'Base'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:6]: (warning) The struct 'Derived' defines member variable with name 'x' also defined in its parent class 'Base'.\n", errout_str()); checkDuplInheritedMembers("class Base0 {\n" " int x;\n" @@ -559,7 +551,7 @@ class TestClass : public TestFixture { "struct Derived : Base0, Base1 {\n" " int x;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkDuplInheritedMembers("class Base0 {\n" " protected:\n" @@ -571,7 +563,7 @@ class TestClass : public TestFixture { "struct Derived : Base0, Base1 {\n" " int x;\n" "};"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:9]: (warning) The struct 'Derived' defines member variable with name 'x' also defined in its parent class 'Base0'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:9]: (warning) The struct 'Derived' defines member variable with name 'x' also defined in its parent class 'Base0'.\n", errout_str()); checkDuplInheritedMembers("class Base0 {\n" " protected:\n" @@ -585,7 +577,7 @@ class TestClass : public TestFixture { " int x;\n" "};"); ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:10]: (warning) The struct 'Derived' defines member variable with name 'x' also defined in its parent class 'Base0'.\n" - "[test.cpp:7] -> [test.cpp:10]: (warning) The struct 'Derived' defines member variable with name 'x' also defined in its parent class 'Base1'.\n", errout.str()); + "[test.cpp:7] -> [test.cpp:10]: (warning) The struct 'Derived' defines member variable with name 'x' also defined in its parent class 'Base1'.\n", errout_str()); checkDuplInheritedMembers("class Base {\n" " int x;\n" @@ -593,7 +585,7 @@ class TestClass : public TestFixture { "struct Derived : Base {\n" " int y;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkDuplInheritedMembers("class A {\n" " int x;\n" @@ -601,20 +593,20 @@ class TestClass : public TestFixture { "struct B {\n" " int x;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Unknown 'Base' class checkDuplInheritedMembers("class Derived : public UnknownBase {\n" " int x;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkDuplInheritedMembers("class Base {\n" " int x;\n" "};\n" "class Derived : public Base {\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #6692 checkDuplInheritedMembers("namespace test1 {\n" @@ -626,7 +618,7 @@ class TestClass : public TestFixture { " int Value;\n" " };\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #9957 checkDuplInheritedMembers("class Base {\n" @@ -640,12 +632,12 @@ class TestClass : public TestFixture { "class Derived2 : public Derived1 {\n" " int i;\n" "};"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:10]: (warning) The class 'Derived2' defines member variable with name 'i' also defined in its parent class 'Base'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:10]: (warning) The class 'Derived2' defines member variable with name 'i' also defined in its parent class 'Base'.\n", errout_str()); // don't crash on recursive template checkDuplInheritedMembers("template\n" "struct BitInt : public BitInt { };"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // don't crash on recursive template checkDuplInheritedMembers("namespace _impl {\n" @@ -660,13 +652,13 @@ class TestClass : public TestFixture { " struct fn_traits\n" " : public fn_traits {};\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #10594 checkDuplInheritedMembers("template struct A { bool a = true; };\n" "struct B { bool a; };\n" "template<> struct A<1> : B {};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkDuplInheritedMembers("struct B {\n" " int g() const;\n" @@ -677,7 +669,7 @@ class TestClass : public TestFixture { " int f() const override { return g(); }\n" "};\n"); ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:6]: (warning) The struct 'D' defines member function with name 'g' also defined in its parent struct 'B'.\n", - errout.str()); + errout_str()); checkDuplInheritedMembers("struct B {\n" " int g() const;\n" @@ -685,7 +677,7 @@ class TestClass : public TestFixture { "struct D : B {\n" " int g(int) const;\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkDuplInheritedMembers("struct S {\n" " struct T {\n" @@ -695,7 +687,7 @@ class TestClass : public TestFixture { "struct T : S::T {\n" " T() : S::T() {}\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkDuplInheritedMembers("struct S {};\n" // #11827 "struct SPtr {\n" @@ -706,7 +698,7 @@ class TestClass : public TestFixture { "struct TPtr : public SPtr {\n" " T* operator->() const { return (T*)p; }\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkDuplInheritedMembers("struct B { virtual int& get() = 0; };\n" // #12311 "struct D : B {\n" @@ -714,7 +706,7 @@ class TestClass : public TestFixture { " int& get() override { return i; }\n" " const int& get() const { return i; }\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkDuplInheritedMembers("class Base {\n" // #12353 " public:\n" @@ -725,14 +717,11 @@ class TestClass : public TestFixture { "public:\n" " void Two() = delete;\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } #define checkCopyConstructor(code) checkCopyConstructor_(code, __FILE__, __LINE__) void checkCopyConstructor_(const char code[], const char* file, int line) { - // Clear the error log - errout.str(""); - Preprocessor preprocessor(settings3); // Tokenize.. @@ -763,7 +752,7 @@ class TestClass : public TestFixture { " F&operator=(const F&);\n" " ~F();\n" "};"); - TODO_ASSERT_EQUALS("[test.cpp:5]: (warning) Value of pointer 'p', which points to allocated memory, is copied in copy constructor instead of allocating new memory.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:5]: (warning) Value of pointer 'p', which points to allocated memory, is copied in copy constructor instead of allocating new memory.\n", "", errout_str()); checkCopyConstructor("class F {\n" " char *p;\n" @@ -779,7 +768,7 @@ class TestClass : public TestFixture { TODO_ASSERT_EQUALS("[test.cpp:4]: (warning) Value of pointer 'p', which points to allocated memory, is copied in copy constructor instead of allocating new memory.\n" "[test.cpp:3] -> [test.cpp:7]: (warning) Copy constructor does not allocate memory for member 'p' although memory has been allocated in other constructors.\n", "[test.cpp:4]: (warning) Value of pointer 'p', which points to allocated memory, is copied in copy constructor instead of allocating new memory.\n" - , errout.str()); + , errout_str()); checkCopyConstructor("class F\n" "{\n" @@ -799,7 +788,7 @@ class TestClass : public TestFixture { TODO_ASSERT_EQUALS("[test.cpp:5]: (warning) Value of pointer 'p', which points to allocated memory, is copied in copy constructor instead of allocating new memory.\n" "[test.cpp:5] -> [test.cpp:10]: (warning) Copy constructor does not allocate memory for member 'p' although memory has been allocated in other constructors.\n", "" - , errout.str()); + , errout_str()); checkCopyConstructor("class kalci\n" "{\n" @@ -826,7 +815,7 @@ class TestClass : public TestFixture { " ~kalci();\n" " kalci& operator=(const kalci&kalci);\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkCopyConstructor("class F\n" "{\n" @@ -851,7 +840,7 @@ class TestClass : public TestFixture { " ~F();\n" " F& operator=(const F&f);\n" "};"); - TODO_ASSERT_EQUALS("[test.cpp:14] -> [test.cpp:11]: (warning) Copy constructor does not allocate memory for member 'd' although memory has been allocated in other constructors.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:14] -> [test.cpp:11]: (warning) Copy constructor does not allocate memory for member 'd' although memory has been allocated in other constructors.\n", "", errout_str()); checkCopyConstructor("class F {\n" " char *c;\n" @@ -865,7 +854,7 @@ class TestClass : public TestFixture { " ~F();\n" " F& operator=(const F&f);\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkCopyConstructor("class F {\n" " char *c;\n" @@ -879,7 +868,7 @@ class TestClass : public TestFixture { " ~F();\n" " F& operator=(const F&f);\n" "};"); - TODO_ASSERT_EQUALS("[test.cpp:7] -> [test.cpp:4]: (warning) Copy constructor does not allocate memory for member 'd' although memory has been allocated in other constructors.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:7] -> [test.cpp:4]: (warning) Copy constructor does not allocate memory for member 'd' although memory has been allocated in other constructors.\n", "", errout_str()); checkCopyConstructor("class F\n" "{\n" @@ -894,7 +883,7 @@ class TestClass : public TestFixture { " ~F();\n" " F& operator=(const F&f);\n" "};"); - TODO_ASSERT_EQUALS("[test.cpp:8]: (warning) Class 'F' does not have a copy constructor which is recommended since it has dynamic memory/resource allocation(s).\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:8]: (warning) Class 'F' does not have a copy constructor which is recommended since it has dynamic memory/resource allocation(s).\n", "", errout_str()); checkCopyConstructor("class F\n" "{\n" @@ -918,7 +907,7 @@ class TestClass : public TestFixture { " ~F();\n" " F& operator=(const F&f);\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkCopyConstructor("class F : E\n" "{\n" @@ -929,7 +918,7 @@ class TestClass : public TestFixture { " ~F();\n" " F& operator=(const F&f);\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkCopyConstructor("class E { E(E&); };\n" // non-copyable "class F : E\n" @@ -941,7 +930,7 @@ class TestClass : public TestFixture { " ~F();\n" " F& operator=(const F&f);\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkCopyConstructor("class E {};\n" "class F : E {\n" @@ -952,7 +941,7 @@ class TestClass : public TestFixture { " ~F();\n" " F& operator=(const F&f);\n" "};"); - ASSERT_EQUALS("[test.cpp:5]: (warning) Class 'F' does not have a copy constructor which is recommended since it has dynamic memory/resource allocation(s).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (warning) Class 'F' does not have a copy constructor which is recommended since it has dynamic memory/resource allocation(s).\n", errout_str()); checkCopyConstructor("class F {\n" " char *p;\n" @@ -963,7 +952,7 @@ class TestClass : public TestFixture { " ~F();\n" " F& operator=(const F&f);\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkCopyConstructor("class F {\n" " char *p;\n" @@ -971,7 +960,7 @@ class TestClass : public TestFixture { " ~F();\n" " F& operator=(const F&f);\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Class 'F' does not have a copy constructor which is recommended since it has dynamic memory/resource allocation(s).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Class 'F' does not have a copy constructor which is recommended since it has dynamic memory/resource allocation(s).\n", errout_str()); // #7198 checkCopyConstructor("struct F {\n" @@ -980,7 +969,7 @@ class TestClass : public TestFixture { " p = malloc(100);\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void copyConstructor2() { // ticket #4458 @@ -997,7 +986,7 @@ class TestClass : public TestFixture { " Vector& operator=(const Vector&v);\n" " _Tp* _M_finish;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void copyConstructor3() { @@ -1008,7 +997,7 @@ class TestClass : public TestFixture { " F&operator=(const F &f);\n" " ~F();\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkCopyConstructor("struct F {\n" " char* c;\n" @@ -1017,7 +1006,7 @@ class TestClass : public TestFixture { " F&operator=(const F &f);\n" " ~F();\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Struct 'F' has dynamic memory/resource allocation(s). The copy constructor is explicitly defaulted but the default copy constructor does not work well. It is recommended to define or delete the copy constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Struct 'F' has dynamic memory/resource allocation(s). The copy constructor is explicitly defaulted but the default copy constructor does not work well. It is recommended to define or delete the copy constructor.\n", errout_str()); } void copyConstructor4() { @@ -1040,7 +1029,7 @@ class TestClass : public TestFixture { "private:\n" " int* m_ptr;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void copyConstructor5() { @@ -1053,7 +1042,7 @@ class TestClass : public TestFixture { "private:\n" " int* m_ptr;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkCopyConstructor("class Copyable {};\n" "\n" @@ -1064,7 +1053,7 @@ class TestClass : public TestFixture { "private:\n" " int* m_ptr;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void copyConstructor6() { @@ -1079,7 +1068,7 @@ class TestClass : public TestFixture { "[test.cpp:4]: (warning) Struct 'S' does not have a operator= which is recommended since it has dynamic memory/resource allocation(s).\n" "[test.cpp:4]: (warning) Struct 'S' does not have a destructor which is recommended since it has dynamic memory/resource allocation(s).\n", "", - errout.str()); + errout_str()); } void noOperatorEq() { @@ -1089,7 +1078,7 @@ class TestClass : public TestFixture { " F(const F &f);\n" " ~F();\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Struct 'F' does not have a operator= which is recommended since it has dynamic memory/resource allocation(s).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Struct 'F' does not have a operator= which is recommended since it has dynamic memory/resource allocation(s).\n", errout_str()); // defaulted operator= checkCopyConstructor("struct F {\n" @@ -1099,7 +1088,7 @@ class TestClass : public TestFixture { " F &operator=(const F &f) = default;\n" " ~F();\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Struct 'F' has dynamic memory/resource allocation(s). The operator= is explicitly defaulted but the default operator= does not work well. It is recommended to define or delete the operator=.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Struct 'F' has dynamic memory/resource allocation(s). The operator= is explicitly defaulted but the default operator= does not work well. It is recommended to define or delete the operator=.\n", errout_str()); // deleted operator= checkCopyConstructor("struct F {\n" @@ -1109,7 +1098,7 @@ class TestClass : public TestFixture { " F &operator=(const F &f) = delete;\n" " ~F();\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // base class deletes operator= checkCopyConstructor("struct F : NonCopyable {\n" @@ -1118,7 +1107,7 @@ class TestClass : public TestFixture { " F(const F &f);\n" " ~F();\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void noDestructor() { @@ -1128,7 +1117,7 @@ class TestClass : public TestFixture { " F(const F &f);\n" " F&operator=(const F&);" "};"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Struct 'F' does not have a destructor which is recommended since it has dynamic memory/resource allocation(s).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Struct 'F' does not have a destructor which is recommended since it has dynamic memory/resource allocation(s).\n", errout_str()); checkCopyConstructor("struct F {\n" " C* c;\n" @@ -1136,7 +1125,7 @@ class TestClass : public TestFixture { " F(const F &f);\n" " F&operator=(const F&);" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkCopyConstructor("struct F {\n" " int* i;\n" @@ -1144,7 +1133,7 @@ class TestClass : public TestFixture { " F(const F &f);\n" " F& operator=(const F&);" "};"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Struct 'F' does not have a destructor which is recommended since it has dynamic memory/resource allocation(s).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Struct 'F' does not have a destructor which is recommended since it has dynamic memory/resource allocation(s).\n", errout_str()); checkCopyConstructor("struct Data { int x; int y; };\n" "struct F {\n" @@ -1153,7 +1142,7 @@ class TestClass : public TestFixture { " F(const F &f);\n" " F&operator=(const F&);" "};"); - ASSERT_EQUALS("[test.cpp:4]: (warning) Struct 'F' does not have a destructor which is recommended since it has dynamic memory/resource allocation(s).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (warning) Struct 'F' does not have a destructor which is recommended since it has dynamic memory/resource allocation(s).\n", errout_str()); // defaulted destructor checkCopyConstructor("struct F {\n" @@ -1163,7 +1152,7 @@ class TestClass : public TestFixture { " F &operator=(const F &f);\n" " ~F() = default;\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Struct 'F' has dynamic memory/resource allocation(s). The destructor is explicitly defaulted but the default destructor does not work well. It is recommended to define the destructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Struct 'F' has dynamic memory/resource allocation(s). The destructor is explicitly defaulted but the default destructor does not work well. It is recommended to define the destructor.\n", errout_str()); // deleted destructor checkCopyConstructor("struct F {\n" @@ -1173,15 +1162,12 @@ class TestClass : public TestFixture { " F &operator=(const F &f);\n" " ~F() = delete;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } // Check that operator Equal returns reference to this #define checkOpertorEqRetRefThis(code) checkOpertorEqRetRefThis_(code, __FILE__, __LINE__) void checkOpertorEqRetRefThis_(const char code[], const char* file, int line) { - // Clear the error log - errout.str(""); - Preprocessor preprocessor(settings0); // Tokenize.. @@ -1201,7 +1187,7 @@ class TestClass : public TestFixture { "public:\n" " A & operator=(const A &a) { return *this; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkOpertorEqRetRefThis( "class A\n" @@ -1209,7 +1195,7 @@ class TestClass : public TestFixture { "public:\n" " A & operator=(const A &a) { return a; }\n" "};"); - ASSERT_EQUALS("[test.cpp:4]: (style) 'operator=' should return reference to 'this' instance.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) 'operator=' should return reference to 'this' instance.\n", errout_str()); checkOpertorEqRetRefThis( "class A\n" @@ -1218,7 +1204,7 @@ class TestClass : public TestFixture { " A & operator=(const A &);\n" "};\n" "A & A::operator=(const A &a) { return *this; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkOpertorEqRetRefThis( "class A\n" @@ -1227,7 +1213,7 @@ class TestClass : public TestFixture { " A & operator=(const A &a);\n" "};\n" "A & A::operator=(const A &a) { return *this; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkOpertorEqRetRefThis( "class A\n" @@ -1236,7 +1222,7 @@ class TestClass : public TestFixture { " A & operator=(const A &);\n" "};\n" "A & A::operator=(const A &a) { return a; }"); - ASSERT_EQUALS("[test.cpp:6]: (style) 'operator=' should return reference to 'this' instance.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (style) 'operator=' should return reference to 'this' instance.\n", errout_str()); checkOpertorEqRetRefThis( "class A\n" @@ -1245,7 +1231,7 @@ class TestClass : public TestFixture { " A & operator=(const A &a);\n" "};\n" "A & A::operator=(const A &a) { return a; }"); - ASSERT_EQUALS("[test.cpp:6]: (style) 'operator=' should return reference to 'this' instance.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (style) 'operator=' should return reference to 'this' instance.\n", errout_str()); checkOpertorEqRetRefThis( "class A\n" @@ -1257,7 +1243,7 @@ class TestClass : public TestFixture { " B & operator=(const B &b) { return *this; }\n" " };\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkOpertorEqRetRefThis( "class A\n" @@ -1269,7 +1255,7 @@ class TestClass : public TestFixture { " B & operator=(const B &b) { return b; }\n" " };\n" "};"); - ASSERT_EQUALS("[test.cpp:7]: (style) 'operator=' should return reference to 'this' instance.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (style) 'operator=' should return reference to 'this' instance.\n", errout_str()); checkOpertorEqRetRefThis( "class A\n" @@ -1282,7 +1268,7 @@ class TestClass : public TestFixture { " };\n" "};\n" "A::B & A::B::operator=(const A::B &b) { return *this; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkOpertorEqRetRefThis( "class A\n" @@ -1295,7 +1281,7 @@ class TestClass : public TestFixture { " };\n" "};\n" "A::B & A::B::operator=(const A::B &b) { return b; }"); - ASSERT_EQUALS("[test.cpp:10]: (style) 'operator=' should return reference to 'this' instance.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:10]: (style) 'operator=' should return reference to 'this' instance.\n", errout_str()); checkOpertorEqRetRefThis( "class A {\n" @@ -1305,7 +1291,7 @@ class TestClass : public TestFixture { "{\n" " B & operator=(const B & b) { return b; }\n" "};"); - ASSERT_EQUALS("[test.cpp:6]: (style) 'operator=' should return reference to 'this' instance.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (style) 'operator=' should return reference to 'this' instance.\n", errout_str()); checkOpertorEqRetRefThis( "class A {\n" @@ -1316,7 +1302,7 @@ class TestClass : public TestFixture { " B & operator=(const B &);\n" "};\n" "A::B & A::B::operator=(const A::B & b) { return b; }"); - ASSERT_EQUALS("[test.cpp:8]: (style) 'operator=' should return reference to 'this' instance.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8]: (style) 'operator=' should return reference to 'this' instance.\n", errout_str()); checkOpertorEqRetRefThis( "class A {\n" @@ -1326,7 +1312,7 @@ class TestClass : public TestFixture { "{\n" " A::B & operator=(const A::B & b) { return b; }\n" "};"); - ASSERT_EQUALS("[test.cpp:6]: (style) 'operator=' should return reference to 'this' instance.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (style) 'operator=' should return reference to 'this' instance.\n", errout_str()); checkOpertorEqRetRefThis( "class A {\n" @@ -1337,7 +1323,7 @@ class TestClass : public TestFixture { " A::B & operator=(const A::B &);\n" "};\n" "A::B & A::B::operator=(const A::B & b) { return b; }"); - ASSERT_EQUALS("[test.cpp:8]: (style) 'operator=' should return reference to 'this' instance.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8]: (style) 'operator=' should return reference to 'this' instance.\n", errout_str()); checkOpertorEqRetRefThis( "namespace A {\n" @@ -1347,7 +1333,7 @@ class TestClass : public TestFixture { "{\n" " B & operator=(const B & b) { return b; }\n" "};"); - ASSERT_EQUALS("[test.cpp:6]: (style) 'operator=' should return reference to 'this' instance.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (style) 'operator=' should return reference to 'this' instance.\n", errout_str()); checkOpertorEqRetRefThis( "namespace A {\n" @@ -1358,7 +1344,7 @@ class TestClass : public TestFixture { " B & operator=(const B &);\n" "};\n" "A::B & A::B::operator=(const A::B & b) { return b; }"); - ASSERT_EQUALS("[test.cpp:8]: (style) 'operator=' should return reference to 'this' instance.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8]: (style) 'operator=' should return reference to 'this' instance.\n", errout_str()); checkOpertorEqRetRefThis( "namespace A {\n" @@ -1368,7 +1354,7 @@ class TestClass : public TestFixture { "{\n" " A::B & operator=(const A::B & b) { return b; }\n" "};"); - ASSERT_EQUALS("[test.cpp:6]: (style) 'operator=' should return reference to 'this' instance.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (style) 'operator=' should return reference to 'this' instance.\n", errout_str()); checkOpertorEqRetRefThis( "namespace A {\n" @@ -1379,7 +1365,7 @@ class TestClass : public TestFixture { " A::B & operator=(const A::B &);\n" "};\n" "A::B & A::B::operator=(const A::B & b) { return b; }"); - ASSERT_EQUALS("[test.cpp:8]: (style) 'operator=' should return reference to 'this' instance.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8]: (style) 'operator=' should return reference to 'this' instance.\n", errout_str()); checkOpertorEqRetRefThis( // #11380 "struct S {\n" @@ -1389,7 +1375,7 @@ class TestClass : public TestFixture { " }\n" " int i;\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void operatorEqRetRefThis2() { @@ -1399,7 +1385,7 @@ class TestClass : public TestFixture { "{\n" " szp &operator =(int *other) {}\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (error) No 'return' statement in non-void function causes undefined behavior.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) No 'return' statement in non-void function causes undefined behavior.\n", errout_str()); checkOpertorEqRetRefThis( "class szp\n" @@ -1407,7 +1393,7 @@ class TestClass : public TestFixture { " szp &operator =(int *other);\n" "};\n" "szp &szp::operator =(int *other) {}"); - ASSERT_EQUALS("[test.cpp:5]: (error) No 'return' statement in non-void function causes undefined behavior.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) No 'return' statement in non-void function causes undefined behavior.\n", errout_str()); checkOpertorEqRetRefThis( "namespace NS {\n" @@ -1417,7 +1403,7 @@ class TestClass : public TestFixture { "{\n" " szp &operator =(int *other) {}\n" "};"); - ASSERT_EQUALS("[test.cpp:6]: (error) No 'return' statement in non-void function causes undefined behavior.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (error) No 'return' statement in non-void function causes undefined behavior.\n", errout_str()); checkOpertorEqRetRefThis( "namespace NS {\n" @@ -1428,7 +1414,7 @@ class TestClass : public TestFixture { " szp &operator =(int *other);\n" "};\n" "NS::szp &NS::szp::operator =(int *other) {}"); - ASSERT_EQUALS("[test.cpp:8]: (error) No 'return' statement in non-void function causes undefined behavior.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8]: (error) No 'return' statement in non-void function causes undefined behavior.\n", errout_str()); checkOpertorEqRetRefThis( "namespace NS {\n" @@ -1438,7 +1424,7 @@ class TestClass : public TestFixture { "{\n" " NS::szp &operator =(int *other) {}\n" "};"); - ASSERT_EQUALS("[test.cpp:6]: (error) No 'return' statement in non-void function causes undefined behavior.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (error) No 'return' statement in non-void function causes undefined behavior.\n", errout_str()); checkOpertorEqRetRefThis( "namespace NS {\n" @@ -1449,7 +1435,7 @@ class TestClass : public TestFixture { " NS::szp &operator =(int *other);\n" "};\n" "NS::szp &NS::szp::operator =(int *other) {}"); - ASSERT_EQUALS("[test.cpp:8]: (error) No 'return' statement in non-void function causes undefined behavior.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8]: (error) No 'return' statement in non-void function causes undefined behavior.\n", errout_str()); checkOpertorEqRetRefThis( "class A {\n" @@ -1459,7 +1445,7 @@ class TestClass : public TestFixture { "{\n" " szp &operator =(int *other) {}\n" "};"); - ASSERT_EQUALS("[test.cpp:6]: (error) No 'return' statement in non-void function causes undefined behavior.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (error) No 'return' statement in non-void function causes undefined behavior.\n", errout_str()); checkOpertorEqRetRefThis( "class A {\n" @@ -1470,7 +1456,7 @@ class TestClass : public TestFixture { " szp &operator =(int *other);\n" "};\n" "A::szp &A::szp::operator =(int *other) {}"); - ASSERT_EQUALS("[test.cpp:8]: (error) No 'return' statement in non-void function causes undefined behavior.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8]: (error) No 'return' statement in non-void function causes undefined behavior.\n", errout_str()); checkOpertorEqRetRefThis( "class A {\n" @@ -1480,7 +1466,7 @@ class TestClass : public TestFixture { "{\n" " A::szp &operator =(int *other) {}\n" "};"); - ASSERT_EQUALS("[test.cpp:6]: (error) No 'return' statement in non-void function causes undefined behavior.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (error) No 'return' statement in non-void function causes undefined behavior.\n", errout_str()); checkOpertorEqRetRefThis( "class A {\n" @@ -1491,7 +1477,7 @@ class TestClass : public TestFixture { " A::szp &operator =(int *other);\n" "};\n" "A::szp &A::szp::operator =(int *other) {}"); - ASSERT_EQUALS("[test.cpp:8]: (error) No 'return' statement in non-void function causes undefined behavior.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8]: (error) No 'return' statement in non-void function causes undefined behavior.\n", errout_str()); } void operatorEqRetRefThis3() { @@ -1502,7 +1488,7 @@ class TestClass : public TestFixture { " inline A &operator =(int *other) { return (*this); };\n" " inline A &operator =(long *other) { return (*this = 0); };\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkOpertorEqRetRefThis( "class A {\n" @@ -1512,7 +1498,7 @@ class TestClass : public TestFixture { "};\n" "A &A::operator =(int *other) { return (*this); };\n" "A &A::operator =(long *other) { return (*this = 0); };"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkOpertorEqRetRefThis( "class A {\n" @@ -1520,7 +1506,7 @@ class TestClass : public TestFixture { " inline A &operator =(int *other) { return (*this); };\n" " inline A &operator =(long *other) { return operator = (*(int *)other); };\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkOpertorEqRetRefThis( "class A {\n" @@ -1530,7 +1516,7 @@ class TestClass : public TestFixture { "};\n" "A &A::operator =(int *other) { return (*this); };\n" "A &A::operator =(long *other) { return operator = (*(int *)other); };"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkOpertorEqRetRefThis( "class A {\n" @@ -1540,7 +1526,7 @@ class TestClass : public TestFixture { "};\n" "A &A::operator =(int *other) { return (*this); };\n" "A &A::operator =(long *other) { return this->operator = (*(int *)other); };"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkOpertorEqRetRefThis( // #9045 "class V {\n" @@ -1552,7 +1538,7 @@ class TestClass : public TestFixture { " return *this;\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void operatorEqRetRefThis4() { @@ -1562,7 +1548,7 @@ class TestClass : public TestFixture { "{\n" " return (P&)(*this += pc);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void operatorEqRetRefThis5() { @@ -1572,21 +1558,21 @@ class TestClass : public TestFixture { "public:\n" " A & operator=(const A &a) { }\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (error) No 'return' statement in non-void function causes undefined behavior.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) No 'return' statement in non-void function causes undefined behavior.\n", errout_str()); checkOpertorEqRetRefThis( "class A {\n" "protected:\n" " A & operator=(const A &a) {}\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (style) 'operator=' should return reference to 'this' instance.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) 'operator=' should return reference to 'this' instance.\n", errout_str()); checkOpertorEqRetRefThis( "class A {\n" "private:\n" " A & operator=(const A &a) {}\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (style) 'operator=' should return reference to 'this' instance.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) 'operator=' should return reference to 'this' instance.\n", errout_str()); checkOpertorEqRetRefThis( "class A {\n" @@ -1596,7 +1582,7 @@ class TestClass : public TestFixture { " throw std::exception();\n" " }\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (style) 'operator=' should either return reference to 'this' instance or be declared private and left unimplemented.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) 'operator=' should either return reference to 'this' instance or be declared private and left unimplemented.\n", errout_str()); checkOpertorEqRetRefThis( "class A {\n" @@ -1606,7 +1592,7 @@ class TestClass : public TestFixture { " abort();\n" " }\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (style) 'operator=' should either return reference to 'this' instance or be declared private and left unimplemented.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) 'operator=' should either return reference to 'this' instance or be declared private and left unimplemented.\n", errout_str()); checkOpertorEqRetRefThis( "class A {\n" @@ -1614,7 +1600,7 @@ class TestClass : public TestFixture { " A & operator=(const A &a);\n" "};\n" "A & A :: operator=(const A &a) { }"); - ASSERT_EQUALS("[test.cpp:5]: (error) No 'return' statement in non-void function causes undefined behavior.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) No 'return' statement in non-void function causes undefined behavior.\n", errout_str()); } void operatorEqRetRefThis6() { // ticket #2478 (segmentation fault) @@ -1649,15 +1635,12 @@ class TestClass : public TestFixture { " return replaceImplDiscr();\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } // Check that operator Equal checks for assignment to self #define checkOpertorEqToSelf(code) checkOpertorEqToSelf_(code, __FILE__, __LINE__) void checkOpertorEqToSelf_(const char code[], const char* file, int line) { - // Clear the error log - errout.str(""); - Preprocessor preprocessor(settings1); // Tokenize.. @@ -1678,7 +1661,7 @@ class TestClass : public TestFixture { "public:\n" " A & operator=(const A &a) { if (&a != this) { } return *this; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // this test doesn't have an assignment test but it is not needed checkOpertorEqToSelf( @@ -1687,7 +1670,7 @@ class TestClass : public TestFixture { "public:\n" " A & operator=(const A &a) { return *this; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // this test needs an assignment test and has it checkOpertorEqToSelf( @@ -1705,7 +1688,7 @@ class TestClass : public TestFixture { " return *this;\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // this class needs an assignment test but doesn't have it checkOpertorEqToSelf( @@ -1720,7 +1703,7 @@ class TestClass : public TestFixture { " return *this;\n" " }\n" "};"); - ASSERT_EQUALS("[test.cpp:5]: (warning) 'operator=' should check for assignment to self to avoid problems with dynamic memory.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (warning) 'operator=' should check for assignment to self to avoid problems with dynamic memory.\n", errout_str()); // this test has an assignment test but doesn't need it checkOpertorEqToSelf( @@ -1730,7 +1713,7 @@ class TestClass : public TestFixture { " A & operator=(const A &);\n" "};\n" "A & A::operator=(const A &a) { if (&a != this) { } return *this; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // this test doesn't have an assignment test but doesn't need it checkOpertorEqToSelf( @@ -1740,7 +1723,7 @@ class TestClass : public TestFixture { " A & operator=(const A &);\n" "};\n" "A & A::operator=(const A &a) { return *this; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // this test needs an assignment test and has it checkOpertorEqToSelf( @@ -1759,7 +1742,7 @@ class TestClass : public TestFixture { " }\n" " return *this;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // this test needs an assignment test and has the inverse test checkOpertorEqToSelf( @@ -1778,7 +1761,7 @@ class TestClass : public TestFixture { " }\n" " return *this;\n" "}"); - ASSERT_EQUALS("[test.cpp:7]: (warning) 'operator=' should check for assignment to self to avoid problems with dynamic memory.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (warning) 'operator=' should check for assignment to self to avoid problems with dynamic memory.\n", errout_str()); // this test needs an assignment test and has the inverse test checkOpertorEqToSelf( @@ -1797,7 +1780,7 @@ class TestClass : public TestFixture { " }\n" " return *this;\n" "}"); - ASSERT_EQUALS("[test.cpp:7]: (warning) 'operator=' should check for assignment to self to avoid problems with dynamic memory.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (warning) 'operator=' should check for assignment to self to avoid problems with dynamic memory.\n", errout_str()); // this test needs an assignment test and has the inverse test checkOpertorEqToSelf( @@ -1816,7 +1799,7 @@ class TestClass : public TestFixture { " }\n" " return *this;\n" "}"); - ASSERT_EQUALS("[test.cpp:7]: (warning) 'operator=' should check for assignment to self to avoid problems with dynamic memory.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (warning) 'operator=' should check for assignment to self to avoid problems with dynamic memory.\n", errout_str()); // this test needs an assignment test and has the inverse test checkOpertorEqToSelf( @@ -1835,7 +1818,7 @@ class TestClass : public TestFixture { " }\n" " return *this;\n" "}"); - ASSERT_EQUALS("[test.cpp:7]: (warning) 'operator=' should check for assignment to self to avoid problems with dynamic memory.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (warning) 'operator=' should check for assignment to self to avoid problems with dynamic memory.\n", errout_str()); // this test needs an assignment test and has the inverse test checkOpertorEqToSelf( @@ -1854,7 +1837,7 @@ class TestClass : public TestFixture { " }\n" " return *this;\n" "}"); - ASSERT_EQUALS("[test.cpp:7]: (warning) 'operator=' should check for assignment to self to avoid problems with dynamic memory.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (warning) 'operator=' should check for assignment to self to avoid problems with dynamic memory.\n", errout_str()); // this test needs an assignment test and has the inverse test checkOpertorEqToSelf( @@ -1876,7 +1859,7 @@ class TestClass : public TestFixture { " }\n" " return *this;\n" "}"); - ASSERT_EQUALS("[test.cpp:7]: (warning) 'operator=' should check for assignment to self to avoid problems with dynamic memory.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (warning) 'operator=' should check for assignment to self to avoid problems with dynamic memory.\n", errout_str()); // this test needs an assignment test and has the inverse test checkOpertorEqToSelf( @@ -1897,7 +1880,7 @@ class TestClass : public TestFixture { " }\n" " return *this;\n" "}"); - ASSERT_EQUALS("[test.cpp:7]: (warning) 'operator=' should check for assignment to self to avoid problems with dynamic memory.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (warning) 'operator=' should check for assignment to self to avoid problems with dynamic memory.\n", errout_str()); // this test needs an assignment test but doesn’t have it @@ -1914,7 +1897,7 @@ class TestClass : public TestFixture { " s = strdup(a.s);\n" " return *this;\n" "}"); - ASSERT_EQUALS("[test.cpp:7]: (warning) 'operator=' should check for assignment to self to avoid problems with dynamic memory.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (warning) 'operator=' should check for assignment to self to avoid problems with dynamic memory.\n", errout_str()); // ticket #1224 checkOpertorEqToSelf( @@ -1932,7 +1915,7 @@ class TestClass : public TestFixture { " delete oldtree;\n" " return *this;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } @@ -1948,7 +1931,7 @@ class TestClass : public TestFixture { " B & operator=(const B &b) { if (&b != this) { } return *this; }\n" " };\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // this test doesn't have an assignment test but doesn't need it checkOpertorEqToSelf( @@ -1961,7 +1944,7 @@ class TestClass : public TestFixture { " B & operator=(const B &b) { return *this; }\n" " };\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // this test needs an assignment test but has it checkOpertorEqToSelf( @@ -1981,7 +1964,7 @@ class TestClass : public TestFixture { " }\n" " };\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // this test needs an assignment test but doesn't have it checkOpertorEqToSelf( @@ -2000,7 +1983,7 @@ class TestClass : public TestFixture { " }\n" " };\n" "};"); - ASSERT_EQUALS("[test.cpp:8]: (warning) 'operator=' should check for assignment to self to avoid problems with dynamic memory.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8]: (warning) 'operator=' should check for assignment to self to avoid problems with dynamic memory.\n", errout_str()); // this test has an assignment test but doesn't need it checkOpertorEqToSelf( @@ -2014,7 +1997,7 @@ class TestClass : public TestFixture { " };\n" "};\n" "A::B & A::B::operator=(const A::B &b) { if (&b != this) { } return *this; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // this test doesn't have an assignment test but doesn't need it checkOpertorEqToSelf( @@ -2028,7 +2011,7 @@ class TestClass : public TestFixture { " };\n" "};\n" "A::B & A::B::operator=(const A::B &b) { return *this; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // this test needs an assignment test and has it checkOpertorEqToSelf( @@ -2051,7 +2034,7 @@ class TestClass : public TestFixture { " }\n" " return *this;\n" " }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // this test needs an assignment test but doesn't have it checkOpertorEqToSelf( @@ -2071,7 +2054,7 @@ class TestClass : public TestFixture { " s = strdup(b.s);\n" " return *this;\n" " }"); - ASSERT_EQUALS("[test.cpp:11]: (warning) 'operator=' should check for assignment to self to avoid problems with dynamic memory.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:11]: (warning) 'operator=' should check for assignment to self to avoid problems with dynamic memory.\n", errout_str()); } void operatorEqToSelf3() { @@ -2082,7 +2065,7 @@ class TestClass : public TestFixture { "public:\n" " A & operator=(const A &a) { return *this; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // this test has multiple inheritance and needs an assignment test but there is no trivial way to test for it checkOpertorEqToSelf( @@ -2097,7 +2080,7 @@ class TestClass : public TestFixture { " return *this;\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // this test has multiple inheritance so there is no trivial way to test for self assignment but doesn't need it checkOpertorEqToSelf( @@ -2107,7 +2090,7 @@ class TestClass : public TestFixture { " A & operator=(const A &);\n" "};\n" "A & A::operator=(const A &a) { return *this; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // this test has multiple inheritance and needs an assignment test but there is no trivial way to test for it checkOpertorEqToSelf( @@ -2123,7 +2106,7 @@ class TestClass : public TestFixture { " s = strdup(a.s);\n" " return *this;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void operatorEqToSelf4() { @@ -2138,7 +2121,7 @@ class TestClass : public TestFixture { " B & operator=(const B &b) { return *this; }\n" " };\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // this test has multiple inheritance and needs an assignment test but there is no trivial way to test for it checkOpertorEqToSelf( @@ -2157,7 +2140,7 @@ class TestClass : public TestFixture { " }\n" " };\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // this test has multiple inheritance so there is no trivial way to test for self assignment but doesn't need it checkOpertorEqToSelf( @@ -2171,7 +2154,7 @@ class TestClass : public TestFixture { " };\n" "};\n" "A::B & A::B::operator=(const A::B &b) { return *this; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // this test has multiple inheritance and needs an assignment test but there is no trivial way to test for it checkOpertorEqToSelf( @@ -2191,7 +2174,7 @@ class TestClass : public TestFixture { " s = strdup(b.s);\n" " return *this;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void operatorEqToSelf5() { @@ -2211,7 +2194,7 @@ class TestClass : public TestFixture { " return *this;\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkOpertorEqToSelf( "class A\n" @@ -2228,7 +2211,7 @@ class TestClass : public TestFixture { " return *this;\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkOpertorEqToSelf( "class A\n" @@ -2245,7 +2228,7 @@ class TestClass : public TestFixture { " return *this;\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkOpertorEqToSelf( "class A\n" @@ -2262,7 +2245,7 @@ class TestClass : public TestFixture { " return *this;\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkOpertorEqToSelf( "class A\n" @@ -2279,7 +2262,7 @@ class TestClass : public TestFixture { " return *this;\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkOpertorEqToSelf( "class A\n" @@ -2296,7 +2279,7 @@ class TestClass : public TestFixture { " return *this;\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkOpertorEqToSelf( "class A\n" @@ -2313,7 +2296,7 @@ class TestClass : public TestFixture { " return *this;\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkOpertorEqToSelf( "class A\n" @@ -2330,7 +2313,7 @@ class TestClass : public TestFixture { " return *this;\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkOpertorEqToSelf( "class A\n" @@ -2348,7 +2331,7 @@ class TestClass : public TestFixture { " }\n" " return *this;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkOpertorEqToSelf( "class A\n" @@ -2366,7 +2349,7 @@ class TestClass : public TestFixture { " }\n" " return *this;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkOpertorEqToSelf( "class A\n" @@ -2384,7 +2367,7 @@ class TestClass : public TestFixture { " }\n" " return *this;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkOpertorEqToSelf( "class A\n" @@ -2402,7 +2385,7 @@ class TestClass : public TestFixture { " }\n" " return *this;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkOpertorEqToSelf( "class A\n" @@ -2420,7 +2403,7 @@ class TestClass : public TestFixture { " }\n" " return *this;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkOpertorEqToSelf( "class A\n" @@ -2438,7 +2421,7 @@ class TestClass : public TestFixture { " }\n" " return *this;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkOpertorEqToSelf( "class A\n" @@ -2456,7 +2439,7 @@ class TestClass : public TestFixture { " }\n" " return *this;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkOpertorEqToSelf( "class A\n" @@ -2474,7 +2457,7 @@ class TestClass : public TestFixture { " }\n" " return *this;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkOpertorEqToSelf( "struct A {\n" @@ -2486,7 +2469,7 @@ class TestClass : public TestFixture { " s = strdup(a.s);\n" " return *this;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void operatorEqToSelf6() { @@ -2505,7 +2488,7 @@ class TestClass : public TestFixture { "private:\n" " char * data;\n" "};"); - ASSERT_EQUALS("[test.cpp:4]: (warning) 'operator=' should check for assignment to self to avoid problems with dynamic memory.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (warning) 'operator=' should check for assignment to self to avoid problems with dynamic memory.\n", errout_str()); checkOpertorEqToSelf( "class A\n" @@ -2522,7 +2505,7 @@ class TestClass : public TestFixture { " strcpy(data, a.data);\n" " return *this;\n" "};"); - ASSERT_EQUALS("[test.cpp:8]: (warning) 'operator=' should check for assignment to self to avoid problems with dynamic memory.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8]: (warning) 'operator=' should check for assignment to self to avoid problems with dynamic memory.\n", errout_str()); checkOpertorEqToSelf( "class A\n" @@ -2538,7 +2521,7 @@ class TestClass : public TestFixture { "private:\n" " char * data;\n" "};"); - ASSERT_EQUALS("[test.cpp:4]: (warning) 'operator=' should check for assignment to self to avoid problems with dynamic memory.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (warning) 'operator=' should check for assignment to self to avoid problems with dynamic memory.\n", errout_str()); checkOpertorEqToSelf( "class A\n" @@ -2555,7 +2538,7 @@ class TestClass : public TestFixture { " *data = *a.data;\n" " return *this;\n" "};"); - ASSERT_EQUALS("[test.cpp:8]: (warning) 'operator=' should check for assignment to self to avoid problems with dynamic memory.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8]: (warning) 'operator=' should check for assignment to self to avoid problems with dynamic memory.\n", errout_str()); } void operatorEqToSelf7() { @@ -2572,7 +2555,7 @@ class TestClass : public TestFixture { " return assign(a);\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void operatorEqToSelf8() { @@ -2591,7 +2574,7 @@ class TestClass : public TestFixture { "{\n" " return copy(in);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void operatorEqToSelf9() { @@ -2610,15 +2593,12 @@ class TestClass : public TestFixture { "{\n" " return Foo::operator=(&other);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } // Check that base classes have virtual destructors #define checkVirtualDestructor(...) checkVirtualDestructor_(__FILE__, __LINE__, __VA_ARGS__) void checkVirtualDestructor_(const char* file, int line, const char code[], bool inconclusive = false) { - // Clear the error log - errout.str(""); - const Settings s = settingsBuilder(settings0).certainty(Certainty::inconclusive, inconclusive).severity(Severity::warning).build(); Preprocessor preprocessor(s); @@ -2639,12 +2619,12 @@ class TestClass : public TestFixture { checkVirtualDestructor("class Derived : public Base { };\n" "Base *base = new Derived;\n" "delete base;"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkVirtualDestructor("class Derived : Base { };\n" "Base *base = new Derived;\n" "delete base;"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void virtualDestructor2() { @@ -2654,25 +2634,25 @@ class TestClass : public TestFixture { "class Derived : public Base { public: ~Derived() { (void)11; } };" "Base *base = new Derived;\n" "delete base;"); - ASSERT_EQUALS("[test.cpp:1]: (error) Class 'Base' which is inherited by class 'Derived' does not have a virtual destructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (error) Class 'Base' which is inherited by class 'Derived' does not have a virtual destructor.\n", errout_str()); checkVirtualDestructor("class Base { };\n" "class Derived : protected Base { public: ~Derived() { (void)11; } };" "Base *base = new Derived;\n" "delete base;"); - ASSERT_EQUALS("[test.cpp:1]: (error) Class 'Base' which is inherited by class 'Derived' does not have a virtual destructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (error) Class 'Base' which is inherited by class 'Derived' does not have a virtual destructor.\n", errout_str()); checkVirtualDestructor("class Base { };\n" "class Derived : private Base { public: ~Derived() { (void)11; } };" "Base *base = new Derived;\n" "delete base;"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkVirtualDestructor("class Base { };\n" "class Derived : Base { public: ~Derived() { (void)11; } };" "Base *base = new Derived;\n" "delete base;"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #9104 checkVirtualDestructor("struct A\n" @@ -2693,7 +2673,7 @@ class TestClass : public TestFixture { " Base* p = new Derived();\n" " delete p;\n" "}"); - ASSERT_EQUALS("[test.cpp:7]: (error) Class 'Base' which is inherited by class 'Derived' does not have a virtual destructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (error) Class 'Base' which is inherited by class 'Derived' does not have a virtual destructor.\n", errout_str()); checkVirtualDestructor("using namespace std;\n" "struct A\n" @@ -2714,7 +2694,7 @@ class TestClass : public TestFixture { " Base* p = new Derived();\n" " delete p;\n" "}"); - ASSERT_EQUALS("[test.cpp:8]: (error) Class 'Base' which is inherited by class 'Derived' does not have a virtual destructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8]: (error) Class 'Base' which is inherited by class 'Derived' does not have a virtual destructor.\n", errout_str()); } void virtualDestructor3() { @@ -2724,19 +2704,19 @@ class TestClass : public TestFixture { "class Derived : public Base { public: ~Derived() { (void)11; } };" "Base *base = new Derived;\n" "delete base;"); - ASSERT_EQUALS("[test.cpp:1]: (error) Class 'Base' which is inherited by class 'Derived' does not have a virtual destructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (error) Class 'Base' which is inherited by class 'Derived' does not have a virtual destructor.\n", errout_str()); checkVirtualDestructor("class Base { public: ~Base(); };\n" "class Derived : protected Base { public: ~Derived() { (void)11; } };" "Base *base = new Derived;\n" "delete base;"); - ASSERT_EQUALS("[test.cpp:1]: (error) Class 'Base' which is inherited by class 'Derived' does not have a virtual destructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (error) Class 'Base' which is inherited by class 'Derived' does not have a virtual destructor.\n", errout_str()); checkVirtualDestructor("class Base { public: ~Base(); };\n" "class Derived : private Fred, public Base { public: ~Derived() { (void)11; } };" "Base *base = new Derived;\n" "delete base;"); - ASSERT_EQUALS("[test.cpp:1]: (error) Class 'Base' which is inherited by class 'Derived' does not have a virtual destructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (error) Class 'Base' which is inherited by class 'Derived' does not have a virtual destructor.\n", errout_str()); } void virtualDestructor4() { @@ -2746,13 +2726,13 @@ class TestClass : public TestFixture { "class Derived : public Base { };" "Base *base = new Derived;\n" "delete base;"); - ASSERT_EQUALS("[test.cpp:1]: (error) Class 'Base' which is inherited by class 'Derived' does not have a virtual destructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (error) Class 'Base' which is inherited by class 'Derived' does not have a virtual destructor.\n", errout_str()); checkVirtualDestructor("class Base { public: ~Base(); };\n" "class Derived : private Fred, public Base { };" "Base *base = new Derived;\n" "delete base;"); - ASSERT_EQUALS("[test.cpp:1]: (error) Class 'Base' which is inherited by class 'Derived' does not have a virtual destructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (error) Class 'Base' which is inherited by class 'Derived' does not have a virtual destructor.\n", errout_str()); } void virtualDestructor5() { @@ -2762,13 +2742,13 @@ class TestClass : public TestFixture { "class Derived : public Base { public: ~Derived() {} };" "Base *base = new Derived;\n" "delete base;"); - ASSERT_EQUALS("[test.cpp:1]: (error) Class 'Base' which is inherited by class 'Derived' does not have a virtual destructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (error) Class 'Base' which is inherited by class 'Derived' does not have a virtual destructor.\n", errout_str()); checkVirtualDestructor("class Base { public: ~Base(); };\n" "class Derived : public Base { public: ~Derived(); }; Derived::~Derived() {}" "Base *base = new Derived;\n" "delete base;"); - ASSERT_EQUALS("[test.cpp:1]: (error) Class 'Base' which is inherited by class 'Derived' does not have a virtual destructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (error) Class 'Base' which is inherited by class 'Derived' does not have a virtual destructor.\n", errout_str()); } void virtualDestructor6() { @@ -2777,7 +2757,7 @@ class TestClass : public TestFixture { checkVirtualDestructor("class Base { public: ~Base(); };\n" "class Derived : public Base { public: ~Derived() { (void)11; } };"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void virtualDestructorProtected() { @@ -2794,7 +2774,7 @@ class TestClass : public TestFixture { "public:\n" " ~B() { int a; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void virtualDestructorInherited() { @@ -2815,7 +2795,7 @@ class TestClass : public TestFixture { "public:\n" " ~B() { int a; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // class A inherits virtual destructor from struct Base -> no error // also notice that public is not given, but destructor is public, because @@ -2833,7 +2813,7 @@ class TestClass : public TestFixture { "public:\n" " ~B() { int a; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Unknown Base class -> it could have virtual destructor, so ignore checkVirtualDestructor("class A : private Base\n" @@ -2847,7 +2827,7 @@ class TestClass : public TestFixture { "public:\n" " ~B() { int a; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Virtual destructor is inherited -> no error checkVirtualDestructor("class Base2\n" @@ -2868,7 +2848,7 @@ class TestClass : public TestFixture { "public:\n" " ~B() { int a; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // class A doesn't inherit virtual destructor from class Base -> error checkVirtualDestructor("class Base\n" @@ -2888,7 +2868,7 @@ class TestClass : public TestFixture { " ~B() { int a; }\n" "};"); TODO_ASSERT_EQUALS("[test.cpp:7]: (error) Class 'Base' which is inherited by class 'B' does not have a virtual destructor.\n", - "", errout.str()); + "", errout_str()); } void virtualDestructorTemplate() { @@ -2909,7 +2889,7 @@ class TestClass : public TestFixture { "};\n" "\n" "AA *p = new B; delete p;"); - ASSERT_EQUALS("[test.cpp:9]: (error) Class 'AA < double >' which is inherited by class 'B' does not have a virtual destructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:9]: (error) Class 'AA < double >' which is inherited by class 'B' does not have a virtual destructor.\n", errout_str()); } void virtualDestructorInconclusive() { @@ -2918,7 +2898,7 @@ class TestClass : public TestFixture { " ~Base(){}\n" " virtual void foo(){}\n" "};\n", true); - ASSERT_EQUALS("[test.cpp:3]: (warning, inconclusive) Class 'Base' which has virtual members does not have a virtual destructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning, inconclusive) Class 'Base' which has virtual members does not have a virtual destructor.\n", errout_str()); checkVirtualDestructor("class Base {\n" "public:\n" @@ -2933,7 +2913,7 @@ class TestClass : public TestFixture { " Base * base = new Derived();\n" " delete base;\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:3]: (error) Class 'Base' which is inherited by class 'Derived' does not have a virtual destructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Class 'Base' which is inherited by class 'Derived' does not have a virtual destructor.\n", errout_str()); // class Base destructor is not virtual but protected -> no error checkVirtualDestructor("class Base {\n" @@ -2942,14 +2922,14 @@ class TestClass : public TestFixture { "protected:\n" " ~Base(){}\n" "};\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkVirtualDestructor("class C {\n" "private:\n" " C();\n" " virtual ~C();\n" "};\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } @@ -2960,9 +2940,6 @@ class TestClass : public TestFixture { } void checkNoMemset_(const char* file, int line, const char code[], const Settings &settings) { - // Clear the error log - errout.str(""); - Preprocessor preprocessor(settings); // Tokenize.. @@ -2984,7 +2961,7 @@ class TestClass : public TestFixture { " Fred fred;\n" " memset(&fred, 0, sizeof(Fred));\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkNoMemset("class Fred\n" "{\n" @@ -2995,7 +2972,7 @@ class TestClass : public TestFixture { " Fred fred;\n" " memset(&fred, 0, sizeof(Fred));\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkNoMemset("class Fred\n" "{\n" @@ -3006,7 +2983,7 @@ class TestClass : public TestFixture { " Fred fred;\n" " memset(&fred, 0, sizeof(Fred));\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkNoMemset("class Fred\n" "{\n" @@ -3017,7 +2994,7 @@ class TestClass : public TestFixture { " Fred fred;\n" " memset(&fred, 0, sizeof(Fred));\n" "}"); - ASSERT_EQUALS("[test.cpp:8]: (error) Using 'memset' on class that contains a 'std::string'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8]: (error) Using 'memset' on class that contains a 'std::string'.\n", errout_str()); checkNoMemset("class Fred\n" "{\n" @@ -3028,7 +3005,7 @@ class TestClass : public TestFixture { " Fred fred;\n" " memset(&fred, 0, sizeof(Fred));\n" "}"); - ASSERT_EQUALS("[test.cpp:8]: (error) Using 'memset' on class that contains a 'std::string'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8]: (error) Using 'memset' on class that contains a 'std::string'.\n", errout_str()); checkNoMemset("class Fred {\n" " std::string b;\n" @@ -3037,7 +3014,7 @@ class TestClass : public TestFixture { "void Fred::f() {\n" " memset(this, 0, sizeof(*this));\n" "}"); - ASSERT_EQUALS("[test.cpp:6]: (error) Using 'memset' on class that contains a 'std::string'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (error) Using 'memset' on class that contains a 'std::string'.\n", errout_str()); checkNoMemset("class Fred\n" "{\n" @@ -3047,7 +3024,7 @@ class TestClass : public TestFixture { " Fred fred;\n" " memset(&fred, 0, sizeof(fred));\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkNoMemset("class Fred\n" "{\n" @@ -3058,7 +3035,7 @@ class TestClass : public TestFixture { " Fred fred;\n" " memset(&fred, 0, sizeof(fred));\n" "}"); - ASSERT_EQUALS("[test.cpp:8]: (error) Using 'memset' on class that contains a 'std::string'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8]: (error) Using 'memset' on class that contains a 'std::string'.\n", errout_str()); checkNoMemset("class Fred\n" "{\n" @@ -3070,7 +3047,7 @@ class TestClass : public TestFixture { " Pebbles pebbles;\n" " memset(&pebbles, 0, sizeof(pebbles));\n" "}"); - ASSERT_EQUALS("[test.cpp:9]: (error) Using 'memset' on class that contains a 'std::string'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:9]: (error) Using 'memset' on class that contains a 'std::string'.\n", errout_str()); checkNoMemset("class Fred\n" "{\n" @@ -3081,7 +3058,7 @@ class TestClass : public TestFixture { " Fred fred;\n" " memset(&fred, 0, sizeof(fred));\n" "}"); - ASSERT_EQUALS("[test.cpp:8]: (error) Using 'memset' on class that contains a virtual function.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8]: (error) Using 'memset' on class that contains a virtual function.\n", errout_str()); checkNoMemset("class Fred\n" "{\n" @@ -3092,7 +3069,7 @@ class TestClass : public TestFixture { " static Fred fred;\n" " memset(&fred, 0, sizeof(fred));\n" "}"); - ASSERT_EQUALS("[test.cpp:8]: (error) Using 'memset' on class that contains a virtual function.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8]: (error) Using 'memset' on class that contains a virtual function.\n", errout_str()); checkNoMemset("class Fred\n" "{\n" @@ -3107,7 +3084,7 @@ class TestClass : public TestFixture { " Pebbles pebbles;\n" " memset(&pebbles, 0, sizeof(pebbles));\n" "}"); - ASSERT_EQUALS("[test.cpp:12]: (error) Using 'memset' on class that contains a virtual function.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:12]: (error) Using 'memset' on class that contains a virtual function.\n", errout_str()); // Fred not defined in scope checkNoMemset("namespace n1 {\n" @@ -3121,7 +3098,7 @@ class TestClass : public TestFixture { " Fred fred;\n" " memset(&fred, 0, sizeof(Fred));\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Fred with namespace qualifier checkNoMemset("namespace n1 {\n" @@ -3135,7 +3112,7 @@ class TestClass : public TestFixture { " n1::Fred fred;\n" " memset(&fred, 0, sizeof(n1::Fred));\n" "}"); - ASSERT_EQUALS("[test.cpp:10]: (error) Using 'memset' on class that contains a 'std::string'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:10]: (error) Using 'memset' on class that contains a 'std::string'.\n", errout_str()); // Fred with namespace qualifier checkNoMemset("namespace n1 {\n" @@ -3149,7 +3126,7 @@ class TestClass : public TestFixture { " n1::Fred fred;\n" " memset(&fred, 0, sizeof(fred));\n" "}"); - ASSERT_EQUALS("[test.cpp:10]: (error) Using 'memset' on class that contains a 'std::string'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:10]: (error) Using 'memset' on class that contains a 'std::string'.\n", errout_str()); checkNoMemset("class A {\n" " virtual ~A() { }\n" @@ -3160,7 +3137,7 @@ class TestClass : public TestFixture { " A** arr = new A*[N];\n" " memset(arr, 0, N * sizeof(A*));\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkNoMemset("class A {\n" // #5116 - nested class data is mixed in the SymbolDatabase " std::string s;\n" @@ -3169,7 +3146,7 @@ class TestClass : public TestFixture { "void f(A::B *b) {\n" " memset(b,0,4);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #4461 Warn about memset/memcpy on class with references as members checkNoMemset("class A {\n" @@ -3179,7 +3156,7 @@ class TestClass : public TestFixture { " A a;\n" " memset(&a, 0, sizeof(a));\n" "}"); - ASSERT_EQUALS("[test.cpp:6]: (error) Using 'memset' on class that contains a reference.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (error) Using 'memset' on class that contains a reference.\n", errout_str()); checkNoMemset("class A {\n" " const B&b;\n" "};\n" @@ -3187,7 +3164,7 @@ class TestClass : public TestFixture { " A a;\n" " memset(&a, 0, sizeof(a));\n" "}"); - ASSERT_EQUALS("[test.cpp:6]: (error) Using 'memset' on class that contains a reference.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (error) Using 'memset' on class that contains a reference.\n", errout_str()); // #7456 checkNoMemset("struct A {\n" @@ -3201,7 +3178,7 @@ class TestClass : public TestFixture { " B b[4];\n" " memset(b, 0, sizeof(b));\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #8619 checkNoMemset("struct S { std::vector m; };\n" @@ -3216,7 +3193,7 @@ class TestClass : public TestFixture { "[test.cpp:5]: (error) Using 'memset' on struct that contains a 'std::vector'.\n" "[test.cpp:6]: (error) Using 'memset' on struct that contains a 'std::vector'.\n" "[test.cpp:7]: (error) Using 'memset' on struct that contains a 'std::vector'.\n", - errout.str()); + errout_str()); // #1655 const Settings s = settingsBuilder().library("std.cfg").build(); @@ -3225,7 +3202,7 @@ class TestClass : public TestFixture { " std::string s;\n" " memcpy(&s, c, strlen(c) + 1);\n" "}\n", s); - ASSERT_EQUALS("[test.cpp:4]: (error) Using 'memcpy' on std::string.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Using 'memcpy' on std::string.\n", errout_str()); checkNoMemset("template \n" " void f(T* dst, const T* src, int N) {\n" @@ -3237,13 +3214,13 @@ class TestClass : public TestFixture { " P Dst[2];\n" " f

(Dst, Src, 2);\n" "}\n", s); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkNoMemset("void f() {\n" " std::array a;\n" " std::memset(&a, 0, 4);\n" "}\n", s); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void memsetOnInvalid() { // Ticket #5425 @@ -3271,7 +3248,7 @@ class TestClass : public TestFixture { " A a;\n" " memset(&a, 0, sizeof(A));\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkNoMemset("struct A\n" "{\n" @@ -3281,7 +3258,7 @@ class TestClass : public TestFixture { " struct A a;\n" " memset(&a, 0, sizeof(struct A));\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkNoMemset("struct A\n" "{\n" @@ -3291,14 +3268,14 @@ class TestClass : public TestFixture { " struct A a;\n" " memset(&a, 0, sizeof(A));\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkNoMemset("void f()\n" "{\n" " struct sockaddr_in6 fail;\n" " memset(&fail, 0, sizeof(struct sockaddr_in6));\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkNoMemset("struct A\n" "{\n" @@ -3311,7 +3288,7 @@ class TestClass : public TestFixture { " struct A fail;\n" " memset(&fail, 0, sizeof(struct A));\n" "}"); - ASSERT_EQUALS("[test.cpp:10]: (error) Using 'memset' on struct that contains a 'std::string'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:10]: (error) Using 'memset' on struct that contains a 'std::string'.\n", errout_str()); checkNoMemset("struct Fred\n" "{\n" @@ -3322,7 +3299,7 @@ class TestClass : public TestFixture { " Fred fred;\n" " memset(&fred, 0, sizeof(fred));\n" "}"); - ASSERT_EQUALS("[test.cpp:8]: (error) Using 'memset' on struct that contains a 'std::string'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8]: (error) Using 'memset' on struct that contains a 'std::string'.\n", errout_str()); checkNoMemset("struct Stringy {\n" " std::string inner;\n" @@ -3335,7 +3312,7 @@ class TestClass : public TestFixture { " memset(&foo, 0, sizeof(Foo));\n" "}"); - ASSERT_EQUALS("[test.cpp:9]: (error) Using 'memset' on struct that contains a 'std::string'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:9]: (error) Using 'memset' on struct that contains a 'std::string'.\n", errout_str()); } void memsetVector() { @@ -3347,7 +3324,7 @@ class TestClass : public TestFixture { " A a;\n" " memset(&a, 0, sizeof(A));\n" "}"); - ASSERT_EQUALS("[test.cpp:7]: (error) Using 'memset' on class that contains a 'std::vector'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (error) Using 'memset' on class that contains a 'std::vector'.\n", errout_str()); checkNoMemset("struct A\n" "{ std::vector ints; };\n" @@ -3357,7 +3334,7 @@ class TestClass : public TestFixture { " A a;\n" " memset(&a, 0, sizeof(A));\n" "}"); - ASSERT_EQUALS("[test.cpp:7]: (error) Using 'memset' on struct that contains a 'std::vector'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (error) Using 'memset' on struct that contains a 'std::vector'.\n", errout_str()); checkNoMemset("struct A\n" "{ std::vector ints; };\n" @@ -3367,7 +3344,7 @@ class TestClass : public TestFixture { " A a;\n" " memset(&a, 0, sizeof(struct A));\n" "}"); - ASSERT_EQUALS("[test.cpp:7]: (error) Using 'memset' on struct that contains a 'std::vector'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (error) Using 'memset' on struct that contains a 'std::vector'.\n", errout_str()); checkNoMemset("struct A\n" "{ std::vector ints; };\n" @@ -3377,7 +3354,7 @@ class TestClass : public TestFixture { " A a;\n" " memset(&a, 0, sizeof(a));\n" "}"); - ASSERT_EQUALS("[test.cpp:7]: (error) Using 'memset' on struct that contains a 'std::vector'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (error) Using 'memset' on struct that contains a 'std::vector'.\n", errout_str()); checkNoMemset("class A\n" "{ std::vector< std::vector > ints; };\n" @@ -3387,7 +3364,7 @@ class TestClass : public TestFixture { " A a;\n" " memset(&a, 0, sizeof(A));\n" "}"); - ASSERT_EQUALS("[test.cpp:7]: (error) Using 'memset' on class that contains a 'std::vector'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (error) Using 'memset' on class that contains a 'std::vector'.\n", errout_str()); checkNoMemset("struct A\n" "{ std::vector< std::vector > ints; };\n" @@ -3397,7 +3374,7 @@ class TestClass : public TestFixture { " A a;\n" " memset(&a, 0, sizeof(A));\n" "}"); - ASSERT_EQUALS("[test.cpp:7]: (error) Using 'memset' on struct that contains a 'std::vector'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (error) Using 'memset' on struct that contains a 'std::vector'.\n", errout_str()); checkNoMemset("struct A\n" "{ std::vector< std::vector > ints; };\n" @@ -3407,7 +3384,7 @@ class TestClass : public TestFixture { " A a;\n" " memset(&a, 0, sizeof(a));\n" "}"); - ASSERT_EQUALS("[test.cpp:7]: (error) Using 'memset' on struct that contains a 'std::vector'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (error) Using 'memset' on struct that contains a 'std::vector'.\n", errout_str()); checkNoMemset("struct A\n" "{ std::vector ints; };\n" @@ -3417,7 +3394,7 @@ class TestClass : public TestFixture { " A a;\n" " memset(&a, 0, sizeof(A));\n" "}"); - ASSERT_EQUALS("[test.cpp:7]: (error) Using 'memset' on struct that contains a 'std::vector'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (error) Using 'memset' on struct that contains a 'std::vector'.\n", errout_str()); checkNoMemset("struct A {\n" " std::vector buf;\n" @@ -3427,7 +3404,7 @@ class TestClass : public TestFixture { " A a;\n" " memset(a, 0, 100);\n" "}"); - ASSERT_EQUALS("", errout.str()); // #4460 + ASSERT_EQUALS("", errout_str()); // #4460 checkNoMemset("struct C {\n" " std::string s;\n" @@ -3448,7 +3425,7 @@ class TestClass : public TestFixture { ASSERT_EQUALS("[test.cpp:9]: (error) Using 'memset' on struct that contains a 'std::string'.\n" "[test.cpp:11]: (error) Using 'memset' on struct that contains a 'std::string'.\n" "[test.cpp:12]: (error) Using 'memset' on struct that contains a 'std::string'.\n" - "[test.cpp:13]: (error) Using 'memset' on struct that contains a 'std::string'.\n", errout.str()); + "[test.cpp:13]: (error) Using 'memset' on struct that contains a 'std::string'.\n", errout_str()); // Ticket #6953 checkNoMemset("typedef float realnum;\n" @@ -3461,7 +3438,7 @@ class TestClass : public TestFixture { " memset(d, 0, sizeof(multilevel_data));\n" " return (void*) d;\n" "}"); - ASSERT_EQUALS("[test.cpp:8]: (portability) Using memset() on struct which contains a floating point number.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8]: (portability) Using memset() on struct which contains a floating point number.\n", errout_str()); } void memsetOnStdPodType() { // Ticket #5901 @@ -3479,7 +3456,7 @@ class TestClass : public TestFixture { " A a;\n" " memset(&a, 0, sizeof(A));\n" "}"); - ASSERT_EQUALS("", errout.str()); // std::array is POD (#5481) + ASSERT_EQUALS("", errout_str()); // std::array is POD (#5481) checkNoMemset("struct st {\n" " std::uint8_t a;\n" @@ -3490,7 +3467,7 @@ class TestClass : public TestFixture { " st s;\n" " std::memset(&s, 0, sizeof(st));\n" "}", settings); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void memsetOnFloat() { @@ -3501,7 +3478,7 @@ class TestClass : public TestFixture { " A a;\n" " memset(&a, 0, sizeof(A));\n" "}"); - ASSERT_EQUALS("[test.cpp:6]: (portability) Using memset() on struct which contains a floating point number.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (portability) Using memset() on struct which contains a floating point number.\n", errout_str()); checkNoMemset("struct A {\n" " float f[4];\n" @@ -3510,7 +3487,7 @@ class TestClass : public TestFixture { " A a;\n" " memset(&a, 0, sizeof(A));\n" "}"); - ASSERT_EQUALS("[test.cpp:6]: (portability) Using memset() on struct which contains a floating point number.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (portability) Using memset() on struct which contains a floating point number.\n", errout_str()); checkNoMemset("struct A {\n" " float f[4];\n" @@ -3519,7 +3496,7 @@ class TestClass : public TestFixture { " A a;\n" " memcpy(&a, &b, sizeof(A));\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkNoMemset("struct A {\n" " float* f;\n" @@ -3528,7 +3505,7 @@ class TestClass : public TestFixture { " A a;\n" " memset(&a, 0, sizeof(A));\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void memsetOnUnknown() { @@ -3536,7 +3513,7 @@ class TestClass : public TestFixture { " *Tokens = (CXToken *)malloc(sizeof(CXToken) * CXTokens.size());\n" " memmove(*Tokens, CXTokens.data(), sizeof(CXToken) * CXTokens.size());\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void mallocOnClass() { @@ -3544,49 +3521,49 @@ class TestClass : public TestFixture { "void foo(C*& p) {\n" " p = malloc(sizeof(C));\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:1]: (warning) Memory for class instance allocated with malloc(), but class provides constructors.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:1]: (warning) Memory for class instance allocated with malloc(), but class provides constructors.\n", errout_str()); checkNoMemset("class C { C(int z, Foo bar) { bar(); } };\n" "void foo(C*& p) {\n" " p = malloc(sizeof(C));\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:1]: (warning) Memory for class instance allocated with malloc(), but class provides constructors.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:1]: (warning) Memory for class instance allocated with malloc(), but class provides constructors.\n", errout_str()); checkNoMemset("struct C { C() {} };\n" "void foo(C*& p) {\n" " p = realloc(p, sizeof(C));\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:1]: (warning) Memory for class instance allocated with realloc(), but class provides constructors.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:1]: (warning) Memory for class instance allocated with realloc(), but class provides constructors.\n", errout_str()); checkNoMemset("struct C { virtual void bar(); };\n" "void foo(C*& p) {\n" " p = malloc(sizeof(C));\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:1]: (error) Memory for class instance allocated with malloc(), but class contains a virtual function.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:1]: (error) Memory for class instance allocated with malloc(), but class contains a virtual function.\n", errout_str()); checkNoMemset("struct C { std::string s; };\n" "void foo(C*& p) {\n" " p = malloc(sizeof(C));\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:1]: (error) Memory for class instance allocated with malloc(), but class contains a 'std::string'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:1]: (error) Memory for class instance allocated with malloc(), but class contains a 'std::string'.\n", errout_str()); checkNoMemset("class C { };\n" // C-Style class/struct "void foo(C*& p) {\n" " p = malloc(sizeof(C));\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkNoMemset("struct C { C() {} };\n" "void foo(C*& p) {\n" " p = new C();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkNoMemset("class C { C() {} };\n" "void foo(D*& p) {\n" // Unknown type " p = malloc(sizeof(C));\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkNoMemset("class AutoCloseFD {\n" " int fd;\n" @@ -3597,7 +3574,7 @@ class TestClass : public TestFixture { "void f() {\n" " AutoCloseFD fd = open(\"abc\", O_RDONLY | O_CLOEXEC);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkNoMemset("struct C {\n" // #12313 " char* p;\n" @@ -3606,14 +3583,11 @@ class TestClass : public TestFixture { "void f() {\n" " C c = strdup(\"abc\");\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } #define checkThisSubtraction(code) checkThisSubtraction_(code, __FILE__, __LINE__) void checkThisSubtraction_(const char code[], const char* file, int line) { - // Clear the error log - errout.str(""); - Preprocessor preprocessor(settings1); // Tokenize.. @@ -3628,27 +3602,24 @@ class TestClass : public TestFixture { void this_subtraction() { checkThisSubtraction("; this-x ;"); - ASSERT_EQUALS("[test.cpp:1]: (warning) Suspicious pointer subtraction. Did you intend to write '->'?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (warning) Suspicious pointer subtraction. Did you intend to write '->'?\n", errout_str()); checkThisSubtraction("; *this = *this-x ;"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkThisSubtraction("; *this = *this-x ;\n" "this-x ;"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Suspicious pointer subtraction. Did you intend to write '->'?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Suspicious pointer subtraction. Did you intend to write '->'?\n", errout_str()); checkThisSubtraction("; *this = *this-x ;\n" "this-x ;\n" "this-x ;"); ASSERT_EQUALS("[test.cpp:2]: (warning) Suspicious pointer subtraction. Did you intend to write '->'?\n" - "[test.cpp:3]: (warning) Suspicious pointer subtraction. Did you intend to write '->'?\n", errout.str()); + "[test.cpp:3]: (warning) Suspicious pointer subtraction. Did you intend to write '->'?\n", errout_str()); } #define checkConst(...) checkConst_(__FILE__, __LINE__, __VA_ARGS__) void checkConst_(const char* file, int line, const char code[], const Settings *s = nullptr, bool inconclusive = true) { - // Clear the error log - errout.str(""); - const Settings settings = settingsBuilder(s ? *s : settings0).certainty(Certainty::inconclusive, inconclusive).build(); Preprocessor preprocessor(settings); @@ -3667,18 +3638,18 @@ class TestClass : public TestFixture { " int a;\n" " int getA() { return a; }\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (style, inconclusive) Technically the member function 'Fred::getA' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style, inconclusive) Technically the member function 'Fred::getA' can be const.\n", errout_str()); checkConst("class Fred {\n" " const std::string foo() { return \"\"; }\n" "};"); - ASSERT_EQUALS("[test.cpp:2]: (performance, inconclusive) Technically the member function 'Fred::foo' can be static (but you may consider moving to unnamed namespace).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (performance, inconclusive) Technically the member function 'Fred::foo' can be static (but you may consider moving to unnamed namespace).\n", errout_str()); checkConst("class Fred {\n" " std::string s;\n" " const std::string & foo() { return \"\"; }\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Technically the member function 'Fred::foo' can be static (but you may consider moving to unnamed namespace).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Technically the member function 'Fred::foo' can be static (but you may consider moving to unnamed namespace).\n", errout_str()); // constructors can't be const.. checkConst("class Fred {\n" @@ -3686,14 +3657,14 @@ class TestClass : public TestFixture { "public:\n" " Fred() { }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // assignment through |=.. checkConst("class Fred {\n" " int a;\n" " int setA() { a |= true; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // functions with a call to a member function can only be const, if that member function is const, too.. (#1305) checkConst("class foo {\n" @@ -3702,7 +3673,7 @@ class TestClass : public TestFixture { " void a() { x = 1; }\n" " void b() { a(); }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("class Fred {\n" "public:\n" @@ -3710,14 +3681,14 @@ class TestClass : public TestFixture { " int a() const { return x; }\n" " void b() { a(); }\n" "};"); - ASSERT_EQUALS("[test.cpp:5]: (style, inconclusive) Technically the member function 'Fred::b' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (style, inconclusive) Technically the member function 'Fred::b' can be const.\n", errout_str()); checkConst("class Fred {\n" "public:\n" " int x;\n" " void b() { a(); }\n" "};"); - ASSERT_EQUALS("[test.cpp:4]: (performance, inconclusive) Technically the member function 'Fred::b' can be static (but you may consider moving to unnamed namespace).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (performance, inconclusive) Technically the member function 'Fred::b' can be static (but you may consider moving to unnamed namespace).\n", errout_str()); // static functions can't be const.. checkConst("class foo\n" @@ -3726,12 +3697,12 @@ class TestClass : public TestFixture { " static unsigned get()\n" " { return 0; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("class Fred {\n" " const std::string foo() const throw() { return \"\"; }\n" "};"); - ASSERT_EQUALS("[test.cpp:2]: (performance, inconclusive) Technically the member function 'Fred::foo' can be static (but you may consider moving to unnamed namespace).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (performance, inconclusive) Technically the member function 'Fred::foo' can be static (but you may consider moving to unnamed namespace).\n", errout_str()); } void const2() { @@ -3741,49 +3712,49 @@ class TestClass : public TestFixture { " std::string s;\n" " void foo() { s = \"\"; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // assignment to function argument reference can be const checkConst("class Fred {\n" " std::string s;\n" " void foo(std::string & a) { a = s; }\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (style, inconclusive) Technically the member function 'Fred::foo' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style, inconclusive) Technically the member function 'Fred::foo' can be const.\n", errout_str()); // assignment to variable can't be const checkConst("class Fred {\n" " std::string s;\n" " void foo(std::string & a) { s = a; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // assignment to function argument references can be const checkConst("class Fred {\n" " std::string s;\n" " void foo(std::string & a, std::string & b) { a = s; b = s; }\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (style, inconclusive) Technically the member function 'Fred::foo' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style, inconclusive) Technically the member function 'Fred::foo' can be const.\n", errout_str()); // assignment to variable, can't be const checkConst("class Fred {\n" " std::string s;\n" " void foo(std::string & a, std::string & b) { s = a; s = b; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // assignment to variable, can't be const checkConst("class Fred {\n" " std::string s;\n" " void foo(std::string & a, std::string & b) { s = a; b = a; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // assignment to variable, can't be const checkConst("class Fred {\n" " std::string s;\n" " void foo(std::string & a, std::string & b) { a = s; s = b; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void const3() { @@ -3792,42 +3763,42 @@ class TestClass : public TestFixture { " int s;\n" " void foo(int * a) { *a = s; }\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (style, inconclusive) Technically the member function 'Fred::foo' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style, inconclusive) Technically the member function 'Fred::foo' can be const.\n", errout_str()); // assignment to variable, can't be const checkConst("class Fred {\n" " int s;\n" " void foo(int * a) { s = *a; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // assignment to function argument pointers can be const checkConst("class Fred {\n" " std::string s;\n" " void foo(std::string * a, std::string * b) { *a = s; *b = s; }\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (style, inconclusive) Technically the member function 'Fred::foo' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style, inconclusive) Technically the member function 'Fred::foo' can be const.\n", errout_str()); // assignment to variable, can't be const checkConst("class Fred {\n" " std::string s;\n" " void foo(std::string * a, std::string * b) { s = *a; s = *b; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // assignment to variable, can't be const checkConst("class Fred {\n" " std::string s;\n" " void foo(std::string * a, std::string * b) { s = *a; *b = s; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // assignment to variable, can't be const checkConst("class Fred {\n" " std::string s;\n" " void foo(std::string * a, std::string * b) { *a = s; s = b; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void const4() { @@ -3836,14 +3807,14 @@ class TestClass : public TestFixture { " int getA();\n" "};\n" "int Fred::getA() { return a; }"); - ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:3]: (style, inconclusive) Technically the member function 'Fred::getA' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:3]: (style, inconclusive) Technically the member function 'Fred::getA' can be const.\n", errout_str()); checkConst("class Fred {\n" " std::string s;\n" " const std::string & foo();\n" "};\n" "const std::string & Fred::foo() { return \"\"; }"); - ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:3]: (performance, inconclusive) Technically the member function 'Fred::foo' can be static (but you may consider moving to unnamed namespace).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:3]: (performance, inconclusive) Technically the member function 'Fred::foo' can be static (but you may consider moving to unnamed namespace).\n", errout_str()); // functions with a function call to a non-const member can't be const.. (#1305) checkConst("class Fred\n" @@ -3854,7 +3825,7 @@ class TestClass : public TestFixture { " void b();\n" "};\n" "void Fred::b() { a(); }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // static functions can't be const.. checkConst("class Fred\n" @@ -3863,7 +3834,7 @@ class TestClass : public TestFixture { " static unsigned get();\n" "};\n" "static unsigned Fred::get() { return 0; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // assignment to variable can't be const checkConst("class Fred {\n" @@ -3871,7 +3842,7 @@ class TestClass : public TestFixture { " void foo();\n" "};\n" "void Fred::foo() { s = \"\"; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // assignment to function argument reference can be const checkConst("class Fred {\n" @@ -3879,7 +3850,7 @@ class TestClass : public TestFixture { " void foo(std::string & a);\n" "};\n" "void Fred::foo(std::string & a) { a = s; }"); - ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:3]: (style, inconclusive) Technically the member function 'Fred::foo' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:3]: (style, inconclusive) Technically the member function 'Fred::foo' can be const.\n", errout_str()); // assignment to variable can't be const checkConst("class Fred {\n" @@ -3887,7 +3858,7 @@ class TestClass : public TestFixture { " void foo(std::string & a);\n" "};\n" "void Fred::foo(std::string & a) { s = a; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // assignment to function argument references can be const checkConst("class Fred {\n" @@ -3895,7 +3866,7 @@ class TestClass : public TestFixture { " void foo(std::string & a, std::string & b);\n" "};\n" "void Fred::foo(std::string & a, std::string & b) { a = s; b = s; }"); - ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:3]: (style, inconclusive) Technically the member function 'Fred::foo' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:3]: (style, inconclusive) Technically the member function 'Fred::foo' can be const.\n", errout_str()); // assignment to variable, can't be const checkConst("class Fred {\n" @@ -3903,7 +3874,7 @@ class TestClass : public TestFixture { " void foo(std::string & a, std::string & b);\n" "};\n" "void Fred::foo(std::string & a, std::string & b) { s = a; s = b; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // assignment to variable, can't be const checkConst("class Fred {\n" @@ -3911,7 +3882,7 @@ class TestClass : public TestFixture { " void foo(std::string & a, std::string & b);\n" "};\n" "void Fred::foo(std::string & a, std::string & b) { s = a; b = a; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // assignment to variable, can't be const checkConst("class Fred {\n" @@ -3919,7 +3890,7 @@ class TestClass : public TestFixture { " void foo(std::string & a, std::string & b);\n" "};\n" "void Fred::foo(std::string & a, std::string & b) { a = s; s = b; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // assignment to function argument pointer can be const checkConst("class Fred {\n" @@ -3927,7 +3898,7 @@ class TestClass : public TestFixture { " void foo(int * a);\n" "};\n" "void Fred::foo(int * a) { *a = s; }"); - ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:3]: (style, inconclusive) Technically the member function 'Fred::foo' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:3]: (style, inconclusive) Technically the member function 'Fred::foo' can be const.\n", errout_str()); // assignment to variable, can't be const checkConst("class Fred {\n" @@ -3935,7 +3906,7 @@ class TestClass : public TestFixture { " void foo(int * a);\n" "};\n" "void Fred::foo(int * a) { s = *a; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // assignment to function argument pointers can be const checkConst("class Fred {\n" @@ -3943,7 +3914,7 @@ class TestClass : public TestFixture { " void foo(std::string * a, std::string * b);\n" "};\n" "void Fred::foo(std::string * a, std::string * b) { *a = s; *b = s; }"); - ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:3]: (style, inconclusive) Technically the member function 'Fred::foo' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:3]: (style, inconclusive) Technically the member function 'Fred::foo' can be const.\n", errout_str()); // assignment to variable, can't be const checkConst("class Fred {\n" @@ -3951,7 +3922,7 @@ class TestClass : public TestFixture { " void foo(std::string * a, std::string * b);\n" "};\n" "void Fred::foo(std::string * a, std::string * b) { s = *a; s = *b; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // assignment to variable, can't be const checkConst("class Fred {\n" @@ -3959,7 +3930,7 @@ class TestClass : public TestFixture { " void foo(std::string * a, std::string * b);\n" "};\n" "void Fred::foo(std::string * a, std::string * b) { s = *a; *b = s; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // assignment to variable, can't be const checkConst("class Fred {\n" @@ -3967,7 +3938,7 @@ class TestClass : public TestFixture { " void foo(std::string * a, std::string * b);\n" "};\n" "void Fred::foo(std::string * a, std::string * b) { *a = s; s = b; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // check functions with same name checkConst("class Fred {\n" @@ -3980,7 +3951,7 @@ class TestClass : public TestFixture { "void Fred::foo(std::string & a) { a = s; }" "void Fred::foo(const std::string & a) { s = a; }"); ASSERT_EQUALS("[test.cpp:7] -> [test.cpp:3]: (performance, inconclusive) Technically the member function 'Fred::foo' can be static (but you may consider moving to unnamed namespace).\n" - "[test.cpp:7] -> [test.cpp:4]: (style, inconclusive) Technically the member function 'Fred::foo' can be const.\n", errout.str()); + "[test.cpp:7] -> [test.cpp:4]: (style, inconclusive) Technically the member function 'Fred::foo' can be const.\n", errout_str()); // check functions with different or missing parameter names checkConst("class Fred {\n" @@ -4000,7 +3971,7 @@ class TestClass : public TestFixture { "[test.cpp:10] -> [test.cpp:4]: (performance, inconclusive) Technically the member function 'Fred::foo2' can be static (but you may consider moving to unnamed namespace).\n" "[test.cpp:11] -> [test.cpp:5]: (performance, inconclusive) Technically the member function 'Fred::foo3' can be static (but you may consider moving to unnamed namespace).\n" "[test.cpp:12] -> [test.cpp:6]: (performance, inconclusive) Technically the member function 'Fred::foo4' can be static (but you may consider moving to unnamed namespace).\n" - "[test.cpp:13] -> [test.cpp:7]: (performance, inconclusive) Technically the member function 'Fred::foo5' can be static (but you may consider moving to unnamed namespace).\n", errout.str()); + "[test.cpp:13] -> [test.cpp:7]: (performance, inconclusive) Technically the member function 'Fred::foo5' can be static (but you may consider moving to unnamed namespace).\n", errout_str()); // check nested classes checkConst("class Fred {\n" @@ -4009,7 +3980,7 @@ class TestClass : public TestFixture { " int getA() { return a; }\n" " };\n" "};"); - ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'Fred::A::getA' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'Fred::A::getA' can be const.\n", errout_str()); checkConst("class Fred {\n" " class A {\n" @@ -4018,7 +3989,7 @@ class TestClass : public TestFixture { " };\n" " int A::getA() { return a; }\n" "};"); - ASSERT_EQUALS("[test.cpp:6] -> [test.cpp:4]: (style, inconclusive) Technically the member function 'Fred::A::getA' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6] -> [test.cpp:4]: (style, inconclusive) Technically the member function 'Fred::A::getA' can be const.\n", errout_str()); checkConst("class Fred {\n" " class A {\n" @@ -4027,7 +3998,7 @@ class TestClass : public TestFixture { " };\n" "};\n" "int Fred::A::getA() { return a; }"); - ASSERT_EQUALS("[test.cpp:7] -> [test.cpp:4]: (style, inconclusive) Technically the member function 'Fred::A::getA' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7] -> [test.cpp:4]: (style, inconclusive) Technically the member function 'Fred::A::getA' can be const.\n", errout_str()); // check deeply nested classes checkConst("class Fred {\n" @@ -4042,7 +4013,7 @@ class TestClass : public TestFixture { "};"); ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'Fred::B::getB' can be const.\n" "[test.cpp:7]: (style, inconclusive) Technically the member function 'Fred::B::A::getA' can be const.\n" - , errout.str()); + , errout_str()); checkConst("class Fred {\n" " class B {\n" @@ -4057,7 +4028,7 @@ class TestClass : public TestFixture { " int B::getB() { return b; }\n" "};"); ASSERT_EQUALS("[test.cpp:11] -> [test.cpp:4]: (style, inconclusive) Technically the member function 'Fred::B::getB' can be const.\n" - "[test.cpp:9] -> [test.cpp:7]: (style, inconclusive) Technically the member function 'Fred::B::A::getA' can be const.\n", errout.str()); + "[test.cpp:9] -> [test.cpp:7]: (style, inconclusive) Technically the member function 'Fred::B::A::getA' can be const.\n", errout_str()); checkConst("class Fred {\n" " class B {\n" @@ -4072,7 +4043,7 @@ class TestClass : public TestFixture { " int B::getB() { return b; }\n" "};"); ASSERT_EQUALS("[test.cpp:11] -> [test.cpp:4]: (style, inconclusive) Technically the member function 'Fred::B::getB' can be const.\n" - "[test.cpp:10] -> [test.cpp:7]: (style, inconclusive) Technically the member function 'Fred::B::A::getA' can be const.\n", errout.str()); + "[test.cpp:10] -> [test.cpp:7]: (style, inconclusive) Technically the member function 'Fred::B::A::getA' can be const.\n", errout_str()); checkConst("class Fred {\n" " class B {\n" @@ -4087,7 +4058,7 @@ class TestClass : public TestFixture { "int Fred::B::A::getA() { return a; }\n" "int Fred::B::getB() { return b; }"); ASSERT_EQUALS("[test.cpp:12] -> [test.cpp:4]: (style, inconclusive) Technically the member function 'Fred::B::getB' can be const.\n" - "[test.cpp:11] -> [test.cpp:7]: (style, inconclusive) Technically the member function 'Fred::B::A::getA' can be const.\n", errout.str()); + "[test.cpp:11] -> [test.cpp:7]: (style, inconclusive) Technically the member function 'Fred::B::A::getA' can be const.\n", errout_str()); } // operator< can often be const @@ -4096,7 +4067,7 @@ class TestClass : public TestFixture { " int a;\n" " bool operator<(const Fred &f) { return a < f.a; }\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (style, inconclusive) Technically the member function 'Fred::operator<' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style, inconclusive) Technically the member function 'Fred::operator<' can be const.\n", errout_str()); } // operator<< @@ -4111,7 +4082,7 @@ class TestClass : public TestFixture { " foo << 123;\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("struct Foo {\n" " void operator<<(int);\n" @@ -4123,7 +4094,7 @@ class TestClass : public TestFixture { " std::cout << foo << 123;\n" " }\n" "};"); - ASSERT_EQUALS("[test.cpp:6]: (style, inconclusive) Technically the member function 'Fred::x' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (style, inconclusive) Technically the member function 'Fred::x' can be const.\n", errout_str()); } void constoperator3() { @@ -4132,13 +4103,13 @@ class TestClass : public TestFixture { " int const & operator [] (unsigned int index) const { return array[index]; }\n" " int & operator [] (unsigned int index) { return array[index]; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("struct Fred {\n" " int array[10];\n" " int const & operator [] (unsigned int index) { return array[index]; }\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (style, inconclusive) Technically the member function 'Fred::operator[]' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style, inconclusive) Technically the member function 'Fred::operator[]' can be const.\n", errout_str()); } void constoperator4() { @@ -4148,14 +4119,14 @@ class TestClass : public TestFixture { "public:\n" " operator int*() { return &c; };\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("class A {\n" " int c;\n" "public:\n" " operator const int*() { return &c; };\n" "};"); - ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'A::operatorconstint*' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'A::operatorconstint*' can be const.\n", errout_str()); // #2375 checkConst("struct Fred {\n" @@ -4163,14 +4134,14 @@ class TestClass : public TestFixture { " typedef int* (Fred::*UnspecifiedBoolType);\n" " operator UnspecifiedBoolType() { };\n" "};"); - TODO_ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'Fred::operatorint**' can be const.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'Fred::operatorint**' can be const.\n", "", errout_str()); checkConst("struct Fred {\n" " int array[10];\n" " typedef int* (Fred::*UnspecifiedBoolType);\n" " operator UnspecifiedBoolType() { array[0] = 0; };\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void constoperator5() { // ticket #3252 @@ -4179,21 +4150,21 @@ class TestClass : public TestFixture { "public:\n" " operator int& () {return c}\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("class A {\n" " int c;\n" "public:\n" " operator const int& () {return c}\n" "};"); - ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'A::operatorconstint&' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'A::operatorconstint&' can be const.\n", errout_str()); checkConst("class A {\n" " int c;\n" "public:\n" " operator int () {return c}\n" "};"); - ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'A::operatorint' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'A::operatorint' can be const.\n", errout_str()); } void constoperator6() { // ticket #8669 @@ -4201,7 +4172,7 @@ class TestClass : public TestFixture { " int c;\n" " void f() { os >> *this; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void const5() { @@ -4215,7 +4186,7 @@ class TestClass : public TestFixture { " return same;\n" " }\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (style, inconclusive) Technically the member function 'A::foo' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style, inconclusive) Technically the member function 'A::foo' can be const.\n", errout_str()); } void const6() { @@ -4224,14 +4195,14 @@ class TestClass : public TestFixture { "public:\n" "};\n" "void bar() {}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("class Fred\n" "{\n" "public:\n" " void foo() { }\n" "};"); - ASSERT_EQUALS("[test.cpp:4]: (performance, inconclusive) Technically the member function 'Fred::foo' can be static (but you may consider moving to unnamed namespace).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (performance, inconclusive) Technically the member function 'Fred::foo' can be static (but you may consider moving to unnamed namespace).\n", errout_str()); checkConst("struct fast_string\n" "{\n" @@ -4245,7 +4216,7 @@ class TestClass : public TestFixture { "{\n" " buff[10] = t;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void const7() { @@ -4256,7 +4227,7 @@ class TestClass : public TestFixture { " void set(const foo & f) { *this = f; }\n" "};\n" "void bar() {}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void const8() { @@ -4268,7 +4239,7 @@ class TestClass : public TestFixture { "private:\n" " std::string m_strValue;\n" "};"); - ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'A::strGetString' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'A::strGetString' can be const.\n", errout_str()); } void const9() { @@ -4279,7 +4250,7 @@ class TestClass : public TestFixture { "private:\n" " wxThread::ExitCode m_exitcode;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void const10() { @@ -4290,7 +4261,7 @@ class TestClass : public TestFixture { "private:\n" " int x;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("class A {\n" "public:\n" @@ -4298,7 +4269,7 @@ class TestClass : public TestFixture { "private:\n" " int x;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("class A {\n" "public:\n" @@ -4306,7 +4277,7 @@ class TestClass : public TestFixture { "private:\n" " int x;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void const11() { @@ -4317,7 +4288,7 @@ class TestClass : public TestFixture { "private:\n" " struct tm m_time;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void const12() { @@ -4328,7 +4299,7 @@ class TestClass : public TestFixture { "private:\n" " mutable int x;\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (style, inconclusive) Technically the member function 'A::foo' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style, inconclusive) Technically the member function 'A::foo' can be const.\n", errout_str()); } void const13() { @@ -4343,7 +4314,7 @@ class TestClass : public TestFixture { " std::pair m_pair;\n" "};"); ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'A::GetVec' can be const.\n" - "[test.cpp:5]: (style, inconclusive) Technically the member function 'A::GetPair' can be const.\n", errout.str()); + "[test.cpp:5]: (style, inconclusive) Technically the member function 'A::GetPair' can be const.\n", errout_str()); checkConst("class A {\n" "public:\n" @@ -4355,7 +4326,7 @@ class TestClass : public TestFixture { " std::pair m_pair;\n" "};"); ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'A::GetVec' can be const.\n" - "[test.cpp:5]: (style, inconclusive) Technically the member function 'A::GetPair' can be const.\n", errout.str()); + "[test.cpp:5]: (style, inconclusive) Technically the member function 'A::GetPair' can be const.\n", errout_str()); } void const14() { @@ -4367,7 +4338,7 @@ class TestClass : public TestFixture { "private:\n" " std::pair,double> m_pair;\n" "};"); - ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'A::GetPair' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'A::GetPair' can be const.\n", errout_str()); checkConst("class A {\n" "public:\n" @@ -4376,7 +4347,7 @@ class TestClass : public TestFixture { "private:\n" " std::pair,double> m_pair;\n" "};"); - ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'A::GetPair' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'A::GetPair' can be const.\n", errout_str()); checkConst("class A {\n" "public:\n" @@ -4385,7 +4356,7 @@ class TestClass : public TestFixture { "private:\n" " std::pair,double> m_pair;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("using namespace std;" @@ -4396,7 +4367,7 @@ class TestClass : public TestFixture { "private:\n" " pair m_pair;\n" "};"); - ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'A::GetPair' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'A::GetPair' can be const.\n", errout_str()); checkConst("using namespace std;" "class A {\n" @@ -4406,7 +4377,7 @@ class TestClass : public TestFixture { "private:\n" " pair m_pair;\n" "};"); - ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'A::GetPair' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'A::GetPair' can be const.\n", errout_str()); checkConst("using namespace std;" "class A {\n" @@ -4416,7 +4387,7 @@ class TestClass : public TestFixture { "private:\n" " pair m_pair;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("class A {\n" @@ -4426,7 +4397,7 @@ class TestClass : public TestFixture { "private:\n" " std::pair< int,std::vector > m_pair;\n" "};"); - ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'A::GetPair' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'A::GetPair' can be const.\n", errout_str()); checkConst("class A {\n" "public:\n" @@ -4435,7 +4406,7 @@ class TestClass : public TestFixture { "private:\n" " std::pair< int,std::vector > m_pair;\n" "};"); - ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'A::GetPair' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'A::GetPair' can be const.\n", errout_str()); checkConst("class A {\n" "public:\n" @@ -4444,7 +4415,7 @@ class TestClass : public TestFixture { "private:\n" " std::pair< int,std::vector > m_pair;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("using namespace std;" @@ -4455,7 +4426,7 @@ class TestClass : public TestFixture { "private:\n" " pair< vector, int > m_pair;\n" "};"); - ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'A::GetPair' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'A::GetPair' can be const.\n", errout_str()); checkConst("using namespace std;" "class A {\n" @@ -4465,7 +4436,7 @@ class TestClass : public TestFixture { "private:\n" " pair< vector, int > m_pair;\n" "};"); - ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'A::GetPair' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'A::GetPair' can be const.\n", errout_str()); checkConst("using namespace std;" "class A {\n" @@ -4475,7 +4446,7 @@ class TestClass : public TestFixture { "private:\n" " pair< vector, int > m_pair;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("class A {\n" "public:\n" @@ -4484,7 +4455,7 @@ class TestClass : public TestFixture { "private:\n" " std::pair< std::vector,std::vector > m_pair;\n" "};"); - ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'A::GetPair' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'A::GetPair' can be const.\n", errout_str()); checkConst("class A {\n" "public:\n" @@ -4493,7 +4464,7 @@ class TestClass : public TestFixture { "private:\n" " std::pair< std::vector,std::vector > m_pair;\n" "};"); - ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'A::GetPair' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'A::GetPair' can be const.\n", errout_str()); checkConst("class A {\n" "public:\n" @@ -4502,7 +4473,7 @@ class TestClass : public TestFixture { "private:\n" " std::pair< std::vector,std::vector > m_pair;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); @@ -4513,7 +4484,7 @@ class TestClass : public TestFixture { "private:\n" " std::pair< std::pair < int, char > , int > m_pair;\n" "};"); - ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'A::GetPair' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'A::GetPair' can be const.\n", errout_str()); checkConst("class A {\n" "public:\n" @@ -4522,7 +4493,7 @@ class TestClass : public TestFixture { "private:\n" " std::pair< std::pair < int, char > , int > m_pair;\n" "};"); - ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'A::GetPair' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'A::GetPair' can be const.\n", errout_str()); checkConst("class A {\n" "public:\n" @@ -4531,7 +4502,7 @@ class TestClass : public TestFixture { "private:\n" " std::pair< std::pair < int, char > , int > m_pair;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("class A {\n" @@ -4541,7 +4512,7 @@ class TestClass : public TestFixture { "private:\n" " std::pair< int , std::pair < int, char > > m_pair;\n" "};"); - ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'A::GetPair' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'A::GetPair' can be const.\n", errout_str()); checkConst("class A {\n" "public:\n" @@ -4550,7 +4521,7 @@ class TestClass : public TestFixture { "private:\n" " std::pair< int , std::pair < int, char > > m_pair;\n" "};"); - ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'A::GetPair' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'A::GetPair' can be const.\n", errout_str()); checkConst("class A {\n" "public:\n" @@ -4559,7 +4530,7 @@ class TestClass : public TestFixture { "private:\n" " std::pair< int , std::pair < int, char > > m_pair;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("using namespace std;" @@ -4570,7 +4541,7 @@ class TestClass : public TestFixture { "private:\n" " vector m_Vec;\n" "};"); - ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'A::GetVec' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'A::GetVec' can be const.\n", errout_str()); checkConst("using namespace std;" "class A {\n" @@ -4580,7 +4551,7 @@ class TestClass : public TestFixture { "private:\n" " vector m_Vec;\n" "};"); - ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'A::GetVec' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'A::GetVec' can be const.\n", errout_str()); checkConst("using namespace std;" "class A {\n" @@ -4590,7 +4561,7 @@ class TestClass : public TestFixture { "private:\n" " vector m_Vec;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("class A {\n" @@ -4599,7 +4570,7 @@ class TestClass : public TestFixture { "private:\n" " const int * x;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("class A {\n" "public:\n" @@ -4607,7 +4578,7 @@ class TestClass : public TestFixture { "private:\n" " const int * x;\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (style, inconclusive) Technically the member function 'A::foo' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style, inconclusive) Technically the member function 'A::foo' can be const.\n", errout_str()); } void const15() { @@ -4615,7 +4586,7 @@ class TestClass : public TestFixture { " unsigned long long int a;\n" " unsigned long long int getA() { return a; }\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (style, inconclusive) Technically the member function 'Fred::getA' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style, inconclusive) Technically the member function 'Fred::getA' can be const.\n", errout_str()); // constructors can't be const.. checkConst("class Fred {\n" @@ -4623,14 +4594,14 @@ class TestClass : public TestFixture { "public:\n" " Fred() { }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // assignment through |=.. checkConst("class Fred {\n" " unsigned long long int a;\n" " unsigned long long int setA() { a |= true; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // static functions can't be const.. checkConst("class foo\n" @@ -4639,7 +4610,7 @@ class TestClass : public TestFixture { " static unsigned long long int get()\n" " { return 0; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void const16() { @@ -4648,7 +4619,7 @@ class TestClass : public TestFixture { " int a;\n" " void set(int i) { Fred::a = i; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void const17() { @@ -4659,7 +4630,7 @@ class TestClass : public TestFixture { "private:\n" " struct { int k; } a[4];\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void const18() { @@ -4668,7 +4639,7 @@ class TestClass : public TestFixture { "public:\n" " void set(int i) { x = i; }\n" "};"); - ASSERT_EQUALS("[test.cpp:4]: (performance, inconclusive) Technically the member function 'Fred::set' can be static (but you may consider moving to unnamed namespace).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (performance, inconclusive) Technically the member function 'Fred::set' can be static (but you may consider moving to unnamed namespace).\n", errout_str()); } void const19() { @@ -4680,7 +4651,7 @@ class TestClass : public TestFixture { "public:\n" " void set(std::string ss) { s = ss; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void const20() { @@ -4690,35 +4661,35 @@ class TestClass : public TestFixture { "public:\n" " void set(int i) { x = i; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("class Fred {\n" " list x;\n" "public:\n" " list get() { return x; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("class Fred {\n" " list x;\n" "public:\n" " list get() { return x; }\n" "};"); - ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'Fred::get' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'Fred::get' can be const.\n", errout_str()); checkConst("class Fred {\n" " std::list x;\n" "public:\n" " std::list get() { return x; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("class Fred {\n" " std::list x;\n" "public:\n" " std::list get() { return x; }\n" "};"); - ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'Fred::get' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'Fred::get' can be const.\n", errout_str()); } void const21() { @@ -4734,7 +4705,7 @@ class TestClass : public TestFixture { " }\n" " void f1() { l1[0] = \"Hello\"; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void const22() { @@ -4745,7 +4716,7 @@ class TestClass : public TestFixture { "public:\n" " void f1() { v1 = 0; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("class A\n" "{\n" @@ -4754,7 +4725,7 @@ class TestClass : public TestFixture { "public:\n" " void f1() { v1[0] = 0; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void const23() { @@ -4766,7 +4737,7 @@ class TestClass : public TestFixture { "private:\n" " Type2 _m;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void const24() { @@ -4779,7 +4750,7 @@ class TestClass : public TestFixture { "private:\n" " std::map *m_pSettings;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } @@ -4794,7 +4765,7 @@ class TestClass : public TestFixture { "private:\n" "std::string m_strVal;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("class A{\n" "public:\n" @@ -4804,7 +4775,7 @@ class TestClass : public TestFixture { "private:\n" "std::string m_strVal;\n" "};"); - ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'A::strGetString' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'A::strGetString' can be const.\n", errout_str()); checkConst("class A{\n" "public:\n" @@ -4814,7 +4785,7 @@ class TestClass : public TestFixture { "private:\n" "std::string m_strVal;\n" "};"); - ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'A::strGetString1' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'A::strGetString1' can be const.\n", errout_str()); checkConst("class A{\n" "public:\n" @@ -4824,7 +4795,7 @@ class TestClass : public TestFixture { "private:\n" "std::vector m_strVec;\n" "};"); - ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'A::strGetSize' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'A::strGetSize' can be const.\n", errout_str()); checkConst("class A{\n" "public:\n" @@ -4834,7 +4805,7 @@ class TestClass : public TestFixture { "private:\n" "std::vector m_strVec;\n" "};"); - ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'A::strGetEmpty' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'A::strGetEmpty' can be const.\n", errout_str()); } void const26() { // ticket #1847 @@ -4845,7 +4816,7 @@ class TestClass : public TestFixture { "}\n" "float delays_[4];\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("struct DelayBase {\n" " float swapSpecificDelays(int index1) {\n" @@ -4853,7 +4824,7 @@ class TestClass : public TestFixture { " }\n" " float delays_[4];\n" "};"); - ASSERT_EQUALS("[test.cpp:2]: (style, inconclusive) Technically the member function 'DelayBase::swapSpecificDelays' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style, inconclusive) Technically the member function 'DelayBase::swapSpecificDelays' can be const.\n", errout_str()); } void const27() { // ticket #1882 @@ -4871,7 +4842,7 @@ class TestClass : public TestFixture { " return m_iRealVal / m_d;\n" " return dRet;\n" "};", nullptr, true); - ASSERT_EQUALS("[test.cpp:9] -> [test.cpp:4]: (style, inconclusive) Technically the member function 'A::dGetValue' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:9] -> [test.cpp:4]: (style, inconclusive) Technically the member function 'A::dGetValue' can be const.\n", errout_str()); } void const28() { // ticket #1883 @@ -4888,7 +4859,7 @@ class TestClass : public TestFixture { " y=yPos;\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("class AA : public P {\n" "public:\n" @@ -4898,7 +4869,7 @@ class TestClass : public TestFixture { " UnknownScope::x = x_;\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("class AA {\n" "public:\n" @@ -4908,7 +4879,7 @@ class TestClass : public TestFixture { " UnknownScope::x = x_;\n" " }\n" "};"); - ASSERT_EQUALS("[test.cpp:4]: (performance, inconclusive) Technically the member function 'AA::vSetXPos' can be static (but you may consider moving to unnamed namespace).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (performance, inconclusive) Technically the member function 'AA::vSetXPos' can be static (but you may consider moving to unnamed namespace).\n", errout_str()); } @@ -4933,7 +4904,7 @@ class TestClass : public TestFixture { "{\n" " return value_;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void const30() { @@ -4948,7 +4919,7 @@ class TestClass : public TestFixture { " return a;\n" " }\n" "};"); - ASSERT_EQUALS("[test.cpp:7]: (style, inconclusive) Technically the member function 'Derived::get' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (style, inconclusive) Technically the member function 'Derived::get' can be const.\n", errout_str()); checkConst("class Base1 {\n" "public:\n" @@ -4968,7 +4939,7 @@ class TestClass : public TestFixture { " }\n" "};"); ASSERT_EQUALS("[test.cpp:11]: (style, inconclusive) Technically the member function 'Derived::getA' can be const.\n" - "[test.cpp:14]: (style, inconclusive) Technically the member function 'Derived::getB' can be const.\n", errout.str()); + "[test.cpp:14]: (style, inconclusive) Technically the member function 'Derived::getB' can be const.\n", errout_str()); checkConst("class Base {\n" "public:\n" @@ -4981,7 +4952,7 @@ class TestClass : public TestFixture { " return a;\n" " }\n" "};"); - ASSERT_EQUALS("[test.cpp:8]: (style, inconclusive) Technically the member function 'Derived2::get' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8]: (style, inconclusive) Technically the member function 'Derived2::get' can be const.\n", errout_str()); checkConst("class Base {\n" "public:\n" @@ -4996,7 +4967,7 @@ class TestClass : public TestFixture { " return a;\n" " }\n" "};"); - ASSERT_EQUALS("[test.cpp:10]: (style, inconclusive) Technically the member function 'Derived4::get' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:10]: (style, inconclusive) Technically the member function 'Derived4::get' can be const.\n", errout_str()); // check for false positives checkConst("class Base {\n" @@ -5009,7 +4980,7 @@ class TestClass : public TestFixture { " return a;\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("class Base1 {\n" "public:\n" @@ -5028,7 +4999,7 @@ class TestClass : public TestFixture { " return b;\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("class Base {\n" "public:\n" @@ -5041,7 +5012,7 @@ class TestClass : public TestFixture { " return a;\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("class Base {\n" "public:\n" @@ -5056,7 +5027,7 @@ class TestClass : public TestFixture { " return a;\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void const31() { @@ -5066,7 +5037,7 @@ class TestClass : public TestFixture { " int a;\n" " int get() { return a; }\n" "};"); - ASSERT_EQUALS("[test.cpp:5]: (style, inconclusive) Technically the member function 'Fred::get' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (style, inconclusive) Technically the member function 'Fred::get' can be const.\n", errout_str()); } void const32() { @@ -5075,7 +5046,7 @@ class TestClass : public TestFixture { " std::string a[10];\n" " void seta() { a[0] = \"\"; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void const33() { @@ -5083,7 +5054,7 @@ class TestClass : public TestFixture { "public:\n" " void f(){}\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void const34() { // ticket #1964 @@ -5092,7 +5063,7 @@ class TestClass : public TestFixture { " foo.bar = this;\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void const35() { // ticket #2001 @@ -5111,7 +5082,7 @@ class TestClass : public TestFixture { " int var;\n" " };\n" "}"); - ASSERT_EQUALS("[test.cpp:12]: (style, inconclusive) Technically the member function 'N::Derived::getResourceName' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:12]: (style, inconclusive) Technically the member function 'N::Derived::getResourceName' can be const.\n", errout_str()); checkConst("namespace N\n" "{\n" @@ -5123,7 +5094,7 @@ class TestClass : public TestFixture { " };\n" "}\n" "int N::Base::getResourceName() { return var; }"); - ASSERT_EQUALS("[test.cpp:10] -> [test.cpp:6]: (style, inconclusive) Technically the member function 'N::Base::getResourceName' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:10] -> [test.cpp:6]: (style, inconclusive) Technically the member function 'N::Base::getResourceName' can be const.\n", errout_str()); checkConst("namespace N\n" "{\n" @@ -5138,7 +5109,7 @@ class TestClass : public TestFixture { "{\n" " int Base::getResourceName() { return var; }\n" "}"); - ASSERT_EQUALS("[test.cpp:12] -> [test.cpp:6]: (style, inconclusive) Technically the member function 'N::Base::getResourceName' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:12] -> [test.cpp:6]: (style, inconclusive) Technically the member function 'N::Base::getResourceName' can be const.\n", errout_str()); checkConst("namespace N\n" "{\n" @@ -5151,7 +5122,7 @@ class TestClass : public TestFixture { "}\n" "using namespace N;\n" "int Base::getResourceName() { return var; }"); - ASSERT_EQUALS("[test.cpp:11] -> [test.cpp:6]: (style, inconclusive) Technically the member function 'N::Base::getResourceName' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:11] -> [test.cpp:6]: (style, inconclusive) Technically the member function 'N::Base::getResourceName' can be const.\n", errout_str()); } void const36() { // ticket #2003 @@ -5163,7 +5134,7 @@ class TestClass : public TestFixture { " m_MaxQueueSize = a_MaxQueueSize;\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void const37() { // ticket #2081 and #2085 @@ -5178,7 +5149,7 @@ class TestClass : public TestFixture { "private:\n" " std::string m_str;\n" "};"); - ASSERT_EQUALS("[test.cpp:5]: (style, inconclusive) Technically the member function 'A::operator+' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (style, inconclusive) Technically the member function 'A::operator+' can be const.\n", errout_str()); checkConst("class Fred\n" "{\n" @@ -5192,7 +5163,7 @@ class TestClass : public TestFixture { " return (x == 0x11224488);\n" " }\n" "};"); - ASSERT_EQUALS("[test.cpp:9]: (style, inconclusive) Technically the member function 'Fred::isValid' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:9]: (style, inconclusive) Technically the member function 'Fred::isValid' can be const.\n", errout_str()); } void const38() { // ticket #2135 @@ -5208,7 +5179,7 @@ class TestClass : public TestFixture { "{\n" " (*oArq) << \"\";\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void const39() { @@ -5229,7 +5200,7 @@ class TestClass : public TestFixture { " return p;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void const40() { // ticket #2228 @@ -5246,7 +5217,7 @@ class TestClass : public TestFixture { " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void const41() { // ticket #2255 @@ -5260,7 +5231,7 @@ class TestClass : public TestFixture { " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("class SharedPtrHolder\n" "{\n" @@ -5272,7 +5243,7 @@ class TestClass : public TestFixture { " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("class SharedPtrHolder2\n" "{\n" @@ -5287,7 +5258,7 @@ class TestClass : public TestFixture { " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("struct IntPtrTypes\n" "{\n" @@ -5304,7 +5275,7 @@ class TestClass : public TestFixture { " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("template \n" "struct PtrTypes\n" @@ -5322,7 +5293,7 @@ class TestClass : public TestFixture { " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void const42() { // ticket #2282 @@ -5336,7 +5307,7 @@ class TestClass : public TestFixture { "{\n" "}"); - ASSERT_EQUALS("[test.cpp:7] -> [test.cpp:5]: (performance, inconclusive) Technically the member function 'Fred::f' can be static (but you may consider moving to unnamed namespace).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7] -> [test.cpp:5]: (performance, inconclusive) Technically the member function 'Fred::f' can be static (but you may consider moving to unnamed namespace).\n", errout_str()); checkConst("class Fred\n" "{\n" @@ -5350,7 +5321,7 @@ class TestClass : public TestFixture { "{\n" "}"); - ASSERT_EQUALS("[test.cpp:9] -> [test.cpp:7]: (performance, inconclusive) Technically the member function 'Fred::f' can be static (but you may consider moving to unnamed namespace).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:9] -> [test.cpp:7]: (performance, inconclusive) Technically the member function 'Fred::f' can be static (but you may consider moving to unnamed namespace).\n", errout_str()); checkConst("namespace NS {\n" " class Fred\n" @@ -5366,7 +5337,7 @@ class TestClass : public TestFixture { " }\n" "}"); - ASSERT_EQUALS("[test.cpp:10] -> [test.cpp:8]: (performance, inconclusive) Technically the member function 'NS::Fred::f' can be static (but you may consider moving to unnamed namespace).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:10] -> [test.cpp:8]: (performance, inconclusive) Technically the member function 'NS::Fred::f' can be static (but you may consider moving to unnamed namespace).\n", errout_str()); checkConst("namespace NS {\n" " class Fred\n" @@ -5382,7 +5353,7 @@ class TestClass : public TestFixture { "{\n" "}"); - ASSERT_EQUALS("[test.cpp:11] -> [test.cpp:8]: (performance, inconclusive) Technically the member function 'NS::Fred::f' can be static (but you may consider moving to unnamed namespace).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:11] -> [test.cpp:8]: (performance, inconclusive) Technically the member function 'NS::Fred::f' can be static (but you may consider moving to unnamed namespace).\n", errout_str()); checkConst("class Foo {\n" " class Fred\n" @@ -5398,7 +5369,7 @@ class TestClass : public TestFixture { "{\n" "}"); - ASSERT_EQUALS("[test.cpp:11] -> [test.cpp:8]: (performance, inconclusive) Technically the member function 'Foo::Fred::f' can be static (but you may consider moving to unnamed namespace).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:11] -> [test.cpp:8]: (performance, inconclusive) Technically the member function 'Foo::Fred::f' can be static (but you may consider moving to unnamed namespace).\n", errout_str()); } void const43() { // ticket 2377 @@ -5413,7 +5384,7 @@ class TestClass : public TestFixture { " a = b;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("namespace AA\n" "{\n" @@ -5437,7 +5408,7 @@ class TestClass : public TestFixture { " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("namespace ZZ\n" "{\n" @@ -5456,7 +5427,7 @@ class TestClass : public TestFixture { " a = b;\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void const44() { // ticket 2595 @@ -5470,7 +5441,7 @@ class TestClass : public TestFixture { " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void const45() { // ticket 2664 @@ -5487,7 +5458,7 @@ class TestClass : public TestFixture { " };\n" "}"); - ASSERT_EQUALS("[test.cpp:8]: (performance, inconclusive) Technically the member function 'tools::WorkspaceControl::toGrid' can be static (but you may consider moving to unnamed namespace).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8]: (performance, inconclusive) Technically the member function 'tools::WorkspaceControl::toGrid' can be static (but you may consider moving to unnamed namespace).\n", errout_str()); } void const46() { // ticket 2663 @@ -5503,7 +5474,7 @@ class TestClass : public TestFixture { "};"); ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Technically the member function 'Altren::fun1' can be static (but you may consider moving to unnamed namespace).\n" - "[test.cpp:7]: (performance, inconclusive) Technically the member function 'Altren::fun2' can be static (but you may consider moving to unnamed namespace).\n", errout.str()); + "[test.cpp:7]: (performance, inconclusive) Technically the member function 'Altren::fun2' can be static (but you may consider moving to unnamed namespace).\n", errout_str()); } void const47() { // ticket 2670 @@ -5514,7 +5485,7 @@ class TestClass : public TestFixture { " void bar() { foo(); }\n" "};"); - ASSERT_EQUALS("[test.cpp:4]: (performance, inconclusive) Technically the member function 'Altren::foo' can be static (but you may consider moving to unnamed namespace).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (performance, inconclusive) Technically the member function 'Altren::foo' can be static (but you may consider moving to unnamed namespace).\n", errout_str()); checkConst("class Altren {\n" "public:\n" @@ -5524,7 +5495,7 @@ class TestClass : public TestFixture { "};"); ASSERT_EQUALS("[test.cpp:4]: (performance, inconclusive) Technically the member function 'Altren::foo' can be static (but you may consider moving to unnamed namespace).\n" - "[test.cpp:5]: (style, inconclusive) Technically the member function 'Altren::bar' can be const.\n", errout.str()); + "[test.cpp:5]: (style, inconclusive) Technically the member function 'Altren::bar' can be const.\n", errout_str()); } void const48() { // ticket 2672 @@ -5546,7 +5517,7 @@ class TestClass : public TestFixture { " mSave = mCurrent;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void const49() { // ticket 2795 @@ -5560,7 +5531,7 @@ class TestClass : public TestFixture { " return _hash[key];\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void const50() { // ticket 2943 @@ -5576,7 +5547,7 @@ class TestClass : public TestFixture { " if (mEmptyView) return;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void const51() { // ticket 3040 @@ -5589,7 +5560,7 @@ class TestClass : public TestFixture { "private:\n" " unsigned char *_pesdata;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("class PESPacket {\n" "public:\n" @@ -5604,7 +5575,7 @@ class TestClass : public TestFixture { "public:\n" " void SetSection(uint num) { pesdata()[6] = num; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void const52() { // ticket 3048 @@ -5614,7 +5585,7 @@ class TestClass : public TestFixture { "private:\n" " int bar;\n" "};"); - ASSERT_EQUALS("[test.cpp:2]: (performance, inconclusive) Technically the member function 'foo::DoSomething' can be static (but you may consider moving to unnamed namespace).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (performance, inconclusive) Technically the member function 'foo::DoSomething' can be static (but you may consider moving to unnamed namespace).\n", errout_str()); } void const53() { // ticket 3049 @@ -5630,7 +5601,7 @@ class TestClass : public TestFixture { " B() {};\n" " bool One(bool b = false) { return false; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void const54() { // ticket 3052 @@ -5638,7 +5609,7 @@ class TestClass : public TestFixture { " public:\n" " void Clear(void) { Example tmp; (*this) = tmp; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void const55() { @@ -5648,7 +5619,7 @@ class TestClass : public TestFixture { "public:\n" " void set(std::stringstream &in) { in >> tmp; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void const56() { // ticket #3149 @@ -5658,7 +5629,7 @@ class TestClass : public TestFixture { " switch (x) { }\n" " }\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Technically the member function 'MyObject::foo' can be static (but you may consider moving to unnamed namespace).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Technically the member function 'MyObject::foo' can be static (but you may consider moving to unnamed namespace).\n", errout_str()); checkConst("class A\n" "{\n" @@ -5698,7 +5669,7 @@ class TestClass : public TestFixture { "\n" " return RET_NOK;\n" "}"); - ASSERT_EQUALS("[test.cpp:9] -> [test.cpp:4]: (performance, inconclusive) Technically the member function 'A::f' can be static (but you may consider moving to unnamed namespace).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:9] -> [test.cpp:4]: (performance, inconclusive) Technically the member function 'A::f' can be static (but you may consider moving to unnamed namespace).\n", errout_str()); checkConst("class MyObject {\n" "public:\n" @@ -5706,7 +5677,7 @@ class TestClass : public TestFixture { " for (int i = 0; i < 5; i++) { }\n" " }\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Technically the member function 'MyObject::foo' can be static (but you may consider moving to unnamed namespace).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Technically the member function 'MyObject::foo' can be static (but you may consider moving to unnamed namespace).\n", errout_str()); } void const57() { // tickets #2669 and #2477 @@ -5733,7 +5704,7 @@ class TestClass : public TestFixture { "};"); TODO_ASSERT_EQUALS("[test.cpp:7]: (performance, inconclusive) Technically the member function 'MyGUI::types::TCoord::size' can be static (but you may consider moving to unnamed namespace).\n" "[test.cpp:15]: (style, inconclusive) Technically the member function 'SelectorControl::getSize' can be const.\n", - "[test.cpp:7]: (performance, inconclusive) Technically the member function 'MyGUI::types::TCoord::size' can be static (but you may consider moving to unnamed namespace).\n", errout.str()); + "[test.cpp:7]: (performance, inconclusive) Technically the member function 'MyGUI::types::TCoord::size' can be static (but you may consider moving to unnamed namespace).\n", errout_str()); checkConst("struct Foo {\n" " Bar b;\n" @@ -5741,7 +5712,7 @@ class TestClass : public TestFixture { " b.run();\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("struct Bar {\n" " int i = 0;\n" @@ -5753,7 +5724,7 @@ class TestClass : public TestFixture { " b.run();\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("struct Bar {\n" " void run() const { }\n" @@ -5765,7 +5736,7 @@ class TestClass : public TestFixture { " }\n" "};"); ASSERT_EQUALS("[test.cpp:2]: (performance, inconclusive) Technically the member function 'Bar::run' can be static (but you may consider moving to unnamed namespace).\n" - "[test.cpp:6]: (style, inconclusive) Technically the member function 'Foo::foo' can be const.\n", errout.str()); + "[test.cpp:6]: (style, inconclusive) Technically the member function 'Foo::foo' can be const.\n", errout_str()); } void const58() { @@ -5774,14 +5745,14 @@ class TestClass : public TestFixture { " f.clear();\n" " }\n" "};"); - ASSERT_EQUALS("[test.cpp:2]: (performance, inconclusive) Technically the member function 'MyObject::foo' can be static (but you may consider moving to unnamed namespace).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (performance, inconclusive) Technically the member function 'MyObject::foo' can be static (but you may consider moving to unnamed namespace).\n", errout_str()); checkConst("struct MyObject {\n" " int foo(Foo f) {\n" " return f.length();\n" " }\n" "};"); - ASSERT_EQUALS("[test.cpp:2]: (performance, inconclusive) Technically the member function 'MyObject::foo' can be static (but you may consider moving to unnamed namespace).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (performance, inconclusive) Technically the member function 'MyObject::foo' can be static (but you may consider moving to unnamed namespace).\n", errout_str()); checkConst("struct MyObject {\n" " Foo f;\n" @@ -5789,7 +5760,7 @@ class TestClass : public TestFixture { " return f.length();\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("struct MyObject {\n" " std::string f;\n" @@ -5797,7 +5768,7 @@ class TestClass : public TestFixture { " return f.length();\n" " }\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (style, inconclusive) Technically the member function 'MyObject::foo' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style, inconclusive) Technically the member function 'MyObject::foo' can be const.\n", errout_str()); } void const59() { // ticket #4646 @@ -5809,7 +5780,7 @@ class TestClass : public TestFixture { " int re;\n" " int im;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void const60() { // ticket #3322 @@ -5824,7 +5795,7 @@ class TestClass : public TestFixture { " { return operator+=( str ); }\n" " char *m_ptr;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("class MyString {\n" "public:\n" " MyString() : m_ptr(0){}\n" @@ -5833,7 +5804,7 @@ class TestClass : public TestFixture { " { return operator+=( str ); }\n" " char *m_ptr;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void const61() { // ticket #5606 - don't crash @@ -5869,7 +5840,7 @@ class TestClass : public TestFixture { " inherited::set(inherited::Key(key));\n" " }\n" "};\n", nullptr, false); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void const62() { @@ -5883,7 +5854,7 @@ class TestClass : public TestFixture { " return _hash[key];\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void const63() { @@ -5894,7 +5865,7 @@ class TestClass : public TestFixture { " p->clear();\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("struct A {\n" " std::string s;\n" @@ -5903,7 +5874,7 @@ class TestClass : public TestFixture { " r.clear();\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("struct A {\n" " std::string s;\n" @@ -5912,7 +5883,7 @@ class TestClass : public TestFixture { " r.clear();\n" " }\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (style, inconclusive) Technically the member function 'A::clear' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style, inconclusive) Technically the member function 'A::clear' can be const.\n", errout_str()); checkConst("struct A {\n" " std::string s;\n" @@ -5921,7 +5892,7 @@ class TestClass : public TestFixture { " p->somefunction();\n" " }\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (style, inconclusive) Technically the member function 'A::clear' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style, inconclusive) Technically the member function 'A::clear' can be const.\n", errout_str()); checkConst("struct A {\n" " std::string s;\n" @@ -5930,7 +5901,7 @@ class TestClass : public TestFixture { " r.somefunction();\n" " }\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (style, inconclusive) Technically the member function 'A::clear' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style, inconclusive) Technically the member function 'A::clear' can be const.\n", errout_str()); } void const64() { @@ -5945,7 +5916,7 @@ class TestClass : public TestFixture { " ::B::D::DKIPtr membervariable;\n" " };\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void const65() { @@ -5964,7 +5935,7 @@ class TestClass : public TestFixture { " TemplateClass b;\n" " return 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void const66() { @@ -5974,7 +5945,7 @@ class TestClass : public TestFixture { " void g(char *) { n++; }\n" " int n;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void const67() { // #9193 @@ -5988,7 +5959,7 @@ class TestClass : public TestFixture { " const std::list>& get() { return m_test.m_list; }\n" " TestList> m_test;\n" "};"); - ASSERT_EQUALS("[test.cpp:8]: (style, inconclusive) Technically the member function 'Test::get' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8]: (style, inconclusive) Technically the member function 'Test::get' can be const.\n", errout_str()); } void const68() { // #6471 @@ -5999,7 +5970,7 @@ class TestClass : public TestFixture { " }\n" " void* m_data;\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void const69() { // #9806 @@ -6018,7 +5989,7 @@ class TestClass : public TestFixture { " call(1, 2, 3);\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void const70() { @@ -6031,7 +6002,7 @@ class TestClass : public TestFixture { " call(1, 2);\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void const71() { // #10146 @@ -6044,7 +6015,7 @@ class TestClass : public TestFixture { " int k{};\n" " void g() { bar.f(k); }\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("struct S {\n" " A a;\n" @@ -6052,7 +6023,7 @@ class TestClass : public TestFixture { " p = &(((a[j])));\n" " }\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void const72() { // #10520 @@ -6064,7 +6035,7 @@ class TestClass : public TestFixture { " int i{};\n" " S f() { return S{ &i }; }\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("struct S {\n" " explicit S(int* p) : mp(p) {}\n" @@ -6074,7 +6045,7 @@ class TestClass : public TestFixture { " int i{};\n" " S f() { return S(&i); }\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("struct S {\n" " int* mp{};\n" @@ -6083,7 +6054,7 @@ class TestClass : public TestFixture { " int i{};\n" " S f() { return S{ &i }; }\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("struct S {\n" " int* mp{};\n" @@ -6092,7 +6063,7 @@ class TestClass : public TestFixture { " int i{};\n" " S f() { return { &i }; }\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("struct S {\n" " explicit S(const int* p) : mp(p) {}\n" @@ -6102,7 +6073,7 @@ class TestClass : public TestFixture { " int i{};\n" " S f() { return S{ &i }; }\n" "};\n"); - ASSERT_EQUALS("[test.cpp:7]: (style, inconclusive) Technically the member function 'C::f' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (style, inconclusive) Technically the member function 'C::f' can be const.\n", errout_str()); checkConst("struct S {\n" " explicit S(const int* p) : mp(p) {}\n" @@ -6112,7 +6083,7 @@ class TestClass : public TestFixture { " int i{};\n" " S f() { return S(&i); }\n" "};\n"); - ASSERT_EQUALS("[test.cpp:7]: (style, inconclusive) Technically the member function 'C::f' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (style, inconclusive) Technically the member function 'C::f' can be const.\n", errout_str()); checkConst("struct S {\n" " const int* mp{};\n" @@ -6121,7 +6092,7 @@ class TestClass : public TestFixture { " int i{};\n" " S f() { return S{ &i }; }\n" "};\n"); - TODO_ASSERT_EQUALS("[test.cpp:7]: (style, inconclusive) Technically the member function 'C::f' can be const.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:7]: (style, inconclusive) Technically the member function 'C::f' can be const.\n", "", errout_str()); checkConst("struct S {\n" " const int* mp{};\n" @@ -6130,7 +6101,7 @@ class TestClass : public TestFixture { " int i{};\n" " S f() { return { &i }; }\n" "};\n"); - TODO_ASSERT_EQUALS("[test.cpp:7]: (style, inconclusive) Technically the member function 'C::f' can be const.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:7]: (style, inconclusive) Technically the member function 'C::f' can be const.\n", "", errout_str()); } void const73() { @@ -6145,7 +6116,7 @@ class TestClass : public TestFixture { " *p = 0;\n" " }\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("struct S {\n" // #10758 " T* h;\n" @@ -6154,7 +6125,7 @@ class TestClass : public TestFixture { "void S::f() {\n" " char* c = h->x[y];\n" "};\n"); - ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:3]: (style, inconclusive) Technically the member function 'S::f' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:3]: (style, inconclusive) Technically the member function 'S::f' can be const.\n", errout_str()); } void const74() { // #10671 @@ -6166,7 +6137,7 @@ class TestClass : public TestFixture { " for(std::vector::const_iterator it = m_str.begin(); it != m_str.end(); ++it) {;}\n" " }\n" "};"); - ASSERT_EQUALS("[test.cpp:5]: (style, inconclusive) Technically the member function 'A::bar' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (style, inconclusive) Technically the member function 'A::bar' can be const.\n", errout_str()); // Don't crash checkConst("struct S {\n" @@ -6176,7 +6147,7 @@ class TestClass : public TestFixture { "void S::f() const {\n" " for (std::vector::const_iterator it = v.begin(), end = v.end(); it != end; ++it) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void const75() { // #10065 @@ -6187,7 +6158,7 @@ class TestClass : public TestFixture { " if (N::i) {}\n" " }\n" "};\n"); - ASSERT_EQUALS("[test.cpp:4]: (performance, inconclusive) Technically the member function 'S::f' can be static (but you may consider moving to unnamed namespace).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (performance, inconclusive) Technically the member function 'S::f' can be static (but you may consider moving to unnamed namespace).\n", errout_str()); checkConst("int i = 0;\n" "struct S {\n" @@ -6196,7 +6167,7 @@ class TestClass : public TestFixture { " if (::i) {}\n" " }\n" "};\n"); - ASSERT_EQUALS("[test.cpp:4]: (performance, inconclusive) Technically the member function 'S::f' can be static (but you may consider moving to unnamed namespace).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (performance, inconclusive) Technically the member function 'S::f' can be static (but you may consider moving to unnamed namespace).\n", errout_str()); checkConst("namespace N {\n" " struct S {\n" @@ -6206,7 +6177,7 @@ class TestClass : public TestFixture { " }\n" " };\n" "}\n"); - ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'N::S::f' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'N::S::f' can be const.\n", errout_str()); } void const76() { // #10825 @@ -6220,7 +6191,7 @@ class TestClass : public TestFixture { " const_cast(t)->e();\n" "};\n"); ASSERT_EQUALS("[test.cpp:7] -> [test.cpp:3]: (performance, inconclusive) Technically the member function 'S::f' can be static (but you may consider moving to unnamed namespace).\n", - errout.str()); + errout_str()); } void const77() { @@ -6229,13 +6200,13 @@ class TestClass : public TestFixture { " std::vector const* f() const { return p; }\n" " std::vector const* p;\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("struct S {\n" // #10311 " std::vector v;\n" " std::vector& f() { return v; }\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void const78() { // #10315 @@ -6246,7 +6217,7 @@ class TestClass : public TestFixture { "void S::g(F f) {\n" " (this->*f)();\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("struct S {\n" " using F = void(S::*)();\n" @@ -6255,7 +6226,7 @@ class TestClass : public TestFixture { "void S::g(F f) {\n" " (this->*f)();\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void const79() { // #9861 @@ -6266,7 +6237,7 @@ class TestClass : public TestFixture { " }\n" "};\n"); ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Technically the member function 'A::f' can be static (but you may consider moving to unnamed namespace).\n", - errout.str()); + errout_str()); } void const80() { // #11328 @@ -6300,7 +6271,7 @@ class TestClass : public TestFixture { "[test.cpp:14] -> [test.cpp:5]: (performance, inconclusive) Technically the member function 'S::h' can be static (but you may consider moving to unnamed namespace).\n" "[test.cpp:17] -> [test.cpp:6]: (style, inconclusive) Technically the member function 'S::k' can be const.\n" "[test.cpp:21] -> [test.cpp:7]: (performance, inconclusive) Technically the member function 'S::m' can be static (but you may consider moving to unnamed namespace).\n", - errout.str()); + errout_str()); } void const81() { @@ -6314,7 +6285,7 @@ class TestClass : public TestFixture { " }\n" "};\n"); ASSERT_EQUALS("[test.cpp:6]: (style, inconclusive) Technically the member function 'S::g' can be const.\n", - errout.str()); + errout_str()); checkConst("struct A {\n" // #11499 " void f() const;\n" @@ -6329,7 +6300,7 @@ class TestClass : public TestFixture { " void g() { p->f(); }\n" "};\n"); ASSERT_EQUALS("[test.cpp:11]: (style, inconclusive) Technically the member function 'S::g' can be const.\n", - errout.str()); + errout_str()); checkConst("struct A {\n" " void f(int) const;\n" @@ -6343,7 +6314,7 @@ class TestClass : public TestFixture { " P p;\n" " void g() { p->f(1); }\n" "};\n"); - ASSERT_EQUALS("[test.cpp:11]: (style, inconclusive) Technically the member function 'S::g' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:11]: (style, inconclusive) Technically the member function 'S::g' can be const.\n", errout_str()); checkConst("struct A {\n" " void f(void*) const;\n" @@ -6360,7 +6331,7 @@ class TestClass : public TestFixture { " P p;\n" " std::vector g() { p->f(nullptr); return {}; }\n" "};\n"); - ASSERT_EQUALS("[test.cpp:14]: (style, inconclusive) Technically the member function 'S::g' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:14]: (style, inconclusive) Technically the member function 'S::g' can be const.\n", errout_str()); checkConst("struct A {\n" " void f();\n" @@ -6374,7 +6345,7 @@ class TestClass : public TestFixture { " P p;\n" " void g() { p->f(); }\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("struct A {\n" " void f() const;\n" @@ -6387,7 +6358,7 @@ class TestClass : public TestFixture { " P p;\n" " void g() { p->f(); }\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("struct A {\n" " void f(int&) const;\n" @@ -6402,7 +6373,7 @@ class TestClass : public TestFixture { " int i;\n" " void g() { p->f(i); }\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("struct A {\n" // #11501 " enum E { E1 };\n" @@ -6412,7 +6383,7 @@ class TestClass : public TestFixture { " A* a;\n" " void g() { a->f(A::E1); }\n" "};\n"); - ASSERT_EQUALS("[test.cpp:7]: (style, inconclusive) Technically the member function 'F::g' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (style, inconclusive) Technically the member function 'F::g' can be const.\n", errout_str()); } void const82() { // #11513 @@ -6422,7 +6393,7 @@ class TestClass : public TestFixture { " void g() { h(i == 1); }\n" "};\n"); ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'S::g' can be const.\n", - errout.str()); + errout_str()); checkConst("struct S {\n" " int i;\n" @@ -6430,7 +6401,7 @@ class TestClass : public TestFixture { " void g() { int a; h(i, &a); }\n" "};\n"); ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'S::g' can be const.\n", - errout.str()); + errout_str()); } void const83() { @@ -6447,7 +6418,7 @@ class TestClass : public TestFixture { " int& r = b ? j : i2;\n" " r = 5;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void const84() { @@ -6467,7 +6438,7 @@ class TestClass : public TestFixture { "};\n"); ASSERT_EQUALS("[test.cpp:8]: (style, inconclusive) Technically the member function 'C::f1' can be const.\n" "[test.cpp:11]: (style, inconclusive) Technically the member function 'C::f2' can be const.\n", - errout.str()); + errout_str()); } void const85() { // #11618 @@ -6480,7 +6451,7 @@ class TestClass : public TestFixture { " q[0] = p[0];\n" " q[1] = p[1];\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void const86() { // #11621 @@ -6492,7 +6463,7 @@ class TestClass : public TestFixture { " void g() { int* a[] = { &i }; }\n" " void h() { T t = { 1, &i }; }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void const87() { @@ -6518,14 +6489,14 @@ class TestClass : public TestFixture { "bool CheckB::f(const std::string& s) {\n" " return CheckA::test(s, mSettings, mTokenizer->isCPP());\n" "}\n"); - ASSERT_EQUALS("[test.cpp:20] -> [test.cpp:15]: (style, inconclusive) Technically the member function 'CheckB::f' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:20] -> [test.cpp:15]: (style, inconclusive) Technically the member function 'CheckB::f' can be const.\n", errout_str()); checkConst("void g(int&);\n" "struct S {\n" " struct { int i; } a[1];\n" " void f() { g(a[0].i); }\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("struct S {\n" " const int& g() const { return i; }\n" @@ -6537,7 +6508,7 @@ class TestClass : public TestFixture { " int j;\n" " void f() { h(j, s.g()); }\n" "};\n"); - ASSERT_EQUALS("[test.cpp:9]: (style, inconclusive) Technically the member function 'T::f' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:9]: (style, inconclusive) Technically the member function 'T::f' can be const.\n", errout_str()); checkConst("struct S {\n" " int& g() { return i; }\n" @@ -6549,7 +6520,7 @@ class TestClass : public TestFixture { " int j;\n" " void f() { h(j, s.g()); }\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("struct S {\n" " const int& g() const { return i; }\n" @@ -6561,7 +6532,7 @@ class TestClass : public TestFixture { " int j;\n" " void f() { h(j, &s.g()); }\n" "};\n"); - ASSERT_EQUALS("[test.cpp:9]: (style, inconclusive) Technically the member function 'T::f' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:9]: (style, inconclusive) Technically the member function 'T::f' can be const.\n", errout_str()); checkConst("struct S {\n" " int& g() { return i; }\n" @@ -6573,7 +6544,7 @@ class TestClass : public TestFixture { " int j;\n" " void f() { h(j, &s.g()); }\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("void j(int** x);\n" "void k(int* const* y);\n" @@ -6587,7 +6558,7 @@ class TestClass : public TestFixture { " void g2() { k(q); }\n" " void g3() { k(r); }\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("void m(int*& r);\n" "void n(int* const& s);\n" @@ -6598,7 +6569,7 @@ class TestClass : public TestFixture { " void f2() { n(&i); }\n" " void f3() { n(p); }\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void const88() { // #11626 @@ -6613,14 +6584,14 @@ class TestClass : public TestFixture { ASSERT_EQUALS("[test.cpp:2]: (style, inconclusive) Technically the member function 'S::f' can be const.\n" "[test.cpp:3]: (style, inconclusive) Technically the member function 'S::g' can be const.\n" "[test.cpp:4]: (style, inconclusive) Technically the member function 'S::h' can be const.\n", - errout.str()); + errout_str()); checkConst("struct S {\n" " bool f() { return p != nullptr; }\n" " std::shared_ptr p;\n" "};\n"); ASSERT_EQUALS("[test.cpp:2]: (style, inconclusive) Technically the member function 'S::f' can be const.\n", - errout.str()); + errout_str()); } void const89() { @@ -6632,7 +6603,7 @@ class TestClass : public TestFixture { " if (i && b)\n" " f(false);\n" "}\n"); - ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:2]: (style, inconclusive) Technically the member function 'S::f' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:2]: (style, inconclusive) Technically the member function 'S::f' can be const.\n", errout_str()); checkConst("struct S {\n" " void f(int& r);\n" @@ -6643,7 +6614,7 @@ class TestClass : public TestFixture { " if (i)\n" " f(i);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("struct S {\n" // #11744 " S* p;\n" @@ -6660,7 +6631,7 @@ class TestClass : public TestFixture { "};\n"); ASSERT_EQUALS("[test.cpp:3]: (style, inconclusive) Technically the member function 'S::f' can be const.\n" "[test.cpp:8]: (performance, inconclusive) Technically the member function 'S::g' can be static (but you may consider moving to unnamed namespace).\n", - errout.str()); + errout_str()); checkConst("class C {\n" // #11653 "public:\n" @@ -6671,7 +6642,7 @@ class TestClass : public TestFixture { " f(false);\n" "}\n"); ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:3]: (performance, inconclusive) Technically the member function 'C::f' can be static (but you may consider moving to unnamed namespace).\n", - errout.str()); + errout_str()); } void const90() { // #11637 @@ -6687,7 +6658,7 @@ class TestClass : public TestFixture { "};\n"); ASSERT_EQUALS("[test.cpp:8]: (style, inconclusive) Technically the member function 'T::f1' can be const.\n" "[test.cpp:9]: (style, inconclusive) Technically the member function 'T::f2' can be const.\n", - errout.str()); + errout_str()); } void const91() { // #11790 @@ -6701,7 +6672,7 @@ class TestClass : public TestFixture { "const int* f(S& s) {\n" " return s.get();\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void const92() { // #11886 @@ -6716,6 +6687,8 @@ class TestClass : public TestFixture { "struct S<0> {};\n" "struct D : S<150> {};\n"); // don't hang + // we are not interested in the output - just consume it + (void)errout_str(); } void const93() { // #12162 @@ -6730,7 +6703,7 @@ class TestClass : public TestFixture { "};\n"); ASSERT_EQUALS("[test.cpp:2]: (style, inconclusive) Technically the member function 'S::f' can be const.\n" "[test.cpp:5]: (style, inconclusive) Technically the member function 'S::g' can be const.\n", - errout.str()); + errout_str()); } void const_handleDefaultParameters() { @@ -6764,7 +6737,7 @@ class TestClass : public TestFixture { " }\n" "};"); ASSERT_EQUALS("[test.cpp:11]: (performance, inconclusive) Technically the member function 'Foo::bar3' can be static (but you may consider moving to unnamed namespace).\n" - "[test.cpp:14]: (performance, inconclusive) Technically the member function 'Foo::bar4' can be static (but you may consider moving to unnamed namespace).\n", errout.str()); + "[test.cpp:14]: (performance, inconclusive) Technically the member function 'Foo::bar4' can be static (but you may consider moving to unnamed namespace).\n", errout_str()); } void const_passThisToMemberOfOtherClass() { @@ -6774,7 +6747,7 @@ class TestClass : public TestFixture { " b.takeFoo(this);\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("struct Foo {\n" " void foo() {\n" @@ -6782,7 +6755,7 @@ class TestClass : public TestFixture { " f.foo();\n" " }\n" "};"); - ASSERT_EQUALS("[test.cpp:2]: (performance, inconclusive) Technically the member function 'Foo::foo' can be static (but you may consider moving to unnamed namespace).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (performance, inconclusive) Technically the member function 'Foo::foo' can be static (but you may consider moving to unnamed namespace).\n", errout_str()); checkConst("struct A;\n" // #5839 - operator() "struct B {\n" @@ -6793,7 +6766,7 @@ class TestClass : public TestFixture { " B()(this);\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void assigningPointerToPointerIsNotAConstOperation() { @@ -6805,7 +6778,7 @@ class TestClass : public TestFixture { " v = 0;\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void assigningArrayElementIsNotAConstOperation() { @@ -6817,7 +6790,7 @@ class TestClass : public TestFixture { " v[0] = \"Happy new year!\";\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } // increment/decrement => not const @@ -6826,49 +6799,49 @@ class TestClass : public TestFixture { " int a;\n" " void nextA() { return ++a; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("class Fred {\n" " int a;\n" " void nextA() { return --a; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("class Fred {\n" " int a;\n" " void nextA() { return a++; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("class Fred {\n" " int a;\n" " void nextA() { return a--; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("int a;\n" "class Fred {\n" " void nextA() { return ++a; }\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Technically the member function 'Fred::nextA' can be static (but you may consider moving to unnamed namespace).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Technically the member function 'Fred::nextA' can be static (but you may consider moving to unnamed namespace).\n", errout_str()); checkConst("int a;\n" "class Fred {\n" " void nextA() { return --a; }\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Technically the member function 'Fred::nextA' can be static (but you may consider moving to unnamed namespace).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Technically the member function 'Fred::nextA' can be static (but you may consider moving to unnamed namespace).\n", errout_str()); checkConst("int a;\n" "class Fred {\n" " void nextA() { return a++; }\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Technically the member function 'Fred::nextA' can be static (but you may consider moving to unnamed namespace).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Technically the member function 'Fred::nextA' can be static (but you may consider moving to unnamed namespace).\n", errout_str()); checkConst("int a;\n" "class Fred {\n" " void nextA() { return a--; }\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Technically the member function 'Fred::nextA' can be static (but you may consider moving to unnamed namespace).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Technically the member function 'Fred::nextA' can be static (but you may consider moving to unnamed namespace).\n", errout_str()); checkConst("struct S {\n" // #10077 " int i{};\n" @@ -6876,7 +6849,7 @@ class TestClass : public TestFixture { " S operator ++(int) { S s = *this; ++(*this); return s; }\n" " void f() { (*this)--; }\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void constassign1() { @@ -6884,61 +6857,61 @@ class TestClass : public TestFixture { " int a;\n" " void nextA() { return a=1; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("class Fred {\n" " int a;\n" " void nextA() { return a-=1; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("class Fred {\n" " int a;\n" " void nextA() { return a+=1; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("class Fred {\n" " int a;\n" " void nextA() { return a*=-1; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("class Fred {\n" " int a;\n" " void nextA() { return a/=-2; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("int a;\n" "class Fred {\n" " void nextA() { return a=1; }\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Technically the member function 'Fred::nextA' can be static (but you may consider moving to unnamed namespace).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Technically the member function 'Fred::nextA' can be static (but you may consider moving to unnamed namespace).\n", errout_str()); checkConst("int a;\n" "class Fred {\n" " void nextA() { return a-=1; }\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Technically the member function 'Fred::nextA' can be static (but you may consider moving to unnamed namespace).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Technically the member function 'Fred::nextA' can be static (but you may consider moving to unnamed namespace).\n", errout_str()); checkConst("int a;\n" "class Fred {\n" " void nextA() { return a+=1; }\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Technically the member function 'Fred::nextA' can be static (but you may consider moving to unnamed namespace).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Technically the member function 'Fred::nextA' can be static (but you may consider moving to unnamed namespace).\n", errout_str()); checkConst("int a;\n" "class Fred {\n" " void nextA() { return a*=-1; }\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Technically the member function 'Fred::nextA' can be static (but you may consider moving to unnamed namespace).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Technically the member function 'Fred::nextA' can be static (but you may consider moving to unnamed namespace).\n", errout_str()); checkConst("int a;\n" "class Fred {\n" " void nextA() { return a/=-2; }\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Technically the member function 'Fred::nextA' can be static (but you may consider moving to unnamed namespace).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Technically the member function 'Fred::nextA' can be static (but you may consider moving to unnamed namespace).\n", errout_str()); } void constassign2() { @@ -6946,90 +6919,90 @@ class TestClass : public TestFixture { " struct A { int a; } s;\n" " void nextA() { return s.a=1; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("class Fred {\n" " struct A { int a; } s;\n" " void nextA() { return s.a-=1; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("class Fred {\n" " struct A { int a; } s;\n" " void nextA() { return s.a+=1; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("class Fred {\n" " struct A { int a; } s;\n" " void nextA() { return s.a*=-1; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("struct A { int a; } s;\n" "class Fred {\n" " void nextA() { return s.a=1; }\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Technically the member function 'Fred::nextA' can be static (but you may consider moving to unnamed namespace).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Technically the member function 'Fred::nextA' can be static (but you may consider moving to unnamed namespace).\n", errout_str()); checkConst("struct A { int a; } s;\n" "class Fred {\n" " void nextA() { return s.a-=1; }\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Technically the member function 'Fred::nextA' can be static (but you may consider moving to unnamed namespace).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Technically the member function 'Fred::nextA' can be static (but you may consider moving to unnamed namespace).\n", errout_str()); checkConst("struct A { int a; } s;\n" "class Fred {\n" " void nextA() { return s.a+=1; }\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Technically the member function 'Fred::nextA' can be static (but you may consider moving to unnamed namespace).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Technically the member function 'Fred::nextA' can be static (but you may consider moving to unnamed namespace).\n", errout_str()); checkConst("struct A { int a; } s;\n" "class Fred {\n" " void nextA() { return s.a*=-1; }\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Technically the member function 'Fred::nextA' can be static (but you may consider moving to unnamed namespace).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Technically the member function 'Fred::nextA' can be static (but you may consider moving to unnamed namespace).\n", errout_str()); checkConst("struct A { int a; } s;\n" "class Fred {\n" " void nextA() { return s.a/=-2; }\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Technically the member function 'Fred::nextA' can be static (but you may consider moving to unnamed namespace).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Technically the member function 'Fred::nextA' can be static (but you may consider moving to unnamed namespace).\n", errout_str()); checkConst("struct A { int a; };\n" "class Fred {\n" " A s;\n" " void nextA() { return s.a=1; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("struct A { int a; };\n" "class Fred {\n" " A s;\n" " void nextA() { return s.a-=1; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("struct A { int a; };\n" "class Fred {\n" " A s;\n" " void nextA() { return s.a+=1; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("struct A { int a; };\n" "class Fred {\n" " A s;\n" " void nextA() { return s.a*=-1; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("struct A { int a; };\n" "class Fred {\n" " A s;\n" " void nextA() { return s.a/=-2; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } // increment/decrement array element => not const @@ -7038,49 +7011,49 @@ class TestClass : public TestFixture { " int a[2];\n" " void nextA() { return ++a[0]; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("class Fred {\n" " int a[2];\n" " void nextA() { return --a[0]; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("class Fred {\n" " int a[2];\n" " void nextA() { return a[0]++; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("class Fred {\n" " int a[2];\n" " void nextA() { return a[0]--; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("int a[2];\n" "class Fred {\n" " void nextA() { return ++a[0]; }\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Technically the member function 'Fred::nextA' can be static (but you may consider moving to unnamed namespace).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Technically the member function 'Fred::nextA' can be static (but you may consider moving to unnamed namespace).\n", errout_str()); checkConst("int a[2];\n" "class Fred {\n" " void nextA() { return --a[0]; }\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Technically the member function 'Fred::nextA' can be static (but you may consider moving to unnamed namespace).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Technically the member function 'Fred::nextA' can be static (but you may consider moving to unnamed namespace).\n", errout_str()); checkConst("int a[2];\n" "class Fred {\n" " void nextA() { return a[0]++; }\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Technically the member function 'Fred::nextA' can be static (but you may consider moving to unnamed namespace).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Technically the member function 'Fred::nextA' can be static (but you may consider moving to unnamed namespace).\n", errout_str()); checkConst("int a[2];\n" "class Fred {\n" " void nextA() { return a[0]--; }\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Technically the member function 'Fred::nextA' can be static (but you may consider moving to unnamed namespace).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Technically the member function 'Fred::nextA' can be static (but you may consider moving to unnamed namespace).\n", errout_str()); } void constassignarray() { @@ -7088,61 +7061,61 @@ class TestClass : public TestFixture { " int a[2];\n" " void nextA() { return a[0]=1; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("class Fred {\n" " int a[2];\n" " void nextA() { return a[0]-=1; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("class Fred {\n" " int a[2];\n" " void nextA() { return a[0]+=1; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("class Fred {\n" " int a[2];\n" " void nextA() { return a[0]*=-1; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("class Fred {\n" " int a[2];\n" " void nextA() { return a[0]/=-2; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("int a[2];\n" "class Fred {\n" " void nextA() { return a[0]=1; }\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Technically the member function 'Fred::nextA' can be static (but you may consider moving to unnamed namespace).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Technically the member function 'Fred::nextA' can be static (but you may consider moving to unnamed namespace).\n", errout_str()); checkConst("int a[2];\n" "class Fred {\n" " void nextA() { return a[0]-=1; }\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Technically the member function 'Fred::nextA' can be static (but you may consider moving to unnamed namespace).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Technically the member function 'Fred::nextA' can be static (but you may consider moving to unnamed namespace).\n", errout_str()); checkConst("int a[2];\n" "class Fred {\n" " void nextA() { return a[0]+=1; }\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Technically the member function 'Fred::nextA' can be static (but you may consider moving to unnamed namespace).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Technically the member function 'Fred::nextA' can be static (but you may consider moving to unnamed namespace).\n", errout_str()); checkConst("int a[2];\n" "class Fred {\n" " void nextA() { return a[0]*=-1; }\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Technically the member function 'Fred::nextA' can be static (but you may consider moving to unnamed namespace).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Technically the member function 'Fred::nextA' can be static (but you may consider moving to unnamed namespace).\n", errout_str()); checkConst("int a[2];\n" "class Fred {\n" " void nextA() { return a[0]/=-2; }\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Technically the member function 'Fred::nextA' can be static (but you may consider moving to unnamed namespace).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Technically the member function 'Fred::nextA' can be static (but you may consider moving to unnamed namespace).\n", errout_str()); } // return pointer/reference => not const @@ -7152,7 +7125,7 @@ class TestClass : public TestFixture { " int &getR() { return a; }\n" " int *getP() { return &a; }" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } // delete member variable => not const (but technically it can, it compiles without errors) @@ -7161,7 +7134,7 @@ class TestClass : public TestFixture { " int *a;\n" " void clean() { delete a; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } // A function that returns unknown types can't be const (#1579) @@ -7169,14 +7142,14 @@ class TestClass : public TestFixture { checkConst("class Fred {\n" " UNKNOWN a() { return 0; };\n" "};"); - TODO_ASSERT_EQUALS("[test.cpp:2]: (performance, inconclusive) Technically the member function 'Fred::a' can be static.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:2]: (performance, inconclusive) Technically the member function 'Fred::a' can be static.\n", "", errout_str()); // #1579 - HDC checkConst("class Fred {\n" " foo bar;\n" " UNKNOWN a() { return b; };\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } // a function that calls const functions can be const @@ -7186,7 +7159,7 @@ class TestClass : public TestFixture { " void a() { f(); };\n" "};"); ASSERT_EQUALS("[test.cpp:2]: (performance, inconclusive) Technically the member function 'Fred::f' can be static (but you may consider moving to unnamed namespace).\n" - "[test.cpp:3]: (style, inconclusive) Technically the member function 'Fred::a' can be const.\n", errout.str()); + "[test.cpp:3]: (style, inconclusive) Technically the member function 'Fred::a' can be const.\n", errout_str()); // ticket #1593 checkConst("class A\n" @@ -7196,7 +7169,7 @@ class TestClass : public TestFixture { " A(){}\n" " unsigned int GetVecSize() {return m_v.size();}\n" "};"); - ASSERT_EQUALS("[test.cpp:6]: (style, inconclusive) Technically the member function 'A::GetVecSize' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (style, inconclusive) Technically the member function 'A::GetVecSize' can be const.\n", errout_str()); checkConst("class A\n" "{\n" @@ -7205,7 +7178,7 @@ class TestClass : public TestFixture { " A(){}\n" " bool GetVecEmpty() {return m_v.empty();}\n" "};"); - ASSERT_EQUALS("[test.cpp:6]: (style, inconclusive) Technically the member function 'A::GetVecEmpty' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (style, inconclusive) Technically the member function 'A::GetVecEmpty' can be const.\n", errout_str()); } void constVirtualFunc() { @@ -7217,7 +7190,7 @@ class TestClass : public TestFixture { " B() : b(0) { }\n" " int func() { return b; }\n" "};"); - ASSERT_EQUALS("[test.cpp:6]: (style, inconclusive) Technically the member function 'B::func' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (style, inconclusive) Technically the member function 'B::func' can be const.\n", errout_str()); checkConst("class A { };\n" "class B : public A {\n" @@ -7227,7 +7200,7 @@ class TestClass : public TestFixture { " int func();\n" "};\n" "int B::func() { return b; }"); - ASSERT_EQUALS("[test.cpp:8] -> [test.cpp:6]: (style, inconclusive) Technically the member function 'B::func' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8] -> [test.cpp:6]: (style, inconclusive) Technically the member function 'B::func' can be const.\n", errout_str()); // base class has no virtual function checkConst("class A {\n" @@ -7240,7 +7213,7 @@ class TestClass : public TestFixture { " B() : b(0) { }\n" " int func() { return b; }\n" "};"); - ASSERT_EQUALS("[test.cpp:9]: (style, inconclusive) Technically the member function 'B::func' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:9]: (style, inconclusive) Technically the member function 'B::func' can be const.\n", errout_str()); checkConst("class A {\n" "public:\n" @@ -7253,7 +7226,7 @@ class TestClass : public TestFixture { " int func();\n" "};\n" "int B::func() { return b; }"); - ASSERT_EQUALS("[test.cpp:11] -> [test.cpp:9]: (style, inconclusive) Technically the member function 'B::func' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:11] -> [test.cpp:9]: (style, inconclusive) Technically the member function 'B::func' can be const.\n", errout_str()); // base class has virtual function checkConst("class A {\n" @@ -7266,7 +7239,7 @@ class TestClass : public TestFixture { " B() : b(0) { }\n" " int func() { return b; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("class A {\n" "public:\n" @@ -7279,7 +7252,7 @@ class TestClass : public TestFixture { " int func();\n" "};\n" "int B::func() { return b; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("class A {\n" "public:\n" @@ -7292,7 +7265,7 @@ class TestClass : public TestFixture { " int func();\n" "};\n" "int B::func() { return b; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // base class has no virtual function checkConst("class A {\n" @@ -7315,7 +7288,7 @@ class TestClass : public TestFixture { "};"); ASSERT_EQUALS("[test.cpp:5]: (style, inconclusive) Technically the member function 'A::func' can be const.\n" "[test.cpp:11]: (style, inconclusive) Technically the member function 'B::func' can be const.\n" - "[test.cpp:17]: (style, inconclusive) Technically the member function 'C::func' can be const.\n", errout.str()); + "[test.cpp:17]: (style, inconclusive) Technically the member function 'C::func' can be const.\n", errout_str()); checkConst("class A {\n" " int a;\n" @@ -7340,7 +7313,7 @@ class TestClass : public TestFixture { "int C::func() { return c; }"); ASSERT_EQUALS("[test.cpp:7] -> [test.cpp:5]: (style, inconclusive) Technically the member function 'A::func' can be const.\n" "[test.cpp:14] -> [test.cpp:12]: (style, inconclusive) Technically the member function 'B::func' can be const.\n" - "[test.cpp:21] -> [test.cpp:19]: (style, inconclusive) Technically the member function 'C::func' can be const.\n", errout.str()); + "[test.cpp:21] -> [test.cpp:19]: (style, inconclusive) Technically the member function 'C::func' can be const.\n", errout_str()); // base class has virtual function checkConst("class A {\n" @@ -7361,7 +7334,7 @@ class TestClass : public TestFixture { " C() : c(0) { }\n" " int func() { return c; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkConst("class A {\n" " int a;\n" @@ -7384,7 +7357,7 @@ class TestClass : public TestFixture { " int func();\n" "};\n" "int C::func() { return c; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // ticket #1311 checkConst("class X {\n" @@ -7407,7 +7380,7 @@ class TestClass : public TestFixture { "};"); ASSERT_EQUALS("[test.cpp:5]: (style, inconclusive) Technically the member function 'X::getX' can be const.\n" "[test.cpp:11]: (style, inconclusive) Technically the member function 'Y::getY' can be const.\n" - "[test.cpp:17]: (style, inconclusive) Technically the member function 'Z::getZ' can be const.\n", errout.str()); + "[test.cpp:17]: (style, inconclusive) Technically the member function 'Z::getZ' can be const.\n", errout_str()); checkConst("class X {\n" " int x;\n" @@ -7432,7 +7405,7 @@ class TestClass : public TestFixture { "int Z::getZ() { return z; }"); ASSERT_EQUALS("[test.cpp:7] -> [test.cpp:5]: (style, inconclusive) Technically the member function 'X::getX' can be const.\n" "[test.cpp:14] -> [test.cpp:12]: (style, inconclusive) Technically the member function 'Y::getY' can be const.\n" - "[test.cpp:21] -> [test.cpp:19]: (style, inconclusive) Technically the member function 'Z::getZ' can be const.\n", errout.str()); + "[test.cpp:21] -> [test.cpp:19]: (style, inconclusive) Technically the member function 'Z::getZ' can be const.\n", errout_str()); } void constIfCfg() { @@ -7446,10 +7419,10 @@ class TestClass : public TestFixture { "};"; checkConst(code, &settings0, true); - ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Technically the member function 'foo::f' can be static (but you may consider moving to unnamed namespace).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Technically the member function 'foo::f' can be static (but you may consider moving to unnamed namespace).\n", errout_str()); checkConst(code, &settings0, false); // TODO: Set inconclusive to true (preprocess it) - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void constFriend() { // ticket #1921 @@ -7457,7 +7430,7 @@ class TestClass : public TestFixture { " friend void f() { }\n" "};"; checkConst(code); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void constUnion() { // ticket #2111 @@ -7471,7 +7444,7 @@ class TestClass : public TestFixture { " d.f = x;\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void constArrayOperator() { @@ -7488,7 +7461,7 @@ class TestClass : public TestFixture { " return y[1][6];\n" " }\n" "};"); - ASSERT_EQUALS("[test.cpp:10]: (style, inconclusive) Technically the member function 'foo::c' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:10]: (style, inconclusive) Technically the member function 'foo::c' can be const.\n", errout_str()); } void constRangeBasedFor() { // #5514 @@ -7508,7 +7481,7 @@ class TestClass : public TestFixture { " foo(e);\n" " }\n" "};"); - ASSERT_EQUALS("[test.cpp:8]: (style, inconclusive) Technically the member function 'Fred::f2' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8]: (style, inconclusive) Technically the member function 'Fred::f2' can be const.\n", errout_str()); } void const_shared_ptr() { // #8674 @@ -7520,7 +7493,7 @@ class TestClass : public TestFixture { "};\n" "\n" "std::shared_ptr Fred::getData() { return data; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void constPtrToConstPtr() { @@ -7528,7 +7501,7 @@ class TestClass : public TestFixture { "public:\n" " const char *const *data;\n" " const char *const *getData() { return data; }\n}"); - ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'Fred::getData' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style, inconclusive) Technically the member function 'Fred::getData' can be const.\n", errout_str()); } void constTrailingReturnType() { // #9814 @@ -7536,7 +7509,7 @@ class TestClass : public TestFixture { " int x = 1;\n" " auto get() -> int & { return x; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void staticArrayPtrOverload() { @@ -7552,7 +7525,7 @@ class TestClass : public TestFixture { " return f(ptrs);\n" "}\n" "template void S::f(const std::array& sv);\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void qualifiedNameMember() { // #10872 @@ -7565,14 +7538,11 @@ class TestClass : public TestFixture { "void S::f() {\n" " std::vector::const_iterator end = std.end();\n" "}\n", &s); - ASSERT_EQUALS("[test.cpp:6] -> [test.cpp:4]: (style, inconclusive) Technically the member function 'S::f' can be const.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6] -> [test.cpp:4]: (style, inconclusive) Technically the member function 'S::f' can be const.\n", errout_str()); } #define checkInitializerListOrder(code) checkInitializerListOrder_(code, __FILE__, __LINE__) void checkInitializerListOrder_(const char code[], const char* file, int line) { - // Clear the error log - errout.str(""); - // Check.. Preprocessor preprocessor(settings2); @@ -7592,7 +7562,7 @@ class TestClass : public TestFixture { " Fred() : c(0), b(0), a(0) { }\n" "};"); ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:2]: (style, inconclusive) Member variable 'Fred::b' is in the wrong place in the initializer list.\n" - "[test.cpp:4] -> [test.cpp:2]: (style, inconclusive) Member variable 'Fred::a' is in the wrong place in the initializer list.\n", errout.str()); + "[test.cpp:4] -> [test.cpp:2]: (style, inconclusive) Member variable 'Fred::a' is in the wrong place in the initializer list.\n", errout_str()); checkInitializerListOrder("class Fred {\n" " int a, b, c;\n" @@ -7600,13 +7570,13 @@ class TestClass : public TestFixture { " Fred() : c{0}, b{0}, a{0} { }\n" "};"); ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:2]: (style, inconclusive) Member variable 'Fred::b' is in the wrong place in the initializer list.\n" - "[test.cpp:4] -> [test.cpp:2]: (style, inconclusive) Member variable 'Fred::a' is in the wrong place in the initializer list.\n", errout.str()); + "[test.cpp:4] -> [test.cpp:2]: (style, inconclusive) Member variable 'Fred::a' is in the wrong place in the initializer list.\n", errout_str()); checkInitializerListOrder("struct S {\n" " S() : b(a = 1) {}\n" " int a, b;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkInitializerListOrder("struct S {\n" " int nCols() const;\n" @@ -7629,7 +7599,7 @@ class TestClass : public TestFixture { " , m_i(_i)\n" " {}\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void initializerListArgument() { @@ -7641,40 +7611,40 @@ class TestClass : public TestFixture { " const A a;\n" "};"); ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:5]: (style, inconclusive) Member variable 'C::b' uses an uninitialized argument 'a' due to the order of declarations.\n", - errout.str()); + errout_str()); checkInitializerListOrder("struct S {\n" " S(const std::string& f, std::string i, int b, int c) : a(0), b(b), c(c) {}\n" " int a, b, c;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkInitializerListOrder("struct S {\n" " S() : p(a) {}\n" " int* p;\n" " int a[1];\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkInitializerListOrder("struct S {\n" " S() : p(&i) {}\n" " int* p;\n" " int i;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkInitializerListOrder("struct S {\n" " S() : a(b = 1) {}\n" " int a, b;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkInitializerListOrder("struct S {\n" " S() : r(i) {}\n" " int& r;\n" " int i{};\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkInitializerListOrder("struct B {\n" " int a{}, b{};\n" @@ -7683,7 +7653,7 @@ class TestClass : public TestFixture { " D() : B(), j(b) {}\n" " int j;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkInitializerListOrder("struct S {\n" " S() : a(i) {}\n" @@ -7691,20 +7661,17 @@ class TestClass : public TestFixture { " static int i;\n" "};\n" "int S::i = 0;"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkInitializerListOrder("struct S {\n" " S(int b) : a(b) {}\n" " int a, b{};\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } #define checkInitializationListUsage(code) checkInitializationListUsage_(code, __FILE__, __LINE__) void checkInitializationListUsage_(const char code[], const char* file, int line) { - // Clear the error log - errout.str(""); - // Check.. const Settings settings = settingsBuilder().severity(Severity::performance).build(); @@ -7727,113 +7694,113 @@ class TestClass : public TestFixture { " Enum c;\n" // No message for enums: No performance gain " Fred() { a = 0; b = 0; c = C; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkInitializationListUsage("class Fred {\n" " std::string s;\n" " Fred() { a = 0; s = \"foo\"; }\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (performance) Variable 's' is assigned in constructor body. Consider performing initialization in initialization list.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (performance) Variable 's' is assigned in constructor body. Consider performing initialization in initialization list.\n", errout_str()); checkInitializationListUsage("class Fred {\n" " std::string& s;\n" // Message is invalid for references, since their initialization in initializer list is required anyway and behaves different from assignment (#5004) " Fred(const std::string& s_) : s(s_) { s = \"foo\"; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkInitializationListUsage("class Fred {\n" " std::vector v;\n" " Fred() { v = unknown; }\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (performance) Variable 'v' is assigned in constructor body. Consider performing initialization in initialization list.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (performance) Variable 'v' is assigned in constructor body. Consider performing initialization in initialization list.\n", errout_str()); checkInitializationListUsage("class C { std::string s; };\n" "class Fred {\n" " C c;\n" " Fred() { c = unknown; }\n" "};"); - ASSERT_EQUALS("[test.cpp:4]: (performance) Variable 'c' is assigned in constructor body. Consider performing initialization in initialization list.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (performance) Variable 'c' is assigned in constructor body. Consider performing initialization in initialization list.\n", errout_str()); checkInitializationListUsage("class C;\n" "class Fred {\n" " C c;\n" " Fred() { c = unknown; }\n" "};"); - ASSERT_EQUALS("[test.cpp:4]: (performance) Variable 'c' is assigned in constructor body. Consider performing initialization in initialization list.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (performance) Variable 'c' is assigned in constructor body. Consider performing initialization in initialization list.\n", errout_str()); checkInitializationListUsage("class C;\n" "class Fred {\n" " C c;\n" " Fred(Fred const & other) { c = other.c; }\n" "};"); - ASSERT_EQUALS("[test.cpp:4]: (performance) Variable 'c' is assigned in constructor body. Consider performing initialization in initialization list.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (performance) Variable 'c' is assigned in constructor body. Consider performing initialization in initialization list.\n", errout_str()); checkInitializationListUsage("class C;\n" "class Fred {\n" " C c;\n" " Fred(Fred && other) { c = other.c; }\n" "};"); - ASSERT_EQUALS("[test.cpp:4]: (performance) Variable 'c' is assigned in constructor body. Consider performing initialization in initialization list.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (performance) Variable 'c' is assigned in constructor body. Consider performing initialization in initialization list.\n", errout_str()); checkInitializationListUsage("class C;\n" "class Fred {\n" " C a;\n" " Fred() { initB(); a = b; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkInitializationListUsage("class C;\n" "class Fred {\n" " C a;\n" " Fred() : a(0) { if(b) a = 0; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkInitializationListUsage("class C;\n" "class Fred {\n" " C a[5];\n" " Fred() { for(int i = 0; i < 5; i++) a[i] = 0; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkInitializationListUsage("class C;\n" "class Fred {\n" " C a; int b;\n" " Fred() : b(5) { a = b; }\n" // Don't issue a message here: You actually could move it to the initialization list, but it would cause problems if you change the order of the variable declarations. "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkInitializationListUsage("class C;\n" "class Fred {\n" " C a;\n" " Fred() { try { a = new int; } catch(...) {} }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkInitializationListUsage("class Fred {\n" " std::string s;\n" " Fred() { s = toString((size_t)this); }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkInitializationListUsage("class Fred {\n" " std::string a;\n" " std::string foo();\n" " Fred() { a = foo(); }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkInitializationListUsage("class Fred {\n" " std::string a;\n" " Fred() { a = foo(); }\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (performance) Variable 'a' is assigned in constructor body. Consider performing initialization in initialization list.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (performance) Variable 'a' is assigned in constructor body. Consider performing initialization in initialization list.\n", errout_str()); checkInitializationListUsage("class Fred {\n" // #4332 " static std::string s;\n" " Fred() { s = \"foo\"; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkInitializationListUsage("class Fred {\n" // #5640 " std::string s;\n" @@ -7844,7 +7811,7 @@ class TestClass : public TestFixture { " s = str;\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkInitializationListUsage("class B {\n" // #5640 " std::shared_ptr _d;\n" @@ -7852,7 +7819,7 @@ class TestClass : public TestFixture { " *_d = *other._d;\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkInitializationListUsage("class Bar {\n" // #8466 "public:\n" @@ -7861,7 +7828,7 @@ class TestClass : public TestFixture { "private:\n" " char s;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkInitializationListUsage("unsigned bar(std::string);\n" // #8291 "class Foo {\n" @@ -7870,7 +7837,7 @@ class TestClass : public TestFixture { " Foo(int a, int b) : a_(a), b_(b) {}\n" " Foo(int a, const std::string& b) : Foo(a, bar(b)) {}\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkInitializationListUsage("class Fred {\n" // #8111 " std::string a;\n" @@ -7880,7 +7847,7 @@ class TestClass : public TestFixture { " a = ostr.str();\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // bailout: multi line lambda in rhs => do not warn checkInitializationListUsage("class Fred {\n" @@ -7891,7 +7858,7 @@ class TestClass : public TestFixture { " };\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // don't warn if some other instance's members are assigned to checkInitializationListUsage("class C {\n" @@ -7900,7 +7867,7 @@ class TestClass : public TestFixture { "private:\n" " Foo m_i;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkInitializationListUsage("class A {\n" // #9821 - delegate constructor "public:\n" @@ -7913,15 +7880,12 @@ class TestClass : public TestFixture { "private:\n" " std::string st;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } #define checkSelfInitialization(code) checkSelfInitialization_(code, __FILE__, __LINE__) void checkSelfInitialization_(const char code[], const char* file, int line) { - // Clear the error log - errout.str(""); - Preprocessor preprocessor(settings0); // Tokenize.. @@ -7939,14 +7903,14 @@ class TestClass : public TestFixture { " Fred() : i(i) {\n" " }\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (error) Member variable 'i' is initialized by itself.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Member variable 'i' is initialized by itself.\n", errout_str()); checkSelfInitialization("class Fred {\n" " int i;\n" " Fred() : i{i} {\n" " }\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (error) Member variable 'i' is initialized by itself.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Member variable 'i' is initialized by itself.\n", errout_str()); checkSelfInitialization("class Fred {\n" " int i;\n" @@ -7954,7 +7918,7 @@ class TestClass : public TestFixture { "};\n" "Fred::Fred() : i(i) {\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (error) Member variable 'i' is initialized by itself.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Member variable 'i' is initialized by itself.\n", errout_str()); checkSelfInitialization("class A {\n" // #10427 "public:\n" @@ -7962,7 +7926,7 @@ class TestClass : public TestFixture { "private:\n" " int _x;\n" "};\n"); - ASSERT_EQUALS("[test.cpp:3]: (error) Member variable '_x' is initialized by itself.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Member variable '_x' is initialized by itself.\n", errout_str()); checkSelfInitialization("class A {\n" "public:\n" @@ -7970,71 +7934,68 @@ class TestClass : public TestFixture { "private:\n" " int _x;\n" "};\n"); - ASSERT_EQUALS("[test.cpp:3]: (error) Member variable '_x' is initialized by itself.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Member variable '_x' is initialized by itself.\n", errout_str()); checkSelfInitialization("class Fred {\n" " std::string s;\n" " Fred() : s(s) {\n" " }\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (error) Member variable 's' is initialized by itself.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Member variable 's' is initialized by itself.\n", errout_str()); checkSelfInitialization("class Fred {\n" " int x;\n" " Fred(int x);\n" "};\n" "Fred::Fred(int x) : x(x) { }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkSelfInitialization("class Fred {\n" " int x;\n" " Fred(int x);\n" "};\n" "Fred::Fred(int x) : x{x} { }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkSelfInitialization("class Fred {\n" " std::string s;\n" " Fred(const std::string& s) : s(s) {\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkSelfInitialization("class Fred {\n" " std::string s;\n" " Fred(const std::string& s) : s{s} {\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkSelfInitialization("struct Foo : Bar {\n" " int i;\n" " Foo(int i)\n" " : Bar(\"\"), i(i) {}\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkSelfInitialization("struct Foo : std::Bar {\n" // #6073 " int i;\n" " Foo(int i)\n" " : std::Bar(\"\"), i(i) {}\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkSelfInitialization("struct Foo : std::Bar {\n" // #6073 " int i;\n" " Foo(int i)\n" " : std::Bar(\"\"), i{i} {}\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } #define checkVirtualFunctionCall(...) checkVirtualFunctionCall_(__FILE__, __LINE__, __VA_ARGS__) void checkVirtualFunctionCall_(const char* file, int line, const char code[], bool inconclusive = true) { - // Clear the error log - errout.str(""); - // Check.. const Settings settings = settingsBuilder().severity(Severity::warning).severity(Severity::style).certainty(Certainty::inconclusive, inconclusive).build(); @@ -8057,21 +8018,21 @@ class TestClass : public TestFixture { "};\n" "A::A()\n" "{f();}"); - ASSERT_EQUALS("[test.cpp:7] -> [test.cpp:3]: (style) Virtual function 'f' is called from constructor 'A()' at line 7. Dynamic binding is not used.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7] -> [test.cpp:3]: (style) Virtual function 'f' is called from constructor 'A()' at line 7. Dynamic binding is not used.\n", errout_str()); checkVirtualFunctionCall("class A {\n" " virtual int f();\n" " A() {f();}\n" "};\n" "int A::f() { return 1; }"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2]: (style) Virtual function 'f' is called from constructor 'A()' at line 3. Dynamic binding is not used.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2]: (style) Virtual function 'f' is called from constructor 'A()' at line 3. Dynamic binding is not used.\n", errout_str()); checkVirtualFunctionCall("class A : B {\n" " int f() override;\n" " A() {f();}\n" "};\n" "int A::f() { return 1; }"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2]: (style) Virtual function 'f' is called from constructor 'A()' at line 3. Dynamic binding is not used.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2]: (style) Virtual function 'f' is called from constructor 'A()' at line 3. Dynamic binding is not used.\n", errout_str()); checkVirtualFunctionCall("class B {\n" " virtual int f() = 0;\n" @@ -8081,20 +8042,20 @@ class TestClass : public TestFixture { " A() {f();}\n" "};\n" "int A::f() { return 1; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkVirtualFunctionCall("class A\n" "{\n" " A() { A::f(); }\n" " virtual void f() {}\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkVirtualFunctionCall("class A : B {\n" " int f() final { return 1; }\n" " A() { f(); }\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkVirtualFunctionCall("class B {\n" "public:" @@ -8105,7 +8066,7 @@ class TestClass : public TestFixture { " void f() override final {}\n" " A() { f(); }\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkVirtualFunctionCall("class Base {\n" "public:\n" @@ -8126,25 +8087,25 @@ class TestClass : public TestFixture { " i = d.i;\n" "}\n"); ASSERT_EQUALS("[test.cpp:13] -> [test.cpp:9]: (style) Virtual function 'Copy' is called from copy constructor 'Derived(const Derived&Src)' at line 13. Dynamic binding is not used.\n", - errout.str()); + errout_str()); checkVirtualFunctionCall("struct B {\n" " B() { auto pf = &f; }\n" " virtual void f() {}\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkVirtualFunctionCall("struct B {\n" " B() { auto pf = &B::f; }\n" " virtual void f() {}\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkVirtualFunctionCall("struct B {\n" " B() { (f)(); }\n" " virtual void f() {}\n" "};\n"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) Virtual function 'f' is called from constructor 'B()' at line 2. Dynamic binding is not used.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) Virtual function 'f' is called from constructor 'B()' at line 2. Dynamic binding is not used.\n", errout_str()); checkVirtualFunctionCall("class S {\n" // don't crash " ~S();\n" @@ -8155,7 +8116,7 @@ class TestClass : public TestFixture { " typeid(S);\n" "}\n" "S::~S() = default;\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkVirtualFunctionCall("struct Base: { virtual void wibble() = 0; virtual ~Base() {} };\n" // #11167 "struct D final : public Base {\n" @@ -8163,7 +8124,7 @@ class TestClass : public TestFixture { " D() {}\n" " virtual ~D() { wibble(); }\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void pureVirtualFunctionCall() { @@ -8174,7 +8135,7 @@ class TestClass : public TestFixture { "};\n" "A::A()\n" "{pure();}"); - ASSERT_EQUALS("[test.cpp:7] -> [test.cpp:3]: (warning) Call of pure virtual function 'pure' in constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7] -> [test.cpp:3]: (warning) Call of pure virtual function 'pure' in constructor.\n", errout_str()); checkVirtualFunctionCall("class A\n" "{\n" @@ -8184,7 +8145,7 @@ class TestClass : public TestFixture { "};\n" "A::A():m(A::pure())\n" "{}"); - ASSERT_EQUALS("[test.cpp:7] -> [test.cpp:3]: (warning) Call of pure virtual function 'pure' in constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7] -> [test.cpp:3]: (warning) Call of pure virtual function 'pure' in constructor.\n", errout_str()); checkVirtualFunctionCall("namespace N {\n" " class A\n" @@ -8195,7 +8156,7 @@ class TestClass : public TestFixture { " };\n" "}\n" "N::A::A() : m(N::A::pure()) {}\n"); - ASSERT_EQUALS("[test.cpp:9] -> [test.cpp:4]: (warning) Call of pure virtual function 'pure' in constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:9] -> [test.cpp:4]: (warning) Call of pure virtual function 'pure' in constructor.\n", errout_str()); checkVirtualFunctionCall("class A\n" " {\n" @@ -8205,7 +8166,7 @@ class TestClass : public TestFixture { "};\n" "A::~A()\n" "{pure();}"); - ASSERT_EQUALS("[test.cpp:8] -> [test.cpp:3]: (warning) Call of pure virtual function 'pure' in destructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8] -> [test.cpp:3]: (warning) Call of pure virtual function 'pure' in destructor.\n", errout_str()); checkVirtualFunctionCall("class A\n" " {\n" @@ -8216,7 +8177,7 @@ class TestClass : public TestFixture { "};\n" "A::A()\n" "{nonpure();}"); - ASSERT_EQUALS("[test.cpp:9] -> [test.cpp:5] -> [test.cpp:3]: (warning) Call of pure virtual function 'pure' in constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:9] -> [test.cpp:5] -> [test.cpp:3]: (warning) Call of pure virtual function 'pure' in constructor.\n", errout_str()); checkVirtualFunctionCall("class A\n" " {\n" @@ -8228,7 +8189,7 @@ class TestClass : public TestFixture { "};\n" "A::A():m(nonpure())\n" "{}"); - TODO_ASSERT_EQUALS("[test.cpp:9] -> [test.cpp:5] -> [test.cpp:3]: (warning) Call of pure virtual function 'pure' in constructor.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:9] -> [test.cpp:5] -> [test.cpp:3]: (warning) Call of pure virtual function 'pure' in constructor.\n", "", errout_str()); checkVirtualFunctionCall("class A\n" " {\n" @@ -8240,7 +8201,7 @@ class TestClass : public TestFixture { "};\n" "A::~A()\n" "{nonpure();}"); - ASSERT_EQUALS("[test.cpp:10] -> [test.cpp:5] -> [test.cpp:3]: (warning) Call of pure virtual function 'pure' in destructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:10] -> [test.cpp:5] -> [test.cpp:3]: (warning) Call of pure virtual function 'pure' in destructor.\n", errout_str()); checkVirtualFunctionCall("class A\n" "{\n" @@ -8249,7 +8210,7 @@ class TestClass : public TestFixture { "};\n" "A::A(bool b)\n" "{if (b) pure();}"); - ASSERT_EQUALS("[test.cpp:7] -> [test.cpp:3]: (warning) Call of pure virtual function 'pure' in constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7] -> [test.cpp:3]: (warning) Call of pure virtual function 'pure' in constructor.\n", errout_str()); checkVirtualFunctionCall("class A\n" "{\n" @@ -8259,7 +8220,7 @@ class TestClass : public TestFixture { "};\n" "A::~A()\n" "{if (b) pure();}"); - ASSERT_EQUALS("[test.cpp:8] -> [test.cpp:3]: (warning) Call of pure virtual function 'pure' in destructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8] -> [test.cpp:3]: (warning) Call of pure virtual function 'pure' in destructor.\n", errout_str()); // #5831 checkVirtualFunctionCall("class abc {\n" @@ -8267,7 +8228,7 @@ class TestClass : public TestFixture { " virtual ~abc() throw() {}\n" " virtual void def(void* g) throw () = 0;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #4992 checkVirtualFunctionCall("class CMyClass {\n" @@ -8278,7 +8239,7 @@ class TestClass : public TestFixture { " }\n" " virtual void VirtualMethod() = 0;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #10559 checkVirtualFunctionCall("struct S {\n" @@ -8286,7 +8247,7 @@ class TestClass : public TestFixture { " virtual int f(const int x, const int y) = 0;\n" " std::function m;\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void pureVirtualFunctionCallOtherClass() { @@ -8297,7 +8258,7 @@ class TestClass : public TestFixture { "};\n" "A::A(const A & a)\n" "{a.pure();}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkVirtualFunctionCall("class A\n" "{\n" @@ -8310,7 +8271,7 @@ class TestClass : public TestFixture { "};\n" "A::A()\n" "{B b; b.pure();}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void pureVirtualFunctionCallWithBody() { @@ -8323,7 +8284,7 @@ class TestClass : public TestFixture { "{pureWithBody();}\n" "void A::pureWithBody()\n" "{}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkVirtualFunctionCall("class A\n" " {\n" @@ -8336,7 +8297,7 @@ class TestClass : public TestFixture { "{nonpure();}\n" "void A::pureWithBody()\n" "{}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } @@ -8350,7 +8311,7 @@ class TestClass : public TestFixture { "};\n" "A::A()\n" "{nonpure(false);}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkVirtualFunctionCall("class A\n" " {\n" @@ -8361,7 +8322,7 @@ class TestClass : public TestFixture { "};\n" "A::A()\n" "{nonpure(false);}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkVirtualFunctionCall("class A\n" " {\n" @@ -8376,15 +8337,12 @@ class TestClass : public TestFixture { "};\n" "A::A()\n" "{nonpure(false);}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } #define checkOverride(code) checkOverride_(code, __FILE__, __LINE__) void checkOverride_(const char code[], const char* file, int line) { - // Clear the error log - errout.str(""); - const Settings settings = settingsBuilder().severity(Severity::style).build(); Preprocessor preprocessor(settings); @@ -8402,15 +8360,15 @@ class TestClass : public TestFixture { void override1() { checkOverride("class Base { virtual void f(); };\n" "class Derived : Base { virtual void f(); };"); - ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:2]: (style) The function 'f' overrides a function in a base class but is not marked with a 'override' specifier.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:2]: (style) The function 'f' overrides a function in a base class but is not marked with a 'override' specifier.\n", errout_str()); checkOverride("class Base { virtual void f(); };\n" "class Derived : Base { virtual void f() override; };"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkOverride("class Base { virtual void f(); };\n" "class Derived : Base { virtual void f() final; };"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkOverride("class Base {\n" "public:\n" @@ -8422,7 +8380,7 @@ class TestClass : public TestFixture { " auto foo( ) const -> size_t { return 0; }\n" " auto bar( ) const -> size_t override { return 0; }\n" "};"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:8]: (style) The function 'foo' overrides a function in a base class but is not marked with a 'override' specifier.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:8]: (style) The function 'foo' overrides a function in a base class but is not marked with a 'override' specifier.\n", errout_str()); checkOverride("namespace Test {\n" " class C {\n" @@ -8434,7 +8392,7 @@ class TestClass : public TestFixture { "public:\n" " ~C();\n" "};"); - ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:9]: (style) The destructor '~C' overrides a destructor in a base class but is not marked with a 'override' specifier.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:9]: (style) The destructor '~C' overrides a destructor in a base class but is not marked with a 'override' specifier.\n", errout_str()); checkOverride("struct Base {\n" " virtual void foo();\n" @@ -8444,7 +8402,7 @@ class TestClass : public TestFixture { " void foo() override;\n" " void foo(int);\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkOverride("struct B {\n" // #9092 " virtual int f(int i) const = 0;\n" @@ -8454,7 +8412,7 @@ class TestClass : public TestFixture { " virtual int f(int i) const;\n" " };\n" "}\n"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:6]: (style) The function 'f' overrides a function in a base class but is not marked with a 'override' specifier.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:6]: (style) The function 'f' overrides a function in a base class but is not marked with a 'override' specifier.\n", errout_str()); checkOverride("struct A {\n" " virtual void f(int);\n" @@ -8462,7 +8420,7 @@ class TestClass : public TestFixture { "struct D : A {\n" " void f(double);\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkOverride("struct A {\n" " virtual void f(int);\n" @@ -8470,7 +8428,7 @@ class TestClass : public TestFixture { "struct D : A {\n" " void f(int);\n" "};\n"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:5]: (style) The function 'f' overrides a function in a base class but is not marked with a 'override' specifier.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:5]: (style) The function 'f' overrides a function in a base class but is not marked with a 'override' specifier.\n", errout_str()); checkOverride("struct A {\n" " virtual void f(char, int);\n" @@ -8478,7 +8436,7 @@ class TestClass : public TestFixture { "struct D : A {\n" " void f(char, int);\n" "};\n"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:5]: (style) The function 'f' overrides a function in a base class but is not marked with a 'override' specifier.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:5]: (style) The function 'f' overrides a function in a base class but is not marked with a 'override' specifier.\n", errout_str()); checkOverride("struct A {\n" " virtual void f(char, int);\n" @@ -8486,7 +8444,7 @@ class TestClass : public TestFixture { "struct D : A {\n" " void f(char, double);\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkOverride("struct A {\n" " virtual void f(char, int);\n" @@ -8494,7 +8452,7 @@ class TestClass : public TestFixture { "struct D : A {\n" " void f(char c = '\\0', double);\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkOverride("struct A {\n" " virtual void f(char, int);\n" @@ -8502,7 +8460,7 @@ class TestClass : public TestFixture { "struct D : A {\n" " void f(char c = '\\0', int);\n" "};\n"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:5]: (style) The function 'f' overrides a function in a base class but is not marked with a 'override' specifier.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:5]: (style) The function 'f' overrides a function in a base class but is not marked with a 'override' specifier.\n", errout_str()); checkOverride("struct A {\n" " virtual void f(char c, std::vector);\n" @@ -8510,7 +8468,7 @@ class TestClass : public TestFixture { "struct D : A {\n" " void f(char c, std::vector);\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkOverride("struct A {\n" " virtual void f(char c, std::vector);\n" @@ -8518,7 +8476,7 @@ class TestClass : public TestFixture { "struct D : A {\n" " void f(char c, std::set);\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkOverride("struct A {\n" " virtual void f(char c, std::vector v);\n" @@ -8526,7 +8484,7 @@ class TestClass : public TestFixture { "struct D : A {\n" " void f(char c, std::vector w = {});\n" "};\n"); - TODO_ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:5]: (style) The function 'f' overrides a function in a base class but is not marked with a 'override' specifier.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:5]: (style) The function 'f' overrides a function in a base class but is not marked with a 'override' specifier.\n", "", errout_str()); checkOverride("struct T {};\n" // #10920 "struct B {\n" @@ -8535,7 +8493,7 @@ class TestClass : public TestFixture { "struct D : B {\n" " friend T f();\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkOverride("struct S {};\n" // #11827 "struct SPtr {\n" @@ -8547,7 +8505,7 @@ class TestClass : public TestFixture { " T* operator->() const { return (T*)p; }\n" "};\n"); ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:8]: (style) The function 'operator->' overrides a function in a base class but is not marked with a 'override' specifier.\n", - errout.str()); + errout_str()); checkOverride("class Base {\n" // #12131 " virtual int Calculate(int arg) = 0;\n" @@ -8557,7 +8515,7 @@ class TestClass : public TestFixture { " return arg * 2;\n" " }\n" "};\n"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:5]: (style) The function 'Calculate' overrides a function in a base class but is not marked with a 'override' specifier.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:5]: (style) The function 'Calculate' overrides a function in a base class but is not marked with a 'override' specifier.\n", errout_str()); checkOverride("struct S {\n" // #12439 " virtual ~S() = default;\n" @@ -8566,32 +8524,29 @@ class TestClass : public TestFixture { " ~D() {}\n" "};\n"); ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:5]: (style) The destructor '~D' overrides a destructor in a base class but is not marked with a 'override' specifier.\n", - errout.str()); + errout_str()); } void overrideCVRefQualifiers() { checkOverride("class Base { virtual void f(); };\n" "class Derived : Base { void f() const; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkOverride("class Base { virtual void f(); };\n" "class Derived : Base { void f() volatile; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkOverride("class Base { virtual void f(); };\n" "class Derived : Base { void f() &; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkOverride("class Base { virtual void f(); };\n" "class Derived : Base { void f() &&; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } #define checkUselessOverride(...) checkUselessOverride_(__FILE__, __LINE__, __VA_ARGS__) void checkUselessOverride_(const char* file, int line, const char code[]) { - // Clear the error log - errout.str(""); - const Settings settings = settingsBuilder().severity(Severity::style).build(); std::vector files(1, "test.cpp"); @@ -8610,51 +8565,51 @@ class TestClass : public TestFixture { "struct D : B {\n" " int f() override { return B::f(); }\n" "};"); - ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:3]: (style) The function 'f' overrides a function in a base class but just delegates back to the base class.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:3]: (style) The function 'f' overrides a function in a base class but just delegates back to the base class.\n", errout_str()); checkUselessOverride("struct B { virtual void f(); };\n" "struct D : B {\n" " void f() override { B::f(); }\n" "};"); - ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:3]: (style) The function 'f' overrides a function in a base class but just delegates back to the base class.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:3]: (style) The function 'f' overrides a function in a base class but just delegates back to the base class.\n", errout_str()); checkUselessOverride("struct B { virtual int f() = 0; };\n" "int B::f() { return 5; }\n" "struct D : B {\n" " int f() override { return B::f(); }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkUselessOverride("struct B { virtual int f(int i); };\n" "struct D : B {\n" " int f(int i) override { return B::f(i); }\n" "};"); - ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:3]: (style) The function 'f' overrides a function in a base class but just delegates back to the base class.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:3]: (style) The function 'f' overrides a function in a base class but just delegates back to the base class.\n", errout_str()); checkUselessOverride("struct B { virtual int f(int i); };\n" "struct D : B {\n" " int f(int i) override { return B::f(i + 1); }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkUselessOverride("struct B { virtual int f(int i, int j); };\n" "struct D : B {\n" " int f(int i, int j) override { return B::f(j, i); }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkUselessOverride("struct B { virtual int f(); };\n" "struct I { virtual int f() = 0; };\n" "struct D : B, I {\n" " int f() override { return B::f(); }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkUselessOverride("struct S { virtual void f(); };\n" "struct D : S {\n" " void f() final { S::f(); }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkUselessOverride("struct S {\n" "protected:\n" @@ -8664,7 +8619,7 @@ class TestClass : public TestFixture { "public:\n" " void f() override { S::f(); }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkUselessOverride("struct B { virtual void f(int, int, int) const; };\n" // #11799 "struct D : B {\n" @@ -8674,7 +8629,7 @@ class TestClass : public TestFixture { "void D::f(int a, int b, int c) const {\n" " B::f(a, b, m);\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkUselessOverride("struct B {\n" // #11803 " virtual void f();\n" @@ -8685,7 +8640,7 @@ class TestClass : public TestFixture { " void f(int i) override;\n" " void g() { f(); }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkUselessOverride("struct B { virtual void f(); };\n" // #11808 "struct D : B { void f() override {} };\n" @@ -8694,7 +8649,7 @@ class TestClass : public TestFixture { " B::f();\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkUselessOverride("struct B {\n" " virtual int f() { return 1; }\n" @@ -8710,7 +8665,7 @@ class TestClass : public TestFixture { "};"); ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:9]: (style) The function 'g' overrides a function in a base class but is identical to the overridden function\n" "[test.cpp:5] -> [test.cpp:11]: (style) The function 'j' overrides a function in a base class but is identical to the overridden function\n", - errout.str()); + errout_str()); checkUselessOverride("struct B : std::exception {\n" " virtual void f() { throw *this; }\n" @@ -8718,7 +8673,7 @@ class TestClass : public TestFixture { "struct D : B {\n" " void f() override { throw *this; }\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkUselessOverride("#define MACRO virtual void f() {}\n" "struct B {\n" @@ -8727,7 +8682,7 @@ class TestClass : public TestFixture { "struct D : B {\n" " MACRO\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkUselessOverride("struct B {\n" " B() = default;\n" @@ -8740,7 +8695,7 @@ class TestClass : public TestFixture { " int m{};\n" " int f() const override { return m; }\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkUselessOverride("struct B {\n" " int g() const;\n" @@ -8750,21 +8705,18 @@ class TestClass : public TestFixture { " int g() const;\n" " int f() const override { return g(); }\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkUselessOverride("#define MACRO 1\n" "struct B { virtual int f() { return 1; } };\n" "struct D : B {\n" " int f() override { return MACRO; }\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } #define checkUnsafeClassRefMember(code) checkUnsafeClassRefMember_(code, __FILE__, __LINE__) void checkUnsafeClassRefMember_(const char code[], const char* file, int line) { - // Clear the error log - errout.str(""); - /*const*/ Settings settings = settingsBuilder().severity(Severity::warning).build(); settings.safeChecks.classes = true; @@ -8782,15 +8734,12 @@ class TestClass : public TestFixture { void unsafeClassRefMember() { checkUnsafeClassRefMember("class C { C(const std::string &s) : s(s) {} const std::string &s; };"); - ASSERT_EQUALS("[test.cpp:1]: (warning) Unsafe class: The const reference member 'C::s' is initialized by a const reference constructor argument. You need to be careful about lifetime issues.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (warning) Unsafe class: The const reference member 'C::s' is initialized by a const reference constructor argument. You need to be careful about lifetime issues.\n", errout_str()); } #define checkThisUseAfterFree(code) checkThisUseAfterFree_(code, __FILE__, __LINE__) void checkThisUseAfterFree_(const char code[], const char* file, int line) { - // Clear the error log - errout.str(""); - Preprocessor preprocessor(settings1); // Tokenize.. @@ -8818,7 +8767,7 @@ class TestClass : public TestFixture { "test.cpp:5:note:Assuming 'mInstance' is used as 'this'\n" "test.cpp:3:note:Delete 'mInstance', invalidating 'this'\n" "test.cpp:3:note:Call method when 'this' is invalid\n", - errout.str()); + errout_str()); checkThisUseAfterFree("class C {\n" "public:\n" @@ -8831,7 +8780,7 @@ class TestClass : public TestFixture { "test.cpp:5:note:Assuming 'mInstance' is used as 'this'\n" "test.cpp:3:note:Delete 'mInstance', invalidating 'this'\n" "test.cpp:3:note:Call method when 'this' is invalid\n", - errout.str()); + errout_str()); checkThisUseAfterFree("class C {\n" "public:\n" @@ -8845,7 +8794,7 @@ class TestClass : public TestFixture { "test.cpp:5:note:Assuming 'mInstance' is used as 'this'\n" "test.cpp:7:note:Delete 'mInstance', invalidating 'this'\n" "test.cpp:3:note:Call method when 'this' is invalid\n", - errout.str()); + errout_str()); // Use member.. checkThisUseAfterFree("class C {\n" @@ -8859,7 +8808,7 @@ class TestClass : public TestFixture { "test.cpp:5:note:Assuming 'self' is used as 'this'\n" "test.cpp:3:note:Delete 'self', invalidating 'this'\n" "test.cpp:3:note:Call method when 'this' is invalid\n", - errout.str()); + errout_str()); checkThisUseAfterFree("class C {\n" "public:\n" @@ -8872,7 +8821,7 @@ class TestClass : public TestFixture { "test.cpp:5:note:Assuming 'self' is used as 'this'\n" "test.cpp:3:note:Delete 'self', invalidating 'this'\n" "test.cpp:3:note:Call method when 'this' is invalid\n", - errout.str()); + errout_str()); // Assign 'shared_from_this()' to non-static smart pointer checkThisUseAfterFree("class C {\n" @@ -8887,7 +8836,7 @@ class TestClass : public TestFixture { "test.cpp:6:note:Assuming 'mInstance' is used as 'this'\n" "test.cpp:4:note:Delete 'mInstance', invalidating 'this'\n" "test.cpp:4:note:Call method when 'this' is invalid\n", - errout.str()); + errout_str()); // Avoid FP.. checkThisUseAfterFree("class C {\n" @@ -8897,7 +8846,7 @@ class TestClass : public TestFixture { " C *self;\n" " int x;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkThisUseAfterFree("class C {\n" "public:\n" @@ -8907,7 +8856,7 @@ class TestClass : public TestFixture { " std::shared_ptr mInstance;\n" " void hello() {}\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkThisUseAfterFree("class C\n" "{\n" @@ -8924,7 +8873,7 @@ class TestClass : public TestFixture { "};\n" "\n" "C* C::instanceSingleton;"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Avoid false positive when pointer is deleted in lambda checkThisUseAfterFree("class C {\n" @@ -8940,7 +8889,7 @@ class TestClass : public TestFixture { " dostuff();\n" " done();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } @@ -8957,7 +8906,6 @@ class TestClass : public TestFixture { } // Check code.. - errout.str(""); check.analyseWholeProgram(nullptr, fileInfo, settingsDefault, *this); while (!fileInfo.empty()) { @@ -8968,33 +8916,30 @@ class TestClass : public TestFixture { void ctuOneDefinitionRule() { ctu({"class C { C() { std::cout << 0; } };", "class C { C() { std::cout << 1; } };"}); - ASSERT_EQUALS("[1.cpp:1] -> [0.cpp:1]: (error) The one definition rule is violated, different classes/structs have the same name 'C'\n", errout.str()); + ASSERT_EQUALS("[1.cpp:1] -> [0.cpp:1]: (error) The one definition rule is violated, different classes/structs have the same name 'C'\n", errout_str()); ctu({"class C { C(); }; C::C() { std::cout << 0; }", "class C { C(); }; C::C() { std::cout << 1; }"}); - ASSERT_EQUALS("[1.cpp:1] -> [0.cpp:1]: (error) The one definition rule is violated, different classes/structs have the same name 'C'\n", errout.str()); + ASSERT_EQUALS("[1.cpp:1] -> [0.cpp:1]: (error) The one definition rule is violated, different classes/structs have the same name 'C'\n", errout_str()); ctu({"class C { C() {} };\n", "class C { C() {} };\n"}); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); ctu({"class C { C(); }; C::C(){}", "class C { C(); }; C::C(){}"}); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); ctu({"class A::C { C() { std::cout << 0; } };", "class B::C { C() { std::cout << 1; } };"}); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // 11435 - template specialisations const std::string header = "template struct Test {};\n"; ctu({header + "template struct Test {};\n", header + "template struct Test {};\n"}); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } #define getFileInfo(code) getFileInfo_(code, __FILE__, __LINE__) void getFileInfo_(const char code[], const char* file, int line) { - // Clear the error log - errout.str(""); - Preprocessor preprocessor(settings1); // Tokenize.. diff --git a/test/testcondition.cpp b/test/testcondition.cpp index 39d326952a83..868f8a98caa5 100644 --- a/test/testcondition.cpp +++ b/test/testcondition.cpp @@ -127,9 +127,6 @@ class TestCondition : public TestFixture { #define check(...) check_(__FILE__, __LINE__, __VA_ARGS__) void check_(const char* file, int line, const char code[], const Settings &settings, const char* filename = "test.cpp") { - // Clear the error buffer.. - errout.str(""); - Preprocessor preprocessor(settings); std::vector files(1, filename); Tokenizer tokenizer(settings, this, &preprocessor); @@ -154,59 +151,59 @@ class TestCondition : public TestFixture { " int y = x & 4;\n" " if (y == 3);\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (style) Mismatching assignment and comparison, comparison 'y==3' is always false.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (style) Mismatching assignment and comparison, comparison 'y==3' is always false.\n", errout_str()); check("void foo(int x)\n" "{\n" " int y = x & 4;\n" " if (y != 3);\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (style) Mismatching assignment and comparison, comparison 'y!=3' is always true.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (style) Mismatching assignment and comparison, comparison 'y!=3' is always true.\n", errout_str()); // | check("void foo(int x) {\n" " int y = x | 0x14;\n" " if (y == 0x710);\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) Mismatching assignment and comparison, comparison 'y==0x710' is always false.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) Mismatching assignment and comparison, comparison 'y==0x710' is always false.\n", errout_str()); check("void foo(int x) {\n" " int y = x | 0x14;\n" " if (y == 0x71f);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // various simple assignments check("void foo(int x) {\n" " int y = (x+1) | 1;\n" " if (y == 2);\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) Mismatching assignment and comparison, comparison 'y==2' is always false.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) Mismatching assignment and comparison, comparison 'y==2' is always false.\n", errout_str()); check("void foo() {\n" " int y = 1 | x();\n" " if (y == 2);\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) Mismatching assignment and comparison, comparison 'y==2' is always false.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) Mismatching assignment and comparison, comparison 'y==2' is always false.\n", errout_str()); // multiple conditions check("void foo(int x) {\n" " int y = x & 4;\n" " if ((y == 3) && (z == 1));\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) Mismatching assignment and comparison, comparison 'y==3' is always false.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) Mismatching assignment and comparison, comparison 'y==3' is always false.\n", errout_str()); check("void foo(int x) {\n" " int y = x & 4;\n" " if ((x==123) || ((y == 3) && (z == 1)));\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) Mismatching assignment and comparison, comparison 'y==3' is always false.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) Mismatching assignment and comparison, comparison 'y==3' is always false.\n", errout_str()); check("void f(int x) {\n" " int y = x & 7;\n" " if (setvalue(&y) && y != 8);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // recursive checking into scopes check("void f(int x) {\n" @@ -214,20 +211,20 @@ class TestCondition : public TestFixture { " if (z) y=0;\n" " else { if (y==8); }\n" // always false "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:4]: (style) Mismatching assignment and comparison, comparison 'y==8' is always false.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:4]: (style) Mismatching assignment and comparison, comparison 'y==8' is always false.\n", errout_str()); // while check("void f(int x) {\n" " int y = x & 7;\n" " while (y==8);\n" // local variable => always false "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) Mismatching assignment and comparison, comparison 'y==8' is always false.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) Mismatching assignment and comparison, comparison 'y==8' is always false.\n", errout_str()); check("void f(int x) {\n" " extern int y; y = x & 7;\n" " while (y==8);\n" // non-local variable => no error "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x) {\n" " int a = 100;\n" @@ -236,7 +233,7 @@ class TestCondition : public TestFixture { " while (y != 0) y--;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void g(int x);\n" "void f(int x) {\n" @@ -248,7 +245,7 @@ class TestCondition : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:5] -> [test.cpp:6]: (style) Mismatching assignment and comparison, comparison 'y!=0' is always true.\n", - errout.str()); + errout_str()); check("void g(int &x);\n" "void f(int x) {\n" @@ -258,7 +255,7 @@ class TestCondition : public TestFixture { " while (y != 0) g(y);\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // calling function check("void f(int x) {\n" @@ -266,14 +263,14 @@ class TestCondition : public TestFixture { " do_something();\n" " if (y==8);\n" // local variable => always false "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:4]: (style) Mismatching assignment and comparison, comparison 'y==8' is always false.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:4]: (style) Mismatching assignment and comparison, comparison 'y==8' is always false.\n", errout_str()); check("void f(int x) {\n" " int y = x & 7;\n" " do_something(&y);\n" // passing variable => no error " if (y==8);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void do_something(int);\n" "void f(int x) {\n" @@ -281,14 +278,14 @@ class TestCondition : public TestFixture { " do_something(y);\n" " if (y==8);\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:5]: (style) Mismatching assignment and comparison, comparison 'y==8' is always false.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:5]: (style) Mismatching assignment and comparison, comparison 'y==8' is always false.\n", errout_str()); check("void f(int x) {\n" " extern int y; y = x & 7;\n" " do_something();\n" " if (y==8);\n" // non-local variable => no error "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #4434 : false positive: ?: check("void f(int x) {\n" @@ -296,28 +293,28 @@ class TestCondition : public TestFixture { " x = x & 1 ? 1 : -1;\n" " if(x != -1) { }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #4735 check("void f() {\n" " int x = *(char*)&0x12345678;\n" " if (x==18) { }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // bailout: no variable info check("void foo(int x) {\n" " y = 2 | x;\n" // y not declared => no error " if(y == 1) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // bailout: negative number check("void foo(int x) {\n" " int y = -2 | x;\n" // negative number => no error " if (y==1) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // bailout: pass variable to function check("void foo(int x) {\n" @@ -325,7 +322,7 @@ class TestCondition : public TestFixture { " bar(&y);\n" // pass variable to function => no error " if (y==1) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // no crash on unary operator& (#5643) // #11610 @@ -335,7 +332,7 @@ class TestCondition : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:2]: (style) Condition '&rHitObject' is always true\n" "[test.cpp:3]: (style) Condition '!&rHitObject' is always false\n", - errout.str()); + errout_str()); // #5695: increment check("void f(int a0, int n) {\n" @@ -346,7 +343,7 @@ class TestCondition : public TestFixture { " c = 0;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int a) {\n" // #6662 " int x = a & 1;\n" @@ -354,7 +351,7 @@ class TestCondition : public TestFixture { " if (x != 5) {}\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:4]: (style) Mismatching assignment and comparison, comparison 'x!=5' is always true.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:4]: (style) Mismatching assignment and comparison, comparison 'x!=5' is always true.\n", errout_str()); check("void f(int a) {\n" // #6662 " int x = a & 1;\n" @@ -362,7 +359,7 @@ class TestCondition : public TestFixture { " if (x != 5) {}\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " int x = 100;\n" @@ -370,7 +367,7 @@ class TestCondition : public TestFixture { " g(x);\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void g(int x);\n" "void f() {\n" @@ -379,7 +376,7 @@ class TestCondition : public TestFixture { " g(x);\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (style) Condition 'x' is always true\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Condition 'x' is always true\n", errout_str()); check("void g(int & x);\n" "void f() {\n" @@ -388,7 +385,7 @@ class TestCondition : public TestFixture { " g(x);\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } @@ -397,13 +394,13 @@ class TestCondition : public TestFixture { " int b = a & 0xf0;\n" " b &= 1;\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) Mismatching bitmasks. Result is always 0 (X = Y & 0xf0; Z = X & 0x1; => Z=0).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) Mismatching bitmasks. Result is always 0 (X = Y & 0xf0; Z = X & 0x1; => Z=0).\n", errout_str()); check("void f(int a) {\n" " int b = a & 0xf0;\n" " int c = b & 1;\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) Mismatching bitmasks. Result is always 0 (X = Y & 0xf0; Z = X & 0x1; => Z=0).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) Mismatching bitmasks. Result is always 0 (X = Y & 0xf0; Z = X & 0x1; => Z=0).\n", errout_str()); check("void f(int a) {\n" " int b = a;" @@ -412,67 +409,67 @@ class TestCondition : public TestFixture { " case 2: b &= 2; break;\n" " };\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void comparison() { // CheckCondition::comparison test cases // '==' check("void f(int a) {\n assert( (a & 0x07) == 8U );\n}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Expression '(X & 0x7) == 0x8' is always false.\n",errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Expression '(X & 0x7) == 0x8' is always false.\n",errout_str()); check("void f(int a) {\n assert( (a & b & 4 & c ) == 3 );\n}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Expression '(X & 0x4) == 0x3' is always false.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Expression '(X & 0x4) == 0x3' is always false.\n", errout_str()); check("void f(int a) {\n assert( (a | 0x07) == 8U );\n}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Expression '(X | 0x7) == 0x8' is always false.\n",errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Expression '(X | 0x7) == 0x8' is always false.\n",errout_str()); check("void f(int a) {\n assert( (a & 0x07) == 7U );\n}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int a) {\n assert( (a | 0x01) == -15 );\n}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // '!=' check("void f(int a) {\n assert( (a & 0x07) != 8U );\n}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Expression '(X & 0x7) != 0x8' is always true.\n",errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Expression '(X & 0x7) != 0x8' is always true.\n",errout_str()); check("void f(int a) {\n assert( (a | 0x07) != 8U );\n}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Expression '(X | 0x7) != 0x8' is always true.\n",errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Expression '(X | 0x7) != 0x8' is always true.\n",errout_str()); check("void f(int a) {\n assert( (a & 0x07) != 7U );\n}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int a) {\n assert( (a | 0x07) != 7U );\n}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // '>=' check("void f(int a) {\n assert( (a & 0x07) >= 8U );\n}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Expression '(X & 0x7) >= 0x8' is always false.\n",errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Expression '(X & 0x7) >= 0x8' is always false.\n",errout_str()); check("void f(unsigned int a) {\n assert( (a | 0x7) >= 7U );\n}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Expression '(X | 0x7) >= 0x7' is always true.\n",errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Expression '(X | 0x7) >= 0x7' is always true.\n",errout_str()); check("void f(int a) {\n assert( (a & 0x07) >= 7U );\n}"); - ASSERT_EQUALS("",errout.str()); + ASSERT_EQUALS("",errout_str()); check("void f(int a) {\n assert( (a | 0x07) >= 8U );\n}"); - ASSERT_EQUALS("",errout.str()); //correct for negative 'a' + ASSERT_EQUALS("",errout_str()); //correct for negative 'a' // '>' check("void f(int a) {\n assert( (a & 0x07) > 7U );\n}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Expression '(X & 0x7) > 0x7' is always false.\n",errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Expression '(X & 0x7) > 0x7' is always false.\n",errout_str()); check("void f(unsigned int a) {\n assert( (a | 0x7) > 6U );\n}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Expression '(X | 0x7) > 0x6' is always true.\n",errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Expression '(X | 0x7) > 0x6' is always true.\n",errout_str()); check("void f(int a) {\n assert( (a & 0x07) > 6U );\n}"); - ASSERT_EQUALS("",errout.str()); + ASSERT_EQUALS("",errout_str()); check("void f(int a) {\n assert( (a | 0x07) > 7U );\n}"); - ASSERT_EQUALS("",errout.str()); //correct for negative 'a' + ASSERT_EQUALS("",errout_str()); //correct for negative 'a' // '<=' check("void f(int a) {\n assert( (a & 0x07) <= 7U );\n}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Expression '(X & 0x7) <= 0x7' is always true.\n",errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Expression '(X & 0x7) <= 0x7' is always true.\n",errout_str()); check("void f(unsigned int a) {\n assert( (a | 0x08) <= 7U );\n}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Expression '(X | 0x8) <= 0x7' is always false.\n",errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Expression '(X | 0x8) <= 0x7' is always false.\n",errout_str()); check("void f(int a) {\n assert( (a & 0x07) <= 6U );\n}"); - ASSERT_EQUALS("",errout.str()); + ASSERT_EQUALS("",errout_str()); check("void f(int a) {\n assert( (a | 0x08) <= 7U );\n}"); - ASSERT_EQUALS("",errout.str()); //correct for negative 'a' + ASSERT_EQUALS("",errout_str()); //correct for negative 'a' // '<' check("void f(int a) {\n assert( (a & 0x07) < 8U );\n}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Expression '(X & 0x7) < 0x8' is always true.\n",errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Expression '(X & 0x7) < 0x8' is always true.\n",errout_str()); check("void f(unsigned int a) {\n assert( (a | 0x07) < 7U );\n}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Expression '(X | 0x7) < 0x7' is always false.\n",errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Expression '(X | 0x7) < 0x7' is always false.\n",errout_str()); check("void f(int a) {\n assert( (a & 0x07) < 3U );\n}"); - ASSERT_EQUALS("",errout.str()); + ASSERT_EQUALS("",errout_str()); check("void f(int a) {\n assert( (a | 0x07) < 7U );\n}"); - ASSERT_EQUALS("",errout.str()); //correct for negative 'a' + ASSERT_EQUALS("",errout_str()); //correct for negative 'a' check("void f(int i) {\n" // #11998 " if ((i & 0x100) == 0x200) {}\n" @@ -481,7 +478,7 @@ class TestCondition : public TestFixture { ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) The if condition is the same as the previous if condition\n" "[test.cpp:2]: (style) Expression '(X & 0x100) == 0x200' is always false.\n" "[test.cpp:3]: (style) Expression '(X & 0x100) == 0x200' is always false.\n", - errout.str()); + errout_str()); } #define checkPureFunction(code) checkPureFunction_(code, __FILE__, __LINE__) @@ -491,14 +488,14 @@ class TestCondition : public TestFixture { " if (x & 7);\n" " else { if (x == 1); }\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (style) Expression is always false because 'else if' condition matches previous condition at line 3.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Expression is always false because 'else if' condition matches previous condition at line 3.\n", errout_str()); check("void foo(int x)\n" "{\n" " if (x & 7);\n" " else { if (x & 1); }\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (style) Expression is always false because 'else if' condition matches previous condition at line 3.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Expression is always false because 'else if' condition matches previous condition at line 3.\n", errout_str()); check("extern int bar() __attribute__((pure));\n" "void foo(int x)\n" @@ -506,7 +503,7 @@ class TestCondition : public TestFixture { " if ( bar() >1 && b) {}\n" " else if (bar() >1 && b) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (style) Expression is always false because 'else if' condition matches previous condition at line 4.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (style) Expression is always false because 'else if' condition matches previous condition at line 4.\n", errout_str()); checkPureFunction("extern int bar();\n" "void foo(int x)\n" @@ -514,14 +511,14 @@ class TestCondition : public TestFixture { " if ( bar() >1 && b) {}\n" " else if (bar() >1 && b) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (style) Expression is always false because 'else if' condition matches previous condition at line 4.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (style) Expression is always false because 'else if' condition matches previous condition at line 4.\n", errout_str()); // 7284 check("void foo() {\n" " if (a) {}\n" " else if (!!a) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Expression is always false because 'else if' condition matches previous condition at line 2.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Expression is always false because 'else if' condition matches previous condition at line 2.\n", errout_str()); // #11059 check("int f();\n" @@ -531,7 +528,7 @@ class TestCondition : public TestFixture { " else if ((i = f()) == 5) {}\n" " else if (i == 3) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f();\n" "void g() {\n" @@ -540,13 +537,10 @@ class TestCondition : public TestFixture { " else if ((i = f()) == 5) {}\n" " else if (i != 3) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void checkPureFunction_(const char code[], const char* file, int line) { - // Clear the error buffer.. - errout.str(""); - // Tokenize.. Tokenizer tokenizer(settings1, this); std::istringstream istr(code); @@ -560,53 +554,53 @@ class TestCondition : public TestFixture { " if (a) { b = 1; }\n" " else { if (a) { b = 2; } }\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Expression is always false because 'else if' condition matches previous condition at line 2.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Expression is always false because 'else if' condition matches previous condition at line 2.\n", errout_str()); check("void f(int a, int &b) {\n" " if (a) { b = 1; }\n" " else { if (a) { b = 2; } }\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Expression is always false because 'else if' condition matches previous condition at line 2.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Expression is always false because 'else if' condition matches previous condition at line 2.\n", errout_str()); check("void f(int a, int &b) {\n" " if (a == 1) { b = 1; }\n" " else { if (a == 2) { b = 2; }\n" " else { if (a == 1) { b = 3; } } }\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (style) Expression is always false because 'else if' condition matches previous condition at line 2.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Expression is always false because 'else if' condition matches previous condition at line 2.\n", errout_str()); check("void f(int a, int &b) {\n" " if (a == 1) { b = 1; }\n" " else { if (a == 2) { b = 2; }\n" " else { if (a == 2) { b = 3; } } }\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (style) Expression is always false because 'else if' condition matches previous condition at line 3.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Expression is always false because 'else if' condition matches previous condition at line 3.\n", errout_str()); check("void f(int a, int &b) {\n" " if (a++) { b = 1; }\n" " else { if (a++) { b = 2; }\n" " else { if (a++) { b = 3; } } }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int a, int &b) {\n" " if (!strtok(NULL, \" \")) { b = 1; }\n" " else { if (!strtok(NULL, \" \")) { b = 2; } }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); { check("void f(Class &c) {\n" " if (c.dostuff() == 3) {}\n" " else { if (c.dostuff() == 3) {} }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(const Class &c) {\n" " if (c.dostuff() == 3) {}\n" " else { if (c.dostuff() == 3) {} }\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Expression is always false because 'else if' condition matches previous condition at line 2.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Expression is always false because 'else if' condition matches previous condition at line 2.\n", errout_str()); } check("void f(int a, int &b) {\n" @@ -614,13 +608,13 @@ class TestCondition : public TestFixture { " if (x < 100) { b = 1; }\n" " else { x = x / 2; if (x < 100) { b = 2; } }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int i) {\n" " if(i == 0x02e2000000 || i == 0xa0c6000000)\n" " foo(i);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // ticket 3689 ( avoid false positive ) check("int fitInt(long long int nValue){\n" @@ -642,13 +636,13 @@ class TestCondition : public TestFixture { " }\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(WIDGET *widget) {\n" " if (dynamic_cast(widget)){}\n" " else if (dynamic_cast(widget)){}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class B { virtual void v() {} };\n" // #11037 "class D1 : public B {};\n" @@ -659,73 +653,73 @@ class TestCondition : public TestFixture { " if (d1) {}\n" " else if (d2) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x) {\n" // #6482 " if (x & 1) {}\n" " else if (x == 0) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x) {\n" " if (x & 15) {}\n" " else if (x == 40) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Expression is always false because 'else if' condition matches previous condition at line 2.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Expression is always false because 'else if' condition matches previous condition at line 2.\n", errout_str()); check("void f(int x) {\n" " if (x == sizeof(double)) {}\n" " else { if (x == sizeof(long double)) {} }" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x) {\n" " if (x & 0x08) {}\n" " else if (x & 0xF8) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x) {\n" " if (x & 0xF8) {}\n" " else if (x & 0x08) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Expression is always false because 'else if' condition matches previous condition at line 2.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Expression is always false because 'else if' condition matches previous condition at line 2.\n", errout_str()); check("void f(bool a, bool b) {\n" " if(a && b){}\n" " else if( !!b && !!a){}\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Expression is always false because 'else if' condition matches previous condition at line 2.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Expression is always false because 'else if' condition matches previous condition at line 2.\n", errout_str()); check("void f(bool a, bool b) {\n" " if(a && b){}\n" " else if( !!b && a){}\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Expression is always false because 'else if' condition matches previous condition at line 2.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Expression is always false because 'else if' condition matches previous condition at line 2.\n", errout_str()); check("void f(bool a, bool b) {\n" " if(a && b){}\n" " else if( b && !!a){}\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Expression is always false because 'else if' condition matches previous condition at line 2.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Expression is always false because 'else if' condition matches previous condition at line 2.\n", errout_str()); check("void f(bool a, bool b) {\n" " if(a && b){}\n" " else if( b && !(!a)){}\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Expression is always false because 'else if' condition matches previous condition at line 2.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Expression is always false because 'else if' condition matches previous condition at line 2.\n", errout_str()); check("void f(bool a, bool b) {\n" " if(a && b){}\n" " else if( !!b && !(!a)){}\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Expression is always false because 'else if' condition matches previous condition at line 2.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Expression is always false because 'else if' condition matches previous condition at line 2.\n", errout_str()); check("void f(bool a, bool b) {\n" " if(a && b){}\n" " else if( !!(b) && !!(a+b)){}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #8168 check("enum MaskValues\n" @@ -737,19 +731,19 @@ class TestCondition : public TestFixture { " if ( value & (int)Value1 ) {}\n" " else if ( value & (int)Value2 ) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(size_t x) {\n" " if (x == sizeof(int)) {}\n" " else { if (x == sizeof(long))} {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(size_t x) {\n" " if (x == sizeof(long)) {}\n" " else { if (x == sizeof(long long))} {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void oppositeElseIfCondition() { @@ -761,7 +755,7 @@ class TestCondition : public TestFixture { "}"); ASSERT_EQUALS("test.cpp:3:style:Expression is always true because 'else if' condition is opposite to previous condition at line 2.\n" "test.cpp:2:note:first condition\n" - "test.cpp:3:note:else if condition is opposite to first condition\n", errout.str()); + "test.cpp:3:note:else if condition is opposite to first condition\n", errout_str()); check("void f(int x) {\n" " int y = x;\n" @@ -771,7 +765,7 @@ class TestCondition : public TestFixture { ASSERT_EQUALS("test.cpp:4:style:Expression is always true because 'else if' condition is opposite to previous condition at line 3.\n" "test.cpp:2:note:'y' is assigned value 'x' here.\n" "test.cpp:3:note:first condition\n" - "test.cpp:4:note:else if condition is opposite to first condition\n", errout.str()); + "test.cpp:4:note:else if condition is opposite to first condition\n", errout_str()); } void checkBadBitmaskCheck() { @@ -779,31 +773,31 @@ class TestCondition : public TestFixture { " bool b = x | 0x02;\n" " return b;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Result of operator '|' is always true if one operand is non-zero. Did you intend to use '&'?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Result of operator '|' is always true if one operand is non-zero. Did you intend to use '&'?\n", errout_str()); check("bool f(int x) {\n" " bool b = 0x02 | x;\n" " return b;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Result of operator '|' is always true if one operand is non-zero. Did you intend to use '&'?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Result of operator '|' is always true if one operand is non-zero. Did you intend to use '&'?\n", errout_str()); check("int f(int x) {\n" " int b = x | 0x02;\n" " return b;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool f(int x) {\n" " bool b = x & 0x02;\n" " return b;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool f(int x) {\n" " if(x | 0x02)\n" " return b;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Result of operator '|' is always true if one operand is non-zero. Did you intend to use '&'?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Result of operator '|' is always true if one operand is non-zero. Did you intend to use '&'?\n", errout_str()); check("bool f(int x) {\n" " int y = 0x1;\n" @@ -811,27 +805,27 @@ class TestCondition : public TestFixture { " if(x | y)\n" " return b;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool f(int x) {\n" " foo(a && (x | 0x02));\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Result of operator '|' is always true if one operand is non-zero. Did you intend to use '&'?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Result of operator '|' is always true if one operand is non-zero. Did you intend to use '&'?\n", errout_str()); check("int f(int x) {\n" " return (x | 0x02) ? 0 : 5;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Result of operator '|' is always true if one operand is non-zero. Did you intend to use '&'?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Result of operator '|' is always true if one operand is non-zero. Did you intend to use '&'?\n", errout_str()); check("int f(int x) {\n" " return x ? (x | 0x02) : 5;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool f(int x) {\n" " return x | 0x02;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Result of operator '|' is always true if one operand is non-zero. Did you intend to use '&'?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Result of operator '|' is always true if one operand is non-zero. Did you intend to use '&'?\n", errout_str()); check("bool f(int x) {\n" " if (x) {\n" @@ -839,19 +833,19 @@ class TestCondition : public TestFixture { " }\n" " return 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Result of operator '|' is always true if one operand is non-zero. Did you intend to use '&'?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Result of operator '|' is always true if one operand is non-zero. Did you intend to use '&'?\n", errout_str()); check("const bool f(int x) {\n" " return x | 0x02;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Result of operator '|' is always true if one operand is non-zero. Did you intend to use '&'?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Result of operator '|' is always true if one operand is non-zero. Did you intend to use '&'?\n", errout_str()); check("struct F {\n" " static const bool f(int x) {\n" " return x | 0x02;\n" " }\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Result of operator '|' is always true if one operand is non-zero. Did you intend to use '&'?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Result of operator '|' is always true if one operand is non-zero. Did you intend to use '&'?\n", errout_str()); check("struct F {\n" " typedef bool b_t;\n" @@ -859,12 +853,12 @@ class TestCondition : public TestFixture { "F::b_t f(int x) {\n" " return x | 0x02;\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (warning) Result of operator '|' is always true if one operand is non-zero. Did you intend to use '&'?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (warning) Result of operator '|' is always true if one operand is non-zero. Did you intend to use '&'?\n", errout_str()); check("int f(int x) {\n" " return x | 0x02;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void create_rop_masks_4( rop_mask_bits *bits) {\n" "DWORD mask_offset;\n" @@ -872,7 +866,7 @@ class TestCondition : public TestFixture { "rop_mask *rop_mask;\n" "and_bits[mask_offset] |= (rop_mask->and & 0x0f);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(unsigned a, unsigned b) {\n" " unsigned cmd1 = b & 0x0F;\n" @@ -880,25 +874,25 @@ class TestCondition : public TestFixture { " if (b == 0x0C) {}\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int i) {\n" // #11082 " int j = 0;\n" " if (i | j) {}\n" "}\n"); - ASSERT_EQUALS("[test.cpp:3]: (style) Operator '|' with one operand equal to zero is redundant.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Operator '|' with one operand equal to zero is redundant.\n", errout_str()); check("#define EIGHTTOIS(x) (((x) << 8) | (x))\n" "int f() {\n" " return EIGHTTOIS(0);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("#define O_RDONLY 0\n" "void f(const char* s, int* pFd) {\n" " *pFd = open(s, O_RDONLY | O_BINARY, 0);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("const int FEATURE_BITS = x |\n" "#if FOO_ENABLED\n" @@ -908,17 +902,17 @@ class TestCondition : public TestFixture { " FEATURE_BAR |\n" "#endif\n" " 0;"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("enum precedence { PC0, UNARY };\n" "int x = PC0 | UNARY;\n" "int y = UNARY | PC0;\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("#define MASK 0\n" "#define SHIFT 1\n" "int x = 1 | (MASK << SHIFT);\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } @@ -927,84 +921,84 @@ class TestCondition : public TestFixture { " if ((x != 1) || (x != 3))\n" " a++;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Logical disjunction always evaluates to true: x != 1 || x != 3.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Logical disjunction always evaluates to true: x != 1 || x != 3.\n", errout_str()); check("void f(int x) {\n" " if (1 != x || 3 != x)\n" " a++;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Logical disjunction always evaluates to true: x != 1 || x != 3.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Logical disjunction always evaluates to true: x != 1 || x != 3.\n", errout_str()); check("void f(int x) {\n" " if (x<0 && !x) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Logical conjunction always evaluates to false: x < 0 && !x.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Logical conjunction always evaluates to false: x < 0 && !x.\n", errout_str()); check("void f(int x) {\n" " if (x==0 && x) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Logical conjunction always evaluates to false: x == 0 && x.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Logical conjunction always evaluates to false: x == 0 && x.\n", errout_str()); check("void f(int x) {\n" // ast.. " if (y == 1 && x == 1 && x == 7) { }\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Logical conjunction always evaluates to false: x == 1 && x == 7.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Logical conjunction always evaluates to false: x == 1 && x == 7.\n", errout_str()); check("void f(int x, int y) {\n" " if (x != 1 || y != 1)\n" " a++;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x, int y) {\n" " if ((y == 1) && (x != 1) || (x != 3))\n" " a++;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x, int y) {\n" " if ((x != 1) || (x != 3) && (y == 1))\n" " a++;\n" "}" ); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:2]: (style) Condition 'x!=3' is always true\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:2]: (style) Condition 'x!=3' is always true\n", errout_str()); check("void f(int x) {\n" " if ((x != 1) && (x != 3))\n" " a++;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x) {\n" " if ((x == 1) || (x == 3))\n" " a++;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x, int y) {\n" " if ((x != 1) || (y != 3))\n" " a++;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x, int y) {\n" " if ((x != hotdog) || (y != hotdog))\n" " a++;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x, int y) {\n" " if ((x != 5) || (y != 5))\n" " a++;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x) {\n" " if ((x != 5) || (x != 6))\n" " a++;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Logical disjunction always evaluates to true: x != 5 || x != 6.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Logical disjunction always evaluates to true: x != 5 || x != 6.\n", errout_str()); check("void f(unsigned int a, unsigned int b, unsigned int c) {\n" " if((a != b) || (c != b) || (c != a))\n" @@ -1013,7 +1007,7 @@ class TestCondition : public TestFixture { " }\n" " return false;\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:2]: (style) Condition 'c!=a' is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:2]: (style) Condition 'c!=a' is always false\n", errout_str()); } void incorrectLogicOperator2() { @@ -1021,224 +1015,224 @@ class TestCondition : public TestFixture { " if ((x == 1) && (x == 1.0))\n" " a++;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x) {\n" " if ((x == 1) && (x == 0x00000001))\n" " a++;\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:2]: (style) Condition 'x==0x00000001' is always true\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:2]: (style) Condition 'x==0x00000001' is always true\n", errout_str()); check("void f(int x) {\n" " if (x == 1 && x == 3)\n" " a++;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Logical conjunction always evaluates to false: x == 1 && x == 3.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Logical conjunction always evaluates to false: x == 1 && x == 3.\n", errout_str()); check("void f(int x) {\n" " if (x == 1.0 && x == 3.0)\n" " a++;\n" "}"); - ASSERT_EQUALS("", errout.str()); // float comparisons with == and != are not checked right now - such comparison is a bad idea + ASSERT_EQUALS("", errout_str()); // float comparisons with == and != are not checked right now - such comparison is a bad idea check("void f(float x) {\n" " if (x == 1 && x == 1.0)\n" " a++;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void bar(float f) {\n" // #5246 " if ((f > 0) && (f < 1)) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x) {\n" " if (x < 1 && x > 1)\n" " a++;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Logical conjunction always evaluates to false: x < 1 && x > 1.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Logical conjunction always evaluates to false: x < 1 && x > 1.\n", errout_str()); check("void f(int x) {\n" " if (x < 1.0 && x > 1.0)\n" " a++;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Logical conjunction always evaluates to false: x < 1.0 && x > 1.0.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Logical conjunction always evaluates to false: x < 1.0 && x > 1.0.\n", errout_str()); check("void f(int x) {\n" " if (x < 1 && x > 1.0)\n" " a++;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Logical conjunction always evaluates to false: x < 1 && x > 1.0.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Logical conjunction always evaluates to false: x < 1 && x > 1.0.\n", errout_str()); check("void f(int x) {\n" " if (x >= 1.0 && x <= 1.001)\n" " a++;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x) {\n" " if (x < 1 && x > 3)\n" " a++;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Logical conjunction always evaluates to false: x < 1 && x > 3.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Logical conjunction always evaluates to false: x < 1 && x > 3.\n", errout_str()); check("void f(float x) {\n" " if (x < 1.0 && x > 3.0)\n" " a++;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Logical conjunction always evaluates to false: x < 1.0 && x > 3.0.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Logical conjunction always evaluates to false: x < 1.0 && x > 3.0.\n", errout_str()); check("void f(int x) {\n" " if (1 > x && 3 < x)\n" " a++;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Logical conjunction always evaluates to false: x < 1 && x > 3.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Logical conjunction always evaluates to false: x < 1 && x > 3.\n", errout_str()); check("void f(int x) {\n" " if (x < 3 && x > 1)\n" " a++;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x) {\n" " if (x > 3 || x < 10)\n" " a++;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Logical disjunction always evaluates to true: x > 3 || x < 10.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Logical disjunction always evaluates to true: x > 3 || x < 10.\n", errout_str()); check("void f(int x) {\n" " if (x >= 3 || x <= 10)\n" " a++;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Logical disjunction always evaluates to true: x >= 3 || x <= 10.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Logical disjunction always evaluates to true: x >= 3 || x <= 10.\n", errout_str()); check("void f(int x) {\n" " if (x >= 3 || x < 10)\n" " a++;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Logical disjunction always evaluates to true: x >= 3 || x < 10.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Logical disjunction always evaluates to true: x >= 3 || x < 10.\n", errout_str()); check("void f(int x) {\n" " if (x > 3 || x <= 10)\n" " a++;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Logical disjunction always evaluates to true: x > 3 || x <= 10.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Logical disjunction always evaluates to true: x > 3 || x <= 10.\n", errout_str()); check("void f(int x) {\n" " if (x > 3 || x < 3)\n" " a++;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x) {\n" " if (x >= 3 || x <= 3)\n" " a++;\n" "}" ); - ASSERT_EQUALS("[test.cpp:2]: (warning) Logical disjunction always evaluates to true: x >= 3 || x <= 3.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Logical disjunction always evaluates to true: x >= 3 || x <= 3.\n", errout_str()); check("void f(int x) {\n" " if (x >= 3 || x < 3)\n" " a++;\n" "}" ); - ASSERT_EQUALS("[test.cpp:2]: (warning) Logical disjunction always evaluates to true: x >= 3 || x < 3.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Logical disjunction always evaluates to true: x >= 3 || x < 3.\n", errout_str()); check("void f(int x) {\n" " if (x > 3 || x <= 3)\n" " a++;\n" "}" ); - ASSERT_EQUALS("[test.cpp:2]: (warning) Logical disjunction always evaluates to true: x > 3 || x <= 3.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Logical disjunction always evaluates to true: x > 3 || x <= 3.\n", errout_str()); check("void f(int x) {\n" " if((x==3) && (x!=4))\n" " a++;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Redundant condition: The condition 'x != 4' is redundant since 'x == 3' is sufficient.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Redundant condition: The condition 'x != 4' is redundant since 'x == 3' is sufficient.\n", errout_str()); check("void f(const std::string &s) {\n" // #8860 " const std::size_t p = s.find(\"42\");\n" " const std::size_t * const ptr = &p;\n" " if(p != std::string::npos && p == 0 && *ptr != 1){;}\n" "}"); - ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:4]: (style) Condition '*ptr!=1' is always true\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:4]: (style) Condition '*ptr!=1' is always true\n", errout_str()); check("void f(int x) {\n" " if ((x!=4) && (x==3))\n" " a++;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Redundant condition: The condition 'x != 4' is redundant since 'x == 3' is sufficient.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Redundant condition: The condition 'x != 4' is redundant since 'x == 3' is sufficient.\n", errout_str()); check("void f(int x) {\n" " if ((x==3) || (x!=4))\n" " a++;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Redundant condition: The condition 'x == 3' is redundant since 'x != 4' is sufficient.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Redundant condition: The condition 'x == 3' is redundant since 'x != 4' is sufficient.\n", errout_str()); check("void f(int x) {\n" " if ((x!=4) || (x==3))\n" " a++;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Redundant condition: The condition 'x == 3' is redundant since 'x != 4' is sufficient.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Redundant condition: The condition 'x == 3' is redundant since 'x != 4' is sufficient.\n", errout_str()); check("void f(int x) {\n" " if ((x==3) && (x!=3))\n" " a++;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Logical conjunction always evaluates to false: x == 3 && x != 3.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Logical conjunction always evaluates to false: x == 3 && x != 3.\n", errout_str()); check("void f(int x) {\n" " if ((x==6) || (x!=6))\n" " a++;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Logical disjunction always evaluates to true: x == 6 || x != 6.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Logical disjunction always evaluates to true: x == 6 || x != 6.\n", errout_str()); check("void f(int x) {\n" " if (x > 10 || x < 3)\n" " a++;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x) {\n" " if (x > 5 && x == 1)\n" " a++;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Logical conjunction always evaluates to false: x > 5 && x == 1.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Logical conjunction always evaluates to false: x > 5 && x == 1.\n", errout_str()); check("void f(int x) {\n" " if (x > 5 && x == 6)\n" " a++;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Redundant condition: The condition 'x > 5' is redundant since 'x == 6' is sufficient.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Redundant condition: The condition 'x > 5' is redundant since 'x == 6' is sufficient.\n", errout_str()); // #3419 check("void f() {\n" " if ( &q != &a && &q != &b ) { }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #3676 check("void f(int m_x2, int w, int x) {\n" " if (x + w - 1 > m_x2 || m_x2 < 0 )\n" " m_x2 = x + w - 1;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(float x) {\n" // x+1 => x " if (x <= 1.0e20 && x >= -1.0e20) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(float x) {\n" // x+1 => x " if (x >= 1.0e20 && x <= 1.0e21) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(float x) {\n" // x+1 => x " if (x <= -1.0e20 && x >= -1.0e21) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void incorrectLogicOperator3() { @@ -1251,7 +1245,7 @@ class TestCondition : public TestFixture { ASSERT_EQUALS("[test.cpp:2]: (warning) Logical conjunction always evaluates to false: x > 5 && x == 1.\n" "[test.cpp:3]: (warning) Logical conjunction always evaluates to false: x < 1 && x == 3.\n" "[test.cpp:4]: (warning) Logical conjunction always evaluates to false: x >= 5 && x == 1.\n" - "[test.cpp:5]: (warning) Logical conjunction always evaluates to false: x <= 1 && x == 3.\n", errout.str()); + "[test.cpp:5]: (warning) Logical conjunction always evaluates to false: x <= 1 && x == 3.\n", errout_str()); } void incorrectLogicOperator4() { @@ -1259,7 +1253,7 @@ class TestCondition : public TestFixture { "void f(int x) {\n" " if (x && x != ZERO) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int N) {\n" // #9789 " T a[20] = { 0 };\n" @@ -1267,65 +1261,65 @@ class TestCondition : public TestFixture { " if (0 < a[i] && a[i] < 1) {}\n" " }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void incorrectLogicOperator5() { // complex expressions check("void f(int x) {\n" " if (x+3 > 2 || x+3 < 10) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Logical disjunction always evaluates to true: x+3 > 2 || x+3 < 10.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Logical disjunction always evaluates to true: x+3 > 2 || x+3 < 10.\n", errout_str()); } void incorrectLogicOperator6() { // char literals check("void f(char x) {\n" " if (x == '1' || x == '2') {}\n" "}", "test.cpp", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(char x) {\n" " if (x == '1' && x == '2') {}\n" "}", "test.cpp", true); - ASSERT_EQUALS("[test.cpp:2]: (warning) Logical conjunction always evaluates to false: x == '1' && x == '2'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Logical conjunction always evaluates to false: x == '1' && x == '2'.\n", errout_str()); check("int f(char c) {\n" " return (c >= 'a' && c <= 'z');\n" "}", "test.cpp", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f(char c) {\n" " return (c <= 'a' && c >= 'z');\n" "}", "test.cpp", true); - ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Logical conjunction always evaluates to false: c <= 'a' && c >= 'z'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Logical conjunction always evaluates to false: c <= 'a' && c >= 'z'.\n", errout_str()); check("int f(char c) {\n" " return (c <= 'a' && c >= 'z');\n" "}", "test.cpp", false); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:2]: (style) Return value 'c>='z'' is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:2]: (style) Return value 'c>='z'' is always false\n", errout_str()); } void incorrectLogicOperator7() { // opposite expressions check("void f(int i) {\n" " if (i || !i) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Logical disjunction always evaluates to true: i || !(i).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Logical disjunction always evaluates to true: i || !(i).\n", errout_str()); check("void f(int a, int b) {\n" " if (a>b || a<=b) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Logical disjunction always evaluates to true: a > b || a <= b.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Logical disjunction always evaluates to true: a > b || a <= b.\n", errout_str()); check("void f(int a, int b) {\n" " if (a>b || a T icdf( const T uniform ) {\n" " if ((0(obj));\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void incorrectLogicOperator10() { // #7794 - enum @@ -1360,21 +1354,21 @@ class TestCondition : public TestFixture { " if ((t == A) && (t == B))\n" " {}\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Logical conjunction always evaluates to false: t == 0 && t == 1.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Logical conjunction always evaluates to false: t == 0 && t == 1.\n", errout_str()); } void incorrectLogicOperator11() { check("void foo(int i, const int n) { if ( i < n && i == n ) {} }"); - ASSERT_EQUALS("[test.cpp:1]: (warning) Logical conjunction always evaluates to false: i < n && i == n.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (warning) Logical conjunction always evaluates to false: i < n && i == n.\n", errout_str()); check("void foo(int i, const int n) { if ( i > n && i == n ) {} }"); - ASSERT_EQUALS("[test.cpp:1]: (warning) Logical conjunction always evaluates to false: i > n && i == n.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (warning) Logical conjunction always evaluates to false: i > n && i == n.\n", errout_str()); check("void foo(int i, const int n) { if ( i == n && i > n ) {} }"); - ASSERT_EQUALS("[test.cpp:1]: (warning) Logical conjunction always evaluates to false: i == n && i > n.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (warning) Logical conjunction always evaluates to false: i == n && i > n.\n", errout_str()); check("void foo(int i, const int n) { if ( i == n && i < n ) {} }"); - ASSERT_EQUALS("[test.cpp:1]: (warning) Logical conjunction always evaluates to false: i == n && i < n.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (warning) Logical conjunction always evaluates to false: i == n && i < n.\n", errout_str()); } void incorrectLogicOperator12() { // #8696 @@ -1390,7 +1384,7 @@ class TestCondition : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:5] -> [test.cpp:6] -> [test.cpp:8]: (warning) Logical conjunction always evaluates to false: a > x && a < y.\n", - errout.str()); + errout_str()); check("struct A {\n" " void f();\n" @@ -1402,7 +1396,7 @@ class TestCondition : public TestFixture { " if (a > x && a < y)\n" " return;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(A a, A b) {\n" " A x = b;\n" @@ -1411,7 +1405,7 @@ class TestCondition : public TestFixture { " if (a > x && a < y)\n" " return;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(A a, A b) {\n" " const A x = b;\n" @@ -1422,7 +1416,7 @@ class TestCondition : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:2] -> [test.cpp:3] -> [test.cpp:5]: (warning) Logical conjunction always evaluates to false: a > x && a < y.\n", - errout.str()); + errout_str()); check("struct A {\n" " void f() const;\n" @@ -1436,7 +1430,7 @@ class TestCondition : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:8]: (style) Condition 'a>x' is always false\n" "[test.cpp:8]: (style) Condition 'a x && a < y)\n" " return;\n" "}"); - ASSERT_EQUALS("[test.cpp:8]: (style) Condition 'a>x' is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8]: (style) Condition 'a>x' is always false\n", errout_str()); check("void foo(A a) {\n" " A x = a;\n" @@ -1457,7 +1451,7 @@ class TestCondition : public TestFixture { " if (a > x && a < y)\n" " return;\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (style) Condition 'a>x' is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (style) Condition 'a>x' is always false\n", errout_str()); check("void foo(A a) {\n" " const A x = a;\n" @@ -1468,7 +1462,7 @@ class TestCondition : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:5]: (style) Condition 'a>x' is always false\n" "[test.cpp:5]: (style) Condition 'a [test.cpp:3]: (warning) Logical conjunction always evaluates to false: v == 1 && x == 2.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Logical conjunction always evaluates to false: v == 1 && x == 2.\n", errout_str()); check("void f2(const int *v) {\n" " const int *x=v;\n" " if ((*v == 1) && (*x == 2)) {;}\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Logical conjunction always evaluates to false: *(v) == 1 && *(x) == 2.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Logical conjunction always evaluates to false: *(v) == 1 && *(x) == 2.\n", errout_str()); } void incorrectLogicOperator14() { @@ -1690,7 +1684,7 @@ class TestCondition : public TestFixture { " ;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:200] -> [test.cpp:200]: (style) Condition 'g' is always true\n", errout.str()); + ASSERT_EQUALS("[test.cpp:200] -> [test.cpp:200]: (style) Condition 'g' is always true\n", errout_str()); } void incorrectLogicOperator15() { @@ -1713,14 +1707,14 @@ class TestCondition : public TestFixture { " }\n" " }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void incorrectLogicOperator16() { // #10070 check("void foo(void* p) {\n" " if (!p || p == -1) { }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void incorrectLogicOperator17() { // #12471 @@ -1738,7 +1732,7 @@ class TestCondition : public TestFixture { " r->set();\n" " if (a == 0 && r->get()) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void secondAlwaysTrueFalseWhenFirstTrueError() { @@ -1746,31 +1740,31 @@ class TestCondition : public TestFixture { " const char c[1] = { \'x\' }; \n" " if(c[0] == \'x\'){;}\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Condition 'c[0]=='x'' is always true\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Condition 'c[0]=='x'' is always true\n", errout_str()); check("void f(int x) {\n" " if (x > 5 && x != 1)\n" " a++;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Redundant condition: The condition 'x != 1' is redundant since 'x > 5' is sufficient.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Redundant condition: The condition 'x != 1' is redundant since 'x > 5' is sufficient.\n", errout_str()); check("void f(int x) {\n" " if (x > 5 && x != 6)\n" " a++;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x) {\n" " if ((x > 5) && (x != 1))\n" " a++;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Redundant condition: The condition 'x != 1' is redundant since 'x > 5' is sufficient.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Redundant condition: The condition 'x != 1' is redundant since 'x > 5' is sufficient.\n", errout_str()); check("void f(int x) {\n" " if ((x > 5) && (x != 6))\n" " a++;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x, bool& b) {\n" " b = x > 3 || x == 4;\n" @@ -1782,7 +1776,7 @@ class TestCondition : public TestFixture { "[test.cpp:3]: (style) Redundant condition: The condition 'x == 4' is redundant since 'x < 5' is sufficient.\n" "[test.cpp:4]: (style) Redundant condition: The condition 'x == 4' is redundant since 'x >= 3' is sufficient.\n" "[test.cpp:5]: (style) Redundant condition: The condition 'x == 4' is redundant since 'x <= 5' is sufficient.\n", - errout.str()); + errout_str()); check("void f(int x, bool& b) {\n" " b = x > 5 || x != 1;\n" @@ -1794,7 +1788,7 @@ class TestCondition : public TestFixture { "[test.cpp:3]: (style) Redundant condition: The condition 'x < 1' is redundant since 'x != 3' is sufficient.\n" "[test.cpp:4]: (style) Redundant condition: The condition 'x >= 5' is redundant since 'x != 1' is sufficient.\n" "[test.cpp:5]: (style) Redundant condition: The condition 'x <= 1' is redundant since 'x != 3' is sufficient.\n", - errout.str()); + errout_str()); check("void f(int x, bool& b) {\n" " b = x > 6 && x > 5;\n" @@ -1806,7 +1800,7 @@ class TestCondition : public TestFixture { "[test.cpp:3]: (style) Redundant condition: The condition 'x > 6' is redundant since 'x > 5' is sufficient.\n" "[test.cpp:4]: (style) Redundant condition: The condition 'x < 6' is redundant since 'x < 5' is sufficient.\n" "[test.cpp:5]: (style) Redundant condition: The condition 'x < 5' is redundant since 'x < 6' is sufficient.\n", - errout.str()); + errout_str()); check("void f(double x, bool& b) {\n" " b = x > 6.5 && x > 5.5;\n" @@ -1818,13 +1812,13 @@ class TestCondition : public TestFixture { "[test.cpp:3]: (style) Redundant condition: The condition 'x > 6.5' is redundant since 'x > 5.5' is sufficient.\n" "[test.cpp:4]: (style) Redundant condition: The condition 'x < 6.5' is redundant since 'x < 5.5' is sufficient.\n" "[test.cpp:5]: (style) Redundant condition: The condition 'x < 5.5' is redundant since 'x < 6.5' is sufficient.\n", - errout.str()); + errout_str()); check("void f(const char *p) {\n" // #10320 " if (!p || !*p || *p != 'x') {}\n" "}\n"); ASSERT_EQUALS("[test.cpp:2]: (style) Redundant condition: The condition '!*p' is redundant since '*p != 'x'' is sufficient.\n", - errout.str()); + errout_str()); } void incorrectLogicOp_condSwapping() { @@ -1832,49 +1826,49 @@ class TestCondition : public TestFixture { " if (x < 1 && x > 3)\n" " a++;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Logical conjunction always evaluates to false: x < 1 && x > 3.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Logical conjunction always evaluates to false: x < 1 && x > 3.\n", errout_str()); check("void f(int x) {\n" " if (1 > x && x > 3)\n" " a++;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Logical conjunction always evaluates to false: x < 1 && x > 3.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Logical conjunction always evaluates to false: x < 1 && x > 3.\n", errout_str()); check("void f(int x) {\n" " if (x < 1 && 3 < x)\n" " a++;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Logical conjunction always evaluates to false: x < 1 && x > 3.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Logical conjunction always evaluates to false: x < 1 && x > 3.\n", errout_str()); check("void f(int x) {\n" " if (1 > x && 3 < x)\n" " a++;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Logical conjunction always evaluates to false: x < 1 && x > 3.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Logical conjunction always evaluates to false: x < 1 && x > 3.\n", errout_str()); check("void f(int x) {\n" " if (x > 3 && x < 1)\n" " a++;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Logical conjunction always evaluates to false: x > 3 && x < 1.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Logical conjunction always evaluates to false: x > 3 && x < 1.\n", errout_str()); check("void f(int x) {\n" " if (3 < x && x < 1)\n" " a++;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Logical conjunction always evaluates to false: x > 3 && x < 1.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Logical conjunction always evaluates to false: x > 3 && x < 1.\n", errout_str()); check("void f(int x) {\n" " if (x > 3 && 1 > x)\n" " a++;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Logical conjunction always evaluates to false: x > 3 && x < 1.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Logical conjunction always evaluates to false: x > 3 && x < 1.\n", errout_str()); check("void f(int x) {\n" " if (3 < x && 1 > x)\n" " a++;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Logical conjunction always evaluates to false: x > 3 && x < 1.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Logical conjunction always evaluates to false: x > 3 && x < 1.\n", errout_str()); } void modulo() { @@ -1884,7 +1878,7 @@ class TestCondition : public TestFixture { " b3 = a % 5 == c;\n" " return a % 5 == 5-p;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool f(bool& b1, bool& b2, bool& b3, bool& b4, bool& b5) {\n" " b1 = a % 5 < 5;\n" @@ -1901,7 +1895,7 @@ class TestCondition : public TestFixture { "[test.cpp:5]: (warning) Comparison of modulo result is predetermined, because it is always less than 5.\n" "[test.cpp:6]: (warning) Comparison of modulo result is predetermined, because it is always less than 5.\n" "[test.cpp:7]: (warning) Comparison of modulo result is predetermined, because it is always less than 5.\n", - errout.str()); + errout_str()); check("void f(bool& b1, bool& b2) {\n" " b1 = bar() % 5 < 889;\n" @@ -1912,13 +1906,13 @@ class TestCondition : public TestFixture { "[test.cpp:2]: (warning) Comparison of modulo result is predetermined, because it is always less than 5.\n" "[test.cpp:3]: (warning) Comparison of modulo result is predetermined, because it is always less than 5.\n" "[test.cpp:4]: (warning) Comparison of modulo result is predetermined, because it is always less than 5.\n", - errout.str()); + errout_str()); check("void f() {\n" " if (a % 2 + b % 2 == 2)\n" " foo();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void oppositeInnerCondition() { @@ -1927,21 +1921,21 @@ class TestCondition : public TestFixture { " if(a!=b)\n" " cout << a;\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout_str()); check("bool foo(int a, int b) {\n" " if(a==b)\n" " return a!=b;\n" " return false;\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Opposite inner 'return' condition leads to a dead code block.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Opposite inner 'return' condition leads to a dead code block.\n", errout_str()); check("void foo(int a, int b) {\n" " if(a==b)\n" " if(b!=a)\n" " cout << a;\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout_str()); check("void foo(int a) {\n" " if(a >= 50) {\n" @@ -1951,7 +1945,7 @@ class TestCondition : public TestFixture { " cout << 100;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout_str()); // #4186 check("void foo(int a) {\n" @@ -1962,7 +1956,7 @@ class TestCondition : public TestFixture { " cout << 100;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // 4170 check("class foo {\n" @@ -1981,7 +1975,7 @@ class TestCondition : public TestFixture { " void next();\n" " const char *tok;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(int i)\n" "{\n" @@ -1992,7 +1986,7 @@ class TestCondition : public TestFixture { " }\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(int& i) {\n" " i=6;\n" @@ -2004,7 +1998,7 @@ class TestCondition : public TestFixture { " }\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(int& i);\n" "void bar() {\n" @@ -2015,7 +2009,7 @@ class TestCondition : public TestFixture { " }\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(int i);\n" "void bar(int i) {\n" @@ -2025,7 +2019,7 @@ class TestCondition : public TestFixture { " }\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:5]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:5]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout_str()); check("void foo(const int &i);\n" "void bar(int i) {\n" @@ -2035,7 +2029,7 @@ class TestCondition : public TestFixture { " }\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:5]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:5]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout_str()); check("void foo(int i);\n" "void bar() {\n" @@ -2046,7 +2040,7 @@ class TestCondition : public TestFixture { " }\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:6]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:6]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout_str()); check("class C { void f(int &i) const; };\n" // #7028 - variable is changed by const method "void foo(C c, int i) {\n" @@ -2055,7 +2049,7 @@ class TestCondition : public TestFixture { " if (i != 5) {}\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // see linux revision 1f80c0cc check("int generic_write_sync(int,int,int);\n" @@ -2069,7 +2063,7 @@ class TestCondition : public TestFixture { " }\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:7]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:7]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout_str()); // #5874 - array @@ -2080,7 +2074,7 @@ class TestCondition : public TestFixture { " if (array[0] > 2) {}\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #6227 - FP caused by simplifications of casts and known variables check("void foo(A *a) {\n" @@ -2089,7 +2083,7 @@ class TestCondition : public TestFixture { " if(!b) {}\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(int a) {\n" " if(a) {\n" @@ -2097,7 +2091,7 @@ class TestCondition : public TestFixture { " if(!b) {}\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2] -> [test.cpp:4]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2] -> [test.cpp:4]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout_str()); check("void foo(unsigned u) {\n" " if (u != 0) {\n" @@ -2107,7 +2101,7 @@ class TestCondition : public TestFixture { " }\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #8186 check("void f() {\n" @@ -2115,7 +2109,7 @@ class TestCondition : public TestFixture { " if (i==5) {}\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout_str()); // #8938 check("void Delete(SS_CELLCOORD upperleft) {\n" @@ -2124,7 +2118,7 @@ class TestCondition : public TestFixture { " if (upperleft.Row == -1) {}\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #9702 check("struct A {\n" @@ -2137,7 +2131,7 @@ class TestCondition : public TestFixture { " bool IsSet() const { return m_value; }\n" " bool m_value = false;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void oppositeInnerConditionPointers() { @@ -2150,7 +2144,7 @@ class TestCondition : public TestFixture { " }\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void Fred::f() {\n" // daca: ace " if (this->next_ == map_man_->table_) {\n" @@ -2158,7 +2152,7 @@ class TestCondition : public TestFixture { " if (this->next_ != map_man_->table_) {}\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void test(float *f) {\n" // #7405 " if(*f>10) {\n" @@ -2166,13 +2160,13 @@ class TestCondition : public TestFixture { " if(*f<10) {}\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int * f(int * x, int * y) {\n" " if(!x) return x;\n" " return y;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void oppositeInnerConditionClass() { @@ -2184,7 +2178,7 @@ class TestCondition : public TestFixture { " if (!fred.isValid()) {}\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:5]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:5]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout_str()); check("class Fred { public: bool isValid() const; void dostuff() const; };\n" "void f() {\n" @@ -2194,7 +2188,7 @@ class TestCondition : public TestFixture { " if (!fred.isValid()) {}\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:6]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:6]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout_str()); check("void f() {\n" " Fred fred;\n" @@ -2203,7 +2197,7 @@ class TestCondition : public TestFixture { " if (!fred.isValid()) {}\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #6385 "crash in Variable::getFlag()" check("class TranslationHandler {\n" @@ -2214,14 +2208,14 @@ class TestCondition : public TestFixture { " }\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); // just don't crash... + ASSERT_EQUALS("", errout_str()); // just don't crash... check("bool f(std::ofstream &CFileStream) {\n" // #8198 " if(!CFileStream.good()) { return; }\n" " CFileStream << \"abc\";\n" " if (!CFileStream.good()) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void oppositeInnerConditionUndeclaredVariable() { @@ -2232,7 +2226,7 @@ class TestCondition : public TestFixture { " if (x != -1) {}\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #5750 - another fp when undeclared variable is used check("void f() {\n" @@ -2241,7 +2235,7 @@ class TestCondition : public TestFixture { " if (r > w) {}\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #6574 - another fp when undeclared variable is used check("void foo() {\n" @@ -2250,7 +2244,7 @@ class TestCondition : public TestFixture { " if(!i) {}\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // undeclared array check("void f(int x) {\n" @@ -2259,7 +2253,7 @@ class TestCondition : public TestFixture { " if (a[x] < 0) {}\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #6313 - false positive: opposite conditions in nested if blocks when condition changed check("void Foo::Bar() {\n" @@ -2269,7 +2263,7 @@ class TestCondition : public TestFixture { " else {}\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // daca hyphy check("bool f() {\n" @@ -2278,7 +2272,7 @@ class TestCondition : public TestFixture { " if (rec.lLength!=0) {}\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void oppositeInnerConditionAlias() { @@ -2292,7 +2286,7 @@ class TestCondition : public TestFixture { " if (hasFailed) {}\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:6]: (style) Condition '!hasFailed' is always true\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (style) Condition '!hasFailed' is always true\n", errout_str()); } void oppositeInnerCondition2() { @@ -2304,14 +2298,14 @@ class TestCondition : public TestFixture { " }\n" "}"); ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", - errout.str()); + errout_str()); check("void f(int x) {\n" "\n" " if (x<4) {\n" " if (x!=5) {}\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (style) Condition 'x!=5' is always true\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (style) Condition 'x!=5' is always true\n", errout_str()); check("void f(int x) {\n" "\n" " if (x<4) {\n" @@ -2319,7 +2313,7 @@ class TestCondition : public TestFixture { " }\n" "}"); ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", - errout.str()); + errout_str()); check("void f(int x) {\n" "\n" " if (x<4) {\n" @@ -2327,21 +2321,21 @@ class TestCondition : public TestFixture { " }\n" "}"); ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", - errout.str()); + errout_str()); check("void f(int x) {\n" "\n" " if (x<4) {\n" " if (x<5) {}\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (style) Condition 'x<5' is always true\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (style) Condition 'x<5' is always true\n", errout_str()); check("void f(int x) {\n" "\n" " if (x<4) {\n" " if (x<=5) {}\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (style) Condition 'x<=5' is always true\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (style) Condition 'x<=5' is always true\n", errout_str()); check("void f(int x) {\n" "\n" @@ -2349,49 +2343,49 @@ class TestCondition : public TestFixture { " if (x==4) {}\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x) {\n" "\n" " if (x<5) {\n" " if (x!=4) {}\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x) {\n" "\n" " if (x<5) {\n" " if (x!=6) {}\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (style) Condition 'x!=6' is always true\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (style) Condition 'x!=6' is always true\n", errout_str()); check("void f(int x) {\n" "\n" " if (x<5) {\n" " if (x>4) {}\n" // <- Warning " }\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (style) Condition 'x>4' is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (style) Condition 'x>4' is always false\n", errout_str()); check("void f(int x) {\n" "\n" " if (x<5) {\n" " if (x>=4) {}\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x) {\n" "\n" " if (x<5) {\n" " if (x<4) {}\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x) {\n" "\n" " if (x<5) {\n" " if (x<=4) {}\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (style) Condition 'x<=4' is always true\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (style) Condition 'x<=4' is always true\n", errout_str()); // first comparison: > check("void f(int x) {\n" @@ -2400,35 +2394,35 @@ class TestCondition : public TestFixture { " if (x==5) {}\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x) {\n" "\n" " if (x>4) {\n" " if (x>5) {}\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x) {\n" "\n" " if (x>4) {\n" " if (x>=5) {}\n" // <- Warning " }\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (style) Condition 'x>=5' is always true\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (style) Condition 'x>=5' is always true\n", errout_str()); check("void f(int x) {\n" "\n" " if (x>4) {\n" " if (x<5) {}\n" // <- Warning " }\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (style) Condition 'x<5' is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (style) Condition 'x<5' is always false\n", errout_str()); check("void f(int x) {\n" "\n" " if (x>4) {\n" " if (x<=5) {}\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x) {\n" "\n" @@ -2437,21 +2431,21 @@ class TestCondition : public TestFixture { " }\n" "}"); ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", - errout.str()); + errout_str()); check("void f(int x) {\n" "\n" " if (x>5) {\n" " if (x>4) {}\n" // <- Warning " }\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (style) Condition 'x>4' is always true\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (style) Condition 'x>4' is always true\n", errout_str()); check("void f(int x) {\n" "\n" " if (x>5) {\n" " if (x>=4) {}\n" // <- Warning " }\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (style) Condition 'x>=4' is always true\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (style) Condition 'x>=4' is always true\n", errout_str()); check("void f(int x) {\n" "\n" " if (x>5) {\n" @@ -2459,7 +2453,7 @@ class TestCondition : public TestFixture { " }\n" "}"); ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", - errout.str()); + errout_str()); check("void f(int x) {\n" "\n" " if (x>5) {\n" @@ -2467,69 +2461,69 @@ class TestCondition : public TestFixture { " }\n" "}"); ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", - errout.str()); + errout_str()); check("void f(int x) {\n" " if (x < 4) {\n" " if (10 < x) {}\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout_str()); } void oppositeInnerCondition3() { check("void f3(char c) { if(c=='x') if(c=='y') {}}"); - ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:1]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:1]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout_str()); check("void f4(char *p) { if(*p=='x') if(*p=='y') {}}"); - ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:1]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:1]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout_str()); check("void f5(const char * const p) { if(*p=='x') if(*p=='y') {}}"); - ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:1]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:1]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout_str()); check("void f5(const char * const p) { if('x'==*p) if('y'==*p) {}}"); - ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:1]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:1]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout_str()); check("void f6(char * const p) { if(*p=='x') if(*p=='y') {}}"); - ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:1]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:1]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout_str()); check("void f7(const char * p) { if(*p=='x') if(*p=='y') {}}"); - ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:1]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:1]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout_str()); check("void f8(int i) { if(i==4) if(i==2) {}}"); - ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:1]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:1]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout_str()); check("void f9(int *p) { if (*p==4) if(*p==2) {}}"); - ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:1]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:1]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout_str()); check("void f10(int * const p) { if (*p==4) if(*p==2) {}}"); - ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:1]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:1]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout_str()); check("void f11(const int *p) { if (*p==4) if(*p==2) {}}"); - ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:1]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:1]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout_str()); check("void f12(const int * const p) { if (*p==4) if(*p==2) {}}"); - ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:1]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:1]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout_str()); check("struct foo {\n" " int a;\n" " int b;\n" "};\n" "void f(foo x) { if(x.a==4) if(x.b==2) {}}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct foo {\n" " int a;\n" " int b;\n" "};\n" "void f(foo x) { if(x.a==4) if(x.b==4) {}}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f3(char a, char b) { if(a==b) if(a==0) {}}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x) { if (x == 1) if (x != 1) {} }"); - ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:1]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:1]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout_str()); } void oppositeInnerConditionAnd() { @@ -2538,13 +2532,13 @@ class TestCondition : public TestFixture { " if (x < 10) {}\n" " }" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout_str()); check("void f(bool x, const int a, const int b) {\n" " if(x && a < b)\n" " if( x && a > b){}\n" "}\n"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout_str()); } void oppositeInnerConditionOr() @@ -2555,28 +2549,28 @@ class TestCondition : public TestFixture { " }\n" "}\n"); ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", - errout.str()); + errout_str()); check("void f(int x) {\n" " if (x == 1 || x == 2) {\n" " if (x == 1) {}\n" " }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x) {\n" " if (x == 1 || x == 2) {\n" " if (x == 2) {}\n" " }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(std::string x) {\n" " if (x == \"1\" || x == \"2\") {\n" " if (x == \"1\") {}\n" " }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x) {\n" " if (x < 1 || x > 3) {\n" @@ -2584,62 +2578,62 @@ class TestCondition : public TestFixture { " }\n" "}\n"); ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", - errout.str()); + errout_str()); } void oppositeInnerConditionEmpty() { check("void f1(const std::string &s) { if(s.size() > 42) if(s.empty()) {}}"); - ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:1]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:1]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout_str()); check("void f1(const std::string &s) { if(s.size() > 0) if(s.empty()) {}}"); - ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:1]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:1]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout_str()); check("void f1(const std::string &s) { if(s.size() < 0) if(s.empty()) {}} "); // <- CheckOther reports: checking if unsigned expression is less than zero - ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:1]: (style) Condition 's.empty()' is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:1]: (style) Condition 's.empty()' is always false\n", errout_str()); check("void f1(const std::string &s) { if(s.empty()) if(s.size() > 42) {}}"); - ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:1]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:1]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout_str()); check("template void f1(const T &s) { if(s.size() > 42) if(s.empty()) {}}"); - ASSERT_EQUALS("", errout.str()); //We don't know the type of T so we don't know the relationship between size() and empty(). e.g. s might be a 50 tonne truck with nothing in it. + ASSERT_EQUALS("", errout_str()); //We don't know the type of T so we don't know the relationship between size() and empty(). e.g. s might be a 50 tonne truck with nothing in it. check("void f2(const std::wstring &s) { if(s.empty()) if(s.size() > 42) {}}"); - ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:1]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:1]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout_str()); check("void f1(QString s) { if(s.isEmpty()) if(s.length() > 42) {}}"); - ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:1]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:1]: (warning) Opposite inner 'if' condition leads to a dead code block.\n", errout_str()); check("void f1(const std::string &s, bool b) { if(s.empty() || ((s.size() == 1) && b)) {}}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f1(const std::string &x, const std::string &y) { if(x.size() > 42) if(y.empty()) {}}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f1(const std::string &x, const std::string &y) { if(y.empty()) if(x.size() > 42) {}}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f1(const std::string v[10]) { if(v[0].size() > 42) if(v[1].empty()) {}}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f1(const std::string &s) { if(s.size() <= 1) if(s.empty()) {}}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f1(const std::string &s) { if(s.size() <= 2) if(s.empty()) {}}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f1(const std::string &s) { if(s.size() < 2) if(s.empty()) {}}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f1(const std::string &s) { if(s.size() >= 0) if(s.empty()) {}} "); // CheckOther says: Unsigned expression 's.size()' can't be negative so it is unnecessary to test it. [unsignedPositive] - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // TODO: These are identical condition since size cannot be negative check("void f1(const std::string &s) { if(s.size() <= 0) if(s.empty()) {}}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // TODO: These are identical condition since size cannot be negative check("void f1(const std::string &s) { if(s.size() < 1) if(s.empty()) {}}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void oppositeInnerConditionFollowVar() { @@ -2654,7 +2648,7 @@ class TestCondition : public TestFixture { " void bar();\n" " int get() const;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct CD {\n" " bool state;\n" @@ -2668,7 +2662,7 @@ class TestCondition : public TestFixture { " bool get() const;\n" " void bar();\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class C {\n" "public:\n" @@ -2682,7 +2676,7 @@ class TestCondition : public TestFixture { " x += 1;\n" " if (!b && f()) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(double d) {\n" " if (d != 0) {\n" @@ -2690,15 +2684,15 @@ class TestCondition : public TestFixture { " if (i == 0) {}\n" " }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void identicalInnerCondition() { check("void f1(int a, int b) { if(a==b) if(a==b) {}}"); - ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:1]: (warning) Identical inner 'if' condition is always true.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:1]: (warning) Identical inner 'if' condition is always true.\n", errout_str()); check("void f2(int a, int b) { if(a!=b) if(a!=b) {}}"); - ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:1]: (warning) Identical inner 'if' condition is always true.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:1]: (warning) Identical inner 'if' condition is always true.\n", errout_str()); // #6645 false negative: condition is always false check("void f(bool a, bool b) {\n" @@ -2707,38 +2701,38 @@ class TestCondition : public TestFixture { " else {}\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Identical inner 'if' condition is always true.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Identical inner 'if' condition is always true.\n", errout_str()); check("bool f(int a, int b) {\n" " if(a == b) { return a == b; }\n" " return false;\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:2]: (warning) Identical inner 'return' condition is always true.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:2]: (warning) Identical inner 'return' condition is always true.\n", errout_str()); check("bool f(bool a) {\n" " if(a) { return a; }\n" " return false;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int* f(int* a, int * b) {\n" " if(a) { return a; }\n" " return b;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int* f(std::shared_ptr a, std::shared_ptr b) {\n" " if(a.get()) { return a.get(); }\n" " return b.get();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A { int * x; };\n" "int* f(A a, int * b) {\n" " if(a.x) { return a.x; }\n" " return b;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " uint32_t value;\n" @@ -2750,7 +2744,7 @@ class TestCondition : public TestFixture { " if ((value >> 28) & 1) {}\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void identicalConditionAfterEarlyExit() { @@ -2758,39 +2752,39 @@ class TestCondition : public TestFixture { " if (x > 100) { return; }\n" " if (x > 100) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Identical condition 'x>100', second condition is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Identical condition 'x>100', second condition is always false\n", errout_str()); check("bool f(int x) {\n" " if (x > 100) { return false; }\n" " return x > 100;\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Identical condition and return expression 'x>100', return value is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Identical condition and return expression 'x>100', return value is always false\n", errout_str()); check("void f(int x) {\n" " if (x > 100) { return; }\n" " if (x > 100 || y > 100) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Identical condition 'x>100', second condition is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Identical condition 'x>100', second condition is always false\n", errout_str()); check("void f(int x) {\n" " if (x > 100) { return; }\n" " if (x > 100 && y > 100) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Identical condition 'x>100', second condition is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Identical condition 'x>100', second condition is always false\n", errout_str()); check("void f(int x) {\n" " if (x > 100) { return; }\n" " if (abc) {}\n" " if (x > 100) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:4]: (warning) Identical condition 'x>100', second condition is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:4]: (warning) Identical condition 'x>100', second condition is always false\n", errout_str()); check("void f(int x) {\n" " if (x > 100) { return; }\n" " while (abc) { y = x; }\n" " if (x > 100) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:4]: (warning) Identical condition 'x>100', second condition is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:4]: (warning) Identical condition 'x>100', second condition is always false\n", errout_str()); ASSERT_THROW(check("void f(int x) {\n" // #8217 - crash for incomplete code " if (x > 100) { return; }\n" @@ -2804,7 +2798,7 @@ class TestCondition : public TestFixture { " if (!num1tok) { *num1 = *num2; }\n" " if (!i) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:4]: (warning) Identical condition '!i', second condition is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:4]: (warning) Identical condition '!i', second condition is always false\n", errout_str()); check("void C::f(Tree &coreTree) {\n" // daca " if(!coreTree.build())\n" @@ -2812,7 +2806,7 @@ class TestCondition : public TestFixture { " coreTree.dostuff();\n" " if(!coreTree.build()) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct C { void f(const Tree &coreTree); };\n" "void C::f(const Tree &coreTree) {\n" @@ -2821,7 +2815,7 @@ class TestCondition : public TestFixture { " coreTree.dostuff();\n" " if(!coreTree.build()) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:6]: (warning) Identical condition '!coreTree.build()', second condition is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:6]: (warning) Identical condition '!coreTree.build()', second condition is always false\n", errout_str()); check("void f(int x) {\n" // daca: labplot " switch(type) {\n" @@ -2834,7 +2828,7 @@ class TestCondition : public TestFixture { " }\n" " return 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("static int failed = 0;\n" "void f() {\n" @@ -2842,14 +2836,14 @@ class TestCondition : public TestFixture { " checkBuffer();\n" " if (failed) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // daca icu check("void f(const uint32_t *section, int32_t start) {\n" " if(10<=section[start]) { return; }\n" " if(++start<100 && 10<=section[start]) { }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // daca iqtree check("void readNCBITree(std::istream &in) {\n" @@ -2859,7 +2853,7 @@ class TestCondition : public TestFixture { " in >> ch;\n" " if (ch != '|') {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #8924 check("struct A {\n" @@ -2870,7 +2864,7 @@ class TestCondition : public TestFixture { " }\n" " int FileIndex;\n" "};"); - ASSERT_EQUALS("[test.cpp:5]: (style) Condition 'this->FileIndex<0' is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (style) Condition 'this->FileIndex<0' is always false\n", errout_str()); // #8858 - #if check("short Do() {\n" @@ -2882,7 +2876,7 @@ class TestCondition : public TestFixture { "#endif\n" " return ret;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #10456 check("int f() {\n" @@ -2893,7 +2887,7 @@ class TestCondition : public TestFixture { " if (i) return i;\n" " return 0;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #11478 check("struct S {\n" @@ -2910,7 +2904,7 @@ class TestCondition : public TestFixture { " return;\n" " }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void innerConditionModified() { @@ -2920,7 +2914,7 @@ class TestCondition : public TestFixture { " if (x == 0) {}\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x) {\n" " if (x == 0) {\n" @@ -2928,7 +2922,7 @@ class TestCondition : public TestFixture { " if (x == 1) {}\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int * x, int * y) {\n" " if (x[*y] == 0) {\n" @@ -2936,7 +2930,7 @@ class TestCondition : public TestFixture { " if (x[*y] == 0) {}\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } // clarify conditions with = and comparison @@ -2944,102 +2938,102 @@ class TestCondition : public TestFixture { check("void f() {\n" " if (x = b() < 0) {}\n" // don't simplify and verify this code "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Suspicious condition (assignment + comparison); Clarify expression with parentheses.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Suspicious condition (assignment + comparison); Clarify expression with parentheses.\n", errout_str()); check("void f(int i) {\n" " for (i = 0; i < 10; i++) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " x = a(); if (x) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " if (x = b < 0 ? 1 : 2) {}\n" // don't simplify and verify this code "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " int y = rand(), z = rand();\n" " if (y || (!y && z));\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Redundant condition: !y. 'y || (!y && z)' is equivalent to 'y || z'\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Redundant condition: !y. 'y || (!y && z)' is equivalent to 'y || z'\n", errout_str()); check("void f() {\n" " int y = rand(), z = rand();\n" " if (y || !y && z);\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Redundant condition: !y. 'y || (!y && z)' is equivalent to 'y || z'\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Redundant condition: !y. 'y || (!y && z)' is equivalent to 'y || z'\n", errout_str()); check("void f() {\n" " if (!a || a && b) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Redundant condition: a. '!a || (a && b)' is equivalent to '!a || b'\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Redundant condition: a. '!a || (a && b)' is equivalent to '!a || b'\n", errout_str()); check("void f(const Token *tok) {\n" " if (!tok->next()->function() ||\n" " (tok->next()->function() && tok->next()->function()->isConstructor()));\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Redundant condition: tok->next()->function(). '!A || (A && B)' is equivalent to '!A || B'\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Redundant condition: tok->next()->function(). '!A || (A && B)' is equivalent to '!A || B'\n", errout_str()); check("void f() {\n" " if (!tok->next()->function() ||\n" " (!tok->next()->function() && tok->next()->function()->isConstructor()));\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " if (!tok->next()->function() ||\n" " (!tok2->next()->function() && tok->next()->function()->isConstructor()));\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(const Token *tok) {\n" " if (!tok->next(1)->function(1) ||\n" " (tok->next(1)->function(1) && tok->next(1)->function(1)->isConstructor()));\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Redundant condition: tok->next(1)->function(1). '!A || (A && B)' is equivalent to '!A || B'\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Redundant condition: tok->next(1)->function(1). '!A || (A && B)' is equivalent to '!A || B'\n", errout_str()); check("void f() {\n" " if (!tok->next()->function(1) ||\n" " (tok->next()->function(2) && tok->next()->function()->isConstructor()));\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " int y = rand(), z = rand();\n" " if (y==0 || y!=0 && z);\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Redundant condition: y!=0. 'y==0 || (y!=0 && z)' is equivalent to 'y==0 || z'\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Redundant condition: y!=0. 'y==0 || (y!=0 && z)' is equivalent to 'y==0 || z'\n", errout_str()); check("void f() {\n" " if (x>0 || (x<0 && y)) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Test Token::expressionString, TODO move this test check("void f() {\n" " if (!dead || (dead && (*it).ticks > 0)) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Redundant condition: dead. '!dead || (dead && (*it).ticks>0)' is equivalent to '!dead || (*it).ticks>0'\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Redundant condition: dead. '!dead || (dead && (*it).ticks>0)' is equivalent to '!dead || (*it).ticks>0'\n", errout_str()); check("void f() {\n" " if (!x || (x && (2>(y-1)))) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Redundant condition: x. '!x || (x && 2>(y-1))' is equivalent to '!x || 2>(y-1)'\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Redundant condition: x. '!x || (x && 2>(y-1))' is equivalent to '!x || 2>(y-1)'\n", errout_str()); check("void f(bool a, bool b) {\n" " if (a || (a && b)) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Redundant condition: a. 'a || (a && b)' is equivalent to 'a'\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Redundant condition: a. 'a || (a && b)' is equivalent to 'a'\n", errout_str()); check("void f(bool a, bool b) {\n" " if (a && (a || b)) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Redundant condition: a. 'a && (a || b)' is equivalent to 'a'\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Redundant condition: a. 'a && (a || b)' is equivalent to 'a'\n", errout_str()); } // clarify conditions with bitwise operator and comparison @@ -3049,14 +3043,14 @@ class TestCondition : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:2]: (style) Suspicious condition (bitwise operator + comparison); Clarify expression with parentheses.\n" "[test.cpp:2]: (style) Boolean result is used in bitwise operation. Clarify expression with parentheses.\n" - "[test.cpp:2]: (style) Condition 'x&3==2' is always false\n", errout.str()); + "[test.cpp:2]: (style) Condition 'x&3==2' is always false\n", errout_str()); check("void f() {\n" " if (a & fred1.x == fred2.y) {}\n" "}"); ASSERT_EQUALS("[test.cpp:2]: (style) Suspicious condition (bitwise operator + comparison); Clarify expression with parentheses.\n" "[test.cpp:2]: (style) Boolean result is used in bitwise operation. Clarify expression with parentheses.\n" - , errout.str()); + , errout_str()); } // clarify condition that uses ! operator and then bitwise operator @@ -3064,50 +3058,50 @@ class TestCondition : public TestFixture { check("void f(int w) {\n" " if(!w & 0x8000) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Boolean result is used in bitwise operation. Clarify expression with parentheses.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Boolean result is used in bitwise operation. Clarify expression with parentheses.\n", errout_str()); check("void f(int w) {\n" " if((!w) & 0x8000) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " if (x == foo() & 2) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Boolean result is used in bitwise operation. Clarify expression with parentheses.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Boolean result is used in bitwise operation. Clarify expression with parentheses.\n", errout_str()); check("void f() {\n" " if (2 & x == foo()) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Boolean result is used in bitwise operation. Clarify expression with parentheses.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Boolean result is used in bitwise operation. Clarify expression with parentheses.\n", errout_str()); check("void f() {\n" " if (2 & (x == foo())) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(std::list &ints) { }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() { A a; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() { a(x there are never templates - ASSERT_EQUALS("[test.c:1]: (style) Boolean result is used in bitwise operation. Clarify expression with parentheses.\n", errout.str()); + ASSERT_EQUALS("[test.c:1]: (style) Boolean result is used in bitwise operation. Clarify expression with parentheses.\n", errout_str()); check("class A;", "test.cpp"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " if (result != (char *)&inline_result) { }\n" // don't simplify and verify cast "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #8495 check("void f(bool a, bool b) {\n" " C & a & b;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void clarifyCondition4() { // ticket #3110 @@ -3122,13 +3116,13 @@ class TestCondition : public TestFixture { " return left.first < right.first;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void clarifyCondition5() { // ticket #3609 (using | in template instantiation) check("template struct CWinTraits;\n" "CWinTraits::GetWndStyle(0);"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void clarifyCondition6() { @@ -3137,7 +3131,7 @@ class TestCondition : public TestFixture { " px = r.px;\n" " return *this;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void clarifyCondition7() { @@ -3146,7 +3140,7 @@ class TestCondition : public TestFixture { " bool & withoutSideEffects=found.first->second;\n" // Declaring a reference to a boolean; & is no operator at all " execute(secondExpression, &programMemory, &result, &error);\n" // Unary & "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void clarifyCondition8() { @@ -3156,24 +3150,24 @@ class TestCondition : public TestFixture { "bool f(bool b) {\n" " return (a() & b);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool f(bool *a, bool b) {\n" " return (a[10] & b);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A { bool a; };\n" "bool f(struct A a, bool b) {\n" " return (a.a & b);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A { bool a; };\n" "bool f(struct A a, bool b) {\n" " return (A::a & b);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void testBug5895() { @@ -3181,7 +3175,7 @@ class TestCondition : public TestFixture { " if (init == 0x89504e470d0a1a0a || init == 0x8a4d4e470d0a1a0a)\n" " ;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void testBug5309() { @@ -3190,7 +3184,7 @@ class TestCondition : public TestFixture { " if( ( value >= 0x7ff0000000000001ULL )\n" " && ( value <= 0x7fffffffffffffffULL ) );\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void alwaysTrue() { @@ -3200,7 +3194,7 @@ class TestCondition : public TestFixture { " int x2 = s->x;\n" " if (x1 == 10 && x2 == 10) {}\n" // << "}"); - ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:4]: (style) Condition 'x2==10' is always true\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:4]: (style) Condition 'x2==10' is always true\n", errout_str()); check("void f ()\n"// #8220 "{\n" @@ -3216,20 +3210,20 @@ class TestCondition : public TestFixture { " }\n" " ret = b;\n" "}"); - ASSERT_EQUALS("[test.cpp:8] -> [test.cpp:8]: (style) Condition '8 [test.cpp:8]: (style) Condition '8 [test.cpp:2]: (style) Return value 'x==0' is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:2]: (style) Return value 'x==0' is always false\n", errout_str()); check("void f() {\n" // #6898 (Token::expressionString) " int x = 0;\n" @@ -3238,7 +3232,7 @@ class TestCondition : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:3]: (style) Condition 'x++==1' is always false\n" "[test.cpp:4]: (style) Condition 'x++==2' is always false\n", - errout.str()); + errout_str()); check("bool foo(int bar) {\n" " bool ret = false;\n" @@ -3248,68 +3242,68 @@ class TestCondition : public TestFixture { " ret = true;\n" " return ret;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f1(const std::string &s) { if(s.empty()) if(s.size() == 0) {}}"); - ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:1]: (style) Condition 's.size()==0' is always true\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:1]: (style) Condition 's.size()==0' is always true\n", errout_str()); check("void f() {\n" " int buf[42];\n" " if( buf != 0) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Condition 'buf!=0' is always true\n", errout.str()); // #8924 + ASSERT_EQUALS("[test.cpp:3]: (style) Condition 'buf!=0' is always true\n", errout_str()); // #8924 check("void f() {\n" " int buf[42];\n" " if( !buf ) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Condition '!buf' is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Condition '!buf' is always false\n", errout_str()); check("void f() {\n" " int buf[42];\n" " bool b = buf;\n" " if( b ) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (style) Condition 'b' is always true\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Condition 'b' is always true\n", errout_str()); check("void f() {\n" " int buf[42];\n" " bool b = buf;\n" " if( !b ) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (style) Condition '!b' is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Condition '!b' is always false\n", errout_str()); check("void f() {\n" " int buf[42];\n" " int * p = nullptr;\n" " if( buf == p ) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (style) Condition 'buf==p' is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Condition 'buf==p' is always false\n", errout_str()); check("void f(bool x) {\n" " int buf[42];\n" " if( buf || x ) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Condition 'buf' is always true\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Condition 'buf' is always true\n", errout_str()); check("void f(int * p) {\n" " int buf[42];\n" " if( buf == p ) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " int buf[42];\n" " int p[42];\n" " if( buf == p ) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " int buf[42];\n" " if( buf == 1) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Avoid FP when condition comes from macro check("#define NOT !\n" @@ -3318,7 +3312,7 @@ class TestCondition : public TestFixture { " if (a) { return; }\n" // <- this is just here to fool simplifyKnownVariabels " if (NOT x) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("#define M x != 0\n" "void f() {\n" @@ -3326,20 +3320,20 @@ class TestCondition : public TestFixture { " if (a) { return; }\n" // <- this is just here to fool simplifyKnownVariabels " if (M) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("#define IF(X) if (X && x())\n" "void f() {\n" " IF(1) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Avoid FP for sizeof condition check("void f() {\n" " if (sizeof(char) != 123) {}\n" " if (123 != sizeof(char)) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " int x = 123;\n" @@ -3347,7 +3341,7 @@ class TestCondition : public TestFixture { " if (x != sizeof(char)) {}\n" "}"); TODO_ASSERT_EQUALS("[test.cpp:3]: (style) Condition 'sizeof(char)!=x' is always true\n" - "[test.cpp:4]: (style) Condition 'x!=sizeof(char)' is always true\n", "", errout.str()); + "[test.cpp:4]: (style) Condition 'x!=sizeof(char)' is always true\n", "", errout_str()); // Don't warn in assertions. Condition is often 'always true' by intention. // If platform,defines,etc cause an 'always false' assertion then that is not very dangerous neither @@ -3355,7 +3349,7 @@ class TestCondition : public TestFixture { " int x = 0;\n" " assert(x == 0);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #9363 - do not warn about value passed to function check("void f(bool b) {\n" @@ -3363,7 +3357,7 @@ class TestCondition : public TestFixture { " if (bar(!b)) {}\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #7783 FP knownConditionTrueFalse on assert(0 && "message") @@ -3378,7 +3372,7 @@ class TestCondition : public TestFixture { " assert((int)(0==0) && \"bla\");\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #7750 char literals in boolean expressions check("void f() {\n" @@ -3387,7 +3381,7 @@ class TestCondition : public TestFixture { " if(1 && 'c'){}\n" " int x = 'd' ? 1 : 2;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #8206 - knownCondition always false check("void f(int i)\n" @@ -3395,26 +3389,26 @@ class TestCondition : public TestFixture { " if(i > 4)\n" " for( int x = 0; i < 3; ++x){}\n" // << "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (style) Condition 'i<3' is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (style) Condition 'i<3' is always false\n", errout_str()); // Skip literals check("void f() { if(true) {} }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() { if(false) {} }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() { if(!true) {} }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() { if(!false) {} }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() { if(0) {} }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() { if(1) {} }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int i) {\n" " bool b = false;\n" @@ -3423,36 +3417,36 @@ class TestCondition : public TestFixture { " if (b)\n" " {}\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (style) Condition '!b' is always true\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Condition '!b' is always true\n", errout_str()); check("bool f() { return nullptr; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("enum E { A };\n" "bool f() { return A; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool f() {\n" " const int x = 0;\n" " return x;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f(void){return 1/abs(10);}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool f() {\n" " int x = 0;\n" " return x;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool f() {\n" " const int a = 50;\n" " const int b = 52;\n" " return a+b;\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (style) Return value 'a+b' is always true\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Return value 'a+b' is always true\n", errout_str()); check("int f() {\n" " int a = 50;\n" @@ -3461,7 +3455,7 @@ class TestCondition : public TestFixture { " b++;\n" " return a+b;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool& g();\n" "bool f() {\n" @@ -3469,7 +3463,7 @@ class TestCondition : public TestFixture { " b = false;\n" " return b;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A {\n" " bool b;\n" @@ -3478,13 +3472,13 @@ class TestCondition : public TestFixture { " return b;\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool f(long maxtime) {\n" " if (std::time(0) > maxtime)\n" " return std::time(0) > maxtime;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(double param) {\n" " while(bar()) {\n" @@ -3494,7 +3488,7 @@ class TestCondition : public TestFixture { " if (param<0.)\n" " return;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(int i) {\n" " if (i==42)\n" @@ -3504,7 +3498,7 @@ class TestCondition : public TestFixture { " if (cond && (42==i))\n" " return;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // 8842 crash check("class a {\n" @@ -3514,15 +3508,15 @@ class TestCondition : public TestFixture { " if (b) return;\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(const char* x, const char* t) {\n" " if (!(strcmp(x, y) == 0)) { return; }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(const int a[]){ if (a == 0){} }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S {\n" " bool operator<(const S&);\n" @@ -3533,7 +3527,7 @@ class TestCondition : public TestFixture { " if (c) return 0;\n" " else return 42;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("long X::g(bool unknown, int& result) {\n" " long ret = 0;\n" @@ -3542,35 +3536,35 @@ class TestCondition : public TestFixture { " f ? result = 42 : ret = -1;\n" " return ret;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f(void *handle) {\n" " if (!handle) return 0;\n" " if (handle) return 1;\n" " else return 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) Condition 'handle' is always true\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) Condition 'handle' is always true\n", errout_str()); check("int f(void *handle) {\n" " if (handle == 0) return 0;\n" " if (handle) return 1;\n" " else return 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Condition 'handle' is always true\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Condition 'handle' is always true\n", errout_str()); check("int f(void *handle) {\n" " if (handle != 0) return 0;\n" " if (handle) return 1;\n" " else return 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Identical condition 'handle!=0', second condition is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Identical condition 'handle!=0', second condition is always false\n", errout_str()); check("int f(void *handle) {\n" " if (handle != nullptr) return 0;\n" " if (handle) return 1;\n" " else return 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Identical condition 'handle!=nullptr', second condition is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Identical condition 'handle!=nullptr', second condition is always false\n", errout_str()); check("void f(void* x, void* y) {\n" " if (x == nullptr && y == nullptr)\n" @@ -3578,7 +3572,7 @@ class TestCondition : public TestFixture { " if (x == nullptr || y == nullptr)\n" " return;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void* g();\n" "void f(void* a, void* b) {\n" @@ -3589,7 +3583,7 @@ class TestCondition : public TestFixture { " }\n" " if (a) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void* g();\n" "void f(void* a, void* b) {\n" @@ -3598,26 +3592,26 @@ class TestCondition : public TestFixture { " }\n" " if (a) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:6]: (style) Condition 'a' is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:6]: (style) Condition 'a' is always false\n", errout_str()); check("void f(int * x, bool b) {\n" " if (!x && b) {}\n" " else if (x) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " const std::string x=\"xyz\";\n" " if(!x.empty()){}\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Condition '!x.empty()' is always true\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Condition '!x.empty()' is always true\n", errout_str()); check("std::string g();\n" "void f() {\n" " const std::string msg = g();\n" " if(!msg.empty()){}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int *array, int size ) {\n" " for(int i = 0; i < size; ++i) {\n" @@ -3626,7 +3620,7 @@ class TestCondition : public TestFixture { " if(array){}\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (style) Condition 'array' is always true\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (style) Condition 'array' is always true\n", errout_str()); check("void f(int *array, int size ) {\n" " for(int i = 0; i < size; ++i) {\n" @@ -3635,7 +3629,7 @@ class TestCondition : public TestFixture { " else if(array){}\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (style) Condition 'array' is always true\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (style) Condition 'array' is always true\n", errout_str()); // #9277 check("int f() {\n" @@ -3645,7 +3639,7 @@ class TestCondition : public TestFixture { " else\n" " return 1;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #9954 check("void f() {\n" @@ -3654,7 +3648,7 @@ class TestCondition : public TestFixture { " if constexpr (a == 16 && b == 16) {}\n" " else if constexpr (a == 16 && b == 32) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #9319 check("struct S {\n" @@ -3667,7 +3661,7 @@ class TestCondition : public TestFixture { " g({0, 1}, x);\n" " if (x) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #9318 check("class A {};\n" @@ -3678,7 +3672,7 @@ class TestCondition : public TestFixture { " auto b = dynamic_cast(x);\n" " if (b) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int foo() {\n" " auto x = getX();\n" @@ -3689,14 +3683,14 @@ class TestCondition : public TestFixture { " return 2;\n" " return 3;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // handleKnownValuesInLoop check("bool g();\n" "void f(bool x) {\n" " if (x) while(x) x = g();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // isLikelyStream check("void f(std::istringstream& iss) {\n" @@ -3706,7 +3700,7 @@ class TestCondition : public TestFixture { " if (!iss) break;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #9332 check("struct A { void* g(); };\n" @@ -3718,14 +3712,14 @@ class TestCondition : public TestFixture { " if (!c) return;\n" " bool compare = c == b;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #9361 check("void f(char c) {\n" " if (c == '.') {}\n" " else if (isdigit(c) != 0) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #9351 check("int f(int x) {\n" @@ -3733,7 +3727,7 @@ class TestCondition : public TestFixture { " if(b) return b?0:-1;\n" " return 42;\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:3]: (style) Condition 'b' is always true\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:3]: (style) Condition 'b' is always true\n", errout_str()); // #9362 check("uint8_t g();\n" @@ -3743,7 +3737,7 @@ class TestCondition : public TestFixture { " if( (v & 0x01) == 0x00) {}\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #9367 check("void f(long x) {\n" @@ -3752,25 +3746,25 @@ class TestCondition : public TestFixture { " if (x % 360L == 0)\n" " return;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f(int a, int b) {\n" " static const int x = 10;\n" " return x == 1 ? a : b;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("const bool x = false;\n" "void f() {\n" " if (x) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("const bool x = false;\n" "void f() {\n" " if (!x) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #9709 check("void f(int a) {\n" @@ -3781,7 +3775,7 @@ class TestCondition : public TestFixture { " ok = a != 0;\n" " if (ok) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #9816 check("bool g();\n" @@ -3795,7 +3789,7 @@ class TestCondition : public TestFixture { " } while(false);\n" " } while(!b);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #9865 check("void f(const std::string &s) {\n" @@ -3807,7 +3801,7 @@ class TestCondition : public TestFixture { " else {}\n" " }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #9711 check("int main(int argc, char* argv[]) {\n" @@ -3819,7 +3813,7 @@ class TestCondition : public TestFixture { " getopt_long(argc, argv, \"f\", options, NULL);\n" " if (foo) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // TODO: if (!v) is a known condition as well check("struct a {\n" @@ -3835,7 +3829,7 @@ class TestCondition : public TestFixture { " if (v == nullptr && e) {}\n" " return d;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:11]: (style) Condition 'e' is always true\n", errout.str()); + ASSERT_EQUALS("[test.cpp:11]: (style) Condition 'e' is always true\n", errout_str()); // #10037 check("struct a {\n" @@ -3850,7 +3844,7 @@ class TestCondition : public TestFixture { " if (r == 0)\n" " if (p != (uint32_t) -1) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #9890 check("int g(int);\n" @@ -3867,7 +3861,7 @@ class TestCondition : public TestFixture { " }\n" " return 0;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:11]: (style) Condition '!y' is always true\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:11]: (style) Condition '!y' is always true\n", errout_str()); // #10134 check("bool foo(bool b);\n" @@ -3879,7 +3873,7 @@ class TestCondition : public TestFixture { " return foo(OldFormat);\n" " return false;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #10208 check("bool GetFirst(std::string &first);\n" @@ -3889,7 +3883,7 @@ class TestCondition : public TestFixture { " for (std::string name; name.empty() ? GetFirst(name) : GetNext(name);)\n" " g(name);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool GetFirst(std::string &first);\n" "bool GetNext(std::string &next);\n" @@ -3898,7 +3892,7 @@ class TestCondition : public TestFixture { " for (std::string name{}; name.empty() ? GetFirst(name) : GetNext(name);)\n" " g(name);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool GetFirst(std::string &first);\n" "bool GetNext(std::string &next);\n" @@ -3907,7 +3901,7 @@ class TestCondition : public TestFixture { " for (std::string name{'a', 'b'}; name.empty() ? GetFirst(name) : GetNext(name);)\n" " g(name);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool GetFirst(const std::string &first);\n" "bool GetNext(const std::string &next);\n" @@ -3916,19 +3910,19 @@ class TestCondition : public TestFixture { " for (std::string name; name.empty() ? GetFirst(name) : GetNext(name);)\n" " g(name);\n" "}\n"); - ASSERT_EQUALS("[test.cpp:5]: (style) Condition 'name.empty()' is always true\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (style) Condition 'name.empty()' is always true\n", errout_str()); // #10278 check("void foo(unsigned int x) {\n" " if ((100 - x) > 0) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #10298 check("void foo(unsigned int x) {\n" " if (x == -1) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #10121 check("struct AB {\n" @@ -3949,28 +3943,28 @@ class TestCondition : public TestFixture { " }\n" " return err;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #10323 check("void foo(int x) {\n" " if(x)\n" " if(x == 1) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(int x) {\n" " if(x) {}\n" " else\n" " if(x == 1) {}\n" "}\n"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:4]: (style) Condition 'x==1' is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:4]: (style) Condition 'x==1' is always false\n", errout_str()); // do not report both unsignedLessThanZero and knownConditionTrueFalse check("void foo(unsigned int max) {\n" " unsigned int num = max - 1;\n" " if (num < 0) {}\n" // <- do not report knownConditionTrueFalse "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #10297 check("void foo(size_t len, int start) {\n" @@ -3979,7 +3973,7 @@ class TestCondition : public TestFixture { " if (start < 0) {}\n" " }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #10362 check("int tok;\n" @@ -3996,35 +3990,35 @@ class TestCondition : public TestFixture { " } while (parenthesis && tok != -1);\n" " }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #7843 check("void f(int i) {\n" " if(abs(i) == -1) {}\n" "}\n"); - ASSERT_EQUALS("[test.cpp:2]: (style) Condition 'abs(i)==-1' is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Condition 'abs(i)==-1' is always false\n", errout_str()); // #7844 check("void f(int i) {\n" " if(i > 0 && abs(i) == i) {}\n" "}\n"); - ASSERT_EQUALS("[test.cpp:2]: (style) Condition 'abs(i)==i' is always true\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Condition 'abs(i)==i' is always true\n", errout_str()); check("void f(int i) {\n" " if(i < 0 && abs(i) == i) {}\n" "}\n"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:2]: (style) Condition 'abs(i)==i' is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:2]: (style) Condition 'abs(i)==i' is always false\n", errout_str()); check("void f(int i) {\n" " if(i > -3 && abs(i) == i) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #9948 check("bool f(bool a, bool b) {\n" " return a || ! b || ! a;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:2]: (style) Return value '!a' is always true\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:2]: (style) Return value '!a' is always true\n", errout_str()); // #10148 check("void f(int i) {\n" @@ -4035,14 +4029,14 @@ class TestCondition : public TestFixture { " else {}\n" " }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #10548 check("void f() {\n" " int i = 0;\n" " do {} while (i++ == 0);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #10582 check("static void fun(message_t *message) {\n" @@ -4051,7 +4045,7 @@ class TestCondition : public TestFixture { " }\n" " uint8_t d0 = message->length > 0 ? data[0] : 0xff;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #8266 check("void f(bool b) {\n" @@ -4060,7 +4054,7 @@ class TestCondition : public TestFixture { " if (g(&b) || b)\n" " return;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #9720 check("bool bar(int &);\n" @@ -4069,7 +4063,7 @@ class TestCondition : public TestFixture { " return;\n" " if (bar(a) && (a + b == 3)) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #10437 check("void f() {\n" @@ -4079,7 +4073,7 @@ class TestCondition : public TestFixture { " b = true;\n" " if (b) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #10223 check("static volatile sig_atomic_t is_running;\n" @@ -4091,7 +4085,7 @@ class TestCondition : public TestFixture { " is_running = 1;\n" " while (is_running) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #10659 check("auto func(const std::tuple& t) {\n" @@ -4099,7 +4093,7 @@ class TestCondition : public TestFixture { " std::cout << foo << bar << std::endl;\n" " return foo < bar;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #10484 check("void f() {\n" @@ -4107,34 +4101,34 @@ class TestCondition : public TestFixture { " if (init)\n" " init = false;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:3]: (style) The statement 'if (init) init=false' is logically equivalent to 'init=false'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:3]: (style) The statement 'if (init) init=false' is logically equivalent to 'init=false'.\n", errout_str()); check("void f() {\n" " static bool init(true);\n" " if (init)\n" " init = false;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:3]: (style) The statement 'if (init) init=false' is logically equivalent to 'init=false'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:3]: (style) The statement 'if (init) init=false' is logically equivalent to 'init=false'.\n", errout_str()); check("void f() {\n" " static bool init{ true };\n" " if (init)\n" " init = false;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:3]: (style) The statement 'if (init) init=false' is logically equivalent to 'init=false'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:3]: (style) The statement 'if (init) init=false' is logically equivalent to 'init=false'.\n", errout_str()); // #10248 check("void f() {\n" " static int var(1);\n" " if (var == 1) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " static int var{ 1 };\n" " if (var == 1) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void Fun();\n" "using Fn = void (*)();\n" @@ -4143,7 +4137,7 @@ class TestCondition : public TestFixture { " if (logger == nullptr)\n" " logger = Fun;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void Fun();\n" "using Fn = void (*)();\n" @@ -4152,7 +4146,7 @@ class TestCondition : public TestFixture { " if (logger == nullptr)\n" " logger = Fun;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void Fun();\n" "using Fn = void (*)();\n" @@ -4161,7 +4155,7 @@ class TestCondition : public TestFixture { " if (logger == nullptr)\n" " logger = Fun;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void Fun();\n" "typedef void (*Fn)();\n" @@ -4170,7 +4164,7 @@ class TestCondition : public TestFixture { " if (logger == nullptr)\n" " logger = Fun;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void Fun();\n" "typedef void (*Fn)();\n" @@ -4179,7 +4173,7 @@ class TestCondition : public TestFixture { " if (logger == nullptr)\n" " logger = Fun;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void Fun();\n" "typedef void (*Fn)();\n" @@ -4188,7 +4182,7 @@ class TestCondition : public TestFixture { " if (logger == nullptr)\n" " logger = Fun;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #9256 check("bool f() {\n" @@ -4196,7 +4190,7 @@ class TestCondition : public TestFixture { " b = true;\n" " return b;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #10702 check("struct Object {\n" @@ -4220,7 +4214,7 @@ class TestCondition : public TestFixture { " return;\n" " }\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct Object {\n" " int _count=0;\n" @@ -4242,7 +4236,7 @@ class TestCondition : public TestFixture { " return;\n" " }\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(const uint32_t u) {\n" " const uint32_t v = u < 4;\n" @@ -4253,7 +4247,7 @@ class TestCondition : public TestFixture { "}\n"); ASSERT_EQUALS("[test.cpp:4]: (style) Condition 'v<2' is always true\n" "[test.cpp:5]: (style) Condition 'w' is always true\n", - errout.str()); + errout_str()); check("void f(double d) {\n" // #10792 " if (d != 0) {\n" @@ -4261,7 +4255,7 @@ class TestCondition : public TestFixture { " if (i == 0) {}\n" " }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(double d) {\n" " if (0 != d) {\n" @@ -4269,7 +4263,7 @@ class TestCondition : public TestFixture { " if (i == 0) {}\n" " }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A { double d; }\n" "void f(A a) {\n" @@ -4278,7 +4272,7 @@ class TestCondition : public TestFixture { " if (i == 0) {}\n" " }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " if(strlen(\"abc\") == 3) {;}\n" @@ -4290,14 +4284,14 @@ class TestCondition : public TestFixture { "[test.cpp:3]: (style) Condition 'strlen(\"abc\")==1' is always false\n" "[test.cpp:4]: (style) Condition 'wcslen(L\"abc\")==3' is always true\n" "[test.cpp:5]: (style) Condition 'wcslen(L\"abc\")==1' is always false\n", - errout.str()); + errout_str()); check("int foo(bool a, bool b) {\n" " if(!a && b && (!a == !b))\n" " return 1;\n" " return 0;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:2]: (style) Condition '!a==!b' is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:2]: (style) Condition '!a==!b' is always false\n", errout_str()); // #10454 check("struct S {\n" @@ -4305,11 +4299,11 @@ class TestCondition : public TestFixture { " bool g() const { return u == 18446744073709551615ULL; }\n" " unsigned long long u{};\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #8358 check("void f(double d) { if ((d * 0) != 0) {} }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #6870 check("struct S {\n" @@ -4320,7 +4314,7 @@ class TestCondition : public TestFixture { "void S::f() {\n" " if ((p == NULL) || ((p) && (g() >= *p))) {}\n" "}\n"); - ASSERT_EQUALS("[test.cpp:7]: (style) Condition 'p' is always true\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (style) Condition 'p' is always true\n", errout_str()); // #10749 check("struct Interface {\n" @@ -4338,7 +4332,7 @@ class TestCondition : public TestFixture { "struct GrandChild : Child {\n" " int method() override { return 1; }\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #6855 check("struct S { int i; };\n" @@ -4348,7 +4342,7 @@ class TestCondition : public TestFixture { " else if (s.i < 0)\n" " s.s = 0;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:5]: (style) Condition 's.i<0' is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:5]: (style) Condition 's.i<0' is always false\n", errout_str()); // #6857 check("int bar(int i) { return i; }\n" @@ -4357,14 +4351,14 @@ class TestCondition : public TestFixture { "}\n"); ASSERT_EQUALS("[test.cpp:3]: (style) Condition 'bar(1)==0' is always false\n" "[test.cpp:3]: (style) Condition 'bar(1)>0' is always true\n", - errout.str()); + errout_str()); check("struct S { int bar(int i) const; };\n" "void foo(const S& s) {\n" " if (s.bar(1) == 0 && s.bar(1) > 0) {}\n" "}\n"); ASSERT_EQUALS("[test.cpp:3]: (warning) Logical conjunction always evaluates to false: s.bar(1) == 0 && s.bar(1) > 0.\n", - errout.str()); + errout_str()); check("struct B {\n" // #10618 " void Modify();\n" @@ -4387,7 +4381,7 @@ class TestCondition : public TestFixture { " B::Static();\n" " if (i == 1) {}\n" "}\n"); - ASSERT_EQUALS("[test.cpp:20]: (style) Condition 'i==1' is always true\n", errout.str()); + ASSERT_EQUALS("[test.cpp:20]: (style) Condition 'i==1' is always true\n", errout_str()); check("typedef struct { bool x; } s_t;\n" // #8446 "unsigned f(bool a, bool b) {\n" @@ -4396,7 +4390,7 @@ class TestCondition : public TestFixture { " if (!s.x) {}\n" " return col;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S {\n" // #11233 " static std::string m;\n" @@ -4407,7 +4401,7 @@ class TestCondition : public TestFixture { " if (m.empty()) {}\n" " }\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #11203 check("void f() {\n" @@ -4418,14 +4412,14 @@ class TestCondition : public TestFixture { "}\n"); ASSERT_EQUALS("[test.cpp:3]: (style) Condition 'i>9.9' is always true\n" "[test.cpp:5]: (style) Condition 'f<10' is always true\n", - errout.str()); + errout_str()); check("constexpr int f() {\n" // #11238 " return 1;\n" "}\n" "constexpr bool g() {\n" " return f() == 1;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int g() { return -1; }\n" "void f() {\n" @@ -4433,14 +4427,14 @@ class TestCondition : public TestFixture { "}\n"); ASSERT_EQUALS("[test.cpp:3]: (style) Condition 'g()==1' is always false\n" "[test.cpp:3]: (style) Condition 'g()==-1' is always true\n", - errout.str()); + errout_str()); // #9817 check("void f(float x) {\n" " if (x <= 0) {}\n" " else if (x < 1) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #10426 check("int f() {\n" @@ -4456,7 +4450,7 @@ class TestCondition : public TestFixture { "[test.cpp:5]: (style) Condition 's.empty()' is always true\n" "[test.cpp:6]: (style) Condition '(bool)0' is always false\n" "[test.cpp:7]: (style) Return value 's.empty()' is always true\n", - errout.str()); + errout_str()); check("int f(bool b) {\n" " if (b) return static_cast(1);\n" @@ -4468,7 +4462,7 @@ class TestCondition : public TestFixture { "}\n"); ASSERT_EQUALS("[test.cpp:6]: (style) Return value 'static_cast(1)' is always true\n" "[test.cpp:7]: (style) Return value '(int)0' is always false\n", - errout.str()); + errout_str()); check("int f() { return 3; }\n" "int g() { return f(); }\n" @@ -4476,14 +4470,14 @@ class TestCondition : public TestFixture { "int i() { return f() == 3; }\n"); ASSERT_EQUALS("[test.cpp:3]: (style) Condition 'f()' is always true\n" "[test.cpp:4]: (style) Return value 'f()==3' is always true\n", - errout.str()); + errout_str()); check("int f() {\n" " const char *n;\n" " return((n=42) &&\n" " *n == 'A');\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(std::istringstream& i) {\n" // #9327 " std::string s;\n" @@ -4492,7 +4486,7 @@ class TestCondition : public TestFixture { " if (!(i >> s))\n" " return;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #11227 check("struct S {\n" @@ -4503,7 +4497,7 @@ class TestCondition : public TestFixture { " return;\n" " g(s ? s->get() : 0);\n" "}\n"); - ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:7]: (style) Condition 's' is always true\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:7]: (style) Condition 's' is always true\n", errout_str()); check("void f(const char* o) {\n" // #11558 " if (!o || !o[0])\n" @@ -4514,9 +4508,9 @@ class TestCondition : public TestFixture { " }\n" "}\n"); if (std::numeric_limits::is_signed) { - ASSERT_EQUALS("[test.cpp:6]: (style) Condition 'o[1]=='\\0'' is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (style) Condition 'o[1]=='\\0'' is always false\n", errout_str()); } else { - ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:6]: (style) Condition 'o[1]=='\\0'' is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:6]: (style) Condition 'o[1]=='\\0'' is always false\n", errout_str()); } check("void f(int x) {\n" // #11449 @@ -4527,21 +4521,21 @@ class TestCondition : public TestFixture { " j = (::std::min)(j, 1);\n" " if (j == 1) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void h(int);\n" // #11679 "bool g(int a) { h(a); return false; }\n" "bool f(int i) {\n" " return g(i);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(std::string a) {\n" // #11051 " a = \"x\";\n" " if (a == \"x\") {}\n" " return a;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:3]: (style) Condition 'a==\"x\"' is always true\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Condition 'a==\"x\"' is always true\n", errout_str()); check("void g(bool);\n" "void f() {\n" @@ -4552,13 +4546,13 @@ class TestCondition : public TestFixture { "}\n"); ASSERT_EQUALS("[test.cpp:5]: (style) Condition 'i==7' is always false\n" "[test.cpp:6]: (style) Condition 'p==nullptr' is always false\n", - errout.str()); + errout_str()); check("enum E { E0, E1 };\n" "void f() {\n" " static_assert(static_cast(E::E1) == 1);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct a {\n" " bool g();\n" @@ -4573,7 +4567,7 @@ class TestCondition : public TestFixture { " if (u) {}\n" " }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f(int i) {\n" // #11741 " i = -i - 1;\n" @@ -4581,7 +4575,7 @@ class TestCondition : public TestFixture { " return 0;\n" " return 1;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void alwaysTrueSymbolic() @@ -4591,7 +4585,7 @@ class TestCondition : public TestFixture { " y[0]=x;\n" " if(x > 0 || y[0] < 42){}\n" "}\n"); - ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:4]: (style) Condition 'y[0]<42' is always true\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:4]: (style) Condition 'y[0]<42' is always true\n", errout_str()); check("void f(int x, int y) {\n" " if(x < y && x < 42) {\n" @@ -4599,13 +4593,13 @@ class TestCondition : public TestFixture { " if(x == y) {}\n" " }\n" "}\n"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:4]: (style) Condition 'x==y' is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:4]: (style) Condition 'x==y' is always false\n", errout_str()); check("void f(bool a, bool b) { if (a == b && a && !b){} }"); - ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:1]: (style) Condition '!b' is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:1]: (style) Condition '!b' is always false\n", errout_str()); check("bool f(bool a, bool b) { if(a && b && (!a)){} }"); - ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:1]: (style) Condition '!a' is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:1]: (style) Condition '!a' is always false\n", errout_str()); check("void f(int x, int y) {\n" " if (x < y) {\n" @@ -4613,7 +4607,7 @@ class TestCondition : public TestFixture { " if (z < 1) {}\n" " }\n" "}\n"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:4]: (style) Condition 'z<1' is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:4]: (style) Condition 'z<1' is always false\n", errout_str()); check("bool f(int &index, const int s, const double * const array, double & x) {\n" " if (index >= s)\n" @@ -4623,7 +4617,7 @@ class TestCondition : public TestFixture { " return (index++) >= s;\n" " }\n" "}\n"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:6]: (style) Return value '(index++)>=s' is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:6]: (style) Return value '(index++)>=s' is always false\n", errout_str()); check("struct a {\n" " a *b() const;\n" @@ -4633,7 +4627,7 @@ class TestCondition : public TestFixture { " e = c.b();\n" " if (e) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int g(int i) {\n" " if (i < 256)\n" @@ -4644,7 +4638,7 @@ class TestCondition : public TestFixture { " return 0;\n" " return N;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int i, int j) {\n" " if (i < j) {\n" @@ -4655,7 +4649,7 @@ class TestCondition : public TestFixture { " if (i >= j) {}\n" " }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int get_delta() {\n" " clock_t now_ms = (clock() / (CLOCKS_PER_SEC / 1000));\n" @@ -4666,7 +4660,7 @@ class TestCondition : public TestFixture { " delta = 50;\n" " return delta;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #10555 check("struct C {\n" @@ -4685,7 +4679,7 @@ class TestCondition : public TestFixture { " Modify();\n" " if (m_PC->GetI() != I) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #10624 check("struct Data {\n" @@ -4698,7 +4692,7 @@ class TestCondition : public TestFixture { " Derived* pD = dynamic_cast(PObj);\n" " if (pD) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #9549 check("void f(const uint32_t v) {\n" @@ -4708,7 +4702,7 @@ class TestCondition : public TestFixture { " if (v8) {}\n" " }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #10649 check("void foo(struct diag_msg *msg) {\n" @@ -4719,14 +4713,14 @@ class TestCondition : public TestFixture { " if (msg == NULL)\n" " return CMD_OK;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int foo(bool a, bool b) {\n" " if((!a == !b) && !a && b)\n" " return 1;\n" " return 0;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:2]: (style) Condition 'b' is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:2]: (style) Condition 'b' is always false\n", errout_str()); // #11124 check("struct Basket {\n" @@ -4746,13 +4740,13 @@ class TestCondition : public TestFixture { " fruit = preferApples ? apple : banana;\n" " return fruit;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(const std::string & s, int i) {\n" " const char c = s[i];\n" " if (!std::isalnum(c)) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S {\n" // #11404 " int f() const;\n" @@ -4764,14 +4758,14 @@ class TestCondition : public TestFixture { " auto j = (*it)->f();\n" " if (i == j) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #11384 check("bool f(const int* it, const int* end) {\n" " return (it != end) && *it++ &&\n" " (it != end) && *it;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #12116 check("void f(int n) {\n" @@ -4781,7 +4775,7 @@ class TestCondition : public TestFixture { " else {}\n" " }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void alwaysTrueInfer() { @@ -4791,7 +4785,7 @@ class TestCondition : public TestFixture { " if (x == 1) {}\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:4]: (style) Condition 'x==1' is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:4]: (style) Condition 'x==1' is always false\n", errout_str()); check("void f(int x) {\n" " if (x > 5) {\n" @@ -4799,7 +4793,7 @@ class TestCondition : public TestFixture { " if (x != 1) {}\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:4]: (style) Condition 'x!=1' is always true\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:4]: (style) Condition 'x!=1' is always true\n", errout_str()); // #6890 check("void f(int i) {\n" @@ -4811,7 +4805,7 @@ class TestCondition : public TestFixture { " else {}\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:6]: (style) Condition 'x==-1' is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:6]: (style) Condition 'x==-1' is always false\n", errout_str()); check("void f(int i) {\n" " int x = i;\n" @@ -4822,7 +4816,7 @@ class TestCondition : public TestFixture { " else {}\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:6]: (style) Condition 'x!=-1' is always true\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:6]: (style) Condition 'x!=-1' is always true\n", errout_str()); check("void f(int i) {\n" " int x = i;\n" @@ -4833,7 +4827,7 @@ class TestCondition : public TestFixture { " else {}\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:6]: (style) Condition 'x>=-1' is always true\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:6]: (style) Condition 'x>=-1' is always true\n", errout_str()); check("void f(int i) {\n" " int x = i;\n" @@ -4844,7 +4838,7 @@ class TestCondition : public TestFixture { " else {}\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:6]: (style) Condition 'x>-1' is always true\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:6]: (style) Condition 'x>-1' is always true\n", errout_str()); check("void f(int i) {\n" " int x = i;\n" @@ -4855,7 +4849,7 @@ class TestCondition : public TestFixture { " else {}\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:6]: (style) Condition 'x<-1' is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:6]: (style) Condition 'x<-1' is always false\n", errout_str()); check("void f(int i) {\n" " int x = i;\n" @@ -4866,7 +4860,7 @@ class TestCondition : public TestFixture { " else {}\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:6]: (style) Condition 'x<=-1' is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:6]: (style) Condition 'x<=-1' is always false\n", errout_str()); check("void f(int i) {\n" " int x = i;\n" @@ -4877,7 +4871,7 @@ class TestCondition : public TestFixture { " else {}\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:6]: (style) Condition 'x>7' is always true\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:6]: (style) Condition 'x>7' is always true\n", errout_str()); check("void f(int i) {\n" " int x = i;\n" @@ -4888,7 +4882,7 @@ class TestCondition : public TestFixture { " else {}\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int i) {\n" " int x = i;\n" @@ -4899,7 +4893,7 @@ class TestCondition : public TestFixture { " else {}\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #11100 check("struct T {\n" @@ -4913,7 +4907,7 @@ class TestCondition : public TestFixture { " set(b);\n" " if (tmp != get()) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #9541 check("int f(int pos, int a) {\n" @@ -4924,7 +4918,7 @@ class TestCondition : public TestFixture { " --pos;\n" " return pos;\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:5]: (style) Condition 'pos>0' is always true\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:5]: (style) Condition 'pos>0' is always true\n", errout_str()); // #9721 check("void f(int x) {\n" @@ -4933,21 +4927,21 @@ class TestCondition : public TestFixture { " return;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) Condition '-128>x' is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) Condition '-128>x' is always false\n", errout_str()); // #8778 check("void f() {\n" " for(int i = 0; i < 19; ++i)\n" " if(i<=18) {}\n" "}\n"); - ASSERT_EQUALS("[test.cpp:3]: (style) Condition 'i<=18' is always true\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Condition 'i<=18' is always true\n", errout_str()); // #8209 check("void f() {\n" " for(int x = 0; x < 3; ++x)\n" " if(x == -5) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Condition 'x==-5' is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Condition 'x==-5' is always false\n", errout_str()); // #8407 check("int f(void) {\n" @@ -4956,14 +4950,14 @@ class TestCondition : public TestFixture { " else return 0;\n" " return -1;\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Condition 'i==0' is always true\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Condition 'i==0' is always true\n", errout_str()); check("void f(unsigned int u1, unsigned int u2) {\n" " if (u1 <= 10 && u2 >= 20) {\n" " if (u1 != u2) {}\n" " }\n" "}\n"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) Condition 'u1!=u2' is always true\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) Condition 'u1!=u2' is always true\n", errout_str()); // #10544 check("void f(int N) {\n" @@ -4972,16 +4966,16 @@ class TestCondition : public TestFixture { " N = test();\n" " }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #11098 check("void f(unsigned int x) { if (x == -1u) {} }\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool f(const int *p, const int *q) {\n" " return p != NULL && q != NULL && p == NULL;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:2]: (style) Return value 'p==NULL' is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Return value 'p==NULL' is always false\n", errout_str()); check("struct S {\n" // #11789 " std::vector v;\n" @@ -4991,12 +4985,12 @@ class TestCondition : public TestFixture { " int j = i - v.size();\n" " if (j >= 0) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int i) {\n" // #12039 " if ((128 + i < 255 ? 128 + i : 255) > 0) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void alwaysTrueContainer() { @@ -5012,7 +5006,7 @@ class TestCondition : public TestFixture { " if ( !g.empty() )\n" " return;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(int flag) {\n" " std::vector g;\n" @@ -5023,7 +5017,7 @@ class TestCondition : public TestFixture { " if ( !g.empty() )\n" " return;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A {\n" " std::vector v;\n" @@ -5034,7 +5028,7 @@ class TestCondition : public TestFixture { " return !v.empty();\n" " }\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #10409 check("void foo(const std::string& s) {\n" @@ -5042,14 +5036,14 @@ class TestCondition : public TestFixture { " if( s == \"ab\" ) return;\n" " if( s.size() < 3 ) return;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(const std::string& s) {\n" " if( s.size() < 2 ) return;\n" " if( s != \"ab\" )\n" " if( s.size() < 3 ) return;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #10226 check("int f(std::vector::iterator it, const std::vector& vector) {\n" @@ -5059,7 +5053,7 @@ class TestCondition : public TestFixture { " return -1;\n" " return *it;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:4]: (style) Condition 'it!=vector.end()' is always true\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Condition 'it!=vector.end()' is always true\n", errout_str()); // #11303 check("void f(int n) {\n" @@ -5069,9 +5063,9 @@ class TestCondition : public TestFixture { " buffer.back() == '\\0') {}\n" "}\n"); if (std::numeric_limits::is_signed) { - ASSERT_EQUALS("[test.cpp:5]: (style) Condition 'buffer.back()=='\\0'' is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (style) Condition 'buffer.back()=='\\0'' is always false\n", errout_str()); } else { - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:5]: (style) Condition 'buffer.back()=='\\0'' is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:5]: (style) Condition 'buffer.back()=='\\0'' is always false\n", errout_str()); } // #9353 @@ -5082,7 +5076,7 @@ class TestCondition : public TestFixture { " if (!it->s.empty()) {}\n" " }\n" "}\n"); - ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:5]: (style) Condition '!it->s.empty()' is always true\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:5]: (style) Condition '!it->s.empty()' is always true\n", errout_str()); check("struct X { std::string s; };\n" "void f(const std::vector&v) {\n" @@ -5091,13 +5085,13 @@ class TestCondition : public TestFixture { " if (!it->s.empty()) {}\n" " }\n" "}\n"); - TODO_ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:5]: (style) Condition '!it->s.empty()' is always true\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:5]: (style) Condition '!it->s.empty()' is always true\n", "", errout_str()); // #10508 check("bool f(const std::string& a, const std::string& b) {\n" " return a.empty() || (b.empty() && a.empty());\n" "}\n"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:2]: (style) Return value 'a.empty()' is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:2]: (style) Return value 'a.empty()' is always false\n", errout_str()); check("struct A {\n" " struct iterator;\n" @@ -5113,7 +5107,7 @@ class TestCondition : public TestFixture { " return;\n" " if(!s.empty()) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f(std::string s) {\n" " if (s.empty())\n" @@ -5123,14 +5117,14 @@ class TestCondition : public TestFixture { " return -1;\n" " return -1;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:5]: (style) Condition 's.empty()' is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (style) Condition 's.empty()' is always false\n", errout_str()); check("void f(std::string& p) {\n" " const std::string d{ \"abc\" };\n" " p += d;\n" " if(p.empty()) {}\n" "}\n"); - ASSERT_EQUALS("[test.cpp:4]: (style) Condition 'p.empty()' is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Condition 'p.empty()' is always false\n", errout_str()); check("bool f(int i, FILE* fp) {\n" " std::string s = \"abc\";\n" @@ -5138,12 +5132,12 @@ class TestCondition : public TestFixture { " s += \"\\n\";\n" " return fwrite(s.c_str(), 1, s.length(), fp) == s.length();\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(const std::string& s) {\n" // #9148 " if (s.empty() || s.size() < 1) {}\n" "}\n"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:2]: (style) Condition 's.size()<1' is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:2]: (style) Condition 's.size()<1' is always false\n", errout_str()); check("void bar(std::vector& vv) {\n" // #11464 " class F {\n" @@ -5160,7 +5154,7 @@ class TestCondition : public TestFixture { " bar(v);\n" " if (v.empty()) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct F {\n" " F(int, std::vector&lv) : mV(lv) {\n" @@ -5176,7 +5170,7 @@ class TestCondition : public TestFixture { " g(v);\n" " if (v.empty()) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void alwaysTrueLoop() @@ -5197,7 +5191,7 @@ class TestCondition : public TestFixture { " while (bUpdated);\n" " return Ret;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool foo() {\n" " bool bFirst = true;\n" @@ -5210,7 +5204,7 @@ class TestCondition : public TestFixture { " } while (true);\n" " return bFirst;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " void * pool = NULL;\n" @@ -5223,7 +5217,7 @@ class TestCondition : public TestFixture { " while (0);\n" " if (pool) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #8499 check("void f(void)\n" @@ -5238,7 +5232,7 @@ class TestCondition : public TestFixture { " }\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:7] -> [test.cpp:7]: (style) Condition 'i==1' is always true\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7] -> [test.cpp:7]: (style) Condition 'i==1' is always true\n", errout_str()); // #10863 check("void f(const int A[], int Len) {\n" @@ -5254,24 +5248,24 @@ class TestCondition : public TestFixture { " I = K; \n" " }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" // #11434 " const int N = 5;\n" " bool a[N];\n" " for (int i = 0; i < N; a[i++] = false);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" // #8192 " for (int i = 0; i > 10; ++i) {}\n" "}\n"); - TODO_ASSERT_EQUALS("[test.cpp:2]: (style) Condition 'i>10' is always false\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:2]: (style) Condition 'i>10' is always false\n", "", errout_str()); check("void f() {\n" " for (int i = 1000; i < 20; ++i) {}\n" "}\n"); - ASSERT_EQUALS("[test.cpp:2]: (style) Condition 'i<20' is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Condition 'i<20' is always false\n", errout_str()); } void alwaysTrueTryCatch() @@ -5292,7 +5286,7 @@ class TestCondition : public TestFixture { " g();\n" " }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void g();\n" "void h();\n" @@ -5309,7 +5303,7 @@ class TestCondition : public TestFixture { " g();\n" " }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" // #10701 " std::string s;\n" @@ -5322,7 +5316,7 @@ class TestCondition : public TestFixture { " catch (const std::exception& e) {}\n" " if (s != \"abc\") {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void multiConditionAlwaysTrue() { @@ -5331,7 +5325,7 @@ class TestCondition : public TestFixture { " if (val < 0) continue;\n" " if (val > 0) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " int val = 0;\n" @@ -5339,7 +5333,7 @@ class TestCondition : public TestFixture { " if (val > 0) {}\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " int val = 0;\n" @@ -5347,7 +5341,7 @@ class TestCondition : public TestFixture { " if (val < 0) {}\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " int activate = 0;\n" @@ -5356,14 +5350,14 @@ class TestCondition : public TestFixture { " else if (foo) {}\n" "}"); ASSERT_EQUALS("[test.cpp:4]: (style) Condition 'activate' is always false\n" - "[test.cpp:5]: (style) Condition 'foo' is always false\n", errout.str()); + "[test.cpp:5]: (style) Condition 'foo' is always false\n", errout_str()); // #6904 check("void f() {\n" " const int b[2] = { 1,0 };\n" " if(b[1] == 2) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Condition 'b[1]==2' is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Condition 'b[1]==2' is always false\n", errout_str()); // #9878 check("void f(bool a, bool b) {\n" @@ -5372,7 +5366,7 @@ class TestCondition : public TestFixture { " else if (!a && !b){;}\n" " else {;}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void duplicateCondition() { @@ -5381,39 +5375,39 @@ class TestCondition : public TestFixture { " if(x) {}\n" "}"); ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) The if condition is the same as the previous if condition\n", - errout.str()); + errout_str()); check("void f(int x) {\n" " if(x == 1) {}\n" " if(x == 1) {}\n" "}"); ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) The if condition is the same as the previous if condition\n", - errout.str()); + errout_str()); check("void f(int x) {\n" " if(x == 1) {}\n" " if(x == 2) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x) {\n" " if(x == 1) {}\n" " if(x != 1) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(bool x) {\n" " if(x) {}\n" " g();\n" " if(x) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x) {\n" " if(x == 1) { x++; }\n" " if(x == 1) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #8996 check("void g(int** v);\n" @@ -5425,7 +5419,7 @@ class TestCondition : public TestFixture { " if (a) {}\n" " if (b) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #9311 check("struct c {\n" @@ -5440,7 +5434,7 @@ class TestCondition : public TestFixture { " if (a) {}\n" " if (b) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #8993 check("void f(const std::string& x) {\n" @@ -5448,7 +5442,7 @@ class TestCondition : public TestFixture { " if (x.empty()) y = \"1\";\n" " if (y.empty()) return;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #9106 check("struct A {int b;};\n" @@ -5456,7 +5450,7 @@ class TestCondition : public TestFixture { " if (a.b) a.b = c;\n" " if (a.b) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A {\n" " int a;\n" @@ -5473,7 +5467,7 @@ class TestCondition : public TestFixture { " }\n" " }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A {\n" " int a;\n" @@ -5489,7 +5483,7 @@ class TestCondition : public TestFixture { " }\n" " }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A {\n" " int a;\n" @@ -5505,7 +5499,7 @@ class TestCondition : public TestFixture { " }\n" "}\n"); ASSERT_EQUALS("[test.cpp:7] -> [test.cpp:9]: (style) The if condition is the same as the previous if condition\n", - errout.str()); + errout_str()); check("void f(bool a, bool b) {\n" " auto g = [&] { b = !a; };\n" @@ -5513,7 +5507,7 @@ class TestCondition : public TestFixture { " g();\n" " if (b) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void g(bool& a);\n" "void f(bool b) {\n" @@ -5522,7 +5516,7 @@ class TestCondition : public TestFixture { " h();\n" " if (b) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int *i) {\n" " if (*i == 0) {\n" @@ -5531,7 +5525,7 @@ class TestCondition : public TestFixture { " if (*i == 0) {\n" " }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void g(std::function);\n" "void f(std::vector v) {\n" @@ -5543,7 +5537,7 @@ class TestCondition : public TestFixture { " return;\n" " return;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S { int i; };\n" "int f(const S& s) {\n" @@ -5554,7 +5548,7 @@ class TestCondition : public TestFixture { " b = 1;\n" " return a + b;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:6]: (style) The if condition is the same as the previous if condition\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:6]: (style) The if condition is the same as the previous if condition\n", errout_str()); // do not crash check("void assign(const MMA& other) {\n" @@ -5569,27 +5563,27 @@ class TestCondition : public TestFixture { check("void f(char *p, unsigned int x) {\n" " assert((p + x) < p);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Invalid test for overflow '(p+x)= p);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Invalid test for overflow '(p+x)>=p'; pointer overflow is undefined behavior. Some mainstream compilers remove such overflow tests when optimising the code and assume it's always true.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Invalid test for overflow '(p+x)>=p'; pointer overflow is undefined behavior. Some mainstream compilers remove such overflow tests when optimising the code and assume it's always true.\n", errout_str()); check("void f(char *p, unsigned int x) {\n" " assert(p > (p + x));\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Invalid test for overflow 'p>(p+x)'; pointer overflow is undefined behavior. Some mainstream compilers remove such overflow tests when optimising the code and assume it's always false.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Invalid test for overflow 'p>(p+x)'; pointer overflow is undefined behavior. Some mainstream compilers remove such overflow tests when optimising the code and assume it's always false.\n", errout_str()); check("void f(char *p, unsigned int x) {\n" " assert(p <= (p + x));\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Invalid test for overflow 'p<=(p+x)'; pointer overflow is undefined behavior. Some mainstream compilers remove such overflow tests when optimising the code and assume it's always true.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Invalid test for overflow 'p<=(p+x)'; pointer overflow is undefined behavior. Some mainstream compilers remove such overflow tests when optimising the code and assume it's always true.\n", errout_str()); check("void f(signed int x) {\n" // unsigned overflow => don't warn " assert(x + 100U < x);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // x + c < x @@ -5597,57 +5591,57 @@ class TestCondition : public TestFixture { #define MSG(EXPR, RESULT) "[test.cpp:1]: (warning) Invalid test for overflow '" EXPR "'; signed integer overflow is undefined behavior. Some mainstream compilers remove such overflow tests when optimising the code and assume it's always " RESULT ".\n" check("int f(int x) { return x + 10 > x; }"); - ASSERT_EQUALS(MSG("x+10>x", "true"), errout.str()); + ASSERT_EQUALS(MSG("x+10>x", "true"), errout_str()); check("int f(int x) { return x + 10 >= x; }"); - ASSERT_EQUALS(MSG("x+10>=x", "true"), errout.str()); + ASSERT_EQUALS(MSG("x+10>=x", "true"), errout_str()); check("int f(int x) { return x + 10 < x; }"); - ASSERT_EQUALS(MSG("x+10 x; }"); - ASSERT_EQUALS(MSG("x-10>x", "false"), errout.str()); + ASSERT_EQUALS(MSG("x-10>x", "false"), errout_str()); check("int f(int x) { return x - 10 >= x; }"); - ASSERT_EQUALS(MSG("x-10>=x", "false"), errout.str()); + ASSERT_EQUALS(MSG("x-10>=x", "false"), errout_str()); check("int f(int x) { return x - 10 < x; }"); - ASSERT_EQUALS(MSG("x-10 x; }"); - ASSERT_EQUALS(MSG("x+y>x", "y>0"), errout.str()); + ASSERT_EQUALS(MSG("x+y>x", "y>0"), errout_str()); check("int f(int x, int y) { return x + y >= x; }"); - ASSERT_EQUALS(MSG("x+y>=x", "y>=0"), errout.str()); + ASSERT_EQUALS(MSG("x+y>=x", "y>=0"), errout_str()); // x - y < x check("int f(int x, int y) { return x - y < x; }"); - ASSERT_EQUALS(MSG("x-y0"), errout.str()); + ASSERT_EQUALS(MSG("x-y0"), errout_str()); check("int f(int x, int y) { return x - y <= x; }"); - ASSERT_EQUALS(MSG("x-y<=x", "y>=0"), errout.str()); + ASSERT_EQUALS(MSG("x-y<=x", "y>=0"), errout_str()); check("int f(int x, int y) { return x - y > x; }"); - ASSERT_EQUALS(MSG("x-y>x", "y<0"), errout.str()); + ASSERT_EQUALS(MSG("x-y>x", "y<0"), errout_str()); check("int f(int x, int y) { return x - y >= x; }"); - ASSERT_EQUALS(MSG("x-y>=x", "y<=0"), errout.str()); + ASSERT_EQUALS(MSG("x-y>=x", "y<=0"), errout_str()); } void checkConditionIsAlwaysTrueOrFalseInsideIfWhile() { @@ -5656,75 +5650,75 @@ class TestCondition : public TestFixture { " const unsigned g_flags = B|C;\n" " if(g_flags & A) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (style) Condition 'g_flags&A' is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Condition 'g_flags&A' is always false\n", errout_str()); check("void f() {\n" " int a = 5;" " if(a) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Condition 'a' is always true\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Condition 'a' is always true\n", errout_str()); check("void f() {\n" " int a = 5;" " while(a + 1) { a--; }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " int a = 5;" " while(a + 1) { return; }\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Condition 'a+1' is always true\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Condition 'a+1' is always true\n", errout_str()); } void alwaysTrueFalseInLogicalOperators() { check("bool f();\n" "void foo() { bool x = true; if(x||f()) {}}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Condition 'x' is always true\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Condition 'x' is always true\n", errout_str()); check("void foo(bool b) { bool x = true; if(x||b) {}}"); - ASSERT_EQUALS("[test.cpp:1]: (style) Condition 'x' is always true\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (style) Condition 'x' is always true\n", errout_str()); check("void foo(bool b) { if(true||b) {}}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool f();\n" "void foo() { bool x = false; if(x||f()) {}}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Condition 'x' is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Condition 'x' is always false\n", errout_str()); check("bool f();\n" "void foo() { bool x = false; if(x&&f()) {}}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Condition 'x' is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Condition 'x' is always false\n", errout_str()); check("void foo(bool b) { bool x = false; if(x&&b) {}}"); - ASSERT_EQUALS("[test.cpp:1]: (style) Condition 'x' is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (style) Condition 'x' is always false\n", errout_str()); check("void foo(bool b) { if(false&&b) {}}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool f();\n" "void foo() { bool x = true; if(x&&f()) {}}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Condition 'x' is always true\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Condition 'x' is always true\n", errout_str()); // #9578 check("bool f(const std::string &s) {\n" " return s.size()>2U && s[0]=='4' && s[0]=='2';\n" "}\n"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:2]: (style) Return value 's[0]=='2'' is always false\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:2]: (style) Return value 's[0]=='2'' is always false\n", errout_str()); check("void f(int i) { if (i == 1 || 2) {} }\n"); // #12487 - ASSERT_EQUALS("[test.cpp:1]: (style) Condition 'i==1||2' is always true\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (style) Condition 'i==1||2' is always true\n", errout_str()); check("enum E { E1 = 1, E2 = 2 };\n" "void f(int i) { if (i == E1 || E2) {} }\n"); - ASSERT_EQUALS("[test.cpp:2]: (style) Condition 'i==E1||E2' is always true\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Condition 'i==E1||E2' is always true\n", errout_str()); } void pointerAdditionResultNotNull() { check("void f(char *ptr) {\n" " if (ptr + 1 != 0);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison is wrong. Result of 'ptr+1' can't be 0 unless there is pointer overflow, and pointer overflow is undefined behaviour.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison is wrong. Result of 'ptr+1' can't be 0 unless there is pointer overflow, and pointer overflow is undefined behaviour.\n", errout_str()); } void duplicateConditionalAssign() { @@ -5736,7 +5730,7 @@ class TestCondition : public TestFixture { "}"); ASSERT_EQUALS("test.cpp:3:style:Assignment 'x=y' is redundant with condition 'x==y'.\n" "test.cpp:2:note:Condition 'x==y'\n" - "test.cpp:3:note:Assignment 'x=y' is redundant\n", errout.str()); + "test.cpp:3:note:Assignment 'x=y' is redundant\n", errout_str()); check("void f(int& x, int y) {\n" " if (x != y)\n" @@ -5744,7 +5738,7 @@ class TestCondition : public TestFixture { "}"); ASSERT_EQUALS("test.cpp:2:style:The statement 'if (x!=y) x=y' is logically equivalent to 'x=y'.\n" "test.cpp:3:note:Assignment 'x=y'\n" - "test.cpp:2:note:Condition 'x!=y' is redundant\n", errout.str()); + "test.cpp:2:note:Condition 'x!=y' is redundant\n", errout_str()); check("void f(int& x, int y) {\n" " if (x == y)\n" @@ -5754,7 +5748,7 @@ class TestCondition : public TestFixture { "}"); ASSERT_EQUALS("test.cpp:3:style:Assignment 'x=y' is redundant with condition 'x==y'.\n" "test.cpp:2:note:Condition 'x==y'\n" - "test.cpp:3:note:Assignment 'x=y' is redundant\n", errout.str()); + "test.cpp:3:note:Assignment 'x=y' is redundant\n", errout_str()); check("void f(int& x, int y) {\n" " if (x != y)\n" @@ -5762,13 +5756,13 @@ class TestCondition : public TestFixture { " else\n" " x = 1;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int& x, int y) {\n" " if (x == y)\n" " x = y + 1;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void g();\n" "void f(int& x, int y) {\n" @@ -5777,7 +5771,7 @@ class TestCondition : public TestFixture { " g();\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool f(bool b) {\n" " if (b)\n" @@ -5786,13 +5780,13 @@ class TestCondition : public TestFixture { " g();\n" " return b;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int& i) {\n" " if (!i)\n" " i = 1; \n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S {\n" // #9406 " S() : b(false) {}\n" @@ -5816,26 +5810,26 @@ class TestCondition : public TestFixture { "test.cpp:7:style:The statement 'if (!b) b=false' is redundant.\n" "test.cpp:7:note:Assignment 'b=false'\n" "test.cpp:7:note:Condition '!b' is redundant\n", - errout.str()); + errout_str()); } void checkAssignmentInCondition() { check("void f(std::string s) {\n" " if (s=\"123\"){}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Suspicious assignment in condition. Condition 's=\"123\"' is always true.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Suspicious assignment in condition. Condition 's=\"123\"' is always true.\n", errout_str()); check("void f(std::string *p) {\n" " if (p=foo()){}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(uint32_t u) {\n" // #2490 " if ((u = 0x00000000) || (u = 0xffffffff)) {}\n" "}\n"); ASSERT_EQUALS("[test.cpp:2]: (style) Condition 'u=0x00000000' is always false\n" "[test.cpp:2]: (style) Condition 'u=0xffffffff' is always true\n", - errout.str()); + errout_str()); } void compareOutOfTypeRange() { @@ -5844,65 +5838,65 @@ class TestCondition : public TestFixture { check("void f(unsigned char c) {\n" " if (c == 256) {}\n" "}", settingsUnix64); - ASSERT_EQUALS("[test.cpp:2]: (style) Comparing expression of type 'unsigned char' against value 256. Condition is always false.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Comparing expression of type 'unsigned char' against value 256. Condition is always false.\n", errout_str()); check("void f(unsigned char* b, int i) {\n" // #6372 " if (b[i] == 256) {}\n" "}", settingsUnix64); - ASSERT_EQUALS("[test.cpp:2]: (style) Comparing expression of type 'unsigned char' against value 256. Condition is always false.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Comparing expression of type 'unsigned char' against value 256. Condition is always false.\n", errout_str()); check("void f(unsigned char c) {\n" " if (c == 255) {}\n" "}", settingsUnix64); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(bool b) {\n" " if (b == true) {}\n" "}", settingsUnix64); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #10372 check("void f(signed char x) {\n" " if (x == 0xff) {}\n" "}", settingsUnix64); - ASSERT_EQUALS("[test.cpp:2]: (style) Comparing expression of type 'signed char' against value 255. Condition is always false.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Comparing expression of type 'signed char' against value 255. Condition is always false.\n", errout_str()); check("void f(short x) {\n" " if (x == 0xffff) {}\n" "}", settingsUnix64); - ASSERT_EQUALS("[test.cpp:2]: (style) Comparing expression of type 'signed short' against value 65535. Condition is always false.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Comparing expression of type 'signed short' against value 65535. Condition is always false.\n", errout_str()); check("void f(int x) {\n" " if (x == 0xffffffff) {}\n" "}", settingsUnix64); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(long x) {\n" " if (x == ~0L) {}\n" "}", settingsUnix64); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(long long x) {\n" " if (x == ~0LL) {}\n" "}", settingsUnix64); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f(int x) {\n" " const int i = 0xFFFFFFFF;\n" " if (x == i) {}\n" "}", settingsUnix64); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " char c;\n" " if ((c = foo()) != -1) {}\n" "}", settingsUnix64); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x) {\n" " if (x < 3000000000) {}\n" "}", settingsUnix64); - ASSERT_EQUALS("[test.cpp:2]: (style) Comparing expression of type 'signed int' against value 3000000000. Condition is always true.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Comparing expression of type 'signed int' against value 3000000000. Condition is always true.\n", errout_str()); check("void f(const signed char i) {\n" // #8545 " if (i > -129) {}\n" // warn @@ -5916,7 +5910,7 @@ class TestCondition : public TestFixture { "[test.cpp:3]: (style) Comparing expression of type 'const signed char' against value -128. Condition is always true.\n" "[test.cpp:5]: (style) Comparing expression of type 'const signed char' against value 128. Condition is always true.\n" "[test.cpp:6]: (style) Comparing expression of type 'const signed char' against value 127. Condition is always true.\n", - errout.str()); + errout_str()); check("void f(const unsigned char u) {\n" " if (u > 0) {}\n" @@ -5944,14 +5938,14 @@ class TestCondition : public TestFixture { "[test.cpp:12]: (style) Comparing expression of type 'const unsigned char' against value 0. Condition is always true.\n" "[test.cpp:14]: (style) Comparing expression of type 'const unsigned char' against value 255. Condition is always false.\n" "[test.cpp:17]: (style) Comparing expression of type 'const unsigned char' against value 255. Condition is always true.\n", - errout.str()); + errout_str()); } void knownConditionCast() { // #9976 check("void f(int i) {\n" " if (i < 0 || (unsigned)i > 5) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void knownConditionIncrementLoop() { // #9808 @@ -5961,7 +5955,7 @@ class TestCondition : public TestFixture { " if (a == 1) {}\n" " std::cout << a;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } }; diff --git a/test/testconstructors.cpp b/test/testconstructors.cpp index f91bc3133aaf..4b25cc52b0c0 100644 --- a/test/testconstructors.cpp +++ b/test/testconstructors.cpp @@ -36,9 +36,6 @@ class TestConstructors : public TestFixture { #define check(...) check_(__FILE__, __LINE__, __VA_ARGS__) void check_(const char* file, int line, const char code[], bool inconclusive = false) { - // Clear the error buffer.. - errout.str(""); - const Settings settings1 = settingsBuilder(settings).certainty(Certainty::inconclusive, inconclusive).build(); // Tokenize.. @@ -52,9 +49,6 @@ class TestConstructors : public TestFixture { } void check_(const char* file, int line, const char code[], const Settings &s) { - // Clear the error buffer.. - errout.str(""); - // Tokenize.. Tokenizer tokenizer(s, this); std::istringstream istr(code); @@ -240,21 +234,21 @@ class TestConstructors : public TestFixture { "public:\n" " int i;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class Fred\n" "{\n" "private:\n" " int i;\n" "};"); - ASSERT_EQUALS("[test.cpp:1]: (style) The class 'Fred' does not declare a constructor although it has private member variables which likely require initialization.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (style) The class 'Fred' does not declare a constructor although it has private member variables which likely require initialization.\n", errout_str()); check("struct Fred\n" "{\n" "private:\n" " int i;\n" "};"); - ASSERT_EQUALS("[test.cpp:1]: (style) The struct 'Fred' does not declare a constructor although it has private member variables which likely require initialization.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (style) The struct 'Fred' does not declare a constructor although it has private member variables which likely require initialization.\n", errout_str()); } @@ -267,7 +261,7 @@ class TestConstructors : public TestFixture { " Fred(Fred && other) : i(other.i) {}\n" " int i;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class Fred\n" "{\n" @@ -277,7 +271,7 @@ class TestConstructors : public TestFixture { " Fred(Fred && other) {i=other.i}\n" " int i;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class Fred\n" "{\n" @@ -289,7 +283,7 @@ class TestConstructors : public TestFixture { "};"); ASSERT_EQUALS("[test.cpp:4]: (warning) Member variable 'Fred::i' is not initialized in the constructor.\n" "[test.cpp:5]: (warning) Member variable 'Fred::i' is not initialized in the copy constructor.\n" - "[test.cpp:6]: (warning) Member variable 'Fred::i' is not initialized in the move constructor.\n", errout.str()); + "[test.cpp:6]: (warning) Member variable 'Fred::i' is not initialized in the move constructor.\n", errout_str()); check("struct Fred\n" "{\n" @@ -300,7 +294,7 @@ class TestConstructors : public TestFixture { "};"); ASSERT_EQUALS("[test.cpp:3]: (warning) Member variable 'Fred::i' is not initialized in the constructor.\n" "[test.cpp:4]: (warning) Member variable 'Fred::i' is not initialized in the copy constructor.\n" - "[test.cpp:5]: (warning) Member variable 'Fred::i' is not initialized in the move constructor.\n", errout.str()); + "[test.cpp:5]: (warning) Member variable 'Fred::i' is not initialized in the move constructor.\n", errout_str()); } @@ -312,7 +306,7 @@ class TestConstructors : public TestFixture { "};\n" "Fred::Fred() :i(0)\n" "{ }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct Fred\n" "{\n" @@ -321,7 +315,7 @@ class TestConstructors : public TestFixture { "};\n" "Fred::Fred()\n" "{ i = 0; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct Fred\n" "{\n" @@ -330,7 +324,7 @@ class TestConstructors : public TestFixture { "};\n" "Fred::Fred()\n" "{ }"); - ASSERT_EQUALS("[test.cpp:6]: (warning) Member variable 'Fred::i' is not initialized in the constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (warning) Member variable 'Fred::i' is not initialized in the constructor.\n", errout_str()); } @@ -348,7 +342,7 @@ class TestConstructors : public TestFixture { "{\n" " i = _i;\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:8]: (warning, inconclusive) Member variable 'Fred::i' is not initialized in the constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8]: (warning, inconclusive) Member variable 'Fred::i' is not initialized in the constructor.\n", errout_str()); } void simple5() { // ticket #2560 @@ -365,7 +359,7 @@ class TestConstructors : public TestFixture { "private:\n" " int mValue;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simple6() { // ticket #4085 - uninstantiated template class @@ -375,7 +369,7 @@ class TestConstructors : public TestFixture { "private:\n" " int x;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("template struct A {\n" " A() : x(0) { }\n" @@ -383,7 +377,7 @@ class TestConstructors : public TestFixture { "private:\n" " int x;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("template struct A {\n" " A() : x(0) { }\n" @@ -393,7 +387,7 @@ class TestConstructors : public TestFixture { " int y;\n" "};"); ASSERT_EQUALS("[test.cpp:2]: (warning) Member variable 'A::y' is not initialized in the constructor.\n" - "[test.cpp:3]: (warning) Member variable 'A::y' is not initialized in the constructor.\n", errout.str()); + "[test.cpp:3]: (warning) Member variable 'A::y' is not initialized in the constructor.\n", errout_str()); } void simple7() { // ticket #4531 @@ -401,7 +395,7 @@ class TestConstructors : public TestFixture { "struct Fred {\n" " int x;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simple8() { @@ -409,7 +403,7 @@ class TestConstructors : public TestFixture { "class Barney { Fred fred; };\n" "class Wilma { struct Betty { int x; } betty; };"); ASSERT_EQUALS("[test.cpp:2]: (style) The class 'Barney' does not declare a constructor although it has private member variables which likely require initialization.\n" - "[test.cpp:3]: (style) The class 'Wilma' does not declare a constructor although it has private member variables which likely require initialization.\n", errout.str()); + "[test.cpp:3]: (style) The class 'Wilma' does not declare a constructor although it has private member variables which likely require initialization.\n", errout_str()); } void simple9() { // ticket #4574 @@ -419,7 +413,7 @@ class TestConstructors : public TestFixture { "private:\n" " int x;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simple10() { @@ -429,7 +423,7 @@ class TestConstructors : public TestFixture { "private:\n" " int x;\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Member variable 'Fred::x' is not initialized in the constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Member variable 'Fred::x' is not initialized in the constructor.\n", errout_str()); check("struct S {\n" // #9391 " S() = default;\n" @@ -440,7 +434,7 @@ class TestConstructors : public TestFixture { " S& operator=(S&&) = default;\n" " int i;\n" "};\n"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Member variable 'S::i' is not initialized in the constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Member variable 'S::i' is not initialized in the constructor.\n", errout_str()); } void simple11() { // ticket #4536, #6214 @@ -458,7 +452,7 @@ class TestConstructors : public TestFixture { " int f{4}, g;\n" "};"); ASSERT_EQUALS("[test.cpp:3]: (warning) Member variable 'Fred::d' is not initialized in the constructor.\n" - "[test.cpp:3]: (warning) Member variable 'Fred::g' is not initialized in the constructor.\n", errout.str()); + "[test.cpp:3]: (warning) Member variable 'Fred::g' is not initialized in the constructor.\n", errout_str()); } void simple12() { // ticket #4620 @@ -469,7 +463,7 @@ class TestConstructors : public TestFixture { " void Init(int i = 0);\n" "};\n" "void Fred::Init(int i) { x = i; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class Fred {\n" " int x;\n" @@ -479,7 +473,7 @@ class TestConstructors : public TestFixture { " void Init(int i, int j = 0);\n" "};\n" "void Fred::Init(int i, int j) { x = i; y = j; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simple13() { // #5498 @@ -487,7 +481,7 @@ class TestConstructors : public TestFixture { " int x=1;\n" " int *y=0;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simple14() { // #6253 template base @@ -500,7 +494,7 @@ class TestConstructors : public TestFixture { "private:\n" " int x;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class Fred : public Base {" "public:" @@ -511,7 +505,7 @@ class TestConstructors : public TestFixture { "private:\n" " int x;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simple16() { @@ -523,7 +517,7 @@ class TestConstructors : public TestFixture { "};\n", /*inconclusive*/ true); ASSERT_EQUALS("[test.cpp:4]: (warning, inconclusive) Member variable 'S::i' is not assigned in the copy constructor. Should it be copied?\n" "[test.cpp:5]: (warning) Member variable 'S::i' is not assigned a value in 'S::operator='.\n", - errout.str()); + errout_str()); check("struct S {\n" " int i;\n" @@ -533,7 +527,7 @@ class TestConstructors : public TestFixture { "};\n"); ASSERT_EQUALS("[test.cpp:4]: (warning) Member variable 'S::i' is not initialized in the copy constructor.\n" "[test.cpp:5]: (warning) Member variable 'S::i' is not assigned a value in 'S::operator='.\n", - errout.str()); + errout_str()); } void simple17() { // #10360 @@ -555,7 +549,7 @@ class TestConstructors : public TestFixture { " auto d = dynamic_cast(Src);\n" " i = d.i;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simple15() { // #8942 @@ -572,7 +566,7 @@ class TestConstructors : public TestFixture { " const decltype(A::member)& x;\n" " const decltype(A::member)& y;\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void noConstructor1() { @@ -581,7 +575,7 @@ class TestConstructors : public TestFixture { "{\n" " int i;\n" "};"); - ASSERT_EQUALS("[test.cpp:1]: (style) The class 'Fred' does not declare a constructor although it has private member variables which likely require initialization.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (style) The class 'Fred' does not declare a constructor although it has private member variables which likely require initialization.\n", errout_str()); } void noConstructor2() { @@ -593,7 +587,7 @@ class TestConstructors : public TestFixture { "\n" "void Fred::foobar()\n" "{ }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void noConstructor3() { @@ -602,7 +596,7 @@ class TestConstructors : public TestFixture { "private:\n" " static int foobar;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void noConstructor4() { @@ -611,7 +605,7 @@ class TestConstructors : public TestFixture { "public:\n" " int foobar;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void noConstructor5() { @@ -619,7 +613,7 @@ class TestConstructors : public TestFixture { "{\n" " int i;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void noConstructor6() { @@ -633,14 +627,14 @@ class TestConstructors : public TestFixture { " cpucyclesT m_v;\n" " bool m_b;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void noConstructor7() { // ticket #4391 check("short bar;\n" "class foo;"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void noConstructor8() { @@ -648,7 +642,7 @@ class TestConstructors : public TestFixture { check("class LineSegment;\n" "class PointArray { };\n" "void* tech_ = NULL;"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void noConstructor9() { @@ -659,7 +653,7 @@ class TestConstructors : public TestFixture { "private:\n" " bool MessageSet;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void noConstructor10() { @@ -679,28 +673,28 @@ class TestConstructors : public TestFixture { "private:\n" " wxTimer *WxTimer1;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void noConstructor11() { // #3552 check("class Fred { int x; };\n" "union U { int y; Fred fred; };"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void noConstructor12() { // #8951 check("class Fred { int x{0}; };"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class Fred { int x=0; };"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class Fred { int x[1]={0}; };"); // #8850 - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class Fred { int x[1]{0}; };"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void noConstructor13() { // #9998 @@ -710,7 +704,7 @@ class TestConstructors : public TestFixture { " A() {}\n" " B b;\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void noConstructor14() { // #10770 @@ -721,7 +715,7 @@ class TestConstructors : public TestFixture { "private:\n" " Func fp = nullptr;\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void noConstructor15() { // #5499 @@ -730,14 +724,14 @@ class TestConstructors : public TestFixture { " int i1 = 0;\n" " int i2;\n" "};\n"); - ASSERT_EQUALS("[test.cpp:4]: (warning) Member variable 'C::i2' is not initialized.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (warning) Member variable 'C::i2' is not initialized.\n", errout_str()); check("class C {\n" "private:\n" " int i1;\n" " int i2;\n" "};\n"); - ASSERT_EQUALS("[test.cpp:1]: (style) The class 'C' does not declare a constructor although it has private member variables which likely require initialization.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (style) The class 'C' does not declare a constructor although it has private member variables which likely require initialization.\n", errout_str()); check("class C {\n" "public:\n" @@ -746,7 +740,7 @@ class TestConstructors : public TestFixture { " int i1;\n" " int i2;\n" "};\n"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Member variable 'C::i2' is not initialized in the constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Member variable 'C::i2' is not initialized in the constructor.\n", errout_str()); } // ticket #4290 "False Positive: style (noConstructor): The class 'foo' does not have a constructor." @@ -754,15 +748,15 @@ class TestConstructors : public TestFixture { void forwardDeclaration() { check("class foo;\n" "int bar;"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class foo;\n" "class foo;"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class foo{};\n" "class foo;"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void initvar_with_this() { @@ -772,7 +766,7 @@ class TestConstructors : public TestFixture { " { this->i = 0; }\n" " int i;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void initvar_if() { @@ -787,7 +781,7 @@ class TestConstructors : public TestFixture { " }\n" " int i;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void initvar_operator_eq1() { @@ -806,7 +800,7 @@ class TestConstructors : public TestFixture { " const Fred & operator=(const Fred &fred)\n" " { i = fred.i; return *this; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct Fred {\n" " int i;\n" @@ -817,7 +811,7 @@ class TestConstructors : public TestFixture { " const Fred & operator=(const Fred &fred)\n" " { i = fred.i; return *this; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A\n" "{\n" @@ -832,7 +826,7 @@ class TestConstructors : public TestFixture { " int i;\n" " int j;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } @@ -843,7 +837,7 @@ class TestConstructors : public TestFixture { " void operator=(const Fred &fred) { }\n" " int i;\n" "};"); - ASSERT_EQUALS("[test.cpp:4]: (warning) Member variable 'Fred::i' is not assigned a value in 'Fred::operator='.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (warning) Member variable 'Fred::i' is not assigned a value in 'Fred::operator='.\n", errout_str()); } void initvar_operator_eq3() { @@ -855,7 +849,7 @@ class TestConstructors : public TestFixture { " void Init() { i = 0; }\n" " int i;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void initvar_operator_eq4() { @@ -872,7 +866,7 @@ class TestConstructors : public TestFixture { " return *this\n" " }\n" "};"); - ASSERT_EQUALS("[test.cpp:6]: (warning) Member variable 'Fred::i' is not assigned a value in 'Fred::operator='.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (warning) Member variable 'Fred::i' is not assigned a value in 'Fred::operator='.\n", errout_str()); check("class Fred\n" "{\n" @@ -887,7 +881,7 @@ class TestConstructors : public TestFixture { " return *this\n" " }\n" "};"); - ASSERT_EQUALS("[test.cpp:6]: (warning) Member variable 'Fred::i' is not assigned a value in 'Fred::operator='.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (warning) Member variable 'Fred::i' is not assigned a value in 'Fred::operator='.\n", errout_str()); check("class Fred\n" "{\n" @@ -902,7 +896,7 @@ class TestConstructors : public TestFixture { " return *this\n" " }\n" "};"); - ASSERT_EQUALS("[test.cpp:6]: (warning) Member variable 'Fred::i' is not assigned a value in 'Fred::operator='.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (warning) Member variable 'Fred::i' is not assigned a value in 'Fred::operator='.\n", errout_str()); check("class Fred\n" "{\n" @@ -917,7 +911,7 @@ class TestConstructors : public TestFixture { " return *this\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void initvar_operator_eq5() { // #4119 - false positive when using swap to assign variables @@ -932,7 +926,7 @@ class TestConstructors : public TestFixture { " return *this;\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void initvar_operator_eq6() { // std::vector @@ -942,7 +936,7 @@ class TestConstructors : public TestFixture { " return *this;\n" " }\n" "};",true); - ASSERT_EQUALS("[test.cpp:3]: (warning, inconclusive) Member variable 'Fred::data' is not assigned a value in 'Fred::operator='.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning, inconclusive) Member variable 'Fred::data' is not assigned a value in 'Fred::operator='.\n", errout_str()); check("struct Fred {\n" " std::vector ints;\n" @@ -950,7 +944,7 @@ class TestConstructors : public TestFixture { " return *this;\n" " }\n" "};",true); - ASSERT_EQUALS("[test.cpp:3]: (warning, inconclusive) Member variable 'Fred::ints' is not assigned a value in 'Fred::operator='.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning, inconclusive) Member variable 'Fred::ints' is not assigned a value in 'Fred::operator='.\n", errout_str()); check("struct Fred {\n" " Data data;\n" @@ -958,7 +952,7 @@ class TestConstructors : public TestFixture { " return *this;\n" " }\n" "};",true); - ASSERT_EQUALS("[test.cpp:3]: (warning, inconclusive) Member variable 'Fred::data' is not assigned a value in 'Fred::operator='.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning, inconclusive) Member variable 'Fred::data' is not assigned a value in 'Fred::operator='.\n", errout_str()); } void initvar_operator_eq7() { @@ -977,7 +971,7 @@ class TestConstructors : public TestFixture { " Copy(Src);\n" " return *this;\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void initvar_operator_eq8() { @@ -1001,7 +995,7 @@ class TestConstructors : public TestFixture { " int d3_2;\n" "}\n"); ASSERT_EQUALS("[test.cpp:13]: (warning) Member variable 'D3::d3_2' is not assigned a value in 'D3::operator='.\n" - "[test.cpp:13]: (warning) Member variable 'D3::d2' is not assigned a value in 'D3::operator='.\n", errout.str()); + "[test.cpp:13]: (warning) Member variable 'D3::d2' is not assigned a value in 'D3::operator='.\n", errout_str()); } void initvar_same_classname() { @@ -1025,7 +1019,7 @@ class TestConstructors : public TestFixture { " };\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void func1()\n" "{\n" @@ -1045,7 +1039,7 @@ class TestConstructors : public TestFixture { " };\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void func1()\n" "{\n" @@ -1065,7 +1059,7 @@ class TestConstructors : public TestFixture { " };\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class Foo {\n" " void func1()\n" @@ -1087,7 +1081,7 @@ class TestConstructors : public TestFixture { " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class Foo {\n" " void func1()\n" @@ -1110,7 +1104,7 @@ class TestConstructors : public TestFixture { "};"); ASSERT_EQUALS("[test.cpp:7]: (warning) Member variable 'Fred::a' is not initialized in the constructor.\n" - "[test.cpp:16]: (warning) Member variable 'Fred::b' is not initialized in the constructor.\n", errout.str()); + "[test.cpp:16]: (warning) Member variable 'Fred::b' is not initialized in the constructor.\n", errout_str()); } void initvar_chained_assign() { @@ -1129,7 +1123,7 @@ class TestConstructors : public TestFixture { " m_iMyInt1 = m_iMyInt2 = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } @@ -1162,7 +1156,7 @@ class TestConstructors : public TestFixture { " m_iMyInt = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } @@ -1174,7 +1168,7 @@ class TestConstructors : public TestFixture { "};\n" "Fred::Fred() : s(NULL)\n" "{ }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct Fred\n" "{\n" @@ -1183,7 +1177,7 @@ class TestConstructors : public TestFixture { "};\n" "Fred::Fred()\n" "{ s = NULL; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct Fred\n" "{\n" @@ -1192,7 +1186,7 @@ class TestConstructors : public TestFixture { "};\n" "Fred::Fred()\n" "{ }"); - ASSERT_EQUALS("[test.cpp:6]: (warning) Member variable 'Fred::s' is not initialized in the constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (warning) Member variable 'Fred::s' is not initialized in the constructor.\n", errout_str()); } @@ -1204,7 +1198,7 @@ class TestConstructors : public TestFixture { " void update() const;\n" " mutable int x;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } @@ -1215,7 +1209,7 @@ class TestConstructors : public TestFixture { " Fred() { }\n" " static void *p;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } @@ -1228,7 +1222,7 @@ class TestConstructors : public TestFixture { "private:\n" " std::map * values_{};\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } @@ -1246,7 +1240,7 @@ class TestConstructors : public TestFixture { " U.a = 0;\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class Fred\n" "{\n" @@ -1260,7 +1254,7 @@ class TestConstructors : public TestFixture { " {\n" " }\n" "};"); - TODO_ASSERT_EQUALS("[test.cpp:9]: (warning) Member variable 'Fred::U' is not initialized in the constructor.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:9]: (warning) Member variable 'Fred::U' is not initialized in the constructor.\n", "", errout_str()); } @@ -1272,7 +1266,7 @@ class TestConstructors : public TestFixture { " A() : A(42) {}\n" "};"); ASSERT_EQUALS("[test.cpp:4]: (warning) Member variable 'A::number' is not initialized in the constructor.\n" - "[test.cpp:5]: (warning) Member variable 'A::number' is not initialized in the constructor.\n", errout.str()); + "[test.cpp:5]: (warning) Member variable 'A::number' is not initialized in the constructor.\n", errout_str()); check("class A {\n" " int number;\n" @@ -1280,7 +1274,7 @@ class TestConstructors : public TestFixture { " A(int n) { number = n; }\n" " A() : A(42) {}\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class A {\n" " int number;\n" @@ -1289,7 +1283,7 @@ class TestConstructors : public TestFixture { " A() {}\n" "};", true); ASSERT_EQUALS("[test.cpp:4]: (warning) Member variable 'A::number' is not initialized in the constructor.\n" - "[test.cpp:5]: (warning, inconclusive) Member variable 'A::number' is not initialized in the constructor.\n", errout.str()); + "[test.cpp:5]: (warning, inconclusive) Member variable 'A::number' is not initialized in the constructor.\n", errout_str()); check("class A {\n" " int number;\n" @@ -1297,7 +1291,7 @@ class TestConstructors : public TestFixture { " A(int n) : A() { }\n" " A() { number = 42; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class A {\n" " int number;\n" @@ -1306,7 +1300,7 @@ class TestConstructors : public TestFixture { " A() : A{42} {}\n" "};"); ASSERT_EQUALS("[test.cpp:4]: (warning) Member variable 'A::number' is not initialized in the constructor.\n" - "[test.cpp:5]: (warning) Member variable 'A::number' is not initialized in the constructor.\n", errout.str()); + "[test.cpp:5]: (warning) Member variable 'A::number' is not initialized in the constructor.\n", errout_str()); check("class A {\n" " int number;\n" @@ -1314,7 +1308,7 @@ class TestConstructors : public TestFixture { " A(int n) { number = n; }\n" " A() : A{42} {}\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class A {\n" " int number;\n" @@ -1323,7 +1317,7 @@ class TestConstructors : public TestFixture { " A() {}\n" "};", true); ASSERT_EQUALS("[test.cpp:4]: (warning) Member variable 'A::number' is not initialized in the constructor.\n" - "[test.cpp:5]: (warning, inconclusive) Member variable 'A::number' is not initialized in the constructor.\n", errout.str()); + "[test.cpp:5]: (warning, inconclusive) Member variable 'A::number' is not initialized in the constructor.\n", errout_str()); check("class A {\n" " int number;\n" @@ -1331,7 +1325,7 @@ class TestConstructors : public TestFixture { " A(int n) : A{} { }\n" " A() { number = 42; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Ticket #6675 check("struct Foo {\n" @@ -1341,7 +1335,7 @@ class TestConstructors : public TestFixture { "};\n" "Foo::Foo() : Foo(0) {}\n" "Foo::Foo(int foo) : foo_(foo) {}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Noexcept ctors check("class A {\n" @@ -1353,7 +1347,7 @@ class TestConstructors : public TestFixture { "};\n" "\n" "A::A() noexcept: A(0) {}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Ticket #8581 check("class A {\n" @@ -1363,7 +1357,7 @@ class TestConstructors : public TestFixture { " A(int a) : _a(a) {}\n" " A(float a) : A(int(a)) {}\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Ticket #8258 check("struct F{};\n" @@ -1375,7 +1369,7 @@ class TestConstructors : public TestFixture { " int _b;\n" " F _f;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void initvar_delegate2() { @@ -1399,7 +1393,7 @@ class TestConstructors : public TestFixture { " , b(0)\n" "{\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void initvar_derived_class() { @@ -1414,7 +1408,7 @@ class TestConstructors : public TestFixture { " Derived() {}\n" " void foo() override;\n" "};"); - ASSERT_EQUALS("[test.cpp:9]: (warning) Member variable 'Base::x' is not initialized in the constructor. Maybe it should be initialized directly in the class Base?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:9]: (warning) Member variable 'Base::x' is not initialized in the constructor. Maybe it should be initialized directly in the class Base?\n", errout_str()); check("struct A {\n" // #3462 " char ca;\n" @@ -1430,7 +1424,7 @@ class TestConstructors : public TestFixture { " return *this;\n" " }\n" "};\n"); - ASSERT_EQUALS("[test.cpp:10]: (warning) Member variable 'B::cb' is not assigned a value in 'B::operator='.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:10]: (warning) Member variable 'B::cb' is not assigned a value in 'B::operator='.\n", errout_str()); check("struct A {\n" " char ca;\n" @@ -1448,7 +1442,7 @@ class TestConstructors : public TestFixture { ASSERT_EQUALS("[test.cpp:3]: (warning) Member variable 'A::ca' is not assigned a value in 'A::operator='.\n" "[test.cpp:9]: (warning) Member variable 'B::cb' is not assigned a value in 'B::operator='.\n" "[test.cpp:9]: (warning) Member variable 'B::ca' is not assigned a value in 'B::operator='.\n", - errout.str()); + errout_str()); check("class C : B {\n" // don't crash " virtual C& operator=(C& c);\n" @@ -1456,7 +1450,7 @@ class TestConstructors : public TestFixture { "class D : public C {\n" " virtual C& operator=(C& c) { return C::operator=(c); };\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct B;\n" // don't crash "struct D : B { D& operator=(const D&); };\n" @@ -1466,7 +1460,7 @@ class TestConstructors : public TestFixture { " D::operator=(rhs);\n" " return *this;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("template \n" // #12128 "struct B {\n" @@ -1475,7 +1469,7 @@ class TestConstructors : public TestFixture { "struct D : B {\n" " D(double x) : B{ x } {}\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct B {\n" " int x;\n" @@ -1483,7 +1477,7 @@ class TestConstructors : public TestFixture { "struct D : B {\n" " D(int i) : B{ i } {}\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void initvar_derived_pod_struct_with_union() { @@ -1501,7 +1495,7 @@ class TestConstructors : public TestFixture { "public:\n" " C() { all = 0; tick = 0; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S {\n" " union {\n" @@ -1517,7 +1511,7 @@ class TestConstructors : public TestFixture { "public:\n" " C() { flag1 = flag2 = 0; tick = 0; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S {\n" " union {\n" @@ -1535,7 +1529,7 @@ class TestConstructors : public TestFixture { "};"); ASSERT_EQUALS("[test.cpp:13]: (warning) Member variable 'S::all' is not initialized in the constructor. Maybe it should be initialized directly in the class S?\n" "[test.cpp:13]: (warning) Member variable 'S::flag1' is not initialized in the constructor. Maybe it should be initialized directly in the class S?\n" - "[test.cpp:13]: (warning) Member variable 'S::flag2' is not initialized in the constructor. Maybe it should be initialized directly in the class S?\n", errout.str()); + "[test.cpp:13]: (warning) Member variable 'S::flag2' is not initialized in the constructor. Maybe it should be initialized directly in the class S?\n", errout_str()); } void initvar_private_constructor() { @@ -1549,7 +1543,7 @@ class TestConstructors : public TestFixture { "};\n" "Fred::Fred()\n" "{ }", s); - ASSERT_EQUALS("[test.cpp:7]: (warning) Member variable 'Fred::var' is not initialized in the constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (warning) Member variable 'Fred::var' is not initialized in the constructor.\n", errout_str()); } { @@ -1562,7 +1556,7 @@ class TestConstructors : public TestFixture { "};\n" "Fred::Fred()\n" "{ }", s); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } } @@ -1575,7 +1569,7 @@ class TestConstructors : public TestFixture { " Fred() { };\n" " Fred(const Fred &) { };\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class Fred\n" "{\n" @@ -1585,7 +1579,7 @@ class TestConstructors : public TestFixture { " Fred() { };\n" " Fred(const Fred &) { };\n" "};", true); - ASSERT_EQUALS("[test.cpp:7]: (warning, inconclusive) Member variable 'Fred::var' is not assigned in the copy constructor. Should it be copied?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (warning, inconclusive) Member variable 'Fred::var' is not assigned in the copy constructor. Should it be copied?\n", errout_str()); check("class Fred\n" "{\n" @@ -1597,7 +1591,7 @@ class TestConstructors : public TestFixture { "};\n" "Fred::Fred() { };\n" "Fred::Fred(const Fred &) { };\n", true); - ASSERT_EQUALS("[test.cpp:10]: (warning, inconclusive) Member variable 'Fred::var' is not assigned in the copy constructor. Should it be copied?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:10]: (warning, inconclusive) Member variable 'Fred::var' is not assigned in the copy constructor. Should it be copied?\n", errout_str()); check("class Baz {};\n" // #8496 "class Bar {\n" @@ -1606,7 +1600,7 @@ class TestConstructors : public TestFixture { " Bar(const Bar& bar) {}\n" " int i;\n" "};\n", true); - ASSERT_EQUALS("[test.cpp:5]: (warning) Member variable 'Bar::i' is not initialized in the copy constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (warning) Member variable 'Bar::i' is not initialized in the copy constructor.\n", errout_str()); } void initvar_nested_constructor() { // ticket #1375 @@ -1638,7 +1632,7 @@ class TestConstructors : public TestFixture { ASSERT_EQUALS("[test.cpp:20]: (warning) Member variable 'A::a' is not initialized in the constructor.\n" "[test.cpp:21]: (warning) Member variable 'B::b' is not initialized in the constructor.\n" "[test.cpp:22]: (warning) Member variable 'C::c' is not initialized in the constructor.\n" - "[test.cpp:23]: (warning) Member variable 'D::d' is not initialized in the constructor.\n", errout.str()); + "[test.cpp:23]: (warning) Member variable 'D::d' is not initialized in the constructor.\n", errout_str()); check("class A {\n" "public:\n" @@ -1668,7 +1662,7 @@ class TestConstructors : public TestFixture { ASSERT_EQUALS("[test.cpp:20]: (warning) Member variable 'A::a' is not initialized in the constructor.\n" "[test.cpp:21]: (warning) Member variable 'B::b' is not initialized in the constructor.\n" "[test.cpp:22]: (warning) Member variable 'C::c' is not initialized in the constructor.\n" - "[test.cpp:23]: (warning) Member variable 'D::d' is not initialized in the copy constructor.\n", errout.str()); + "[test.cpp:23]: (warning) Member variable 'D::d' is not initialized in the copy constructor.\n", errout_str()); check("class A {\n" "public:\n" @@ -1699,7 +1693,7 @@ class TestConstructors : public TestFixture { ASSERT_EQUALS("[test.cpp:21]: (warning) Member variable 'A::a' is not initialized in the constructor.\n" "[test.cpp:22]: (warning) Member variable 'B::b' is not initialized in the constructor.\n" "[test.cpp:23]: (warning) Member variable 'C::c' is not initialized in the constructor.\n" - "[test.cpp:24]: (warning) Member variable 'D::d' is not initialized in the constructor.\n", errout.str()); + "[test.cpp:24]: (warning) Member variable 'D::d' is not initialized in the constructor.\n", errout_str()); } void initvar_nocopy1() { // ticket #2474 @@ -1716,7 +1710,7 @@ class TestConstructors : public TestFixture { " A(A &&){}\n" " const A& operator=(const A&){return *this;}\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class B\n" "{\n" @@ -1731,7 +1725,7 @@ class TestConstructors : public TestFixture { " A(A &&){}\n" " const A& operator=(const A&){return *this;}\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class B\n" "{\n" @@ -1748,7 +1742,7 @@ class TestConstructors : public TestFixture { " A(A &&){}\n" " const A& operator=(const A&){return *this;}\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class B\n" "{\n" @@ -1764,7 +1758,7 @@ class TestConstructors : public TestFixture { " A(A &&){}\n" " const A& operator=(const A&){return *this;}\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class A : public std::vector\n" "{\n" @@ -1783,7 +1777,7 @@ class TestConstructors : public TestFixture { ASSERT_EQUALS("[test.cpp:11]: (warning, inconclusive) Member variable 'B::a' is not assigned in the copy constructor. Should it be copied?\n" "[test.cpp:12]: (warning, inconclusive) Member variable 'B::a' is not assigned in the move constructor. Should it be moved?\n" "[test.cpp:13]: (warning, inconclusive) Member variable 'B::a' is not assigned a value in 'B::operator='.\n", - errout.str()); + errout_str()); check("class B\n" "{\n" @@ -1800,7 +1794,7 @@ class TestConstructors : public TestFixture { " A(A &&){}\n" " const A& operator=(const A&){return *this;}\n" "};"); - ASSERT_EQUALS("[test.cpp:13]: (warning) Member variable 'A::m_SemVar' is not initialized in the move constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:13]: (warning) Member variable 'A::m_SemVar' is not initialized in the move constructor.\n", errout_str()); check("class B\n" "{\n" @@ -1818,7 +1812,7 @@ class TestConstructors : public TestFixture { " A(A &&){}\n" " const A& operator=(const A&){return *this;}\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class A\n" "{\n" @@ -1828,7 +1822,7 @@ class TestConstructors : public TestFixture { " A(const A&){}\n" " const A& operator=(const A&){return *this;}\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void initvar_nocopy2() { // ticket #2484 @@ -1846,7 +1840,7 @@ class TestConstructors : public TestFixture { " A(const A&){}\n" " const A& operator=(const A&){return *this;}\n" "};", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class B\n" "{\n" @@ -1865,7 +1859,7 @@ class TestConstructors : public TestFixture { "};", true); ASSERT_EQUALS("[test.cpp:12]: (warning) Member variable 'A::m_SemVar' is not initialized in the constructor.\n" "[test.cpp:13]: (warning) Member variable 'A::m_SemVar' is not initialized in the copy constructor.\n" - "[test.cpp:14]: (warning) Member variable 'A::m_SemVar' is not assigned a value in 'A::operator='.\n", errout.str()); + "[test.cpp:14]: (warning) Member variable 'A::m_SemVar' is not assigned a value in 'A::operator='.\n", errout_str()); } void initvar_nocopy3() { // #3611 - unknown type is non-copyable @@ -1874,14 +1868,14 @@ class TestConstructors : public TestFixture { " A() {}\n" " A(const A& rhs) {}\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A {\n" " B b;\n" " A() {}\n" " A(const A& rhs) {}\n" "};", true); - ASSERT_EQUALS("[test.cpp:4]: (warning, inconclusive) Member variable 'A::b' is not assigned in the copy constructor. Should it be copied?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (warning, inconclusive) Member variable 'A::b' is not assigned in the copy constructor. Should it be copied?\n", errout_str()); } void initvar_nocopy4() { // #9247 @@ -1897,7 +1891,7 @@ class TestConstructors : public TestFixture { "void S::Set(const T& val) {\n" " t = val;\n" "}", /*inconclusive*/ true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void initvar_with_member_function_this() { @@ -1906,7 +1900,7 @@ class TestConstructors : public TestFixture { " void setMember(int m) { member = m; }\n" " int member;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void initvar_destructor() { @@ -1918,7 +1912,7 @@ class TestConstructors : public TestFixture { " Fred() : var(0) {}\n" " ~Fred() {}\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void initvar_func_ret_func_ptr() { // ticket #4449 (segmentation fault) @@ -1926,7 +1920,7 @@ class TestConstructors : public TestFixture { " int * ( something :: * process()) () { return 0; }\n" " something() { process(); }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void initvar_alias() { // #6921 @@ -1937,7 +1931,7 @@ class TestConstructors : public TestFixture { " pa = 4;\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S {\n" " int a;\n" @@ -1946,7 +1940,7 @@ class TestConstructors : public TestFixture { " *pa = 4;\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S {\n" " int a[2];\n" @@ -1956,7 +1950,7 @@ class TestConstructors : public TestFixture { " *pa++ = i;\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S {\n" " int* a[2];\n" @@ -1965,7 +1959,7 @@ class TestConstructors : public TestFixture { " *pa = 0;\n" " }\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Member variable 'S::a' is not initialized in the constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Member variable 'S::a' is not initialized in the constructor.\n", errout_str()); check("struct S {\n" " int a;\n" @@ -1974,7 +1968,7 @@ class TestConstructors : public TestFixture { " pa = 4;\n" " }\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Member variable 'S::a' is not initialized in the constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Member variable 'S::a' is not initialized in the constructor.\n", errout_str()); } void initvar_templateMember() { @@ -1993,7 +1987,7 @@ class TestConstructors : public TestFixture { " Wrapper::foo(x);\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void initvar_smartptr() { // #10237 @@ -2011,7 +2005,7 @@ class TestConstructors : public TestFixture { " }\n" " double d;\n" "};", s); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S {\n" // #8485 " explicit S(const T& rhs) { set(*rhs); }\n" @@ -2020,7 +2014,7 @@ class TestConstructors : public TestFixture { " }\n" " double d; \n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void operatorEqSTL() { @@ -2038,14 +2032,14 @@ class TestConstructors : public TestFixture { "\n" "void Fred::operator=(const Fred &f)\n" "{ }", true); - ASSERT_EQUALS("[test.cpp:13]: (warning, inconclusive) Member variable 'Fred::ints' is not assigned a value in 'Fred::operator='.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:13]: (warning, inconclusive) Member variable 'Fred::ints' is not assigned a value in 'Fred::operator='.\n", errout_str()); const Settings s = settingsBuilder().certainty(Certainty::inconclusive).severity(Severity::style).severity(Severity::warning).library("std.cfg").build(); check("struct S {\n" " S& operator=(const S& s) { return *this; }\n" " std::mutex m;\n" "};\n", s); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void uninitVar1() { @@ -2064,7 +2058,7 @@ class TestConstructors : public TestFixture { " ECODES _code;\n" "};"); - ASSERT_EQUALS("[test.cpp:10]: (warning) Member variable 'Fred::_code' is not initialized in the constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:10]: (warning) Member variable 'Fred::_code' is not initialized in the constructor.\n", errout_str()); check("class A{};\n" @@ -2076,7 +2070,7 @@ class TestConstructors : public TestFixture { "private:\n" " float f;\n" "};"); - ASSERT_EQUALS("[test.cpp:6]: (warning) Member variable 'B::f' is not initialized in the constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (warning) Member variable 'B::f' is not initialized in the constructor.\n", errout_str()); check("class C\n" "{\n" @@ -2089,7 +2083,7 @@ class TestConstructors : public TestFixture { "C::C(FILE *fp) {\n" " C::fp = fp;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void uninitVar2() { @@ -2100,7 +2094,7 @@ class TestConstructors : public TestFixture { "private:\n" " int i;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void uninitVar3() { @@ -2115,7 +2109,7 @@ class TestConstructors : public TestFixture { " };\n" " Bar bars[2];\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Using struct that doesn't have constructor check("class Foo\n" @@ -2128,7 +2122,7 @@ class TestConstructors : public TestFixture { " };\n" " Bar bars[2];\n" "};"); - ASSERT_EQUALS("[test.cpp:4]: (warning) Member variable 'Foo::bars' is not initialized in the constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (warning) Member variable 'Foo::bars' is not initialized in the constructor.\n", errout_str()); } void uninitVar4() { @@ -2142,7 +2136,7 @@ class TestConstructors : public TestFixture { " };\n" " struct Bar bar;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void uninitVar5() { @@ -2154,7 +2148,7 @@ class TestConstructors : public TestFixture { " { return *this; }\n" " static int i;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void uninitVar6() { @@ -2165,7 +2159,7 @@ class TestConstructors : public TestFixture { "private:\n" " int mi;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class Foo : public Bar\n" "{\n" @@ -2174,7 +2168,7 @@ class TestConstructors : public TestFixture { "private:\n" " int mi;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void uninitVar7() { @@ -2195,7 +2189,7 @@ class TestConstructors : public TestFixture { " copy.Swap(*this);\n" " return *this;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void uninitVar8() { @@ -2212,7 +2206,7 @@ class TestConstructors : public TestFixture { " }\n" " return *this;\n" "}"); - ASSERT_EQUALS("[test.cpp:8]: (warning) Member variable 'Foo::a' is not assigned a value in 'Foo::operator='.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8]: (warning) Member variable 'Foo::a' is not assigned a value in 'Foo::operator='.\n", errout_str()); } void uninitVar9() { // ticket #1730 @@ -2226,7 +2220,7 @@ class TestConstructors : public TestFixture { "{\n" " SetMinSize( wxSize( 48,48 ) );\n" "}"); - ASSERT_EQUALS("[test.cpp:7]: (warning) Member variable 'Prefs::xasd' is not initialized in the constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (warning) Member variable 'Prefs::xasd' is not initialized in the constructor.\n", errout_str()); } void uninitVar10() { // ticket #1993 @@ -2238,7 +2232,7 @@ class TestConstructors : public TestFixture { " int var2;\n" "};\n" "A::A() : var1(0) { }"); - ASSERT_EQUALS("[test.cpp:8]: (warning) Member variable 'A::var2' is not initialized in the constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8]: (warning) Member variable 'A::var2' is not initialized in the constructor.\n", errout_str()); } void uninitVar11() { @@ -2249,7 +2243,7 @@ class TestConstructors : public TestFixture { " int var;\n" "};\n" "A::A(int a) { }"); - ASSERT_EQUALS("[test.cpp:7]: (warning) Member variable 'A::var' is not initialized in the constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (warning) Member variable 'A::var' is not initialized in the constructor.\n", errout_str()); } void uninitVar12() { // ticket #2078 @@ -2266,7 +2260,7 @@ class TestConstructors : public TestFixture { " int x, y;\n" "};"); ASSERT_EQUALS("[test.cpp:4]: (warning) Member variable 'Point::x' is not initialized in the constructor.\n" - "[test.cpp:4]: (warning) Member variable 'Point::y' is not initialized in the constructor.\n", errout.str()); + "[test.cpp:4]: (warning) Member variable 'Point::y' is not initialized in the constructor.\n", errout_str()); } void uninitVar13() { // ticket #1195 @@ -2277,7 +2271,7 @@ class TestConstructors : public TestFixture { " A()\n" " {}\n" "};"); - ASSERT_EQUALS("[test.cpp:5]: (warning) Member variable 'A::ints' is not initialized in the constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (warning) Member variable 'A::ints' is not initialized in the constructor.\n", errout_str()); } void uninitVar14() { // ticket #2149 @@ -2292,7 +2286,7 @@ class TestConstructors : public TestFixture { "Foo::Foo()\n" "{\n" "}"); - ASSERT_EQUALS("[test.cpp:8]: (warning) Member variable 'Foo::mMember' is not initialized in the constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8]: (warning) Member variable 'Foo::mMember' is not initialized in the constructor.\n", errout_str()); // single namespace check("namespace Output\n" @@ -2308,7 +2302,7 @@ class TestConstructors : public TestFixture { " {\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:10]: (warning) Member variable 'Foo::mMember' is not initialized in the constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:10]: (warning) Member variable 'Foo::mMember' is not initialized in the constructor.\n", errout_str()); // constructor outside namespace check("namespace Output\n" @@ -2324,7 +2318,7 @@ class TestConstructors : public TestFixture { "Foo::Foo()\n" "{\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // constructor outside namespace check("namespace Output\n" @@ -2340,7 +2334,7 @@ class TestConstructors : public TestFixture { "Output::Foo::Foo()\n" "{\n" "}"); - ASSERT_EQUALS("[test.cpp:11]: (warning) Member variable 'Foo::mMember' is not initialized in the constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:11]: (warning) Member variable 'Foo::mMember' is not initialized in the constructor.\n", errout_str()); // constructor outside namespace with using, #4792 check("namespace Output\n" @@ -2357,7 +2351,7 @@ class TestConstructors : public TestFixture { "Foo::Foo()\n" "{\n" "}"); - ASSERT_EQUALS("[test.cpp:11]: (warning) Member variable 'Foo::mMember' is not initialized in the constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:11]: (warning) Member variable 'Foo::mMember' is not initialized in the constructor.\n", errout_str()); // constructor in separate namespace check("namespace Output\n" @@ -2376,7 +2370,7 @@ class TestConstructors : public TestFixture { " {\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:13]: (warning) Member variable 'Foo::mMember' is not initialized in the constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:13]: (warning) Member variable 'Foo::mMember' is not initialized in the constructor.\n", errout_str()); // constructor in different separate namespace check("namespace Output\n" @@ -2395,7 +2389,7 @@ class TestConstructors : public TestFixture { " {\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // constructor in different separate namespace (won't compile) check("namespace Output\n" @@ -2414,7 +2408,7 @@ class TestConstructors : public TestFixture { " {\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // constructor in nested separate namespace check("namespace A\n" @@ -2436,7 +2430,7 @@ class TestConstructors : public TestFixture { " }\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:15]: (warning) Member variable 'Foo::mMember' is not initialized in the constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:15]: (warning) Member variable 'Foo::mMember' is not initialized in the constructor.\n", errout_str()); // constructor in nested different separate namespace check("namespace A\n" @@ -2458,7 +2452,7 @@ class TestConstructors : public TestFixture { " }\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // constructor in nested different separate namespace check("namespace A\n" @@ -2480,7 +2474,7 @@ class TestConstructors : public TestFixture { " }\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void uninitVar15() { @@ -2494,7 +2488,7 @@ class TestConstructors : public TestFixture { "Fred::~Fred()\n" "{\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void uninitVar16() { @@ -2512,7 +2506,7 @@ class TestConstructors : public TestFixture { " foo.set(0);\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct Foo\n" "{\n" @@ -2527,7 +2521,7 @@ class TestConstructors : public TestFixture { " {\n" " }\n" "};"); - ASSERT_EQUALS("[test.cpp:10]: (warning) Member variable 'Bar::foo' is not initialized in the constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:10]: (warning) Member variable 'Bar::foo' is not initialized in the constructor.\n", errout_str()); } void uninitVar17() { @@ -2544,7 +2538,7 @@ class TestConstructors : public TestFixture { " foo[0].a = 0;\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct Foo\n" "{\n" @@ -2558,7 +2552,7 @@ class TestConstructors : public TestFixture { " {\n" " }\n" "};"); - ASSERT_EQUALS("[test.cpp:9]: (warning) Member variable 'Bar::foo' is not initialized in the constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:9]: (warning) Member variable 'Bar::foo' is not initialized in the constructor.\n", errout_str()); } void uninitVar18() { // ticket #2465 @@ -2574,7 +2568,7 @@ class TestConstructors : public TestFixture { "private:\n" " Altren value;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void uninitVar19() { // ticket #2792 @@ -2598,7 +2592,7 @@ class TestConstructors : public TestFixture { " free(m_str);\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void uninitVar20() { // ticket #2867 @@ -2610,7 +2604,7 @@ class TestConstructors : public TestFixture { " double bitsInData_;\n" " } obj;\n" "};"); - ASSERT_EQUALS("[test.cpp:4]: (warning) Member variable 'LocalClass::bitsInData_' is not initialized in the constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (warning) Member variable 'LocalClass::bitsInData_' is not initialized in the constructor.\n", errout_str()); check("struct copy_protected;\n" "Object::MemFunc() {\n" @@ -2623,7 +2617,7 @@ class TestConstructors : public TestFixture { "};"); ASSERT_EQUALS( "[test.cpp:5]: (warning) Member variable 'LocalClass::bitsInData_' is not initialized in the constructor.\n", - errout.str()); + errout_str()); check("struct copy_protected;\n" "Object::MemFunc() {\n" @@ -2636,7 +2630,7 @@ class TestConstructors : public TestFixture { "};"); ASSERT_EQUALS( "[test.cpp:5]: (warning) Member variable 'LocalClass::bitsInData_' is not initialized in the constructor.\n", - errout.str()); + errout_str()); } void uninitVar21() { // ticket #2947 @@ -2649,7 +2643,7 @@ class TestConstructors : public TestFixture { "Fred::Fred() {\n" " a[x::y] = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void uninitVar22() { // ticket #3043 @@ -2666,7 +2660,7 @@ class TestConstructors : public TestFixture { " x = 0;\n" " return *this;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class Fred {\n" " public:\n" @@ -2680,7 +2674,7 @@ class TestConstructors : public TestFixture { "Fred & Fred::clone(const Fred & other) {\n" " return *this;\n" "}"); - ASSERT_EQUALS("[test.cpp:7]: (warning) Member variable 'Fred::x' is not assigned a value in 'Fred::operator='.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (warning) Member variable 'Fred::x' is not assigned a value in 'Fred::operator='.\n", errout_str()); } void uninitVar23() { // ticket #3702 @@ -2702,7 +2696,7 @@ class TestConstructors : public TestFixture { "[test.cpp:11]: (warning) Member variable 'Fred::x' is not initialized in the constructor.\n" "[test.cpp:12]: (warning) Member variable 'Fred::x' is not initialized in the constructor.\n" "[test.cpp:13]: (warning) Member variable 'Fred::x' is not initialized in the constructor.\n" - "[test.cpp:14]: (warning) Member variable 'Fred::x' is not initialized in the constructor.\n", errout.str()); + "[test.cpp:14]: (warning) Member variable 'Fred::x' is not initialized in the constructor.\n", errout_str()); } void uninitVar24() { // ticket #3190 @@ -2732,7 +2726,7 @@ class TestConstructors : public TestFixture { ASSERT_EQUALS("[test.cpp:9]: (warning, inconclusive) Member variable 'Sub::b' is not initialized in the constructor.\n" "[test.cpp:12]: (warning) Member variable 'Sub::b' is not initialized in the constructor.\n" - "[test.cpp:20]: (warning) Member variable 'Sub::f' is not initialized in the constructor.\n", errout.str()); + "[test.cpp:20]: (warning) Member variable 'Sub::f' is not initialized in the constructor.\n", errout_str()); } void uninitVar25() { // ticket #4789 @@ -2795,7 +2789,7 @@ class TestConstructors : public TestFixture { "[test.cpp:35]: (warning) Member variable 'E::c' is not initialized in the constructor.\n" "[test.cpp:42]: (warning) Member variable 'F::a' is not initialized in the constructor.\n" "[test.cpp:42]: (warning) Member variable 'F::b' is not initialized in the constructor.\n" - "[test.cpp:42]: (warning) Member variable 'F::c' is not initialized in the constructor.\n", errout.str()); + "[test.cpp:42]: (warning) Member variable 'F::c' is not initialized in the constructor.\n", errout_str()); } void uninitVar26() { @@ -2807,7 +2801,7 @@ class TestConstructors : public TestFixture { " v = new int [sz = s];\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void uninitVar27() { @@ -2818,7 +2812,7 @@ class TestConstructors : public TestFixture { " rtl::math::setNan(&d);\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class A {\n" " double d;\n" "public:\n" @@ -2826,7 +2820,7 @@ class TestConstructors : public TestFixture { " ::rtl::math::setNan(&d);\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void uninitVar28() { @@ -2841,7 +2835,7 @@ class TestConstructors : public TestFixture { " void foo(int a) { i = a; }\n" " void foo(float a) { f = a; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void uninitVar29() { @@ -2874,7 +2868,7 @@ class TestConstructors : public TestFixture { " void foo() const { i = 0; }\n" "};"); ASSERT_EQUALS("[test.cpp:18]: (warning) Member variable 'C::i' is not initialized in the constructor.\n" - "[test.cpp:25]: (warning) Member variable 'D::i' is not initialized in the constructor.\n", errout.str()); + "[test.cpp:25]: (warning) Member variable 'D::i' is not initialized in the constructor.\n", errout_str()); } void uninitVar30() { // ticket #6417 @@ -2890,7 +2884,7 @@ class TestConstructors : public TestFixture { "using namespace NS;\n" "MyClass::~MyClass() { }\n" "MyClass::MyClass() : SomeVar(false) { }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void uninitVar31() { // ticket #8271 @@ -2908,7 +2902,7 @@ class TestConstructors : public TestFixture { "void MyClass::Restart() {\n" " m_retCode = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void uninitVar32() { // ticket #8835 @@ -2921,7 +2915,7 @@ class TestConstructors : public TestFixture { " if (1) {}\n" " }\n" "};"); - ASSERT_EQUALS("[test.cpp:5]: (warning) Member variable 'Foo::member' is not initialized in the constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (warning) Member variable 'Foo::member' is not initialized in the constructor.\n", errout_str()); check("class Foo {\n" " friend class Bar;\n" " int member;\n" @@ -2931,7 +2925,7 @@ class TestConstructors : public TestFixture { " while (1) {}\n" " }\n" "};"); - ASSERT_EQUALS("[test.cpp:5]: (warning) Member variable 'Foo::member' is not initialized in the constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (warning) Member variable 'Foo::member' is not initialized in the constructor.\n", errout_str()); check("class Foo {\n" " friend class Bar;\n" " int member;\n" @@ -2941,7 +2935,7 @@ class TestConstructors : public TestFixture { " for (;;) {}\n" " }\n" "};"); - ASSERT_EQUALS("[test.cpp:5]: (warning) Member variable 'Foo::member' is not initialized in the constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (warning) Member variable 'Foo::member' is not initialized in the constructor.\n", errout_str()); } void uninitVar33() { // ticket #10295 @@ -2953,7 +2947,7 @@ class TestConstructors : public TestFixture { " };\n" "};\n" "app::B::B(void){}"); - ASSERT_EQUALS("[test.cpp:8]: (warning) Member variable 'B::x' is not initialized in the constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8]: (warning) Member variable 'B::x' is not initialized in the constructor.\n", errout_str()); } void uninitVar34() { // ticket #10841 @@ -2962,7 +2956,7 @@ class TestConstructors : public TestFixture { " B() { a->f(); }\n" " A* a;\n" "};\n"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Member variable 'B::a' is not initialized in the constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Member variable 'B::a' is not initialized in the constructor.\n", errout_str()); } void uninitVarArray1() { @@ -2974,7 +2968,7 @@ class TestConstructors : public TestFixture { "private:\n" " char name[255];\n" "};"); - ASSERT_EQUALS("[test.cpp:4]: (warning) Member variable 'John::name' is not initialized in the constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (warning) Member variable 'John::name' is not initialized in the constructor.\n", errout_str()); check("class John\n" "{\n" @@ -2984,7 +2978,7 @@ class TestConstructors : public TestFixture { "private:\n" " char name[255];\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class John\n" "{\n" @@ -2994,7 +2988,7 @@ class TestConstructors : public TestFixture { "private:\n" " char name[255];\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class John\n" "{\n" @@ -3003,7 +2997,7 @@ class TestConstructors : public TestFixture { "\n" " double operator[](const unsigned long i);\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class A;\n" "class John\n" @@ -3012,7 +3006,7 @@ class TestConstructors : public TestFixture { " John() { }\n" " A a[5];\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class A;\n" "class John\n" @@ -3021,7 +3015,7 @@ class TestConstructors : public TestFixture { " John() { }\n" " A (*a)[5];\n" "};"); - ASSERT_EQUALS("[test.cpp:5]: (warning) Member variable 'John::a' is not initialized in the constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (warning) Member variable 'John::a' is not initialized in the constructor.\n", errout_str()); } void uninitVarArray2() { @@ -3033,7 +3027,7 @@ class TestConstructors : public TestFixture { "private:\n" " char name[255];\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #5754 check("class John\n" @@ -3044,7 +3038,7 @@ class TestConstructors : public TestFixture { "private:\n" " char name[255];\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void uninitVarArray3() { @@ -3061,7 +3055,7 @@ class TestConstructors : public TestFixture { " memset(b,0,sizeof(b));\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void uninitVarArray4() { @@ -3078,7 +3072,7 @@ class TestConstructors : public TestFixture { " if (snprintf(b,10,\"b\")) { }\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void uninitVarArray5() { @@ -3090,7 +3084,7 @@ class TestConstructors : public TestFixture { " Foo()\n" " { }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void uninitVarArray6() { @@ -3102,7 +3096,7 @@ class TestConstructors : public TestFixture { "};\n" "const char Foo::STR[] = \"abc\";\n" "Foo::Foo() { }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void uninitVarArray7() { @@ -3112,7 +3106,7 @@ class TestConstructors : public TestFixture { "public:\n" " Foo() { }\n" "};"); - ASSERT_EQUALS("[test.cpp:5]: (warning) Member variable 'Foo::array' is not initialized in the constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (warning) Member variable 'Foo::array' is not initialized in the constructor.\n", errout_str()); check("class Foo\n" "{\n" @@ -3120,7 +3114,7 @@ class TestConstructors : public TestFixture { "public:\n" " Foo() { memset(array, 0, sizeof(array)); }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class Foo\n" "{\n" @@ -3128,7 +3122,7 @@ class TestConstructors : public TestFixture { "public:\n" " Foo() { ::memset(array, 0, sizeof(array)); }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void uninitVarArray8() { @@ -3137,7 +3131,7 @@ class TestConstructors : public TestFixture { "public:\n" " Foo() { ::ZeroMemory(a); }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void uninitVarArray9() { // #6957 @@ -3148,7 +3142,7 @@ class TestConstructors : public TestFixture { "public:\n" " IxExprListT() {}\n" "};"); - ASSERT_EQUALS("[test.cpp:6]: (warning) Member variable 'IxExprListT::eArr' is not initialized in the constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (warning) Member variable 'IxExprListT::eArr' is not initialized in the constructor.\n", errout_str()); check("struct sRAIUnitDefBL {\n" " sRAIUnitDefBL();\n" " ~sRAIUnitDefBL();\n" @@ -3157,7 +3151,7 @@ class TestConstructors : public TestFixture { " sRAIUnitDef() {}\n" " sRAIUnitDefBL *List[35];\n" "};"); - ASSERT_EQUALS("[test.cpp:6]: (warning) Member variable 'sRAIUnitDef::List' is not initialized in the constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (warning) Member variable 'sRAIUnitDef::List' is not initialized in the constructor.\n", errout_str()); } void uninitVarArray10() { // #11650 @@ -3178,7 +3172,7 @@ class TestConstructors : public TestFixture { "[test.cpp:10]: (warning) Member variable 'S::b' is not initialized in the constructor.\n" "[test.cpp:10]: (warning) Member variable 'S::c' is not initialized in the constructor.\n" "[test.cpp:10]: (warning) Member variable 'S::d' is not initialized in the constructor.\n", - errout.str()); + errout_str()); } void uninitVarArray11() { @@ -3192,7 +3186,7 @@ class TestConstructors : public TestFixture { " }\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void uninitVarArray2D() { @@ -3204,7 +3198,7 @@ class TestConstructors : public TestFixture { "private:\n" " char a[2][2];\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void uninitVarArray3D() { @@ -3215,7 +3209,7 @@ class TestConstructors : public TestFixture { "public:\n" " John() { a[0][0][0] = 0; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void uninitVarCpp11Init1() { @@ -3226,7 +3220,7 @@ class TestConstructors : public TestFixture { " : bar({\"a\", \"b\"})\n" " {}\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void uninitVarCpp11Init2() { @@ -3242,7 +3236,7 @@ class TestConstructors : public TestFixture { " float get() const;\n" "};\n" "float Fred::get() const { return g; }"); - ASSERT_EQUALS("[test.cpp:9]: (warning) Member variable 'Fred::g' is not initialized in the constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:9]: (warning) Member variable 'Fred::g' is not initialized in the constructor.\n", errout_str()); } void uninitVarStruct1() { // ticket #2172 @@ -3258,7 +3252,7 @@ class TestConstructors : public TestFixture { " A() {\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class A\n" "{\n" @@ -3272,7 +3266,7 @@ class TestConstructors : public TestFixture { " A() {\n" " }\n" "};"); - ASSERT_EQUALS("[test.cpp:10]: (warning) Member variable 'A::b' is not initialized in the constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:10]: (warning) Member variable 'A::b' is not initialized in the constructor.\n", errout_str()); check("class A\n" "{\n" @@ -3287,7 +3281,7 @@ class TestConstructors : public TestFixture { " A() {\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void uninitVarStruct2() { // ticket #838 @@ -3304,7 +3298,7 @@ class TestConstructors : public TestFixture { " Fred()\n" " { }\n" "};"); - ASSERT_EQUALS("[test.cpp:11]: (warning) Member variable 'Fred::p' is not initialized in the constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:11]: (warning) Member variable 'Fred::p' is not initialized in the constructor.\n", errout_str()); check("struct POINT\n" "{\n" @@ -3320,7 +3314,7 @@ class TestConstructors : public TestFixture { " Fred()\n" " { }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct POINT\n" "{\n" @@ -3336,7 +3330,7 @@ class TestConstructors : public TestFixture { " Fred()\n" " { }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // non static data-member initialization check("struct POINT\n" @@ -3352,7 +3346,7 @@ class TestConstructors : public TestFixture { " Fred()\n" " { }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void uninitVarUnion1() { @@ -3364,13 +3358,13 @@ class TestConstructors : public TestFixture { " Fred()\n" " { a = 0; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class Fred {\n" "private:\n" " union { int a{}; int b; };\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void uninitVarUnion2() { @@ -3387,7 +3381,7 @@ class TestConstructors : public TestFixture { " Fred() : data_type(0)\n" " { }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void uninitMissingFuncDef() { @@ -3400,7 +3394,7 @@ class TestConstructors : public TestFixture { " void Init();" " int i;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Unknown non-member function (friend class) check("class Fred\n" @@ -3411,7 +3405,7 @@ class TestConstructors : public TestFixture { " friend ABC;\n" " int i;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Unknown non-member function (is Init a virtual function?) check("class Fred : private ABC\n" @@ -3421,7 +3415,7 @@ class TestConstructors : public TestFixture { "private:\n" " int i;\n" "};"); - ASSERT_EQUALS("[test.cpp:4]: (warning) Member variable 'Fred::i' is not initialized in the constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (warning) Member variable 'Fred::i' is not initialized in the constructor.\n", errout_str()); // Unknown non-member function check("class Fred\n" @@ -3431,7 +3425,7 @@ class TestConstructors : public TestFixture { "private:\n" " int i;\n" "};"); - ASSERT_EQUALS("[test.cpp:4]: (warning) Member variable 'Fred::i' is not initialized in the constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (warning) Member variable 'Fred::i' is not initialized in the constructor.\n", errout_str()); // Unknown non-member function check("class ABC { };\n" @@ -3442,7 +3436,7 @@ class TestConstructors : public TestFixture { "private:\n" " int i;\n" "};"); - ASSERT_EQUALS("[test.cpp:5]: (warning) Member variable 'Fred::i' is not initialized in the constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (warning) Member variable 'Fred::i' is not initialized in the constructor.\n", errout_str()); // Unknown member functions and unknown static functions check("class ABC {\n" @@ -3462,6 +3456,7 @@ class TestConstructors : public TestFixture { "private:\n" " int i;\n" "};"); + ASSERT_EQUALS("[test.cpp:7]: (warning) Member variable 'Fred::i' is not initialized in the constructor.\n", errout_str()); // Unknown overloaded member functions check("class Fred : private ABC {\n" @@ -3474,8 +3469,7 @@ class TestConstructors : public TestFixture { "private:\n" " int i;\n" "};"); - ASSERT_EQUALS("", errout.str()); - + ASSERT_EQUALS("", errout_str()); } void uninitVarEnum1() { @@ -3488,7 +3482,7 @@ class TestConstructors : public TestFixture { " unsigned int i;\n" "};"); - ASSERT_EQUALS("[test.cpp:5]: (warning) Member variable 'Fred::i' is not initialized in the constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (warning) Member variable 'Fred::i' is not initialized in the constructor.\n", errout_str()); } void uninitVarEnum2() { // ticket #8146 @@ -3499,7 +3493,7 @@ class TestConstructors : public TestFixture { " X x;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void uninitVarStream() { @@ -3515,7 +3509,7 @@ class TestConstructors : public TestFixture { " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void uninitVarTypedef() { @@ -3527,7 +3521,7 @@ class TestConstructors : public TestFixture { " pointer a;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void uninitVarMemset() { @@ -3538,7 +3532,7 @@ class TestConstructors : public TestFixture { " Foo() { memset(this, 0, sizeof(*this)); }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class Foo\n" "{\n" @@ -3547,7 +3541,7 @@ class TestConstructors : public TestFixture { " Foo() { ::memset(this, 0, sizeof(*this)); }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Ticket #7068 check("struct Foo {\n" @@ -3555,13 +3549,13 @@ class TestConstructors : public TestFixture { " char c;\n" " Foo() { memset(p, 0, sizeof(int)); }\n" "};"); - ASSERT_EQUALS("[test.cpp:4]: (warning) Member variable 'Foo::c' is not initialized in the constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (warning) Member variable 'Foo::c' is not initialized in the constructor.\n", errout_str()); check("struct Foo {\n" " int i;\n" " char c;\n" " Foo() { memset(&i, 0, sizeof(int)); }\n" "};"); - ASSERT_EQUALS("[test.cpp:4]: (warning) Member variable 'Foo::c' is not initialized in the constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (warning) Member variable 'Foo::c' is not initialized in the constructor.\n", errout_str()); check("struct Foo { int f; };\n" "struct Bar { int b; };\n" "struct FooBar {\n" @@ -3575,7 +3569,7 @@ class TestConstructors : public TestFixture { " FooBar foobar;\n" " return foobar.foo.f + foobar.bar.b;\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (warning) Member variable 'FooBar::bar' is not initialized in the constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (warning) Member variable 'FooBar::bar' is not initialized in the constructor.\n", errout_str()); check("struct Foo { int f; };\n" "struct Bar { int b; };\n" "struct FooBar {\n" @@ -3589,7 +3583,7 @@ class TestConstructors : public TestFixture { " FooBar foobar;\n" " return foobar.foo.f + foobar.bar.b;\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (warning) Member variable 'FooBar::bar' is not initialized in the constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (warning) Member variable 'FooBar::bar' is not initialized in the constructor.\n", errout_str()); // #7755 check("struct A {\n" @@ -3598,7 +3592,7 @@ class TestConstructors : public TestFixture { " }\n" " char data[42];\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void privateCtor1() { @@ -3608,7 +3602,7 @@ class TestConstructors : public TestFixture { " int foo;\n" " Foo() { }\n" "};", s); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { @@ -3617,7 +3611,7 @@ class TestConstructors : public TestFixture { " int foo;\n" " Foo() { }\n" "};", s); - ASSERT_EQUALS("[test.cpp:3]: (warning) Member variable 'Foo::foo' is not initialized in the constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Member variable 'Foo::foo' is not initialized in the constructor.\n", errout_str()); } } @@ -3631,7 +3625,7 @@ class TestConstructors : public TestFixture { " explicit Foo(int _i) { }\n" "};"); - ASSERT_EQUALS("[test.cpp:7]: (warning) Member variable 'Foo::foo' is not initialized in the constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (warning) Member variable 'Foo::foo' is not initialized in the constructor.\n", errout_str()); } @@ -3652,7 +3646,7 @@ class TestConstructors : public TestFixture { " return p;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } @@ -3665,7 +3659,7 @@ class TestConstructors : public TestFixture { "public:\n" " Fred() { }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void uninitVarInheritClassInit() { @@ -3679,7 +3673,7 @@ class TestConstructors : public TestFixture { "private:\n" " int x;\n" "};", s); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void uninitOperator() { @@ -3689,7 +3683,7 @@ class TestConstructors : public TestFixture { " Fred() { }\n" " int *operator [] (int index) { return 0; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void uninitFunction1() { @@ -3703,7 +3697,7 @@ class TestConstructors : public TestFixture { "\n" " double d;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class Fred\n" "{\n" @@ -3715,7 +3709,7 @@ class TestConstructors : public TestFixture { "\n" " double d;\n" "};"); - TODO_ASSERT_EQUALS("[test.cpp:4]: (warning) Member variable 'Fred::d' is not initialized in the constructor.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:4]: (warning) Member variable 'Fred::d' is not initialized in the constructor.\n", "", errout_str()); } void uninitFunction2() { @@ -3729,7 +3723,7 @@ class TestConstructors : public TestFixture { "\n" " double d;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class Fred\n" "{\n" @@ -3741,7 +3735,7 @@ class TestConstructors : public TestFixture { "\n" " double d;\n" "};"); - TODO_ASSERT_EQUALS("[test.cpp:4]: (warning) Member variable 'Fred::d' is not initialized in the constructor.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:4]: (warning) Member variable 'Fred::d' is not initialized in the constructor.\n", "", errout_str()); } void uninitFunction3() { @@ -3755,7 +3749,7 @@ class TestConstructors : public TestFixture { "\n" " double d;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class Fred\n" "{\n" @@ -3767,7 +3761,7 @@ class TestConstructors : public TestFixture { "\n" " double d;\n" "};"); - ASSERT_EQUALS("[test.cpp:4]: (warning) Member variable 'Fred::d' is not initialized in the constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (warning) Member variable 'Fred::d' is not initialized in the constructor.\n", errout_str()); } void uninitFunction4() { @@ -3781,7 +3775,7 @@ class TestConstructors : public TestFixture { "\n" " double d;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class Fred\n" "{\n" @@ -3793,7 +3787,7 @@ class TestConstructors : public TestFixture { "\n" " double d;\n" "};"); - TODO_ASSERT_EQUALS("[test.cpp:4]: (warning) Member variable 'Fred::d' is not initialized in the constructor.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:4]: (warning) Member variable 'Fred::d' is not initialized in the constructor.\n", "", errout_str()); } void uninitFunction5() { // #4072 - FP about struct that is initialized in function @@ -3807,7 +3801,7 @@ class TestConstructors : public TestFixture { " A() { Init( B ); };\n" " void Init( Structure& S ) { S.C = 0; };\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct Structure {\n" " int C;\n" @@ -3819,7 +3813,7 @@ class TestConstructors : public TestFixture { " A() { Init( B ); };\n" " void Init(const Structure& S) { }\n" "};"); - ASSERT_EQUALS("[test.cpp:8]: (warning) Member variable 'A::B' is not initialized in the constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8]: (warning) Member variable 'A::B' is not initialized in the constructor.\n", errout_str()); } void uninitSameClassName() { @@ -3844,7 +3838,7 @@ class TestConstructors : public TestFixture { "{\n" " i = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class B\n" "{\n" @@ -3871,7 +3865,7 @@ class TestConstructors : public TestFixture { "{\n" "}"); ASSERT_EQUALS("[test.cpp:18]: (warning) Member variable 'B::j' is not initialized in the constructor.\n" - "[test.cpp:22]: (warning) Member variable 'B::i' is not initialized in the constructor.\n", errout.str()); + "[test.cpp:22]: (warning) Member variable 'B::i' is not initialized in the constructor.\n", errout_str()); // Ticket #1700 check("namespace n1\n" @@ -3891,7 +3885,7 @@ class TestConstructors : public TestFixture { " Foo() { }\n" "};\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("namespace n1\n" "{\n" @@ -3913,7 +3907,7 @@ class TestConstructors : public TestFixture { " Foo() { }\n" "};\n" "}"); - ASSERT_EQUALS("[test.cpp:11]: (warning) Member variable 'Foo::i' is not initialized in the constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:11]: (warning) Member variable 'Foo::i' is not initialized in the constructor.\n", errout_str()); check("namespace n1\n" "{\n" @@ -3935,7 +3929,7 @@ class TestConstructors : public TestFixture { " Foo() { }\n" "};\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void uninitFunctionOverload() { @@ -3956,7 +3950,7 @@ class TestConstructors : public TestFixture { " void init(int value)\n" " { i = value; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class A\n" "{\n" @@ -3974,7 +3968,7 @@ class TestConstructors : public TestFixture { " void init(int value)\n" " { }\n" "};"); - ASSERT_EQUALS("[test.cpp:7]: (warning) Member variable 'A::i' is not initialized in the constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (warning) Member variable 'A::i' is not initialized in the constructor.\n", errout_str()); check("class bar {\n" // #9887 " int length;\n" @@ -3986,7 +3980,7 @@ class TestConstructors : public TestFixture { " void Set(int num) { x = 1; }\n" " void Set(bar num) { x = num.length; }\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void uninitVarOperatorEqual() { // ticket #2415 @@ -3995,7 +3989,7 @@ class TestConstructors : public TestFixture { " A() { a=0; }\n" " A(A const &a) { operator=(a); }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A {\n" " int a;\n" @@ -4006,7 +4000,7 @@ class TestConstructors : public TestFixture { " return *this;\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A {\n" " int a;\n" @@ -4017,7 +4011,7 @@ class TestConstructors : public TestFixture { " }\n" "};"); ASSERT_EQUALS("[test.cpp:4]: (warning) Member variable 'A::a' is not initialized in the copy constructor.\n" - "[test.cpp:5]: (warning) Member variable 'A::a' is not assigned a value in 'A::operator='.\n", errout.str()); + "[test.cpp:5]: (warning) Member variable 'A::a' is not assigned a value in 'A::operator='.\n", errout_str()); } void uninitVarPointer() { // #3801 @@ -4028,28 +4022,28 @@ class TestConstructors : public TestFixture { " A* a;\n" " B() { }\n" "};"); - ASSERT_EQUALS("[test.cpp:6]: (warning) Member variable 'B::a' is not initialized in the constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (warning) Member variable 'B::a' is not initialized in the constructor.\n", errout_str()); check("struct A;\n" "struct B {\n" " A* a;\n" " B() { }\n" "};"); - ASSERT_EQUALS("[test.cpp:4]: (warning) Member variable 'B::a' is not initialized in the constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (warning) Member variable 'B::a' is not initialized in the constructor.\n", errout_str()); check("struct A;\n" "struct B {\n" " const A* a;\n" " B() { }\n" "};"); - ASSERT_EQUALS("[test.cpp:4]: (warning) Member variable 'B::a' is not initialized in the constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (warning) Member variable 'B::a' is not initialized in the constructor.\n", errout_str()); check("struct A;\n" "struct B {\n" " A* const a;\n" " B() { }\n" "};"); - ASSERT_EQUALS("[test.cpp:4]: (warning) Member variable 'B::a' is not initialized in the constructor.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (warning) Member variable 'B::a' is not initialized in the constructor.\n", errout_str()); check("class Test {\n" // #8498 "public:\n" @@ -4057,7 +4051,7 @@ class TestConstructors : public TestFixture { " std::map* pMap = nullptr;\n" " std::string* pStr = nullptr;\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("template \n" "class C1 {}; \n" @@ -4078,7 +4072,7 @@ class TestConstructors : public TestFixture { " A::D2* d2 = nullptr;\n" " std::map* pMap = nullptr;\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void uninitConstVar() { @@ -4089,14 +4083,14 @@ class TestConstructors : public TestFixture { " B(B& b) { }\n" "};"); ASSERT_EQUALS("[test.cpp:4]: (warning) Member variable 'B::a' is not initialized in the constructor.\n" - "[test.cpp:5]: (warning) Member variable 'B::a' is not initialized in the copy constructor.\n", errout.str()); + "[test.cpp:5]: (warning) Member variable 'B::a' is not initialized in the copy constructor.\n", errout_str()); check("struct A;\n" "struct B {\n" " A* const a;\n" " B& operator=(const B& r) { }\n" "};"); - ASSERT_EQUALS("", errout.str()); // #3804 + ASSERT_EQUALS("", errout_str()); // #3804 check("struct B {\n" " const int a;\n" @@ -4104,13 +4098,13 @@ class TestConstructors : public TestFixture { " B(B& b) { }\n" "};"); ASSERT_EQUALS("[test.cpp:3]: (warning) Member variable 'B::a' is not initialized in the constructor.\n" - "[test.cpp:4]: (warning) Member variable 'B::a' is not initialized in the copy constructor.\n", errout.str()); + "[test.cpp:4]: (warning) Member variable 'B::a' is not initialized in the copy constructor.\n", errout_str()); check("struct B {\n" " const int a;\n" " B& operator=(const B& r) { }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } // Ticket #5641 "Regression. Crash for 'C() _STLP_NOTHROW {}'" @@ -4120,7 +4114,7 @@ class TestConstructors : public TestFixture { " C() _STLP_NOTHROW {}\n" " C(const C&) _STLP_NOTHROW {}\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void classWithOperatorInName() { // ticket #2827 @@ -4129,7 +4123,7 @@ class TestConstructors : public TestFixture { "public:\n" " operatorX() : mValue(0) {}\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void templateConstructor() { // ticket #7942 @@ -4139,7 +4133,7 @@ class TestConstructors : public TestFixture { "};\n" "template Container::Container() : mElements(nullptr) {}\n" "Container intContainer;"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void typedefArray() { // ticket #5766 @@ -4149,7 +4143,7 @@ class TestConstructors : public TestFixture { " SelectionPosition() {}\n" " const rvec &x() const;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void uninitAssignmentWithOperator() { @@ -4165,7 +4159,7 @@ class TestConstructors : public TestFixture { " }\n" "};", true); TODO_ASSERT_EQUALS("[test.cpp:3]: (warning, inconclusive) Member variable 'C::x' is not initialized in the constructor.\n", - "[test.cpp:3]: (warning) Member variable 'C::x' is not initialized in the constructor.\n", errout.str()); + "[test.cpp:3]: (warning) Member variable 'C::x' is not initialized in the constructor.\n", errout_str()); check("struct C {\n" " int x;\n" @@ -4179,7 +4173,7 @@ class TestConstructors : public TestFixture { " }\n" "};", true); TODO_ASSERT_EQUALS("[test.cpp:3]: (warning, inconclusive) Member variable 'C::x' is not initialized in the constructor.\n", - "[test.cpp:3]: (warning) Member variable 'C::x' is not initialized in the constructor.\n", errout.str()); + "[test.cpp:3]: (warning) Member variable 'C::x' is not initialized in the constructor.\n", errout_str()); check("struct C {\n" " int x;\n" @@ -4192,7 +4186,7 @@ class TestConstructors : public TestFixture { " return true;\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct C {\n" " int x;\n" @@ -4205,7 +4199,7 @@ class TestConstructors : public TestFixture { " return true;\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct C {\n" " int x;\n" @@ -4215,7 +4209,7 @@ class TestConstructors : public TestFixture { " }\n" " int SetValue() { return x = 1; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct C {\n" " int x;\n" @@ -4225,7 +4219,7 @@ class TestConstructors : public TestFixture { " }\n" " int SetValue() { return x = 1; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct C {\n" " int x;\n" @@ -4235,7 +4229,7 @@ class TestConstructors : public TestFixture { " }\n" " int SetValue() { return x = 1; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct C {\n" " int x;\n" @@ -4245,7 +4239,7 @@ class TestConstructors : public TestFixture { " }\n" " int SetValue() { return x = 1; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct C {\n" " int x;\n" @@ -4255,7 +4249,7 @@ class TestConstructors : public TestFixture { " }\n" " int SetValue() { return x = 1; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct C {\n" " int x;\n" @@ -4265,7 +4259,7 @@ class TestConstructors : public TestFixture { " }\n" " int SetValue() { return x = 1; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct C {\n" " int x;\n" @@ -4275,7 +4269,7 @@ class TestConstructors : public TestFixture { " }\n" " int SetValue() { return x = 1; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct C {\n" " int x;\n" @@ -4285,7 +4279,7 @@ class TestConstructors : public TestFixture { " }\n" " int SetValue() { return x = 1; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void uninitCompoundAssignment() { @@ -4300,7 +4294,7 @@ class TestConstructors : public TestFixture { " return true;\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct C {\n" " int x;\n" @@ -4313,7 +4307,7 @@ class TestConstructors : public TestFixture { " return true;\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct C {\n" " int x;\n" @@ -4323,7 +4317,7 @@ class TestConstructors : public TestFixture { " }\n" " int SetValue() { return x = 1; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct C {\n" " int x;\n" @@ -4333,7 +4327,7 @@ class TestConstructors : public TestFixture { " }\n" " int SetValue() { return x = 1; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct C {\n" " int x;\n" @@ -4343,7 +4337,7 @@ class TestConstructors : public TestFixture { " }\n" " int SetValue() { return x = 1; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct C {\n" " int x;\n" @@ -4353,7 +4347,7 @@ class TestConstructors : public TestFixture { " }\n" " int SetValue() { return x = 1; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct C {\n" " int x;\n" @@ -4363,7 +4357,7 @@ class TestConstructors : public TestFixture { " }\n" " int SetValue() { return x = 1; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct C {\n" " int x;\n" @@ -4373,7 +4367,7 @@ class TestConstructors : public TestFixture { " }\n" " int SetValue() { return x = 1; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct C {\n" " int x;\n" @@ -4383,7 +4377,7 @@ class TestConstructors : public TestFixture { " }\n" " int SetValue() { return x = 1; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct C {\n" " int x;\n" @@ -4393,7 +4387,7 @@ class TestConstructors : public TestFixture { " }\n" " int SetValue() { return x = 1; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void uninitComparisonAssignment() { @@ -4408,7 +4402,7 @@ class TestConstructors : public TestFixture { " return true;\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct C {\n" " int x;\n" @@ -4421,7 +4415,7 @@ class TestConstructors : public TestFixture { " return true;\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct C {\n" " int x;\n" @@ -4430,7 +4424,7 @@ class TestConstructors : public TestFixture { " }\n" " int SetValue() { return x = 1; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct C {\n" " int x;\n" @@ -4439,7 +4433,7 @@ class TestConstructors : public TestFixture { " }\n" " int SetValue() { return x = 1; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct C {\n" " int x;\n" @@ -4448,7 +4442,7 @@ class TestConstructors : public TestFixture { " }\n" " int SetValue() { return x = 1; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct C {\n" " int x;\n" @@ -4457,7 +4451,7 @@ class TestConstructors : public TestFixture { " }\n" " int SetValue() { return x = 1; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void uninitTemplate1() { @@ -4475,7 +4469,7 @@ class TestConstructors : public TestFixture { " private:\n" " A* b;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("template class A{};\n" "template class B{};\n" @@ -4487,7 +4481,7 @@ class TestConstructors : public TestFixture { "};\n" "template\n" "A>::A() : m_value(false) {}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("template struct S;\n" // #11177 "template <> struct S final {\n" @@ -4495,7 +4489,7 @@ class TestConstructors : public TestFixture { " int& m;\n" "};\n" "S::S(int& i) : m(i) {}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void unknownTemplateType() { @@ -4506,7 +4500,7 @@ class TestConstructors : public TestFixture { " A& operator=() { return *this; }\n" "};\n" "A a;"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } }; diff --git a/test/testexceptionsafety.cpp b/test/testexceptionsafety.cpp index 3f4b7bf187d9..4c1f099d8972 100644 --- a/test/testexceptionsafety.cpp +++ b/test/testexceptionsafety.cpp @@ -60,9 +60,6 @@ class TestExceptionSafety : public TestFixture { #define check(...) check_(__FILE__, __LINE__, __VA_ARGS__) void check_(const char* file, int line, const char code[], bool inconclusive = false, const Settings *s = nullptr) { - // Clear the error buffer.. - errout.str(""); - const Settings settings1 = settingsBuilder(s ? *s : settings).certainty(Certainty::inconclusive, inconclusive).build(); // Tokenize.. @@ -80,7 +77,7 @@ class TestExceptionSafety : public TestFixture { " throw e;\n" " }\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Class x is not safe, destructor throws exception\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Class x is not safe, destructor throws exception\n", errout_str()); check("class x {\n" " ~x();\n" @@ -88,7 +85,7 @@ class TestExceptionSafety : public TestFixture { "x::~x() {\n" " throw e;\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (warning) Class x is not safe, destructor throws exception\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (warning) Class x is not safe, destructor throws exception\n", errout_str()); // #3858 - throwing exception in try block in destructor. check("class x {\n" @@ -99,7 +96,7 @@ class TestExceptionSafety : public TestFixture { " }\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class x {\n" " ~x() {\n" @@ -108,7 +105,7 @@ class TestExceptionSafety : public TestFixture { " }\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void deallocThrow1() { @@ -119,7 +116,7 @@ class TestExceptionSafety : public TestFixture { " throw 123;\n" " p = 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (warning) Exception thrown in invalid state, 'p' points at deallocated memory.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (warning) Exception thrown in invalid state, 'p' points at deallocated memory.\n", errout_str()); check("void f() {\n" " static int* p = foo;\n" @@ -128,7 +125,7 @@ class TestExceptionSafety : public TestFixture { " throw 1;\n" " p = 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (warning) Exception thrown in invalid state, 'p' points at deallocated memory.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (warning) Exception thrown in invalid state, 'p' points at deallocated memory.\n", errout_str()); } void deallocThrow2() { @@ -139,7 +136,7 @@ class TestExceptionSafety : public TestFixture { " throw 1;\n" " p = new int;\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " static int* p = 0;\n" @@ -147,7 +144,7 @@ class TestExceptionSafety : public TestFixture { " reset(p);\n" " throw 1;\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void deallocThrow3() { @@ -156,14 +153,14 @@ class TestExceptionSafety : public TestFixture { " delete p;\n" " throw 1;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " static int* p = 0;\n" " delete p;\n" " throw 1;\n" "}", true); - ASSERT_EQUALS("[test.cpp:4]: (warning) Exception thrown in invalid state, 'p' points at deallocated memory.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (warning) Exception thrown in invalid state, 'p' points at deallocated memory.\n", errout_str()); } void rethrowCopy1() { @@ -177,7 +174,7 @@ class TestExceptionSafety : public TestFixture { " throw err;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:8]: (style) Throwing a copy of the caught exception instead of rethrowing the original exception.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8]: (style) Throwing a copy of the caught exception instead of rethrowing the original exception.\n", errout_str()); } void rethrowCopy2() { @@ -191,7 +188,7 @@ class TestExceptionSafety : public TestFixture { " throw err;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:8]: (style) Throwing a copy of the caught exception instead of rethrowing the original exception.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8]: (style) Throwing a copy of the caught exception instead of rethrowing the original exception.\n", errout_str()); } void rethrowCopy3() { @@ -203,7 +200,7 @@ class TestExceptionSafety : public TestFixture { " throw err;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:6]: (style) Throwing a copy of the caught exception instead of rethrowing the original exception.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (style) Throwing a copy of the caught exception instead of rethrowing the original exception.\n", errout_str()); } void rethrowCopy4() { @@ -218,7 +215,7 @@ class TestExceptionSafety : public TestFixture { " throw err2;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void rethrowCopy5() { @@ -235,7 +232,7 @@ class TestExceptionSafety : public TestFixture { " }\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:10]: (style) Throwing a copy of the caught exception instead of rethrowing the original exception.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:10]: (style) Throwing a copy of the caught exception instead of rethrowing the original exception.\n", errout_str()); check("void f() {\n" " try {\n" @@ -250,7 +247,7 @@ class TestExceptionSafety : public TestFixture { " }\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void catchExceptionByValue() { @@ -262,7 +259,7 @@ class TestExceptionSafety : public TestFixture { " foo(err);\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (style) Exception should be caught by reference.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (style) Exception should be caught by reference.\n", errout_str()); check("void f() {\n" " try {\n" @@ -272,7 +269,7 @@ class TestExceptionSafety : public TestFixture { " foo(err);\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (style) Exception should be caught by reference.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (style) Exception should be caught by reference.\n", errout_str()); check("void f() {\n" " try {\n" @@ -282,7 +279,7 @@ class TestExceptionSafety : public TestFixture { " foo(err);\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " try {\n" @@ -292,7 +289,7 @@ class TestExceptionSafety : public TestFixture { " foo(err);\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " try {\n" @@ -302,7 +299,7 @@ class TestExceptionSafety : public TestFixture { " foo(err);\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " try {\n" @@ -312,7 +309,7 @@ class TestExceptionSafety : public TestFixture { " foo(err);\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " try {\n" @@ -322,7 +319,7 @@ class TestExceptionSafety : public TestFixture { " foo(err);\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void noexceptThrow() { @@ -334,12 +331,12 @@ class TestExceptionSafety : public TestFixture { "void func6() noexcept(false) { func1(); }"); ASSERT_EQUALS("[test.cpp:2]: (error) Exception thrown in function declared not to throw exceptions.\n" "[test.cpp:3]: (error) Exception thrown in function declared not to throw exceptions.\n" - "[test.cpp:5]: (error) Exception thrown in function declared not to throw exceptions.\n", errout.str()); + "[test.cpp:5]: (error) Exception thrown in function declared not to throw exceptions.\n", errout_str()); // avoid false positives check("const char *func() noexcept { return 0; }\n" "const char *func1() noexcept { try { throw 1; } catch(...) {} return 0; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nothrowThrow() { @@ -349,11 +346,11 @@ class TestExceptionSafety : public TestFixture { "void func4() throw() { func1(); }\n" "void func5() throw(int) { func1(); }"); ASSERT_EQUALS("[test.cpp:2]: (error) Exception thrown in function declared not to throw exceptions.\n" - "[test.cpp:4]: (error) Exception thrown in function declared not to throw exceptions.\n", errout.str()); + "[test.cpp:4]: (error) Exception thrown in function declared not to throw exceptions.\n", errout_str()); // avoid false positives check("const char *func() throw() { return 0; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void unhandledExceptionSpecification1() { // #4800 @@ -368,7 +365,7 @@ class TestExceptionSafety : public TestFixture { " myThrowingFoo();\n" " } catch(MyException &) {}\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:1]: (style, inconclusive) Unhandled exception specification when calling function myThrowingFoo().\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:1]: (style, inconclusive) Unhandled exception specification when calling function myThrowingFoo().\n", errout_str()); } void unhandledExceptionSpecification2() { @@ -377,7 +374,7 @@ class TestExceptionSafety : public TestFixture { "{\n" " f();\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void unhandledExceptionSpecification3() { @@ -395,11 +392,11 @@ class TestExceptionSafety : public TestFixture { check(code, true); ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:1]: (style, inconclusive) Unhandled exception specification when calling function f().\n" - "[test.cpp:6] -> [test.cpp:1]: (style, inconclusive) Unhandled exception specification when calling function f().\n", errout.str()); + "[test.cpp:6] -> [test.cpp:1]: (style, inconclusive) Unhandled exception specification when calling function f().\n", errout_str()); const Settings s = settingsBuilder().library("gnu.cfg").build(); check(code, true, &s); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nothrowAttributeThrow() { @@ -407,11 +404,11 @@ class TestExceptionSafety : public TestFixture { "void func2() __attribute((nothrow)); void func2() { throw 1; }\n" "void func3() __attribute((nothrow)); void func3() { func1(); }"); ASSERT_EQUALS("[test.cpp:2]: (error) Exception thrown in function declared not to throw exceptions.\n" - "[test.cpp:3]: (error) Exception thrown in function declared not to throw exceptions.\n", errout.str()); + "[test.cpp:3]: (error) Exception thrown in function declared not to throw exceptions.\n", errout_str()); // avoid false positives check("const char *func() __attribute((nothrow)); void func1() { return 0; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nothrowAttributeThrow2() { @@ -420,7 +417,7 @@ class TestExceptionSafety : public TestFixture { " copyMemberValues();\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nothrowDeclspecThrow() { @@ -428,30 +425,30 @@ class TestExceptionSafety : public TestFixture { "void __declspec(nothrow) func2() { throw 1; }\n" "void __declspec(nothrow) func3() { func1(); }"); ASSERT_EQUALS("[test.cpp:2]: (error) Exception thrown in function declared not to throw exceptions.\n" - "[test.cpp:3]: (error) Exception thrown in function declared not to throw exceptions.\n", errout.str()); + "[test.cpp:3]: (error) Exception thrown in function declared not to throw exceptions.\n", errout_str()); // avoid false positives check("const char *func() __attribute((nothrow)); void func1() { return 0; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void rethrowNoCurrentException1() { check("void func1(const bool flag) { try{ if(!flag) throw; } catch (int&) { ; } }"); ASSERT_EQUALS("[test.cpp:1]: (error) Rethrowing current exception with 'throw;', it seems there is no current exception to rethrow." - " If there is no current exception this calls std::terminate(). More: https://isocpp.org/wiki/faq/exceptions#throw-without-an-object\n", errout.str()); + " If there is no current exception this calls std::terminate(). More: https://isocpp.org/wiki/faq/exceptions#throw-without-an-object\n", errout_str()); } void rethrowNoCurrentException2() { check("void func1() { try{ ; } catch (...) { ; } throw; }"); ASSERT_EQUALS("[test.cpp:1]: (error) Rethrowing current exception with 'throw;', it seems there is no current exception to rethrow." - " If there is no current exception this calls std::terminate(). More: https://isocpp.org/wiki/faq/exceptions#throw-without-an-object\n", errout.str()); + " If there is no current exception this calls std::terminate(). More: https://isocpp.org/wiki/faq/exceptions#throw-without-an-object\n", errout_str()); } void rethrowNoCurrentException3() { check("void on_error() { try { throw; } catch (const int &) { ; } catch (...) { ; } }\n" // exception dispatcher idiom "void func2() { try{ ; } catch (const int&) { throw; } ; }\n" "void func3() { throw 0; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } }; diff --git a/test/testfunctions.cpp b/test/testfunctions.cpp index bbe849f78dcc..799f43cd0629 100644 --- a/test/testfunctions.cpp +++ b/test/testfunctions.cpp @@ -104,11 +104,20 @@ class TestFunctions : public TestFixture { TEST_CASE(checkUseStandardLibrary14); } + static std::string filter_valueflow(std::string s) { + std::istringstream istr(s); + std::ostringstream ostr; + std::string errline; + while (std::getline(istr, errline)) { + if (errline.find("valueflow.cpp") == std::string::npos) { + ostr << errline << '\n'; + } + } + return ostr.str(); + } + #define check(...) check_(__FILE__, __LINE__, __VA_ARGS__) void check_(const char* file, int line, const char code[], const char filename[] = "test.cpp", const Settings* settings_ = nullptr) { - // Clear the error buffer.. - errout.str(""); - if (!settings_) settings_ = &settings; @@ -117,16 +126,6 @@ class TestFunctions : public TestFixture { std::istringstream istr(code); ASSERT_LOC(tokenizer.tokenize(istr, filename), file, line); - // filter out ValueFlow messages.. - const std::string debugwarnings = errout.str(); - errout.str(""); - std::istringstream istr2(debugwarnings); - std::string errline; - while (std::getline(istr2, errline)) { - if (errline.find("valueflow.cpp") == std::string::npos) - errout << errline << "\n"; - } - runChecks(tokenizer, this); } @@ -135,14 +134,14 @@ class TestFunctions : public TestFixture { "{\n" " bsd_signal(SIGABRT, SIG_IGN);\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Obsolescent function 'bsd_signal' called. It is recommended to use 'sigaction' instead.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Obsolescent function 'bsd_signal' called. It is recommended to use 'sigaction' instead.\n", errout_str()); check("int f()\n" "{\n" " int bsd_signal(0);\n" " return bsd_signal;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f()\n" "{\n" @@ -151,7 +150,7 @@ class TestFunctions : public TestFixture { " exit(1);\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (style) Obsolescent function 'gethostbyname' called. It is recommended to use 'getaddrinfo' instead.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Obsolescent function 'gethostbyname' called. It is recommended to use 'getaddrinfo' instead.\n", errout_str()); check("void f()\n" "{\n" @@ -161,13 +160,13 @@ class TestFunctions : public TestFixture { " exit(1);\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (style) Obsolescent function 'gethostbyaddr' called. It is recommended to use 'getnameinfo' instead.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (style) Obsolescent function 'gethostbyaddr' called. It is recommended to use 'getnameinfo' instead.\n", errout_str()); check("void f()\n" "{\n" " usleep( 1000 );\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Obsolescent function 'usleep' called. It is recommended to use 'nanosleep' or 'setitimer' instead.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Obsolescent function 'usleep' called. It is recommended to use 'nanosleep' or 'setitimer' instead.\n", errout_str()); } void prohibitedFunctions_index() { @@ -179,7 +178,7 @@ class TestFunctions : public TestFixture { " n1::index();\n" " return 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("std::size_t f()\n" "{\n" @@ -187,19 +186,19 @@ class TestFunctions : public TestFixture { " index++;\n" " return index;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f()\n" "{\n" " return this->index();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f()\n" "{\n" " int index( 0 );\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("const char f()\n" "{\n" @@ -208,7 +207,7 @@ class TestFunctions : public TestFixture { " return i;\n" "}"); ASSERT_EQUALS("[test.cpp:4]: (style) Obsolescent function 'index' called. It is recommended to use 'strchr' instead.\n", - errout.str()); + errout_str()); } void prohibitedFunctions_qt_index() { @@ -218,7 +217,7 @@ class TestFunctions : public TestFixture { ASSERT_EQUALS( "[test.cpp:2]: (style) Obsolescent function 'index' called. It is recommended to use 'strchr' instead.\n" "[test.cpp:2]: (style) Obsolescent function 'index' called. It is recommended to use 'strchr' instead.\n", // duplicate - errout.str()); + errout_str()); } void prohibitedFunctions_rindex() { @@ -226,14 +225,14 @@ class TestFunctions : public TestFixture { "{\n" " int rindex( 0 );\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f()\n" "{\n" " const char var[7] = \"rindex\";\n" " print(rindex(var, 0));\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (style) Obsolescent function 'rindex' called. It is recommended to use 'strrchr' instead.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Obsolescent function 'rindex' called. It is recommended to use 'strrchr' instead.\n", errout_str()); } @@ -243,7 +242,7 @@ class TestFunctions : public TestFixture { " Fred() : index(0) { }\n" " int index;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void prohibitedFunctions_gets() { @@ -251,13 +250,13 @@ class TestFunctions : public TestFixture { "{\n" " char *x = gets(a);\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Obsolete function 'gets' called. It is recommended to use 'fgets' or 'gets_s' instead.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Obsolete function 'gets' called. It is recommended to use 'fgets' or 'gets_s' instead.\n", errout_str()); check("void f()\n" "{\n" " foo(x, gets(a));\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Obsolete function 'gets' called. It is recommended to use 'fgets' or 'gets_s' instead.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Obsolete function 'gets' called. It is recommended to use 'fgets' or 'gets_s' instead.\n", errout_str()); } void prohibitedFunctions_alloca() { @@ -265,32 +264,32 @@ class TestFunctions : public TestFixture { "{\n" " char *x = alloca(10);\n" "}", "test.cpp"); // #4382 - there are no VLAs in C++ - ASSERT_EQUALS("[test.cpp:3]: (warning) Obsolete function 'alloca' called.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Obsolete function 'alloca' called.\n", errout_str()); check("void f()\n" "{\n" " char *x = alloca(10);\n" "}", "test.c"); - ASSERT_EQUALS("[test.c:3]: (warning) Obsolete function 'alloca' called. In C99 and later it is recommended to use a variable length array instead.\n", errout.str()); + ASSERT_EQUALS("[test.c:3]: (warning) Obsolete function 'alloca' called. In C99 and later it is recommended to use a variable length array instead.\n", errout_str()); const Settings s = settingsBuilder(settings).c(Standards::C89).cpp(Standards::CPP03).build(); check("void f()\n" "{\n" " char *x = alloca(10);\n" "}", "test.cpp", &s); // #4382 - there are no VLAs in C++ - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f()\n" "{\n" " char *x = alloca(10);\n" "}", "test.c", &s); // #7558 - no alternative to alloca in C89 - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f()\n" "{\n" " char *x = alloca(10);\n" "}", "test.c", &s); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } // ticket #3121 @@ -304,7 +303,7 @@ class TestFunctions : public TestFixture { " int b ; b = ftime ( 1 ) ;\n" " return 0 ;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } // test std::gets @@ -315,7 +314,7 @@ class TestFunctions : public TestFixture { " char *y = gets(str);\n" "}"); ASSERT_EQUALS("[test.cpp:3]: (warning) Obsolete function 'gets' called. It is recommended to use 'fgets' or 'gets_s' instead.\n" - "[test.cpp:4]: (warning) Obsolete function 'gets' called. It is recommended to use 'fgets' or 'gets_s' instead.\n", errout.str()); + "[test.cpp:4]: (warning) Obsolete function 'gets' called. It is recommended to use 'fgets' or 'gets_s' instead.\n", errout_str()); } // multiple use @@ -326,7 +325,7 @@ class TestFunctions : public TestFixture { " usleep( 1000 );\n" "}"); ASSERT_EQUALS("[test.cpp:3]: (warning) Obsolete function 'gets' called. It is recommended to use 'fgets' or 'gets_s' instead.\n" - "[test.cpp:4]: (style) Obsolescent function 'usleep' called. It is recommended to use 'nanosleep' or 'setitimer' instead.\n", errout.str()); + "[test.cpp:4]: (style) Obsolescent function 'usleep' called. It is recommended to use 'nanosleep' or 'setitimer' instead.\n", errout_str()); } void prohibitedFunctions_c_declaration() { @@ -337,14 +336,14 @@ class TestFunctions : public TestFixture { " gets ( s ) ;\n" " return 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (warning) Obsolete function 'gets' called. It is recommended to use 'fgets' or 'gets_s' instead.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (warning) Obsolete function 'gets' called. It is recommended to use 'fgets' or 'gets_s' instead.\n", errout_str()); check("int getcontext(ucontext_t *ucp);\n" "void f (ucontext_t *ucp)\n" "{\n" " getcontext ( ucp ) ;\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (portability) Obsolescent function 'getcontext' called. Applications are recommended to be rewritten to use POSIX threads.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (portability) Obsolescent function 'getcontext' called. Applications are recommended to be rewritten to use POSIX threads.\n", errout_str()); } void prohibitedFunctions_functionWithBody() { @@ -355,7 +354,7 @@ class TestFunctions : public TestFixture { " gets ( s ) ;\n" " return 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void prohibitedFunctions_crypt() { @@ -365,7 +364,7 @@ class TestFunctions : public TestFixture { " crypt(pwd, cpwd);\n" "}"); ASSERT_EQUALS("[test.cpp:3]: (warning) Return value of function crypt() is not used.\n" - "[test.cpp:3]: (portability) Non reentrant function 'crypt' called. For threadsafe applications it is recommended to use the reentrant replacement function 'crypt_r'.\n", errout.str()); + "[test.cpp:3]: (portability) Non reentrant function 'crypt' called. For threadsafe applications it is recommended to use the reentrant replacement function 'crypt_r'.\n", errout_str()); check("void f()\n" "{\n" @@ -374,14 +373,14 @@ class TestFunctions : public TestFixture { " crypt(pwd, cpwd);\n" "}"); ASSERT_EQUALS("[test.cpp:3]: (warning) Return value of function crypt() is not used.\n" - "[test.cpp:3]: (portability) Non reentrant function 'crypt' called. For threadsafe applications it is recommended to use the reentrant replacement function 'crypt_r'.\n", errout.str()); + "[test.cpp:3]: (portability) Non reentrant function 'crypt' called. For threadsafe applications it is recommended to use the reentrant replacement function 'crypt_r'.\n", errout_str()); check("int f()\n" "{\n" " int crypt = 0;" " return crypt;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void prohibitedFunctions_namespaceHandling() { @@ -390,14 +389,14 @@ class TestFunctions : public TestFixture { " time_t t = 0;" " auto lt = std::localtime(&t);\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (portability) Non reentrant function 'localtime' called. For threadsafe applications it is recommended to use the reentrant replacement function 'localtime_r'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (portability) Non reentrant function 'localtime' called. For threadsafe applications it is recommended to use the reentrant replacement function 'localtime_r'.\n", errout_str()); // Passed as function argument check("void f()\n" "{\n" " printf(\"Magic guess: %d\", getpwent());\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (portability) Non reentrant function 'getpwent' called. For threadsafe applications it is recommended to use the reentrant replacement function 'getpwent_r'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (portability) Non reentrant function 'getpwent' called. For threadsafe applications it is recommended to use the reentrant replacement function 'getpwent_r'.\n", errout_str()); // Pass return value check("void f()\n" @@ -405,7 +404,7 @@ class TestFunctions : public TestFixture { " time_t t = 0;" " struct tm *foo = localtime(&t);\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (portability) Non reentrant function 'localtime' called. For threadsafe applications it is recommended to use the reentrant replacement function 'localtime_r'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (portability) Non reentrant function 'localtime' called. For threadsafe applications it is recommended to use the reentrant replacement function 'localtime_r'.\n", errout_str()); // Access via global namespace check("void f()\n" @@ -413,75 +412,75 @@ class TestFunctions : public TestFixture { " ::getpwent();\n" "}"); ASSERT_EQUALS("[test.cpp:3]: (warning) Return value of function getpwent() is not used.\n" - "[test.cpp:3]: (portability) Non reentrant function 'getpwent' called. For threadsafe applications it is recommended to use the reentrant replacement function 'getpwent_r'.\n", errout.str()); + "[test.cpp:3]: (portability) Non reentrant function 'getpwent' called. For threadsafe applications it is recommended to use the reentrant replacement function 'getpwent_r'.\n", errout_str()); // Be quiet on function definitions check("int getpwent()\n" "{\n" " return 123;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Be quiet on other namespaces check("void f()\n" "{\n" " foobar::getpwent();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Be quiet on class member functions check("void f()\n" "{\n" " foobar.getpwent();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void invalidFunctionUsage1() { check("void f() { memset(a,b,sizeof(a)!=12); }"); - ASSERT_EQUALS("[test.cpp:1]: (error) Invalid memset() argument nr 3. A non-boolean value is required.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (error) Invalid memset() argument nr 3. A non-boolean value is required.\n", errout_str()); check("void f() { memset(a,b,sizeof(a)!=0); }"); - ASSERT_EQUALS("[test.cpp:1]: (error) Invalid memset() argument nr 3. A non-boolean value is required.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (error) Invalid memset() argument nr 3. A non-boolean value is required.\n", errout_str()); check("void f() { memset(a,b,!c); }"); - ASSERT_EQUALS("[test.cpp:1]: (error) Invalid memset() argument nr 3. A non-boolean value is required.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (error) Invalid memset() argument nr 3. A non-boolean value is required.\n", errout_str()); // Ticket #6990 check("void f(bool c) { memset(a,b,c); }"); - ASSERT_EQUALS("[test.cpp:1]: (error) Invalid memset() argument nr 3. A non-boolean value is required.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (error) Invalid memset() argument nr 3. A non-boolean value is required.\n", errout_str()); check("void f() { memset(a,b,true); }"); - ASSERT_EQUALS("[test.cpp:1]: (error) Invalid memset() argument nr 3. A non-boolean value is required.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (error) Invalid memset() argument nr 3. A non-boolean value is required.\n", errout_str()); // Ticket #6588 (c mode) check("void record(char* buf, int n) {\n" " memset(buf, 0, n < 255);\n" /* KO */ " memset(buf, 0, n < 255 ? n : 255);\n" /* OK */ "}", "test.c"); - ASSERT_EQUALS("[test.c:2]: (error) Invalid memset() argument nr 3. A non-boolean value is required.\n", errout.str()); + ASSERT_EQUALS("[test.c:2]: (error) Invalid memset() argument nr 3. A non-boolean value is required.\n", errout_str()); // Ticket #6588 (c++ mode) check("void record(char* buf, int n) {\n" " memset(buf, 0, n < 255);\n" /* KO */ " memset(buf, 0, n < 255 ? n : 255);\n" /* OK */ "}"); - ASSERT_EQUALS("[test.cpp:2]: (error) Invalid memset() argument nr 3. A non-boolean value is required.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (error) Invalid memset() argument nr 3. A non-boolean value is required.\n", errout_str()); check("int boolArgZeroIsInvalidButOneIsValid(int a, int param) {\n" " return div(a, param > 0);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (error) Invalid div() argument nr 2. The value is 0 or 1 (boolean) but the valid values are ':-1,1:'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (error) Invalid div() argument nr 2. The value is 0 or 1 (boolean) but the valid values are ':-1,1:'.\n", errout_str()); check("void boolArgZeroIsValidButOneIsInvalid(int param) {\n" " strtol(a, b, param > 0);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (error) Invalid strtol() argument nr 3. The value is 0 or 1 (boolean) but the valid values are '0,2:36'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (error) Invalid strtol() argument nr 3. The value is 0 or 1 (boolean) but the valid values are '0,2:36'.\n", errout_str()); check("void f() { strtol(a,b,1); }"); - ASSERT_EQUALS("[test.cpp:1]: (error) Invalid strtol() argument nr 3. The value is 1 but the valid values are '0,2:36'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (error) Invalid strtol() argument nr 3. The value is 1 but the valid values are '0,2:36'.\n", errout_str()); check("void f() { strtol(a,b,10); }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(std::vector& v) {\n" // #10754 " int N = -1;\n" @@ -489,7 +488,7 @@ class TestFunctions : public TestFixture { " N = h(N);\n" " v.resize(N);\n" "}\n"); - ASSERT_EQUALS("[test.cpp:5]: (warning) Invalid v.resize() argument nr 1. The value is -1 but the valid values are '0:'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (warning) Invalid v.resize() argument nr 1. The value is -1 but the valid values are '0:'.\n", errout_str()); check("void f(std::vector& v, int N) {\n" " if (N < -1)\n" @@ -497,14 +496,14 @@ class TestFunctions : public TestFixture { " v.resize(N);\n" "}\n"); ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:4]: (warning) Either the condition 'N<-1' is redundant or v.resize() argument nr 1 can have invalid value. The value is -1 but the valid values are '0:'.\n", - errout.str()); + errout_str()); check("void f(std::vector& v, int N) {\n" " if (N == -1) {}\n" " v.resize(N);\n" "}\n"); ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Either the condition 'N==-1' is redundant or v.resize() argument nr 1 can have invalid value. The value is -1 but the valid values are '0:'.\n", - errout.str()); + errout_str()); check("void f(std::vector& v, int N, bool b) {\n" " if (b)\n" @@ -512,28 +511,28 @@ class TestFunctions : public TestFixture { " v.resize(N);\n" "}\n"); ASSERT_EQUALS("[test.cpp:4]: (warning) Invalid v.resize() argument nr 1. The value is -1 but the valid values are '0:'.\n", - errout.str()); + errout_str()); check("void f(std::vector& v) {\n" " int N = -1;\n" " v.resize(N);\n" "}\n"); ASSERT_EQUALS("[test.cpp:3]: (error) Invalid v.resize() argument nr 1. The value is -1 but the valid values are '0:'.\n", - errout.str()); + errout_str()); } void invalidFunctionUsageStrings() { check("size_t f() { char x = 'x'; return strlen(&x); }"); - ASSERT_EQUALS("[test.cpp:1]: (error) Invalid strlen() argument nr 1. A nul-terminated string is required.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (error) Invalid strlen() argument nr 1. A nul-terminated string is required.\n", errout_str()); check("size_t f() { return strlen(&x); }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("size_t f(char x) { return strlen(&x); }"); - ASSERT_EQUALS("[test.cpp:1]: (error) Invalid strlen() argument nr 1. A nul-terminated string is required.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (error) Invalid strlen() argument nr 1. A nul-terminated string is required.\n", errout_str()); check("size_t f() { char x = '\\0'; return strlen(&x); }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("size_t f() {\n" " char x;\n" @@ -543,41 +542,41 @@ class TestFunctions : public TestFixture { " x = 'a';\n" " return strlen(&x);\n" "}"); - ASSERT_EQUALS("[test.cpp:7]: (error) Invalid strlen() argument nr 1. A nul-terminated string is required.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (error) Invalid strlen() argument nr 1. A nul-terminated string is required.\n", errout_str()); check("int f() { char x = '\\0'; return strcmp(\"Hello world\", &x); }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f() { char x = 'x'; return strcmp(\"Hello world\", &x); }"); - ASSERT_EQUALS("[test.cpp:1]: (error) Invalid strcmp() argument nr 2. A nul-terminated string is required.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (error) Invalid strcmp() argument nr 2. A nul-terminated string is required.\n", errout_str()); check("size_t f(char x) { char * y = &x; return strlen(y); }"); - TODO_ASSERT_EQUALS("[test.cpp:1]: (error) Invalid strlen() argument nr 1. A nul-terminated string is required.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:1]: (error) Invalid strlen() argument nr 1. A nul-terminated string is required.\n", "", errout_str()); check("size_t f(char x) { char * y = &x; char *z = y; return strlen(z); }"); - TODO_ASSERT_EQUALS("[test.cpp:1]: (error) Invalid strlen() argument nr 1. A nul-terminated string is required.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:1]: (error) Invalid strlen() argument nr 1. A nul-terminated string is required.\n", "", errout_str()); check("size_t f() { char x = 'x'; char * y = &x; char *z = y; return strlen(z); }"); - TODO_ASSERT_EQUALS("[test.cpp:1]: (error) Invalid strlen() argument nr 1. A nul-terminated string is required.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:1]: (error) Invalid strlen() argument nr 1. A nul-terminated string is required.\n", "", errout_str()); check("size_t f() { char x = '\\0'; char * y = &x; char *z = y; return strlen(z); }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("size_t f() { char x[] = \"Hello world\"; return strlen(x); }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("size_t f(char x[]) { return strlen(x); }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f(char x, char y) { return strcmp(&x, &y); }"); ASSERT_EQUALS("[test.cpp:1]: (error) Invalid strcmp() argument nr 1. A nul-terminated string is required.\n" - "[test.cpp:1]: (error) Invalid strcmp() argument nr 2. A nul-terminated string is required.\n", errout.str()); + "[test.cpp:1]: (error) Invalid strcmp() argument nr 2. A nul-terminated string is required.\n", errout_str()); check("size_t f() { char x[] = \"Hello world\"; return strlen(&x[0]); }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("size_t f() { char* x = \"Hello world\"; return strlen(&x[0]); }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S {\n" " char x;\n" @@ -591,10 +590,10 @@ class TestFunctions : public TestFixture { " return l1 + l2;\n" "}"); ASSERT_EQUALS("[test.cpp:8]: (error) Invalid strlen() argument nr 1. A nul-terminated string is required.\n" - "[test.cpp:9]: (error) Invalid strlen() argument nr 1. A nul-terminated string is required.\n", errout.str()); + "[test.cpp:9]: (error) Invalid strlen() argument nr 1. A nul-terminated string is required.\n", errout_str()); check("const char x = 'x'; size_t f() { return strlen(&x); }"); - ASSERT_EQUALS("[test.cpp:1]: (error) Invalid strlen() argument nr 1. A nul-terminated string is required.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (error) Invalid strlen() argument nr 1. A nul-terminated string is required.\n", errout_str()); check("struct someStruct {\n" " union {\n" @@ -609,7 +608,7 @@ class TestFunctions : public TestFixture { "{\n" " return strcmp(&tp->x.buf[k], \"needle\");\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct someStruct {\n" " char buf[42];\n" @@ -618,29 +617,29 @@ class TestFunctions : public TestFixture { "{\n" " return strcmp(&tp->buf[k], \"needle\");\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("const char x = 'x'; size_t f() { char y = x; return strlen(&y); }"); - ASSERT_EQUALS("[test.cpp:1]: (error) Invalid strlen() argument nr 1. A nul-terminated string is required.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (error) Invalid strlen() argument nr 1. A nul-terminated string is required.\n", errout_str()); check("const char x = '\\0'; size_t f() { return strlen(&x); }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("const char x = '\\0'; size_t f() { char y = x; return strlen(&y); }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("size_t f() {\n" " char * a = \"Hello world\";\n" " char ** b = &a;\n" " return strlen(&b[0][0]);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("size_t f() {\n" " char ca[] = \"asdf\";\n" " return strlen((char*) &ca);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #5225 check("int main(void)\n" @@ -651,67 +650,67 @@ class TestFunctions : public TestFixture { " puts(str);\n" " return 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (error) Invalid strcat() argument nr 2. A nul-terminated string is required.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Invalid strcat() argument nr 2. A nul-terminated string is required.\n", errout_str()); check("FILE* f(void) {\n" " const char fileName[1] = { \'x\' };\n" " return fopen(fileName, \"r\"); \n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Invalid fopen() argument nr 1. A nul-terminated string is required.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Invalid fopen() argument nr 1. A nul-terminated string is required.\n", errout_str()); check("FILE* f(void) {\n" " const char fileName[2] = { \'x\', \'y\' };\n" " return fopen(fileName, \"r\"); \n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Invalid fopen() argument nr 1. A nul-terminated string is required.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Invalid fopen() argument nr 1. A nul-terminated string is required.\n", errout_str()); check("FILE* f(void) {\n" " const char fileName[3] = { \'x\', \'y\' ,\'\\0\' };\n" " return fopen(fileName, \"r\"); \n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("FILE* f(void) {\n" " const char fileName[3] = { \'x\', \'\\0\' ,\'y\' };\n" " return fopen(fileName, \"r\"); \n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("FILE* f(void) {\n" " const char fileName[3] = { \'x\', \'y\' };\n" // implicit '\0' added at the end " return fopen(fileName, \"r\"); \n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("FILE* f(void) {\n" " const char fileName[] = { \'\\0\' };\n" " return fopen(fileName, \"r\"); \n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("FILE* f(void) {\n" " const char fileName[] = { \'0\' + 42 };\n" // no size is explicitly defined, no implicit '\0' is added " return fopen(fileName, \"r\"); \n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Invalid fopen() argument nr 1. A nul-terminated string is required.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Invalid fopen() argument nr 1. A nul-terminated string is required.\n", errout_str()); check("FILE* f(void) {\n" " const char fileName[] = { \'0\' + 42, \'x\' };\n" // no size is explicitly defined, no implicit '\0' is added " return fopen(fileName, \"r\"); \n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Invalid fopen() argument nr 1. A nul-terminated string is required.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Invalid fopen() argument nr 1. A nul-terminated string is required.\n", errout_str()); check("FILE* f(void) {\n" " const char fileName[2] = { \'0\' + 42 };\n" // implicitly '\0' added at the end because size is set to 2 " return fopen(fileName, \"r\"); \n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("FILE* f(void) {\n" " const char fileName[] = { };\n" " return fopen(fileName, \"r\"); \n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void scanMetaTypes()\n" // don't crash "{\n" @@ -722,31 +721,31 @@ class TestFunctions : public TestFixture { " metaTypes.push_back(mtId);\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f() {\n" " const char c[3] = \"abc\";\n" " return strlen(c);\n" "}\n"); - ASSERT_EQUALS("[test.cpp:3]: (error) Invalid strlen() argument nr 1. A nul-terminated string is required.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Invalid strlen() argument nr 1. A nul-terminated string is required.\n", errout_str()); check("int f() {\n" " const wchar_t c[3] = L\"abc\";\n" " return wcslen(c);\n" "}\n"); - ASSERT_EQUALS("[test.cpp:3]: (error) Invalid wcslen() argument nr 1. A nul-terminated string is required.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Invalid wcslen() argument nr 1. A nul-terminated string is required.\n", errout_str()); check("void f(char* dest) {\n" " char if_name[(IF_NAMESIZE > 21 ? IF_NAMESIZE : 21) + 1] = \"%\";\n" " strcat(dest, if_name);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f() {\n" " const char c[3] = \"ab\\0\";\n" " return strlen(c);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int n) {\n" // #11179 " char s[8] = \" \";\n" @@ -754,13 +753,13 @@ class TestFunctions : public TestFixture { " sprintf(s, \"lwip%02d\", n);\n" " s[strlen(s)] = ' ';\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("size_t f() { wchar_t x = L'x'; return wcslen(&x); }"); - ASSERT_EQUALS("[test.cpp:1]: (error) Invalid wcslen() argument nr 1. A nul-terminated string is required.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (error) Invalid wcslen() argument nr 1. A nul-terminated string is required.\n", errout_str()); check("void f() { char a[10] = \"1234567890\"; puts(a); }", "test.c"); // #1770 - ASSERT_EQUALS("[test.c:1]: (error) Invalid puts() argument nr 1. A nul-terminated string is required.\n", errout.str()); + ASSERT_EQUALS("[test.c:1]: (error) Invalid puts() argument nr 1. A nul-terminated string is required.\n", errout_str()); } void mathfunctionCall_sqrt() { @@ -773,7 +772,7 @@ class TestFunctions : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:3]: (error) Invalid sqrt() argument nr 1. The value is -1 but the valid values are '0.0:'.\n" "[test.cpp:4]: (error) Invalid sqrtf() argument nr 1. The value is -1 but the valid values are '0.0:'.\n" - "[test.cpp:5]: (error) Invalid sqrtl() argument nr 1. The value is -1 but the valid values are '0.0:'.\n", errout.str()); + "[test.cpp:5]: (error) Invalid sqrtl() argument nr 1. The value is -1 but the valid values are '0.0:'.\n", errout_str()); // implementation-defined behaviour for "finite values of x<0" only: check("void foo()\n" @@ -782,7 +781,7 @@ class TestFunctions : public TestFixture { " std::cout << sqrtf(-0.) << std::endl;\n" " std::cout << sqrtl(-0.) << std::endl;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo()\n" "{\n" @@ -790,7 +789,7 @@ class TestFunctions : public TestFixture { " std::cout << sqrtf(1) << std::endl;\n" " std::cout << sqrtl(1) << std::endl;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void mathfunctionCall_log() { @@ -830,7 +829,7 @@ class TestFunctions : public TestFixture { "[test.cpp:11]: (warning) Passing value -2 to log2l() leads to implementation-defined result.\n" "[test.cpp:12]: (warning) Passing value -3 to log1p() leads to implementation-defined result.\n" "[test.cpp:13]: (warning) Passing value -3 to log1pf() leads to implementation-defined result.\n" - "[test.cpp:14]: (warning) Passing value -3 to log1pl() leads to implementation-defined result.\n", errout.str()); + "[test.cpp:14]: (warning) Passing value -3 to log1pl() leads to implementation-defined result.\n", errout_str()); check("void foo()\n" "{\n" @@ -867,7 +866,7 @@ class TestFunctions : public TestFixture { "[test.cpp:11]: (warning) Passing value -1 to log2l() leads to implementation-defined result.\n" "[test.cpp:12]: (warning) Passing value -2 to log1p() leads to implementation-defined result.\n" "[test.cpp:13]: (warning) Passing value -2 to log1pf() leads to implementation-defined result.\n" - "[test.cpp:14]: (warning) Passing value -2 to log1pl() leads to implementation-defined result.\n", errout.str()); + "[test.cpp:14]: (warning) Passing value -2 to log1pl() leads to implementation-defined result.\n", errout_str()); check("void foo()\n" "{\n" @@ -904,7 +903,7 @@ class TestFunctions : public TestFixture { "[test.cpp:11]: (warning) Passing value -1.0 to log2l() leads to implementation-defined result.\n" "[test.cpp:12]: (warning) Passing value -2.0 to log1p() leads to implementation-defined result.\n" "[test.cpp:13]: (warning) Passing value -2.0 to log1pf() leads to implementation-defined result.\n" - "[test.cpp:14]: (warning) Passing value -2.0 to log1pl() leads to implementation-defined result.\n", errout.str()); + "[test.cpp:14]: (warning) Passing value -2.0 to log1pl() leads to implementation-defined result.\n", errout_str()); check("void foo()\n" "{\n" @@ -941,7 +940,7 @@ class TestFunctions : public TestFixture { "[test.cpp:11]: (warning) Passing value -0.1 to log2l() leads to implementation-defined result.\n" "[test.cpp:12]: (warning) Passing value -1.1 to log1p() leads to implementation-defined result.\n" "[test.cpp:13]: (warning) Passing value -1.1 to log1pf() leads to implementation-defined result.\n" - "[test.cpp:14]: (warning) Passing value -1.1 to log1pl() leads to implementation-defined result.\n", errout.str()); + "[test.cpp:14]: (warning) Passing value -1.1 to log1pl() leads to implementation-defined result.\n", errout_str()); check("void foo()\n" "{\n" @@ -978,7 +977,7 @@ class TestFunctions : public TestFixture { "[test.cpp:11]: (warning) Passing value 0 to log2l() leads to implementation-defined result.\n" "[test.cpp:12]: (warning) Passing value -1. to log1p() leads to implementation-defined result.\n" "[test.cpp:13]: (warning) Passing value -1.0 to log1pf() leads to implementation-defined result.\n" - "[test.cpp:14]: (warning) Passing value -1 to log1pl() leads to implementation-defined result.\n", errout.str()); + "[test.cpp:14]: (warning) Passing value -1 to log1pl() leads to implementation-defined result.\n", errout_str()); check("void foo()\n" "{\n" @@ -1031,21 +1030,21 @@ class TestFunctions : public TestFixture { " std::cout << log1pf(2.0) << std::endl;\n" " std::cout << log1pf(2.0f) << std::endl;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo()\n" "{\n" " std::string *log(0);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #3473 - no warning if "log" is a variable check("Fred::Fred() : log(0) { }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #5748 check("void f() { foo.log(0); }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void mathfunctionCall_acos() { @@ -1083,7 +1082,7 @@ class TestFunctions : public TestFixture { " + acosl(+0.1E-1) \n" " + acosl(-0.1E-1);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo()\n" "{\n" @@ -1093,7 +1092,7 @@ class TestFunctions : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:3]: (error) Invalid acos() argument nr 1. The value is 1.1 but the valid values are '-1.0:1.0'.\n" "[test.cpp:4]: (error) Invalid acosf() argument nr 1. The value is 1.1 but the valid values are '-1.0:1.0'.\n" - "[test.cpp:5]: (error) Invalid acosl() argument nr 1. The value is 1.1 but the valid values are '-1.0:1.0'.\n", errout.str()); + "[test.cpp:5]: (error) Invalid acosl() argument nr 1. The value is 1.1 but the valid values are '-1.0:1.0'.\n", errout_str()); check("void foo()\n" "{\n" @@ -1103,7 +1102,7 @@ class TestFunctions : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:3]: (error) Invalid acos() argument nr 1. The value is -1.1 but the valid values are '-1.0:1.0'.\n" "[test.cpp:4]: (error) Invalid acosf() argument nr 1. The value is -1.1 but the valid values are '-1.0:1.0'.\n" - "[test.cpp:5]: (error) Invalid acosl() argument nr 1. The value is -1.1 but the valid values are '-1.0:1.0'.\n", errout.str()); + "[test.cpp:5]: (error) Invalid acosl() argument nr 1. The value is -1.1 but the valid values are '-1.0:1.0'.\n", errout_str()); } void mathfunctionCall_asin() { @@ -1144,7 +1143,7 @@ class TestFunctions : public TestFixture { " + asinl(+0.1E-1) \n" " + asinl(-0.1E-1);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo()\n" "{\n" @@ -1154,7 +1153,7 @@ class TestFunctions : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:3]: (error) Invalid asin() argument nr 1. The value is 1.1 but the valid values are '-1.0:1.0'.\n" "[test.cpp:4]: (error) Invalid asinf() argument nr 1. The value is 1.1 but the valid values are '-1.0:1.0'.\n" - "[test.cpp:5]: (error) Invalid asinl() argument nr 1. The value is 1.1 but the valid values are '-1.0:1.0'.\n", errout.str()); + "[test.cpp:5]: (error) Invalid asinl() argument nr 1. The value is 1.1 but the valid values are '-1.0:1.0'.\n", errout_str()); check("void foo()\n" "{\n" @@ -1164,7 +1163,7 @@ class TestFunctions : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:3]: (error) Invalid asin() argument nr 1. The value is -1.1 but the valid values are '-1.0:1.0'.\n" "[test.cpp:4]: (error) Invalid asinf() argument nr 1. The value is -1.1 but the valid values are '-1.0:1.0'.\n" - "[test.cpp:5]: (error) Invalid asinl() argument nr 1. The value is -1.1 but the valid values are '-1.0:1.0'.\n", errout.str()); + "[test.cpp:5]: (error) Invalid asinl() argument nr 1. The value is -1.1 but the valid values are '-1.0:1.0'.\n", errout_str()); } void mathfunctionCall_pow() { @@ -1177,7 +1176,7 @@ class TestFunctions : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:3]: (warning) Passing values 0 and -10 to pow() leads to implementation-defined result.\n" "[test.cpp:4]: (warning) Passing values 0 and -10 to powf() leads to implementation-defined result.\n" - "[test.cpp:5]: (warning) Passing values 0 and -10 to powl() leads to implementation-defined result.\n", errout.str()); + "[test.cpp:5]: (warning) Passing values 0 and -10 to powl() leads to implementation-defined result.\n", errout_str()); check("void foo()\n" "{\n" @@ -1185,7 +1184,7 @@ class TestFunctions : public TestFixture { " std::cout << powf(0,10) << std::endl;\n" " std::cout << powl(0,10) << std::endl;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void mathfunctionCall_atan2() { @@ -1226,7 +1225,7 @@ class TestFunctions : public TestFixture { " std::cout << atan2l(+0.1E-1,1) ;\n" " std::cout << atan2l(-0.1E-1,8) ;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo()\n" "{\n" @@ -1236,7 +1235,7 @@ class TestFunctions : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:3]: (warning) Passing values 0 and 0 to atan2() leads to implementation-defined result.\n" "[test.cpp:4]: (warning) Passing values 0 and 0 to atan2f() leads to implementation-defined result.\n" - "[test.cpp:5]: (warning) Passing values 0 and 0 to atan2l() leads to implementation-defined result.\n", errout.str()); + "[test.cpp:5]: (warning) Passing values 0 and 0 to atan2l() leads to implementation-defined result.\n", errout_str()); } void mathfunctionCall_fmod() { @@ -1252,7 +1251,7 @@ class TestFunctions : public TestFixture { "[test.cpp:5]: (error) Invalid fmodl() argument nr 2. The value is 0 but the valid values are '!0.0'.\n" "[test.cpp:3]: (warning) Passing values 1.0 and 0 to fmod() leads to implementation-defined result.\n" "[test.cpp:4]: (warning) Passing values 1.0 and 0 to fmodf() leads to implementation-defined result.\n" - "[test.cpp:5]: (warning) Passing values 1.0 and 0 to fmodl() leads to implementation-defined result.\n", errout.str()); + "[test.cpp:5]: (warning) Passing values 1.0 and 0 to fmodl() leads to implementation-defined result.\n", errout_str()); check("void foo()\n" "{\n" @@ -1260,7 +1259,7 @@ class TestFunctions : public TestFixture { " std::cout << fmodf(1.0,1) << std::endl;\n" " std::cout << fmodl(1.0,1) << std::endl;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void mathfunctionCall_precision() { @@ -1271,7 +1270,7 @@ class TestFunctions : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:2]: (style) Expression 'exp(x) - 1' can be replaced by 'expm1(x)' to avoid loss of precision.\n" "[test.cpp:3]: (style) Expression 'log(1 + x)' can be replaced by 'log1p(x)' to avoid loss of precision.\n" - "[test.cpp:4]: (style) Expression '1 - erf(x)' can be replaced by 'erfc(x)' to avoid loss of precision.\n", errout.str()); + "[test.cpp:4]: (style) Expression '1 - erf(x)' can be replaced by 'erfc(x)' to avoid loss of precision.\n", errout_str()); check("void foo() {\n" " print(exp(x) - 1.0);\n" @@ -1280,7 +1279,7 @@ class TestFunctions : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:2]: (style) Expression 'exp(x) - 1' can be replaced by 'expm1(x)' to avoid loss of precision.\n" "[test.cpp:3]: (style) Expression 'log(1 + x)' can be replaced by 'log1p(x)' to avoid loss of precision.\n" - "[test.cpp:4]: (style) Expression '1 - erf(x)' can be replaced by 'erfc(x)' to avoid loss of precision.\n", errout.str()); + "[test.cpp:4]: (style) Expression '1 - erf(x)' can be replaced by 'erfc(x)' to avoid loss of precision.\n", errout_str()); check("void foo() {\n" " print(exp(3 + x*f(a)) - 1);\n" @@ -1289,13 +1288,13 @@ class TestFunctions : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:2]: (style) Expression 'exp(x) - 1' can be replaced by 'expm1(x)' to avoid loss of precision.\n" "[test.cpp:3]: (style) Expression 'log(1 + x)' can be replaced by 'log1p(x)' to avoid loss of precision.\n" - "[test.cpp:4]: (style) Expression '1 - erf(x)' can be replaced by 'erfc(x)' to avoid loss of precision.\n", errout.str()); + "[test.cpp:4]: (style) Expression '1 - erf(x)' can be replaced by 'erfc(x)' to avoid loss of precision.\n", errout_str()); check("void foo() {\n" " print(2*exp(x) - 1);\n" " print(1 - erf(x)/2.0);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void checkIgnoredReturnValue() { @@ -1312,67 +1311,67 @@ class TestFunctions : public TestFixture { check("void foo() {\n" " mystrcmp(a, b);\n" "}", "test.cpp", &settings2); - ASSERT_EQUALS("[test.cpp:2]: (warning) Return value of function mystrcmp() is not used.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Return value of function mystrcmp() is not used.\n", errout_str()); check("void foo() {\n" " foo::mystrcmp(a, b);\n" "}", "test.cpp", &settings2); - ASSERT_EQUALS("[test.cpp:2]: (warning) Return value of function foo::mystrcmp() is not used.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Return value of function foo::mystrcmp() is not used.\n", errout_str()); check("void f() {\n" " foo x;\n" " x.mystrcmp(a, b);\n" "}", "test.cpp", &settings2); - ASSERT_EQUALS("[test.cpp:3]: (warning) Return value of function x.mystrcmp() is not used.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Return value of function x.mystrcmp() is not used.\n", errout_str()); check("bool mystrcmp(char* a, char* b);\n" // cppcheck sees a custom strcmp definition, but it returns a value. Assume it is the one specified in the library. "void foo() {\n" " mystrcmp(a, b);\n" "}", "test.cpp", &settings2); - ASSERT_EQUALS("[test.cpp:3]: (warning) Return value of function mystrcmp() is not used.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Return value of function mystrcmp() is not used.\n", errout_str()); check("void mystrcmp(char* a, char* b);\n" // cppcheck sees a custom strcmp definition which returns void! "void foo() {\n" " mystrcmp(a, b);\n" "}", "test.cpp", &settings2); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() {\n" " class mystrcmp { mystrcmp() {} };\n" // strcmp is a constructor definition here "}", "test.cpp", &settings2); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() {\n" " return mystrcmp(a, b);\n" "}", "test.cpp", &settings2); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() {\n" " return foo::mystrcmp(a, b);\n" "}", "test.cpp", &settings2); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() {\n" " if(mystrcmp(a, b));\n" "}", "test.cpp", &settings2); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() {\n" " bool b = mystrcmp(a, b);\n" "}", "test.cpp", &settings2); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #6194 check("void foo() {\n" " MyStrCmp mystrcmp(x, y);\n" "}", "test.cpp", &settings2); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #6197 check("void foo() {\n" " abc::def.mystrcmp(a,b);\n" "}", "test.cpp", &settings2); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #6233 check("int main() {\n" @@ -1383,25 +1382,25 @@ class TestFunctions : public TestFixture { " lambda(13.3);\n" " return 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #6669 check("void foo(size_t size) {\n" " void * res{malloc(size)};\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #7447 check("void foo() {\n" " int x{mystrcmp(a,b)};\n" "}", "test.cpp", &settings2); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #7905 check("void foo() {\n" " int x({mystrcmp(a,b)});\n" "}", "test.cpp", &settings2); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() {\n" // don't crash " DEBUG(123)(mystrcmp(a,b))(fd);\n" @@ -1420,14 +1419,14 @@ class TestFunctions : public TestFixture { ASSERT_EQUALS("[test.cpp:4]: (warning) Return value of function testfunc1() is not used.\n" "[test.cpp:4]: (warning) Return value of function testfunc2() is not used.\n" "[test.cpp:8]: (warning) Return value of function TestStruct1.testfunc1() is not used.\n" - "[test.cpp:9]: (warning) Return value of function TestStruct1.testfunc2() is not used.\n", errout.str()); + "[test.cpp:9]: (warning) Return value of function TestStruct1.testfunc2() is not used.\n", errout_str()); // #9006 check("template uint8_t b(std::tuple d) {\n" " std::tuple c{std::move(d)};\n" " return std::get<0>(c);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A { int x; };\n" "template \n" @@ -1435,18 +1434,18 @@ class TestFunctions : public TestFixture { " return {std::move(x), static_cast(xs)...};\n" "}\n" "A g() { return f(1); }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #8412 - unused operator result check("void foo() {\n" " !mystrcmp(a, b);\n" "}", "test.cpp", &settings2); - ASSERT_EQUALS("[test.cpp:2]: (warning) Return value of function mystrcmp() is not used.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Return value of function mystrcmp() is not used.\n", errout_str()); check("void f(std::vector v) {\n" " delete *v.begin();\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void checkIgnoredErrorCode() { @@ -1463,24 +1462,24 @@ class TestFunctions : public TestFixture { check("void foo() {\n" " mystrcmp(a, b);\n" "}", "test.cpp", &settings2); - ASSERT_EQUALS("[test.cpp:2]: (style) Error code from the return value of function mystrcmp() is not used.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Error code from the return value of function mystrcmp() is not used.\n", errout_str()); } void memsetZeroBytes() { check("void f() {\n" " memset(p, 10, 0x0);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) memset() called to fill 0 bytes.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) memset() called to fill 0 bytes.\n", errout_str()); check("void f() {\n" " memset(p, sizeof(p), 0);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) memset() called to fill 0 bytes.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) memset() called to fill 0 bytes.\n", errout_str()); check("void f() {\n" " memset(p, sizeof(p), i);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #6269 false positives in case of overloaded standard library functions check("class c {\n" @@ -1489,13 +1488,13 @@ class TestFunctions : public TestFixture { " memset( 0 );\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #7285 check("void f() {\n" " memset(&tm, sizeof(tm), 0);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) memset() called to fill 0 bytes.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) memset() called to fill 0 bytes.\n", errout_str()); } @@ -1507,26 +1506,26 @@ class TestFunctions : public TestFixture { " memset(is2, 0.1f, 40);\n" "}"); ASSERT_EQUALS("[test.cpp:3]: (portability) The 2nd memset() argument '1.0f' is a float, its representation is implementation defined.\n" - "[test.cpp:5]: (portability) The 2nd memset() argument '0.1f' is a float, its representation is implementation defined.\n", errout.str()); + "[test.cpp:5]: (portability) The 2nd memset() argument '0.1f' is a float, its representation is implementation defined.\n", errout_str()); check("void f() {\n" " int* is = new int[10];\n" " float g = computeG();\n" " memset(is, g, 40);\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (portability) The 2nd memset() argument 'g' is a float, its representation is implementation defined.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (portability) The 2nd memset() argument 'g' is a float, its representation is implementation defined.\n", errout_str()); check("void f() {\n" " int* is = new int[10];\n" " memset(is, 0.0f, 40);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" // FP " float x = 2.3f;\n" " memset(a, (x?64:0), 40);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " short ss[] = {1, 2};\n" @@ -1535,7 +1534,7 @@ class TestFunctions : public TestFixture { " memset(ss2, -129, 4);\n" "}"); ASSERT_EQUALS("[test.cpp:3]: (warning) The 2nd memset() argument '256' doesn't fit into an 'unsigned char'.\n" - "[test.cpp:5]: (warning) The 2nd memset() argument '-129' doesn't fit into an 'unsigned char'.\n", errout.str()); + "[test.cpp:5]: (warning) The 2nd memset() argument '-129' doesn't fit into an 'unsigned char'.\n", errout_str()); check("void f() {\n" " int is[10];\n" @@ -1549,19 +1548,19 @@ class TestFunctions : public TestFixture { " char cs3[30];\n" " memset(cs3, 0, 30);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " int is[10];\n" " const int i = g();\n" " memset(is, 1.0f + i, 40);\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (portability) The 2nd memset() argument '1.0f+i' is a float, its representation is implementation defined.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (portability) The 2nd memset() argument '1.0f+i' is a float, its representation is implementation defined.\n", errout_str()); } void checkMissingReturn() { check("int f() {}"); - ASSERT_EQUALS("[test.cpp:1]: (error) Found an exit path from function with non-void return type that has missing return statement\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (error) Found an exit path from function with non-void return type that has missing return statement\n", errout_str()); { const char code[] = "int main(void) {}"; @@ -1569,30 +1568,30 @@ class TestFunctions : public TestFixture { const Settings s = settingsBuilder().c(Standards::C89).build(); check(code, "test.c", &s); // c code (c89) - ASSERT_EQUALS("[test.c:1]: (error) Found an exit path from function with non-void return type that has missing return statement\n", errout.str()); + ASSERT_EQUALS("[test.c:1]: (error) Found an exit path from function with non-void return type that has missing return statement\n", errout_str()); } { const Settings s = settingsBuilder().c(Standards::C99).build(); check(code, "test.c", &s); // c code (c99) - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check(code, "test.cpp", &s); // c++ code - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } } check("F(A,B) { x=1; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("auto foo4() -> void {}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void STDCALL foo() {}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void operator=(int y) { x=y; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f() {\n" "back:\n" @@ -1601,21 +1600,21 @@ class TestFunctions : public TestFixture { " x=y;\n" " goto back;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // unreachable code.. check("int foo(int x) {\n" " return 1;\n" " (void)x;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int foo(int x) {\n" " if (x) goto out;\n" " return 1;\n" "out:\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Found an exit path from function with non-void return type that has missing return statement\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Found an exit path from function with non-void return type that has missing return statement\n", errout_str()); // switch check("int f() {\n" @@ -1624,7 +1623,7 @@ class TestFunctions : public TestFixture { " case 2: return 1;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Found an exit path from function with non-void return type that has missing return statement\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Found an exit path from function with non-void return type that has missing return statement\n", errout_str()); check("int f() {\n" " switch (x) {\n" @@ -1632,7 +1631,7 @@ class TestFunctions : public TestFixture { " default: return 1;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool test(unsigned char v1, int v2) {\n" " switch (v1) {\n" @@ -1646,7 +1645,7 @@ class TestFunctions : public TestFixture { " return true;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // if/else check("int f(int x) {\n" @@ -1654,7 +1653,7 @@ class TestFunctions : public TestFixture { " return 1;\n" " }\n" // <- error (missing else) "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Found an exit path from function with non-void return type that has missing return statement\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Found an exit path from function with non-void return type that has missing return statement\n", errout_str()); check("int f(int x) {\n" " if (x) {\n" @@ -1663,19 +1662,19 @@ class TestFunctions : public TestFixture { " return 1;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Found an exit path from function with non-void return type that has missing return statement\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Found an exit path from function with non-void return type that has missing return statement\n", errout_str()); check("int f() {\n" " if (!0) {\n" " return 1;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f() {\n" " if (!0) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (error) Found an exit path from function with non-void return type that has missing return statement\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (error) Found an exit path from function with non-void return type that has missing return statement\n", errout_str()); // loop check("int f(int x) {\n" @@ -1683,7 +1682,7 @@ class TestFunctions : public TestFixture { " dostuff();\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // return {..} check("std::pair typeDecl(int tok) {\n" @@ -1692,20 +1691,20 @@ class TestFunctions : public TestFixture { " else\n" " return {1, 2};\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // noreturn function check("int f(int x) { exit(0); }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f(int x) { assert(0); }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f(int x) { if (x) return 1; else return bar({1}, {}); }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("auto f() -> void {}"); // #10342 - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S1 {\n" // #7433 " S1& operator=(const S1& r) { if (this != &r) { i = r.i; } }\n" @@ -1721,84 +1720,84 @@ class TestFunctions : public TestFixture { "};\n"); ASSERT_EQUALS("[test.cpp:2]: (error) Found an exit path from function with non-void return type that has missing return statement\n" "[test.cpp:10]: (error) Found an exit path from function with non-void return type that has missing return statement\n", - errout.str()); + errout_str()); // #11171 check("std::enable_if_t f() {}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("std::enable_if_t f() {}"); ASSERT_EQUALS( "[test.cpp:1]: (error) Found an exit path from function with non-void return type that has missing return statement\n", - errout.str()); + errout_str()); check("template std::enable_if_t{}, int> f(T) {}"); ASSERT_EQUALS( "[test.cpp:1]: (error) Found an exit path from function with non-void return type that has missing return statement\n", - errout.str()); + errout_str()); check("template std::enable_if_t{}> f(T) {}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("typename std::enable_if::type f() {}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("typename std::enable_if::type f() {}"); ASSERT_EQUALS( "[test.cpp:1]: (error) Found an exit path from function with non-void return type that has missing return statement\n", - errout.str()); + errout_str()); check("template typename std::enable_if{}, int>::type f(T) {}"); ASSERT_EQUALS( "[test.cpp:1]: (error) Found an exit path from function with non-void return type that has missing return statement\n", - errout.str()); + errout_str()); check("template typename std::enable_if{}>::type f(T) {}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S {\n" " [[noreturn]] void f();\n" " int g() { this->f(); }\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S { [[noreturn]] void f(); };\n" "int g(S& s) { s.f(); }\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } // NRVO check void returnLocalStdMove1() { check("struct A{}; A f() { A var; return std::move(var); }"); ASSERT_EQUALS("[test.cpp:1]: (performance) Using std::move for returning object by-value from function will affect copy elision optimization." - " More: https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Rf-return-move-local\n", errout.str()); + " More: https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Rf-return-move-local\n", errout_str()); } // RVO, C++03 ctor style void returnLocalStdMove2() { check("struct A{}; A f() { return std::move( A() ); }"); ASSERT_EQUALS("[test.cpp:1]: (performance) Using std::move for returning object by-value from function will affect copy elision optimization." - " More: https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Rf-return-move-local\n", errout.str()); + " More: https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Rf-return-move-local\n", errout_str()); } // RVO, new ctor style void returnLocalStdMove3() { check("struct A{}; A f() { return std::move(A{}); }"); ASSERT_EQUALS("[test.cpp:1]: (performance) Using std::move for returning object by-value from function will affect copy elision optimization." - " More: https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Rf-return-move-local\n", errout.str()); + " More: https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Rf-return-move-local\n", errout_str()); } // Function argument void returnLocalStdMove4() { check("struct A{}; A f(A a) { return std::move(A{}); }"); ASSERT_EQUALS("[test.cpp:1]: (performance) Using std::move for returning object by-value from function will affect copy elision optimization." - " More: https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Rf-return-move-local\n", errout.str()); + " More: https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Rf-return-move-local\n", errout_str()); } void returnLocalStdMove5() { check("struct A{} a; A f1() { return std::move(a); }\n" "A f2() { volatile A var; return std::move(var); }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S { std::string msg{ \"abc\" }; };\n" "std::unique_ptr get(std::vector>& v) {\n" @@ -1810,13 +1809,13 @@ class TestFunctions : public TestFixture { " auto p = get(v);\n" " std::cout << p->msg;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("std::string&& f() {\n" // #11881 " std::string s;\n" " return std::move(s);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void negativeMemoryAllocationSizeError() { // #389 @@ -1825,7 +1824,7 @@ class TestFunctions : public TestFixture { " a = malloc( -10 );\n" " free(a);\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Invalid malloc() argument nr 1. The value is -10 but the valid values are '0:'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Invalid malloc() argument nr 1. The value is -10 but the valid values are '0:'.\n", errout_str()); check("void f() {\n" " int *a;\n" @@ -1833,7 +1832,7 @@ class TestFunctions : public TestFixture { " free(a);\n" "}"); ASSERT_EQUALS("[test.cpp:3]: (warning) Obsolete function 'alloca' called.\n" - "[test.cpp:3]: (error) Invalid alloca() argument nr 1. The value is -10 but the valid values are '0:'.\n", errout.str()); + "[test.cpp:3]: (error) Invalid alloca() argument nr 1. The value is -10 but the valid values are '0:'.\n", errout_str()); } void checkLibraryMatchFunctions() { @@ -1843,12 +1842,12 @@ class TestFunctions : public TestFixture { check("void f() {\n" " lib_func();" "}", "test.cpp", &s); - ASSERT_EQUALS("[test.cpp:2]: (information) --check-library: There is no matching configuration for function lib_func()\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (information) --check-library: There is no matching configuration for function lib_func()\n", errout_str()); check("void f(void* v) {\n" " lib_func(v);" "}", "test.cpp", &s); - ASSERT_EQUALS("[test.cpp:2]: (information) --check-library: There is no matching configuration for function lib_func()\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (information) --check-library: There is no matching configuration for function lib_func()\n", errout_str()); // #10105 check("class TestFixture {\n" @@ -1864,7 +1863,7 @@ class TestFunctions : public TestFixture { " void testFunctionReturnType() {\n" " }\n" "};", "test.cpp", &s); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #11183 check("#include \n" @@ -1874,7 +1873,7 @@ class TestFunctions : public TestFixture { "void f() {\n" " cb(std::string(\"\"));\n" "}", "test.cpp", &s); - TODO_ASSERT_EQUALS("", "[test.cpp:6]: (information) --check-library: There is no matching configuration for function cb()\n", errout.str()); + TODO_ASSERT_EQUALS("", "[test.cpp:6]: (information) --check-library: There is no matching configuration for function cb()\n", errout_str()); // #7375 check("void f() {\n" @@ -1882,38 +1881,38 @@ class TestFunctions : public TestFixture { " size_t s = sizeof(S);\n" " static_assert(s == 9);\n" "}\n", "test.cpp", &s); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(char) {}\n" "void g() {\n" " f(int8_t(1));\n" "}\n", "test.cpp", &s); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(std::uint64_t& u) {\n" " u = std::uint32_t(u) * std::uint64_t(100);\n" "}\n", "test.cpp", &s); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() { throw(1); }\n", "test.cpp", &s); // #8958 - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("using namespace std;\n" "void f() { throw range_error(\"abc\"); }\n", "test.cpp", &s); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class C {\n" // #9002 "public:\n" " static int f() { return 1; }\n" "};\n" "void g() { C::f(); }\n", "test.cpp", &s); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(const std::vector& v) {\n" // #11223 " for (const auto& s : v)\n" " s.find(\"\");\n" "}\n", "test.cpp", &s); - ASSERT_EQUALS("[test.cpp:3]: (warning) Return value of function s.find() is not used.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Return value of function s.find() is not used.\n", errout_str()); check("void f() {\n" " auto* p = new std::vector(5);\n" @@ -1923,19 +1922,19 @@ class TestFunctions : public TestFixture { " auto* r = new std::vector;\n" " r->push_back(1);\n" "}\n", "test.cpp", &s); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " auto p = std::make_shared>();\n" " p->push_back(1);\n" "}\n", "test.cpp", &s); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(std::vector>& v) {\n" " auto it = v.begin();\n" " it->push_back(1);\n" "}\n", "test.cpp", &s); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " auto v = std::vector{};\n" @@ -1945,7 +1944,7 @@ class TestFunctions : public TestFixture { " auto x = std::vector(1);\n" " x.push_back(1);\n" "}\n", "test.cpp", &s); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " auto p(std::make_shared>());\n" @@ -1958,7 +1957,7 @@ class TestFunctions : public TestFixture { "[test.cpp:4]: (debug) auto token with no type.\n" "[test.cpp:3]: (information) --check-library: There is no matching configuration for function auto::push_back()\n" "[test.cpp:5]: (information) --check-library: There is no matching configuration for function auto::push_back()\n", - errout.str()); + errout_str()); check("struct F { void g(int); };\n" "void f(std::list& l) {\n" @@ -1966,14 +1965,14 @@ class TestFunctions : public TestFixture { " for (it = l.begin(); it != l.end(); ++it)\n" " it->g(0);\n" "}\n", "test.cpp", &s); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", filter_valueflow(errout_str())); check("auto f() {\n" " return std::runtime_error(\"abc\");\n" "}\n", "test.cpp", &s); TODO_ASSERT_EQUALS("", "[test.cpp:1]: (debug) auto token with no type.\n", - errout.str()); + errout_str()); check("struct S {\n" // #11543 " S() {}\n" @@ -1984,7 +1983,7 @@ class TestFunctions : public TestFixture { " for (const std::shared_ptr& c : v)\n" " c->f(i);\n" "}\n", "test.cpp", &s); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("namespace N {\n" " struct S { static const std::set s; };\n" @@ -1993,29 +1992,29 @@ class TestFunctions : public TestFixture { " const auto& t = N::S::s;\n" " if (t.find(\"abc\") != t.end()) {}\n" "}\n", "test.cpp", &s); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", filter_valueflow(errout_str())); check("void f(std::vector>>& v, int i, int j) {\n" " auto& s = v[i][j];\n" " s.insert(0);\n" "}\n", "test.cpp", &s); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f(const std::vector& v, int i, char c) {\n" " const auto& s = v[i];\n" " return s.find(c);\n" "}\n", "test.cpp", &s); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" // #11604 " int (*g)() = nullptr;\n" "}\n", "test.cpp", &s); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " INT (*g)() = nullptr;\n" "}\n", "test.cpp", &s); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct T;\n" "std::shared_ptr get();\n" @@ -2025,12 +2024,12 @@ class TestFunctions : public TestFixture { " p.reset(nullptr);\n" "}\n", "test.cpp", &s); ASSERT_EQUALS("[test.cpp:5]: (information) --check-library: There is no matching configuration for function T::h()\n", - errout.str()); + errout_str()); check("struct S : std::vector {\n" " void f(int i) { push_back(i); }\n" "};\n", "test.cpp", &s); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " auto g = []() -> std::string { return \"abc\"; };\n" @@ -2040,18 +2039,18 @@ class TestFunctions : public TestFixture { " auto t = h();\n" " if (t.at(0)) {}\n" "};\n", "test.cpp", &s); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", filter_valueflow(errout_str())); check("::std::string f(const char* c) {\n" // #12365 " return ::std::string(c);\n" "}\n", "test.cpp", &s); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("template \n" "struct S : public std::vector {\n" " void resize(size_t n) { std::vector::resize(n); }\n" "};\n", "test.cpp", &s); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void checkUseStandardLibrary1() { @@ -2060,7 +2059,7 @@ class TestFunctions : public TestFixture { " for (i = 0; count > i; ++i)\n" " (reinterpret_cast(dest))[i] = (reinterpret_cast(src))[i];\n" "}\n"); - ASSERT_EQUALS("[test.cpp:4]: (style) Consider using std::memcpy instead of loop.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Consider using std::memcpy instead of loop.\n", errout_str()); } void checkUseStandardLibrary2() { @@ -2068,7 +2067,7 @@ class TestFunctions : public TestFixture { " for (size_t i = 0; i < count; i++) {\n" " (reinterpret_cast(dest))[i] = (reinterpret_cast(src))[i];\n" "}}\n"); - ASSERT_EQUALS("[test.cpp:3]: (style) Consider using std::memcpy instead of loop.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Consider using std::memcpy instead of loop.\n", errout_str()); } void checkUseStandardLibrary3() { @@ -2077,7 +2076,7 @@ class TestFunctions : public TestFixture { " for (i = 0; count > i; i++)\n" " ((char*)dst)[i] = ((const char*)src)[i];\n" "}\n"); - ASSERT_EQUALS("[test.cpp:4]: (style) Consider using std::memcpy instead of loop.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Consider using std::memcpy instead of loop.\n", errout_str()); } void checkUseStandardLibrary4() { @@ -2085,7 +2084,7 @@ class TestFunctions : public TestFixture { " for (size_t i = 0; i < size; i += 1) {\n" " ((int8_t*)dst)[i] = ((int8_t*)src)[i];\n" "}}\n"); - ASSERT_EQUALS("[test.cpp:3]: (style) Consider using std::memcpy instead of loop.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Consider using std::memcpy instead of loop.\n", errout_str()); } // different indexes @@ -2094,7 +2093,7 @@ class TestFunctions : public TestFixture { " for (size_t i = 0; i < size; ++i) {\n" " ((int8_t*)dst)[i] = ((int8_t*)src)[from_idx];\n" "}}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } // unknown count @@ -2103,7 +2102,7 @@ class TestFunctions : public TestFixture { " for (size_t i = 0; ((int8_t*)src)[i] != 0; ++i) {\n" " ((int8_t*)dst)[i] = ((int8_t*)src)[i];\n" "}}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } // increment with 2 @@ -2112,7 +2111,7 @@ class TestFunctions : public TestFixture { " for (size_t i = 0; i < size; i += 2) {\n" " ((int8_t*)dst)[i] = ((int8_t*)src)[i];\n" "}}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } // right argument of assignment could be static_cast, functional cast, c-style and implicit cast @@ -2123,7 +2122,7 @@ class TestFunctions : public TestFixture { " for (i = 0; i < count; ++i)\n" " (reinterpret_cast(dest))[i] = static_cast(0);\n" "}\n"); - ASSERT_EQUALS("[test.cpp:4]: (style) Consider using std::memset instead of loop.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Consider using std::memset instead of loop.\n", errout_str()); } void checkUseStandardLibrary9() { @@ -2131,7 +2130,7 @@ class TestFunctions : public TestFixture { " for (size_t i = 0; i < count; i++) {\n" " (reinterpret_cast(dest))[i] = (static_cast(0));\n" "}}\n"); - ASSERT_EQUALS("[test.cpp:3]: (style) Consider using std::memset instead of loop.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Consider using std::memset instead of loop.\n", errout_str()); } void checkUseStandardLibrary10() { @@ -2140,7 +2139,7 @@ class TestFunctions : public TestFixture { " for (i = 0; i < size; i++)\n" " ((char*)dst)[i] = (const char)0;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:4]: (style) Consider using std::memset instead of loop.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Consider using std::memset instead of loop.\n", errout_str()); } void checkUseStandardLibrary11() { @@ -2148,7 +2147,7 @@ class TestFunctions : public TestFixture { " for (size_t i = 0; i < size; i += 1) {\n" " ((int8_t*)dst)[i] = ((int8_t)0);\n" "}}\n"); - ASSERT_EQUALS("[test.cpp:3]: (style) Consider using std::memset instead of loop.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Consider using std::memset instead of loop.\n", errout_str()); } void checkUseStandardLibrary12() { @@ -2156,7 +2155,7 @@ class TestFunctions : public TestFixture { " for (size_t i = 0; i < size; i += 1) {\n" " ((int8_t*)dst)[i] = 42;\n" "}}\n"); - ASSERT_EQUALS("[test.cpp:3]: (style) Consider using std::memset instead of loop.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Consider using std::memset instead of loop.\n", errout_str()); } void checkUseStandardLibrary13() { @@ -2164,7 +2163,7 @@ class TestFunctions : public TestFixture { " for (size_t i = 0; i < count; i++) {\n" " reinterpret_cast(dest)[i] = '0';\n" "}}\n"); - ASSERT_EQUALS("[test.cpp:3]: (style) Consider using std::memset instead of loop.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Consider using std::memset instead of loop.\n", errout_str()); } void checkUseStandardLibrary14() { @@ -2172,7 +2171,7 @@ class TestFunctions : public TestFixture { " for (size_t i = 0; i < sizeof(int)*(15 + 42/2 - 7); i++) {\n" " reinterpret_cast(dest)[i] = '0';\n" "}}\n"); - ASSERT_EQUALS("[test.cpp:3]: (style) Consider using std::memset instead of loop.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Consider using std::memset instead of loop.\n", errout_str()); } }; diff --git a/test/testgarbage.cpp b/test/testgarbage.cpp index 639b931e7e08..b84e9607275c 100644 --- a/test/testgarbage.cpp +++ b/test/testgarbage.cpp @@ -285,8 +285,6 @@ class TestGarbage : public TestFixture { } std::string checkCodeInternal_(const std::string &code, const char* filename, const char* file, int line) { - errout.str(""); - Preprocessor preprocessor(settings); // tokenize.. @@ -321,11 +319,10 @@ class TestGarbage : public TestFixture { const char code[] = "class __declspec(dllexport) x final { };"; { - errout.str(""); Tokenizer tokenizer(settings, this); std::istringstream istr(code); ASSERT(tokenizer.tokenize(istr, "test.cpp")); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } } @@ -333,7 +330,7 @@ class TestGarbage : public TestFixture { { const char code[] ="TR(kvmpio, PROTO(int rw), ARGS(rw), TP_(aa->rw;))"; ASSERT_THROW(checkCode(code), InternalError); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { @@ -357,6 +354,7 @@ class TestGarbage : public TestFixture { // don't segfault.. ASSERT_THROW(checkCode(code), InternalError); + (void)errout_str(); // we are not interested in the output } @@ -403,18 +401,16 @@ class TestGarbage : public TestFixture { const char code[] = "class x y { };"; { - errout.str(""); Tokenizer tokenizer(settings, this); std::istringstream istr(code); ASSERT(tokenizer.tokenize(istr, "test.c")); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { - errout.str(""); Tokenizer tokenizer(settings, this); std::istringstream istr(code); ASSERT(tokenizer.tokenize(istr, "test.cpp")); - ASSERT_EQUALS("[test.cpp:1]: (information) The code 'class x y {' is not handled. You can use -I or --include to add handling of this code.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (information) The code 'class x y {' is not handled. You can use -I or --include to add handling of this code.\n", errout_str()); } } @@ -498,6 +494,7 @@ class TestGarbage : public TestFixture { void garbageCode12() { // do not crash checkCode("{ g; S (void) { struct } { } int &g; }"); + (void)errout_str(); // we do not care about the output } void garbageCode13() { @@ -565,6 +562,7 @@ class TestGarbage : public TestFixture { " cptr = (char *)buffer;\n" " cptr += (-(long int) buffer & (16 * sizeof (float) - 1));\n" "}\n"), InternalError); + (void)errout_str(); // we do not care about the output } void garbageCode25() { @@ -599,6 +597,7 @@ class TestGarbage : public TestFixture { " int a;\n" " R1 () : a { }\n" "};"); + (void)errout_str(); // we do not care about the output } void garbageCode30() { @@ -606,6 +605,7 @@ class TestGarbage : public TestFixture { checkCode("void f(int x) {\n" " x = 42\n" "}"); + (void)errout_str(); // we do not care about the output } void garbageCode31() { @@ -675,6 +675,7 @@ class TestGarbage : public TestFixture { void garbageCode46() { // #6705 checkCode(" { bar(char *x); void foo (int ...) { struct } va_list ap; va_start(ap, size); va_arg(ap, (d)); }"); + (void)errout_str(); // we do not care about the output } void garbageCode47() { // #6706 @@ -683,6 +684,7 @@ class TestGarbage : public TestFixture { void garbageCode48() { // #6712 checkCode(" { d\" ) d ...\" } int main ( ) { ( ) catch ( A a ) { { } catch ( ) \"\" } }"); + (void)errout_str(); // we do not care about the output } void garbageCode49() { // #6715 @@ -773,6 +775,7 @@ class TestGarbage : public TestFixture { void garbageCode74() { // #6751 ASSERT_THROW(checkCode("_lenraw(const char* digits) { } typedef decltype(sizeof(0)) { } operator"), InternalError); + (void)errout_str(); // we do not care about the output } void garbageCode76() { // #6754 @@ -785,6 +788,7 @@ class TestGarbage : public TestFixture { void garbageCode78() { // #6756 ASSERT_THROW(checkCode("( ) { [ ] } ( ) { } const_array_of_int ( ) { } typedef int A [ ] [ ] ; A a = { { } { } }"), InternalError); + (void)errout_str(); // we do not care about the output } void garbageCode79() { // #6757 @@ -882,6 +886,7 @@ class TestGarbage : public TestFixture { void garbageCode102() { // #6846 checkCode("struct Object { ( ) ; Object & operator= ( Object ) { ( ) { } if ( this != & b ) } }"); + (void)errout_str(); // we do not care about the output } void garbageCode103() { // #6824 @@ -910,6 +915,7 @@ class TestGarbage : public TestFixture { void garbageCode109() { // #6900 "segmentation fault (invalid code) in CheckStl::runSimplifiedChecks" checkCode("( *const<> (( ) ) { } ( *const ( ) ( ) ) { } ( * const<> ( size_t )) ) { } ( * const ( ) ( ) ) { }"); + (void)errout_str(); // we do not care about the output } void garbageCode110() { // #6902 "segmentation fault (invalid code) in CheckStl::string_c_str" @@ -956,13 +962,14 @@ class TestGarbage : public TestFixture { void garbageCode119() { // #5598 checkCode("{ { void foo() { struct }; template struct S { Used x; void bar() } auto f = [this] { }; } };"); + (void)errout_str(); // we do not care about the output } void garbageCode120() { // #4927 checkCode("int main() {\n" " return 0\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void garbageCode121() { // #2585 @@ -976,6 +983,7 @@ class TestGarbage : public TestFixture { "char *a = malloc(10);\n" "a[0]\n" "}"); + (void)errout_str(); // we do not care about the output } void garbageCode123() { @@ -984,6 +992,7 @@ class TestGarbage : public TestFixture { " C tpl_mem(T *) { return }\n" " };\n" "}"); + (void)errout_str(); // we do not care about the output } void garbageCode125() { @@ -1007,6 +1016,7 @@ class TestGarbage : public TestFixture { "};\n" " const A& foo(const A& arg) { return arg; }\n" " foo(A(12)).Var"); + (void)errout_str(); // we do not care about the output } void garbageCode128() { @@ -1095,6 +1105,7 @@ class TestGarbage : public TestFixture { "template struct X {}; " "X<&S::i, int> x = X<&S::i, int>(); " "X<&S::j, int> y = X<&S::j, int>();"); + (void)errout_str(); // we are not interested in the output checkCode("template struct A {}; " "template <> struct A {}; " "void foo(const void* f = 0) {}"); @@ -1112,6 +1123,7 @@ class TestGarbage : public TestFixture { " static int i; " "}; " "void f() { A::i = 0; }"); + (void)errout_str(); // we are not interested in the output } void garbageCode135() { // #4994 @@ -1120,6 +1132,7 @@ class TestGarbage : public TestFixture { "}\n" "long a = 1 ;\n" "long b = 2 ;"); + (void)errout_str(); // we are not interested in the output } void garbageCode136() { // #7033 @@ -1141,6 +1154,7 @@ class TestGarbage : public TestFixture { " } halo;\n" "}\n" "CS_PLUGIN_NAMESPACE_END(csparser)"); + (void)errout_str(); // we are not interested in the output } void garbageCode139() { // #6659 heap user after free: kernel: sm750_accel.c @@ -1161,6 +1175,7 @@ class TestGarbage : public TestFixture { void garbageCode142() { // #7050 checkCode("{ } ( ) { void mapGraphs ( ) { node_t * n ; for (!oid n ) { } } } { }"); + (void)errout_str(); // we are not interested in the output } void garbageCode143() { // #6922 @@ -1240,6 +1255,7 @@ class TestGarbage : public TestFixture { "static std::string foo(char *Bla) {\n" " while (Bla[1] && Bla[1] != ',') }\n"; checkCode(code); + (void)errout_str(); // we are not interested in the output } void garbageCode153() { @@ -1297,6 +1313,7 @@ class TestGarbage : public TestFixture { code = "void f1() { for (int n = 0 n < 10 n++); }"; checkCode(code); + (void)errout_str(); // we are not interested in the output } void garbageSymbolDatabase() { @@ -1311,6 +1328,7 @@ class TestGarbage : public TestFixture { " case YY_STATE_EOF(block):\n" " yyterminate();\n" "} }"); // #5663 + (void)errout_str(); // we are not interested in the output } void garbageAST() { @@ -1381,6 +1399,7 @@ class TestGarbage : public TestFixture { "typedef something_like_tuple something_like_tuple_t;\n" "SA ((is_last::value == false));\n" "SA ((is_last::value == false));"); + (void)errout_str(); // we are not interested in the output checkCode( // #6225 "template \n" @@ -1476,6 +1495,7 @@ class TestGarbage : public TestFixture { void garbageCode176() { // #7527 checkCode("class t { { struct } enum class f : unsigned { q } b ; operator= ( T ) { switch ( b ) { case f::q: } } { assert ( b ) ; } } { ; & ( t ) ( f::t ) ; } ;"); + (void)errout_str(); // we are not interested in the output } void garbageCode181() { @@ -1508,6 +1528,7 @@ class TestGarbage : public TestFixture { " return bStatus;\n" " };\n" "}"); + (void)errout_str(); // we are not interested in the output } // #8151 - segfault due to incorrect template syntax @@ -1641,6 +1662,7 @@ class TestGarbage : public TestFixture { ": wxCommandEvent ( Event )\n" ", m_SnippetID ( 0 ) {\n" "}"); // don't crash + (void)errout_str(); // we are not interested in the output } void garbageCode206() { @@ -1700,6 +1722,7 @@ class TestGarbage : public TestFixture { void garbageCode218() { // #8763 checkCode("d f(){t n0000 const[]n0000+0!=n0000,(0)}"); // don't crash + (void)errout_str(); // we are not interested in the output } void garbageCode219() { // #10101 checkCode("typedef void (*func) (addr) ;\n" @@ -1707,6 +1730,7 @@ class TestGarbage : public TestFixture { " func f;\n" " f & = (func)42;\n" "}\n"); // don't crash + (void)errout_str(); // we are not interested in the output } void garbageCode220() { // #6832 ASSERT_THROW(checkCode("(){(){{()}}return;{switch()0 case(){}break;l:()}}\n"), InternalError); // don't crash @@ -1722,6 +1746,7 @@ class TestGarbage : public TestFixture { } void garbageCode224() { checkCode("void f(){ auto* b = dynamic_cast typedef name5 | ( , ;){ } (); }"), InternalError); // #9067 ASSERT_THROW(checkCode("void f() { x= {}( ) ( 'x')[ ] (); }"), InternalError); // #9068 ASSERT_THROW(checkCode("void f() { x= y{ } name5 y[ ] + y ^ name5 ^ name5 for ( ( y y y && y y y && name5 ++ int )); }"), InternalError); // #9069 @@ -1803,6 +1829,7 @@ class TestGarbage : public TestFixture { "bool bReturn(false);\n" "}\n" "};")); + (void)errout_str(); // we are not interested in the output } void enumTrailingComma() { @@ -1820,6 +1847,7 @@ class TestGarbage : public TestFixture { "template< class Predicate > int\n" "List::DeleteIf( const Predicate &pred )\n" "{}"); + (void)errout_str(); // we are not interested in the output // #8749 checkCode( diff --git a/test/testincompletestatement.cpp b/test/testincompletestatement.cpp index 6e25f14ee9d7..4be5ef1838ca 100644 --- a/test/testincompletestatement.cpp +++ b/test/testincompletestatement.cpp @@ -36,9 +36,6 @@ class TestIncompleteStatement : public TestFixture { #define check(...) check_(__FILE__, __LINE__, __VA_ARGS__) void check_(const char* file, int line, const char code[], bool inconclusive = false) { - // Clear the error buffer.. - errout.str(""); - const Settings settings1 = settingsBuilder(settings).certainty(Certainty::inconclusive, inconclusive).build(); std::vector files(1, "test.cpp"); @@ -92,7 +89,7 @@ class TestIncompleteStatement : public TestFixture { " \"abc\";\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void test2() { @@ -101,7 +98,7 @@ class TestIncompleteStatement : public TestFixture { " \"abc\";\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Redundant code: Found a statement that begins with string constant.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Redundant code: Found a statement that begins with string constant.\n", errout_str()); } void test3() { @@ -110,7 +107,7 @@ class TestIncompleteStatement : public TestFixture { " const char *str[] = { \"abc\" };\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void test4() { @@ -124,7 +121,7 @@ class TestIncompleteStatement : public TestFixture { "};\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void test5() { @@ -133,7 +130,7 @@ class TestIncompleteStatement : public TestFixture { " 50;\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Redundant code: Found a statement that begins with numeric constant.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Redundant code: Found a statement that begins with numeric constant.\n", errout_str()); } void test6() { @@ -158,7 +155,7 @@ class TestIncompleteStatement : public TestFixture { " (void)c;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void test_numeric() { @@ -173,21 +170,21 @@ class TestIncompleteStatement : public TestFixture { " };\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void void0() { // #6327 check("void f() { (void*)0; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("#define X 0\n" "void f() { X; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void intarray() { check("int arr[] = { 100/2, 1*100 };"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void structarraynull() { @@ -195,7 +192,7 @@ class TestIncompleteStatement : public TestFixture { " { 100/2, 1*100 }\n" " { 90, 70 }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void structarray() { @@ -203,14 +200,14 @@ class TestIncompleteStatement : public TestFixture { " { 100/2, 1*100 }\n" " { 90, 70 }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void conditionalcall() { check("void f() {\n" " 0==x ? X() : Y();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void structinit() { @@ -218,7 +215,7 @@ class TestIncompleteStatement : public TestFixture { check("void f() {\n" " ABC abc{1,2,3};\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #6260 - C++11 array initialization check("void foo() {\n" @@ -226,30 +223,30 @@ class TestIncompleteStatement : public TestFixture { " {\"b\", \"\"},\n" " };\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #2482 - false positive for empty struct check("struct A {};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #4387 - C++11 initializer list check("A::A() : abc{0} {}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #5042 - C++11 initializer list check("A::A() : abc::def{0} {}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #4503 - vector init check("void f() { vector v{1}; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void returnstruct() { check("struct s foo() {\n" " return (struct s){0,0};\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #4754 check("unordered_map foo() {\n" @@ -258,19 +255,19 @@ class TestIncompleteStatement : public TestFixture { " {\"happy\", \"sad\"}\n" " };\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct s foo() {\n" " return (struct s){0};\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void cast() { check("void f() {\n" " ((struct foo *)(0x1234))->xy = 1;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool f(const std::exception& e) {\n" // #10918 " try {\n" @@ -281,7 +278,7 @@ class TestIncompleteStatement : public TestFixture { " return false;\n" " }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void increment() { @@ -289,26 +286,26 @@ class TestIncompleteStatement : public TestFixture { " int x = 1;\n" " x++, x++;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void cpp11init() { check("void f() {\n" " int x{1};\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("std::vector f(int* p) {\n" " return std::vector({ p[0] });\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void cpp11init2() { check("x handlers{\n" " { \"mode2\", []() { return 2; } },\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void cpp11init3() { @@ -316,33 +313,33 @@ class TestIncompleteStatement : public TestFixture { "void f() {\n" "A{}(0);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("template struct A { void operator()(int); };\n" "void f() {\n" "A{}(0);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void block() { check("void f() {\n" " ({ do_something(); 0; });\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" "out:\n" " ({ do_something(); 0; });\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void mapindex() { check("void f() {\n" " map[{\"1\",\"2\"}]=0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void commaoperator1() { @@ -350,52 +347,52 @@ class TestIncompleteStatement : public TestFixture { "void f(int value) {\n" " foo(42,\"test\",42),(value&42);\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Found suspicious operator ',', result is not used.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Found suspicious operator ',', result is not used.\n", errout_str()); check("int f() {\n" // #11257 " int y;\n" " y = (3, 4);\n" " return y;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Found suspicious operator ',', result is not used.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Found suspicious operator ',', result is not used.\n", errout_str()); } void commaoperator2() { check("void f() {\n" " for(unsigned int a=0, b; a<10; a++ ) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void g();\n" // #10952 "bool f() {\n" " return (void)g(), false;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int a, int b, int c, int d) {\n" " Eigen::Vector4d V;\n" " V << a, b, c, d;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S { Eigen::Vector4d V; };\n" "struct T { int a, int b, int c, int d; };\n" "void f(S& s, const T& t) {\n" " s.V << t.a, t.b, t.c, t.d;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S { Eigen::Vector4d V[2]; };\n" "void f(int a, int b, int c, int d) {\n" " S s[1];\n" " s[0].V[1] << a, b, c, d;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " a.b[4][3].c()->d << x , y, z;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct V {\n" " Eigen::Vector3d& operator[](int i) { return v[i]; }\n" @@ -405,14 +402,14 @@ class TestIncompleteStatement : public TestFixture { "void V::f(int a, int b, int c) {\n" " (*this)[0] << a, b, c;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" // #11359 " struct S {\n" " S(int x, int y) {}\n" " } s(1, 2);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } // #8451 @@ -435,16 +432,16 @@ class TestIncompleteStatement : public TestFixture { "[test.cpp:7]: (warning, inconclusive) Found suspicious operator '!', result is not used.\n" "[test.cpp:8]: (warning) Redundant code: Found unused cast of expression '!x'.\n" "[test.cpp:9]: (warning, inconclusive) Found suspicious operator '~', result is not used.\n", - errout.str()); + errout_str()); check("void f1(int x) { x; }", true); - ASSERT_EQUALS("[test.cpp:1]: (warning) Unused variable value 'x'\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (warning) Unused variable value 'x'\n", errout_str()); check("void f() { if (Type t; g(t)) {} }"); // #9776 - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x) { static_cast(x); }"); - ASSERT_EQUALS("[test.cpp:1]: (warning) Redundant code: Found unused cast of expression 'x'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (warning) Redundant code: Found unused cast of expression 'x'.\n", errout_str()); check("void f(int x, int* p) {\n" " static_cast(x);\n" @@ -452,10 +449,10 @@ class TestIncompleteStatement : public TestFixture { " static_cast(p);\n" " (void*)p;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() { false; }"); // #10856 - ASSERT_EQUALS("[test.cpp:1]: (warning) Redundant code: Found a statement that begins with bool constant.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (warning) Redundant code: Found a statement that begins with bool constant.\n", errout_str()); check("void f(int i) {\n" " (float)(char)i;\n" @@ -465,7 +462,7 @@ class TestIncompleteStatement : public TestFixture { ASSERT_EQUALS("[test.cpp:2]: (warning) Redundant code: Found unused cast of expression 'i'.\n" "[test.cpp:3]: (warning) Redundant code: Found unused cast of expression 'i'.\n" "[test.cpp:4]: (warning) Redundant code: Found unused cast of expression 'i'.\n", - errout.str()); + errout_str()); check("namespace M {\n" " namespace N { typedef char T; }\n" @@ -473,7 +470,7 @@ class TestIncompleteStatement : public TestFixture { "void f(int i) {\n" " (M::N::T)i;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:5]: (warning) Redundant code: Found unused cast of expression 'i'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (warning) Redundant code: Found unused cast of expression 'i'.\n", errout_str()); check("void f(int (g)(int a, int b)) {\n" // #10873 " int p = 0, q = 1;\n" @@ -484,7 +481,7 @@ class TestIncompleteStatement : public TestFixture { " (sprintf)(buf, \"%d\", 42);\n" " (printf)(\"abc\");\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S; struct T; struct U;\n" "void f() {\n" @@ -493,16 +490,16 @@ class TestIncompleteStatement : public TestFixture { " (S)static_cast(t);\n" " static_cast((U)t);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(bool b) { b ? true : false; }\n"); // #10865 - ASSERT_EQUALS("[test.cpp:1]: (warning) Redundant code: Found unused result of ternary operator.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (warning) Redundant code: Found unused result of ternary operator.\n", errout_str()); check("struct S { void (*f)() = nullptr; };\n" // #10877 "void g(S* s) {\n" " (s->f == nullptr) ? nullptr : (s->f(), nullptr);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(bool b) {\n" " g() ? true : false;\n" @@ -512,7 +509,7 @@ class TestIncompleteStatement : public TestFixture { " C c{ b ? true : false, 1 };\n" " b = (b ? true : false);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int i) {\n" " for (i; ;) {}\n" @@ -532,7 +529,7 @@ class TestIncompleteStatement : public TestFixture { "[test.cpp:7]: (warning) Redundant code: Found a statement that begins with character constant.\n" "[test.cpp:8]: (warning) Redundant code: Found a statement that begins with string constant.\n" "[test.cpp:9]: (warning) Redundant code: Found a statement that begins with string constant.\n", - errout.str()); + errout_str()); check("struct S { bool b{}; };\n" "struct T {\n" @@ -555,7 +552,7 @@ class TestIncompleteStatement : public TestFixture { "[test.cpp:10]: (warning) Redundant code: Found unused member access.\n" "[test.cpp:12]: (warning) Redundant code: Found unused member access.\n" "[test.cpp:15]: (warning) Redundant code: Found unused member access.\n", - errout.str()); + errout_str()); check("struct S { int a[2]{}; };\n" "struct T { S s; };\n" @@ -574,7 +571,7 @@ class TestIncompleteStatement : public TestFixture { "[test.cpp:8]: (warning) Redundant code: Found unused array access.\n" "[test.cpp:10]: (warning) Redundant code: Found unused array access.\n" "[test.cpp:12]: (warning) Redundant code: Found unused array access.\n", - errout.str()); + errout_str()); check("void g(std::map& map) {\n" " int j[2]{};\n" @@ -593,13 +590,13 @@ class TestIncompleteStatement : public TestFixture { " map[\"abc\"];\n" // #10928 " std::auto_ptr app[4];" // #10919 "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S { void* p; };\n" // #10875 "void f(S s) {\n" " delete (int*)s.p;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct T {\n" // #10874 " T* p;\n" @@ -607,37 +604,37 @@ class TestIncompleteStatement : public TestFixture { "void f(T* t) {\n" " for (decltype(t->p) (c) = t->p; ;) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int i, std::vector v);\n" // #10880 "void g() {\n" " f(1, { static_cast(nullptr) });\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S { int i; };\n" // #10882 "enum E {};\n" "void f(const S* s) {\n" " E e = (E)!s->i;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int* p) {\n" // #10932 " int& r(*p[0]);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S { int i; };\n" // #10917 "bool f(S s) {\n" " return [](int i) { return i > 0; }(s.i);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("extern int (*p);\n" // #10936 "void f() {\n" " for (int i = 0; ;) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class T {};\n" // #10849 "void f() {\n" @@ -646,7 +643,7 @@ class TestIncompleteStatement : public TestFixture { " return 0;\n" " };\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("namespace N {\n" // #10876 " template \n" @@ -656,18 +653,18 @@ class TestIncompleteStatement : public TestFixture { " for (typename T::iterator v = c.begin(); v != c.end(); ++v) {}\n" " }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(std::string a, std::string b) {\n" // #7529 " const std::string s = \" x \" + a;\n" " +\" y = \" + b;\n" "}\n", /*inconclusive*/ true); - ASSERT_EQUALS("[test.cpp:3]: (warning, inconclusive) Found suspicious operator '+', result is not used.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning, inconclusive) Found suspicious operator '+', result is not used.\n", errout_str()); check("void f() {\n" " *new int;\n" "}\n", /*inconclusive*/ true); - ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Found suspicious operator '*', result is not used.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Found suspicious operator '*', result is not used.\n", errout_str()); check("void f() {\n" // #5475 " std::string(\"a\") + \"a\";\n" @@ -677,12 +674,12 @@ class TestIncompleteStatement : public TestFixture { "}\n", /*inconclusive*/ true); ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Found suspicious operator '+', result is not used.\n" "[test.cpp:5]: (warning, inconclusive) Found suspicious operator '+', result is not used.\n", - errout.str()); + errout_str()); check("void f(XMLElement& parent) {\n" // #11234 " auto** elem = &parent.firstChild;\n" "}\n", /*inconclusive*/ true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" // #11301 " NULL;\n" @@ -690,87 +687,87 @@ class TestIncompleteStatement : public TestFixture { "}\n"); ASSERT_EQUALS("[test.cpp:2]: (warning) Redundant code: Found a statement that begins with NULL constant.\n" "[test.cpp:3]: (warning) Redundant code: Found a statement that begins with NULL constant.\n", - errout.str()); + errout_str()); check("struct S { int i; };\n" // #6504 "void f(S* s) {\n" " (*s).i;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Redundant code: Found unused member access.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Redundant code: Found unused member access.\n", errout_str()); check("int a[2];\n" // #11370 "void f() {\n" " auto g = [](decltype(a[0]) i) {};\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("enum E { E0 };\n" "void f() {\n" " E0;\n" "}\n"); ASSERT_EQUALS("[test.cpp:3]: (warning) Redundant code: Found a statement that begins with enumerator constant.\n", - errout.str()); + errout_str()); } void vardecl() { // #8984 check("void f() { a::b *c = d(); }", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() { std::vector *c; }", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() { a::b &c = d(); }", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() { std::vector &c; }", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() { a::b &&c = d(); }", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() { std::vector &&c; }", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() { char * const * a, * const * b; }", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() { char * const * a = 0, * volatile restrict * b; }", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() { char * const * a = 0, * volatile const * b; }", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void archive() { check("void f(Archive &ar) {\n" " ar & x;\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int ar) {\n" " ar & x;\n" "}", true); - ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Found suspicious operator '&', result is not used.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Found suspicious operator '&', result is not used.\n", errout_str()); } void ast() { check("struct c { void a() const { for (int x=0; x;); } };", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void oror() { check("void foo() {\n" " params_given (params, \"overrides\") || (overrides = \"1\");\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(std::ifstream& file) {\n" // #10930 " int a{}, b{};\n" " (file >> a) || (file >> b);\n" " (file >> a) && (file >> b);\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } }; diff --git a/test/testinternal.cpp b/test/testinternal.cpp index 069345131edd..90369a6efed9 100644 --- a/test/testinternal.cpp +++ b/test/testinternal.cpp @@ -50,9 +50,6 @@ class TestInternal : public TestFixture { #define check(code) check_(code, __FILE__, __LINE__) void check_(const char code[], const char* file, int line) { - // Clear the error buffer.. - errout.str(""); - // Tokenize.. Tokenizer tokenizer(settings, this); std::istringstream istr(code); @@ -67,25 +64,25 @@ class TestInternal : public TestFixture { " const Token *tok;\n" " Token::Match(tok, \";\");\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Found simple pattern inside Token::Match() call: \";\"\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Found simple pattern inside Token::Match() call: \";\"\n", errout_str()); check("void f() {\n" " const Token *tok;\n" " Token::Match(tok, \"%type%\");\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " const Token *tok;\n" " Token::Match(tok, \"%or%\");\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Found simple pattern inside Token::Match() call: \"%or%\"\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Found simple pattern inside Token::Match() call: \"%or%\"\n", errout_str()); check("void f() {\n" " const Token *tok;\n" " Token::findmatch(tok, \";\");\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Found simple pattern inside Token::findmatch() call: \";\"\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Found simple pattern inside Token::findmatch() call: \";\"\n", errout_str()); } void complexPatternInTokenSimpleMatch() { @@ -93,31 +90,31 @@ class TestInternal : public TestFixture { " const Token *tok;\n" " Token::simpleMatch(tok, \"%type%\");\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Found complex pattern inside Token::simpleMatch() call: \"%type%\"\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Found complex pattern inside Token::simpleMatch() call: \"%type%\"\n", errout_str()); check("void f() {\n" " const Token *tok;\n" " Token::findsimplematch(tok, \"%type%\");\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Found complex pattern inside Token::findsimplematch() call: \"%type%\"\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Found complex pattern inside Token::findsimplematch() call: \"%type%\"\n", errout_str()); check("void f() {\n" " const Token *tok;\n" " Token::findsimplematch(tok, \"} !!else\");\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Found complex pattern inside Token::findsimplematch() call: \"} !!else\"\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Found complex pattern inside Token::findsimplematch() call: \"} !!else\"\n", errout_str()); check("void f() {\n" " const Token *tok;\n" " Token::findsimplematch(tok, \"foobar\");\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " const Token *tok;\n" " Token::findsimplematch(tok, \"%\");\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplePatternSquareBrackets() { @@ -125,37 +122,37 @@ class TestInternal : public TestFixture { " const Token *tok;\n" " Token::simpleMatch(tok, \"[\");\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " const Token *tok;\n" " Token::simpleMatch(tok, \"[ ]\");\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " const Token *tok;\n" " Token::simpleMatch(tok, \"[]\");\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Found complex pattern inside Token::simpleMatch() call: \"[]\"\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Found complex pattern inside Token::simpleMatch() call: \"[]\"\n", errout_str()); check("void f() {\n" " const Token *tok;\n" " Token::simpleMatch(tok, \"] [\");\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " const Token *tok;\n" " Token::simpleMatch(tok, \"] [ [abc]\");\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Found complex pattern inside Token::simpleMatch() call: \"] [ [abc]\"\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Found complex pattern inside Token::simpleMatch() call: \"] [ [abc]\"\n", errout_str()); check("void f() {\n" " const Token *tok;\n" " Token::simpleMatch(tok, \"[.,;]\");\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Found complex pattern inside Token::simpleMatch() call: \"[.,;]\"\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Found complex pattern inside Token::simpleMatch() call: \"[.,;]\"\n", errout_str()); } void simplePatternAlternatives() { @@ -163,31 +160,31 @@ class TestInternal : public TestFixture { " const Token *tok;\n" " Token::simpleMatch(tok, \"||\");\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " const Token *tok;\n" " Token::simpleMatch(tok, \"|\");\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " const Token *tok;\n" " Token::simpleMatch(tok, \"a|b\");\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Found complex pattern inside Token::simpleMatch() call: \"a|b\"\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Found complex pattern inside Token::simpleMatch() call: \"a|b\"\n", errout_str()); check("void f() {\n" " const Token *tok;\n" " Token::simpleMatch(tok, \"|= 0\");\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " const Token *tok;\n" " Token::simpleMatch(tok, \"| 0 )\");\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void missingPercentCharacter() { @@ -195,41 +192,41 @@ class TestInternal : public TestFixture { " const Token *tok;\n" " Token::Match(tok, \"%type%\");\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " const Token *tok;\n" " Token::Match(tok, \"foo %type% bar\");\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Missing % at the end of string check("void f() {\n" " const Token *tok;\n" " Token::Match(tok, \"%type\");\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Missing percent end character in Token::Match() pattern: \"%type\"\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Missing percent end character in Token::Match() pattern: \"%type\"\n", errout_str()); // Missing % in the middle of a pattern check("void f() {\n" " const Token *tok;\n" " Token::Match(tok, \"foo %type bar\");\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Missing percent end character in Token::Match() pattern: \"foo %type bar\"\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Missing percent end character in Token::Match() pattern: \"foo %type bar\"\n", errout_str()); // Bei quiet on single % check("void f() {\n" " const Token *tok;\n" " Token::Match(tok, \"foo % %type% bar\");\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " const Token *tok;\n" " Token::Match(tok, \"foo % %type % bar\");\n" "}"); ASSERT_EQUALS("[test.cpp:3]: (error) Missing percent end character in Token::Match() pattern: \"foo % %type % bar\"\n" - "[test.cpp:3]: (error) Unknown pattern used: \"%type %\"\n", errout.str()); + "[test.cpp:3]: (error) Unknown pattern used: \"%type %\"\n", errout_str()); // Find missing % also in 'alternatives' pattern check("void f() {\n" @@ -237,84 +234,84 @@ class TestInternal : public TestFixture { " Token::Match(tok, \"foo|%type|bar\");\n" "}"); ASSERT_EQUALS("[test.cpp:3]: (error) Missing percent end character in Token::Match() pattern: \"foo|%type|bar\"\n" - , errout.str()); + , errout_str()); // Make sure we don't take %or% for a broken %oror% check("void f() {\n" " const Token *tok;\n" " Token::Match(tok, \"foo|%oror%|bar\");\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void unknownPattern() { check("void f() {\n" " Token::Match(tok, \"%typ%\");\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (error) Unknown pattern used: \"%typ%\"\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (error) Unknown pattern used: \"%typ%\"\n", errout_str()); // Make sure we don't take %or% for a broken %oror% check("void f() {\n" " Token::Match(tok, \"%type%\");\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void redundantNextPrevious() { check("void f() {\n" " return tok->next()->previous();\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Call to 'Token::next()' followed by 'Token::previous()' can be simplified.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Call to 'Token::next()' followed by 'Token::previous()' can be simplified.\n", errout_str()); check("void f() {\n" " return tok->tokAt(5)->previous();\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Call to 'Token::tokAt()' followed by 'Token::previous()' can be simplified.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Call to 'Token::tokAt()' followed by 'Token::previous()' can be simplified.\n", errout_str()); check("void f() {\n" " return tok->previous()->linkAt(5);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Call to 'Token::previous()' followed by 'Token::linkAt()' can be simplified.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Call to 'Token::previous()' followed by 'Token::linkAt()' can be simplified.\n", errout_str()); check("void f() {\n" " tok->next()->previous(foo);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " return tok->next()->next();\n" // Simplification won't make code much shorter/readable "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " return tok->previous()->previous();\n" // Simplification won't make code much shorter/readable "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " return tok->tokAt(foo+bar)->tokAt();\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Call to 'Token::tokAt()' followed by 'Token::tokAt()' can be simplified.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Call to 'Token::tokAt()' followed by 'Token::tokAt()' can be simplified.\n", errout_str()); check("void f() {\n" " return tok->tokAt(foo+bar)->link();\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Call to 'Token::tokAt()' followed by 'Token::link()' can be simplified.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Call to 'Token::tokAt()' followed by 'Token::link()' can be simplified.\n", errout_str()); check("void f() {\n" " tok->tokAt(foo+bar)->link(foo);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " return tok->next()->next()->str();\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Call to 'Token::next()' followed by 'Token::str()' can be simplified.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Call to 'Token::next()' followed by 'Token::str()' can be simplified.\n", errout_str()); check("void f() {\n" " return tok->previous()->next()->str();\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Call to 'Token::previous()' followed by 'Token::next()' can be simplified.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Call to 'Token::previous()' followed by 'Token::next()' can be simplified.\n", errout_str()); } @@ -331,39 +328,39 @@ class TestInternal : public TestFixture { " z[0] = 0;\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void orInComplexPattern() { check("void f() {\n" " Token::Match(tok, \"||\");\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (error) Token::Match() pattern \"||\" contains \"||\" or \"|\". Replace it by \"%oror%\" or \"%or%\".\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (error) Token::Match() pattern \"||\" contains \"||\" or \"|\". Replace it by \"%oror%\" or \"%or%\".\n", errout_str()); check("void f() {\n" " Token::Match(tok, \"|\");\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (error) Token::Match() pattern \"|\" contains \"||\" or \"|\". Replace it by \"%oror%\" or \"%or%\".\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (error) Token::Match() pattern \"|\" contains \"||\" or \"|\". Replace it by \"%oror%\" or \"%or%\".\n", errout_str()); check("void f() {\n" " Token::Match(tok, \"[|+-]\");\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " Token::Match(tok, \"foo | bar\");\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (error) Token::Match() pattern \"foo | bar\" contains \"||\" or \"|\". Replace it by \"%oror%\" or \"%or%\".\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (error) Token::Match() pattern \"foo | bar\" contains \"||\" or \"|\". Replace it by \"%oror%\" or \"%or%\".\n", errout_str()); check("void f() {\n" " Token::Match(tok, \"foo |\");\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (error) Token::Match() pattern \"foo |\" contains \"||\" or \"|\". Replace it by \"%oror%\" or \"%or%\".\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (error) Token::Match() pattern \"foo |\" contains \"||\" or \"|\". Replace it by \"%oror%\" or \"%or%\".\n", errout_str()); check("void f() {\n" " Token::Match(tok, \"bar foo|\");\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void extraWhitespace() { @@ -372,42 +369,42 @@ class TestInternal : public TestFixture { " const Token *tok;\n" " Token::Match(tok, \"%str% \");\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Found extra whitespace inside Token::Match() call: \"%str% \"\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Found extra whitespace inside Token::Match() call: \"%str% \"\n", errout_str()); // whitespace at the begin check("void f() {\n" " const Token *tok;\n" " Token::Match(tok, \" %str%\");\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Found extra whitespace inside Token::Match() call: \" %str%\"\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Found extra whitespace inside Token::Match() call: \" %str%\"\n", errout_str()); // two whitespaces or more check("void f() {\n" " const Token *tok;\n" " Token::Match(tok, \"%str% bar\");\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Found extra whitespace inside Token::Match() call: \"%str% bar\"\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Found extra whitespace inside Token::Match() call: \"%str% bar\"\n", errout_str()); // test simpleMatch check("void f() {\n" " const Token *tok;\n" " Token::simpleMatch(tok, \"foobar \");\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Found extra whitespace inside Token::simpleMatch() call: \"foobar \"\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Found extra whitespace inside Token::simpleMatch() call: \"foobar \"\n", errout_str()); // test findmatch check("void f() {\n" " const Token *tok;\n" " Token::findmatch(tok, \"%str% \");\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Found extra whitespace inside Token::findmatch() call: \"%str% \"\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Found extra whitespace inside Token::findmatch() call: \"%str% \"\n", errout_str()); // test findsimplematch check("void f() {\n" " const Token *tok;\n" " Token::findsimplematch(tok, \"foobar \");\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Found extra whitespace inside Token::findsimplematch() call: \"foobar \"\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Found extra whitespace inside Token::findsimplematch() call: \"foobar \"\n", errout_str()); } void checkRedundantTokCheck() { @@ -416,59 +413,59 @@ class TestInternal : public TestFixture { " const Token *tok;\n" " if(tok && Token::findsimplematch(tok, \"foobar\")) {};\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Unnecessary check of \"tok\", match-function already checks if it is null.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Unnecessary check of \"tok\", match-function already checks if it is null.\n", errout_str()); // findmatch check("void f() {\n" " const Token *tok;\n" " if(tok && Token::findmatch(tok, \"%str% foobar\")) {};\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Unnecessary check of \"tok\", match-function already checks if it is null.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Unnecessary check of \"tok\", match-function already checks if it is null.\n", errout_str()); // Match check("void f() {\n" " const Token *tok;\n" " if(tok && Token::Match(tok, \"5str% foobar\")) {};\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Unnecessary check of \"tok\", match-function already checks if it is null.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Unnecessary check of \"tok\", match-function already checks if it is null.\n", errout_str()); check("void f() {\n" " const Token *tok;\n" " if(a && tok && Token::Match(tok, \"5str% foobar\")) {};\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Unnecessary check of \"tok\", match-function already checks if it is null.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Unnecessary check of \"tok\", match-function already checks if it is null.\n", errout_str()); check("void f() {\n" " const Token *tok;\n" " if(a && b && tok && Token::Match(tok, \"5str% foobar\")) {};\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Unnecessary check of \"tok\", match-function already checks if it is null.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Unnecessary check of \"tok\", match-function already checks if it is null.\n", errout_str()); check("void f() {\n" " const Token *tok;\n" " if(a && b && c && tok && Token::Match(tok, \"5str% foobar\")) {};\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Unnecessary check of \"tok\", match-function already checks if it is null.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Unnecessary check of \"tok\", match-function already checks if it is null.\n", errout_str()); check("void f() {\n" " const Token *tok;\n" " if(a && b && c && tok && d && Token::Match(tok, \"5str% foobar\")) {};\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // simpleMatch check("void f() {\n" " const Token *tok;\n" " if(tok && Token::simpleMatch(tok, \"foobar\")) {};\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Unnecessary check of \"tok\", match-function already checks if it is null.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Unnecessary check of \"tok\", match-function already checks if it is null.\n", errout_str()); // Match check("void f() {\n" " const Token *tok;\n" " if(tok->previous() && Token::Match(tok->previous(), \"5str% foobar\")) {};\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Unnecessary check of \"tok->previous()\", match-function already checks if it is null.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Unnecessary check of \"tok->previous()\", match-function already checks if it is null.\n", errout_str()); // don't report: // tok->previous() vs tok @@ -476,55 +473,55 @@ class TestInternal : public TestFixture { " const Token *tok;\n" " if(tok->previous() && Token::Match(tok, \"5str% foobar\")) {};\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // tok vs tok->previous()) check("void f() {\n" " const Token *tok;\n" " if(tok && Token::Match(tok->previous(), \"5str% foobar\")) {};\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // tok->previous() vs tok->previous()->previous()) check("void f() {\n" " const Token *tok;\n" " if(tok->previous() && Token::Match(tok->previous()->previous(), \"5str% foobar\")) {};\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // if a && fn(a) triggers, make sure !a || !fn(a) triggers as well! check("void f() {\n" " const Token *tok;\n" " if(!tok || !Token::simpleMatch(tok, \"foobar\")) {};\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Unnecessary check of \"tok\", match-function already checks if it is null.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Unnecessary check of \"tok\", match-function already checks if it is null.\n", errout_str()); check("void f() {\n" " const Token *tok;\n" " if(a || !tok || !Token::simpleMatch(tok, \"foobar\")) {};\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Unnecessary check of \"tok\", match-function already checks if it is null.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Unnecessary check of \"tok\", match-function already checks if it is null.\n", errout_str()); // if tok || !Token::simpleMatch... check("void f() {\n" " const Token *tok;\n" " if(tok || !Token::simpleMatch(tok, \"foobar\")) {};\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // if !tok || Token::simpleMatch... check("void f() {\n" " const Token *tok;\n" " if(!tok || Token::simpleMatch(tok, \"foobar\")) {};\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // something more complex check("void f() {\n" " const Token *tok;\n" " if(!tok->previous()->previous() || !Token::simpleMatch(tok->previous()->previous(), \"foobar\")) {};\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Unnecessary check of \"tok->previous()->previous()\", match-function already checks if it is null.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Unnecessary check of \"tok->previous()->previous()\", match-function already checks if it is null.\n", errout_str()); } }; diff --git a/test/testio.cpp b/test/testio.cpp index 140747ecf516..ad07c82f02c1 100644 --- a/test/testio.cpp +++ b/test/testio.cpp @@ -93,9 +93,6 @@ class TestIO : public TestFixture { #define check(...) check_(__FILE__, __LINE__, __VA_ARGS__) void check_(const char* file, int line, const char* code, const CheckOptions& options = make_default_obj()) { - // Clear the error buffer.. - errout.str(""); - // TODO: using dedicated Settings (i.e. copying it) object causes major slowdown settings1.severity.setEnabled(Severity::portability, options.portability); settings1.certainty.setEnabled(Certainty::inconclusive, options.inconclusive); @@ -121,50 +118,50 @@ class TestIO : public TestFixture { "void foo() {\n" " std::cout << std::cout;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (error) Invalid usage of output stream: '<< std::cout'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (error) Invalid usage of output stream: '<< std::cout'.\n", errout_str()); check( "void foo() {\n" " std::cout << (std::cout);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (error) Invalid usage of output stream: '<< std::cout'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (error) Invalid usage of output stream: '<< std::cout'.\n", errout_str()); check( "void foo() {\n" " std::cout << \"xyz\" << std::cout;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (error) Invalid usage of output stream: '<< std::cout'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (error) Invalid usage of output stream: '<< std::cout'.\n", errout_str()); check( "void foo(int i) {\n" " std::cout << i << std::cerr;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (error) Invalid usage of output stream: '<< std::cerr'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (error) Invalid usage of output stream: '<< std::cerr'.\n", errout_str()); check( "void foo() {\n" " std::cout << \"xyz\";\n" " std::cout << \"xyz\";\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check( "void foo() {\n" " std::cout << std::cout.good();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check( "void foo() {\n" " unknownObject << std::cout;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check( "void foo() {\n" " MACRO(std::cout <<, << std::cout)\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } @@ -177,7 +174,7 @@ class TestIO : public TestFixture { " rewind(f);\n" " fwrite(buffer, 5, 6, f);\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (error) Write operation on a file that was opened only for reading.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Write operation on a file that was opened only for reading.\n", errout_str()); check("void foo(FILE*& f) {\n" " f = _wfopen(name, L\"r\");\n" @@ -185,7 +182,7 @@ class TestIO : public TestFixture { " rewind(f);\n" " fwrite(buffer, 5, 6, f);\n" "}", dinit(CheckOptions, $.platform = Platform::Type::Win32W)); - ASSERT_EQUALS("[test.cpp:5]: (error) Write operation on a file that was opened only for reading.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Write operation on a file that was opened only for reading.\n", errout_str()); check("void foo(FILE*& f) {\n" " f = _tfopen(name, _T(\"r\"));\n" @@ -193,7 +190,7 @@ class TestIO : public TestFixture { " rewind(f);\n" " fwrite(buffer, 5, 6, f);\n" "}", dinit(CheckOptions, $.platform = Platform::Type::Win32A)); - ASSERT_EQUALS("[test.cpp:5]: (error) Write operation on a file that was opened only for reading.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Write operation on a file that was opened only for reading.\n", errout_str()); check("void foo(FILE*& f) {\n" " f = _tfopen(name, _T(\"r\"));\n" @@ -201,7 +198,7 @@ class TestIO : public TestFixture { " rewind(f);\n" " fwrite(buffer, 5, 6, f);\n" "}", dinit(CheckOptions, $.platform = Platform::Type::Win32W)); - ASSERT_EQUALS("[test.cpp:5]: (error) Write operation on a file that was opened only for reading.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Write operation on a file that was opened only for reading.\n", errout_str()); check("void foo(FILE*& f) {\n" " _wfopen_s(&f, name, L\"r\");\n" @@ -209,7 +206,7 @@ class TestIO : public TestFixture { " rewind(f);\n" " fwrite(buffer, 5, 6, f);\n" "}", dinit(CheckOptions, $.platform = Platform::Type::Win32W)); - ASSERT_EQUALS("[test.cpp:5]: (error) Write operation on a file that was opened only for reading.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Write operation on a file that was opened only for reading.\n", errout_str()); check("void foo(FILE*& f) {\n" " _tfopen_s(&f, name, _T(\"r\"));\n" @@ -217,7 +214,7 @@ class TestIO : public TestFixture { " rewind(f);\n" " fwrite(buffer, 5, 6, f);\n" "}", dinit(CheckOptions, $.platform = Platform::Type::Win32A)); - ASSERT_EQUALS("[test.cpp:5]: (error) Write operation on a file that was opened only for reading.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Write operation on a file that was opened only for reading.\n", errout_str()); check("void foo(FILE*& f) {\n" " _tfopen_s(&f, name, _T(\"r\"));\n" @@ -225,55 +222,55 @@ class TestIO : public TestFixture { " rewind(f);\n" " fwrite(buffer, 5, 6, f);\n" "}", dinit(CheckOptions, $.platform = Platform::Type::Win32W)); - ASSERT_EQUALS("[test.cpp:5]: (error) Write operation on a file that was opened only for reading.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Write operation on a file that was opened only for reading.\n", errout_str()); check("void foo(FILE*& f) {\n" " f = fopen(name, \"r+\");\n" " fwrite(buffer, 5, 6, f);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(FILE*& f) {\n" " f = _wfopen(name, L\"r+\");\n" " fwrite(buffer, 5, 6, f);\n" "}", dinit(CheckOptions, $.platform = Platform::Type::Win32W)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(FILE*& f) {\n" " f = _tfopen(name, _T(\"r+\"));\n" " fwrite(buffer, 5, 6, f);\n" "}", dinit(CheckOptions, $.platform = Platform::Type::Win32A)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(FILE*& f) {\n" " f = _tfopen(name, _T(\"r+\"));\n" " fwrite(buffer, 5, 6, f);\n" "}", dinit(CheckOptions, $.platform = Platform::Type::Win32W)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(FILE*& f) {\n" " _wfopen_s(&f, name, L\"r+\");\n" " fwrite(buffer, 5, 6, f);\n" "}", dinit(CheckOptions, $.platform = Platform::Type::Win32W)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(FILE*& f) {\n" " _tfopen_s(&f, name, _T(\"r+\"));\n" " fwrite(buffer, 5, 6, f);\n" "}", dinit(CheckOptions, $.platform = Platform::Type::Win32A)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(FILE*& f) {\n" " _tfopen_s(&f, name, _T(\"r+\"));\n" " fwrite(buffer, 5, 6, f);\n" "}", dinit(CheckOptions, $.platform = Platform::Type::Win32W)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(FILE*& f) {\n" " f = tmpfile();\n" " fwrite(buffer, 5, 6, f);\n" "}", dinit(CheckOptions, $.platform = Platform::Type::Win32W)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Write mode check("void foo(FILE*& f) {\n" @@ -282,19 +279,19 @@ class TestIO : public TestFixture { " rewind(f);\n" " fread(buffer, 5, 6, f);\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (error) Read operation on a file that was opened only for writing.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Read operation on a file that was opened only for writing.\n", errout_str()); check("void foo(FILE*& f) {\n" " f = fopen(name, \"w+\");\n" " fread(buffer, 5, 6, f);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(FILE*& f) {\n" " f = tmpfile();\n" " fread(buffer, 5, 6, f);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Append mode check("void foo(FILE*& f) {\n" @@ -304,13 +301,13 @@ class TestIO : public TestFixture { " fread(buffer, 5, 6, f);\n" "}"); ASSERT_EQUALS("[test.cpp:4]: (warning) Repositioning operation performed on a file opened in append mode has no effect.\n" - "[test.cpp:5]: (error) Read operation on a file that was opened only for writing.\n", errout.str()); + "[test.cpp:5]: (error) Read operation on a file that was opened only for writing.\n", errout_str()); check("void foo(FILE*& f) {\n" " f = fopen(name, \"a+\");\n" " fread(buffer, 5, 6, f);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Variable declared locally check("void foo() {\n" @@ -318,7 +315,7 @@ class TestIO : public TestFixture { " fwrite(buffer, 5, 6, f);\n" " fclose(f);\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Write operation on a file that was opened only for reading.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Write operation on a file that was opened only for reading.\n", errout_str()); // Call unknown function check("void foo(FILE*& f) {\n" @@ -327,57 +324,57 @@ class TestIO : public TestFixture { " bar(f);\n" " fread(buffer, 5, 6, f);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // freopen and tmpfile check("void foo(FILE*& f) {\n" " f = freopen(name, \"r\", f);\n" " fwrite(buffer, 5, 6, f);\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Write operation on a file that was opened only for reading.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Write operation on a file that was opened only for reading.\n", errout_str()); check("void foo(FILE*& f) {\n" " f = _wfreopen(name, L\"r\", f);\n" " fwrite(buffer, 5, 6, f);\n" "}", dinit(CheckOptions, $.platform = Platform::Type::Win32W)); - ASSERT_EQUALS("[test.cpp:3]: (error) Write operation on a file that was opened only for reading.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Write operation on a file that was opened only for reading.\n", errout_str()); check("void foo(FILE*& f) {\n" " f = _tfreopen(name, _T(\"r\"), f);\n" " fwrite(buffer, 5, 6, f);\n" "}", dinit(CheckOptions, $.platform = Platform::Type::Win32A)); - ASSERT_EQUALS("[test.cpp:3]: (error) Write operation on a file that was opened only for reading.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Write operation on a file that was opened only for reading.\n", errout_str()); check("void foo(FILE*& f) {\n" " f = _tfreopen(name, _T(\"r\"), f);\n" " fwrite(buffer, 5, 6, f);\n" "}", dinit(CheckOptions, $.platform = Platform::Type::Win32W)); - ASSERT_EQUALS("[test.cpp:3]: (error) Write operation on a file that was opened only for reading.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Write operation on a file that was opened only for reading.\n", errout_str()); check("void foo(FILE*& f) {\n" " f = _wfreopen_s(&f, name, L\"r\", f);\n" " fwrite(buffer, 5, 6, f);\n" "}", dinit(CheckOptions, $.platform = Platform::Type::Win32W)); - ASSERT_EQUALS("[test.cpp:3]: (error) Write operation on a file that was opened only for reading.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Write operation on a file that was opened only for reading.\n", errout_str()); check("void foo(FILE*& f) {\n" " f = _tfreopen_s(&f, name, _T(\"r\"), f);\n" " fwrite(buffer, 5, 6, f);\n" "}", dinit(CheckOptions, $.platform = Platform::Type::Win32A)); - ASSERT_EQUALS("[test.cpp:3]: (error) Write operation on a file that was opened only for reading.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Write operation on a file that was opened only for reading.\n", errout_str()); check("void foo(FILE*& f) {\n" " f = _tfreopen_s(&f, name, _T(\"r\"), f);\n" " fwrite(buffer, 5, 6, f);\n" "}", dinit(CheckOptions, $.platform = Platform::Type::Win32W)); - ASSERT_EQUALS("[test.cpp:3]: (error) Write operation on a file that was opened only for reading.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Write operation on a file that was opened only for reading.\n", errout_str()); // Crash tests check("void foo(FILE*& f) {\n" " f = fopen(name, mode);\n" // No assertion failure (#3830) " fwrite(buffer, 5, 6, f);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void fopen(std::string const &filepath, std::string const &mode);"); // #3832 } @@ -389,7 +386,7 @@ class TestIO : public TestFixture { " if(a) fwrite(buffer, 5, 6, f);\n" " else fread(buffer, 5, 6, f);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() {\n" " FILE* f;\n" @@ -398,14 +395,14 @@ class TestIO : public TestFixture { " if(a) fwrite(buffer, 5, 6, f);\n" " else fread(buffer, 5, 6, f);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() {\n" " FILE* f = fopen(name, \"w\");\n" " if(a) fwrite(buffer, 5, 6, f);\n" " else fread(buffer, 5, 6, f);\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Read operation on a file that was opened only for writing.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Read operation on a file that was opened only for writing.\n", errout_str()); } void useClosedFile() { @@ -423,7 +420,7 @@ class TestIO : public TestFixture { "[test.cpp:5]: (error) Used file that is not opened.\n" "[test.cpp:6]: (error) Used file that is not opened.\n" "[test.cpp:7]: (error) Used file that is not opened.\n" - "[test.cpp:8]: (error) Used file that is not opened.\n", errout.str()); + "[test.cpp:8]: (error) Used file that is not opened.\n", errout_str()); check("void foo(FILE*& f) {\n" " if(!ferror(f)) {\n" @@ -432,40 +429,40 @@ class TestIO : public TestFixture { " }\n" " fwrite(buffer, 5, 6, f);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(FILE*& f) {\n" " fclose(f);\n" " f = fopen(name, \"r\");\n" " fread(buffer, 5, 6, f);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(FILE*& f) {\n" " f = fopen(name, \"r\");\n" " f = g;\n" " fwrite(buffer, 5, 6, f);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() {\n" " FILE* f;\n" " fwrite(buffer, 5, 6, f);\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Used file that is not opened.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Used file that is not opened.\n", errout_str()); check("void foo() {\n" " FILE* f(stdout);\n" " fwrite(buffer, 5, 6, f);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() {\n" // #3965 " FILE* f[3];\n" " f[0] = fopen(name, mode);\n" " fclose(f[0]);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #4368: multiple functions check("static FILE *fp = NULL;\n" @@ -488,7 +485,7 @@ class TestIO : public TestFixture { " close();\n" " return 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("static FILE *fp = NULL;\n" "\n" @@ -502,7 +499,7 @@ class TestIO : public TestFixture { " fclose(fp);\n" " fprintf(fp, \"Here's the output.\\n\");\n" "}"); - ASSERT_EQUALS("[test.cpp:11]: (error) Used file that is not opened.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:11]: (error) Used file that is not opened.\n", errout_str()); // #4466 check("void chdcd_parse_nero(FILE *infile) {\n" @@ -515,7 +512,7 @@ class TestIO : public TestFixture { " return;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void chdcd_parse_nero(FILE *infile) {\n" " switch (mode) {\n" @@ -527,7 +524,7 @@ class TestIO : public TestFixture { " return;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #4649 check("void foo() {\n" @@ -537,14 +534,14 @@ class TestIO : public TestFixture { " fclose(a.f1);\n" " fclose(a.f2);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #1473 check("void foo() {\n" " FILE *a = fopen(\"aa\", \"r\");\n" " while (fclose(a)) {}\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:3]: (error) Used file that is not opened.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:3]: (error) Used file that is not opened.\n", "", errout_str()); // #6823 check("void foo() {\n" @@ -554,7 +551,7 @@ class TestIO : public TestFixture { " fclose(f[0]);\n" " fclose(f[1]);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #12236 check("void f() {\n" @@ -562,7 +559,7 @@ class TestIO : public TestFixture { " decltype(fclose(f)) y;\n" " y = fclose(f);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void fileIOwithoutPositioning() { @@ -570,13 +567,13 @@ class TestIO : public TestFixture { " fwrite(buffer, 5, 6, f);\n" " fread(buffer, 5, 6, f);\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Read and write operations without a call to a positioning function (fseek, fsetpos or rewind) or fflush in between result in undefined behaviour.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Read and write operations without a call to a positioning function (fseek, fsetpos or rewind) or fflush in between result in undefined behaviour.\n", errout_str()); check("void foo(FILE* f) {\n" " fread(buffer, 5, 6, f);\n" " fwrite(buffer, 5, 6, f);\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Read and write operations without a call to a positioning function (fseek, fsetpos or rewind) or fflush in between result in undefined behaviour.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Read and write operations without a call to a positioning function (fseek, fsetpos or rewind) or fflush in between result in undefined behaviour.\n", errout_str()); check("void foo(FILE* f, bool read) {\n" " if(read)\n" @@ -584,42 +581,42 @@ class TestIO : public TestFixture { " else\n" " fwrite(buffer, 5, 6, f);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(FILE* f) {\n" " fread(buffer, 5, 6, f);\n" " fflush(f);\n" " fwrite(buffer, 5, 6, f);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(FILE* f) {\n" " fread(buffer, 5, 6, f);\n" " rewind(f);\n" " fwrite(buffer, 5, 6, f);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(FILE* f) {\n" " fread(buffer, 5, 6, f);\n" " fsetpos(f, pos);\n" " fwrite(buffer, 5, 6, f);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(FILE* f) {\n" " fread(buffer, 5, 6, f);\n" " fseek(f, 0, SEEK_SET);\n" " fwrite(buffer, 5, 6, f);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(FILE* f) {\n" " fread(buffer, 5, 6, f);\n" " long pos = ftell(f);\n" " fwrite(buffer, 5, 6, f);\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Read and write operations without a call to a positioning function (fseek, fsetpos or rewind) or fflush in between result in undefined behaviour.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Read and write operations without a call to a positioning function (fseek, fsetpos or rewind) or fflush in between result in undefined behaviour.\n", errout_str()); // #6452 - member functions check("class FileStream {\n" @@ -632,7 +629,7 @@ class TestIO : public TestFixture { " seek(writePosition);\n" " fwrite(buffer.data(), sizeof(char), buffer.size(), d->file);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class FileStream {\n" " void insert(const ByteVector &data, ulong start);\n" @@ -643,7 +640,7 @@ class TestIO : public TestFixture { " unknown(writePosition);\n" " fwrite(buffer.data(), sizeof(char), buffer.size(), d->file);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class FileStream {\n" " void insert(const ByteVector &data, ulong start);\n" @@ -655,7 +652,7 @@ class TestIO : public TestFixture { " known(writePosition);\n" " fwrite(buffer.data(), sizeof(char), buffer.size(), d->file);\n" "}"); - ASSERT_EQUALS("[test.cpp:9]: (error) Read and write operations without a call to a positioning function (fseek, fsetpos or rewind) or fflush in between result in undefined behaviour.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:9]: (error) Read and write operations without a call to a positioning function (fseek, fsetpos or rewind) or fflush in between result in undefined behaviour.\n", errout_str()); check("class FileStream {\n" " void insert(const ByteVector &data, ulong start);\n" @@ -667,7 +664,7 @@ class TestIO : public TestFixture { " known(writePosition);\n" " fwrite(X::data(), sizeof(char), buffer.size(), d->file);\n" "}"); - ASSERT_EQUALS("[test.cpp:9]: (error) Read and write operations without a call to a positioning function (fseek, fsetpos or rewind) or fflush in between result in undefined behaviour.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:9]: (error) Read and write operations without a call to a positioning function (fseek, fsetpos or rewind) or fflush in between result in undefined behaviour.\n", errout_str()); } void seekOnAppendedFile() { @@ -675,25 +672,25 @@ class TestIO : public TestFixture { " FILE* f = fopen(\"\", \"a+\");\n" " fseek(f, 0, SEEK_SET);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() {\n" " FILE* f = fopen(\"\", \"w\");\n" " fseek(f, 0, SEEK_SET);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() {\n" " FILE* f = fopen(\"\", \"a\");\n" " fseek(f, 0, SEEK_SET);\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Repositioning operation performed on a file opened in append mode has no effect.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Repositioning operation performed on a file opened in append mode has no effect.\n", errout_str()); check("void foo() {\n" " FILE* f = fopen(\"\", \"a\");\n" " fflush(f);\n" "}"); - ASSERT_EQUALS("", errout.str()); // #5578 + ASSERT_EQUALS("", errout_str()); // #5578 check("void foo() {\n" " FILE* f = fopen(\"\", \"a\");\n" @@ -701,7 +698,7 @@ class TestIO : public TestFixture { " f = fopen(\"\", \"r\");\n" " fseek(f, 0, SEEK_SET);\n" "}"); - ASSERT_EQUALS("", errout.str()); // #6566 + ASSERT_EQUALS("", errout_str()); // #6566 } void fflushOnInputStream() { @@ -709,30 +706,30 @@ class TestIO : public TestFixture { "{\n" " fflush(stdin);\n" "}", dinit(CheckOptions, $.portability = true)); - ASSERT_EQUALS("[test.cpp:3]: (portability) fflush() called on input stream 'stdin' may result in undefined behaviour on non-linux systems.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (portability) fflush() called on input stream 'stdin' may result in undefined behaviour on non-linux systems.\n", errout_str()); check("void foo()\n" "{\n" " fflush(stdout);\n" "}", dinit(CheckOptions, $.portability = true)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(FILE*& f) {\n" " f = fopen(path, \"r\");\n" " fflush(f);\n" "}", dinit(CheckOptions, $.portability = true)); - ASSERT_EQUALS("[test.cpp:3]: (portability) fflush() called on input stream 'f' may result in undefined behaviour on non-linux systems.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (portability) fflush() called on input stream 'f' may result in undefined behaviour on non-linux systems.\n", errout_str()); check("void foo(FILE*& f) {\n" " f = fopen(path, \"w\");\n" " fflush(f);\n" "}", dinit(CheckOptions, $.portability = true)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(FILE*& f) {\n" " fflush(f);\n" "}", dinit(CheckOptions, $.portability = true)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void incompatibleFileOpen() { @@ -740,7 +737,7 @@ class TestIO : public TestFixture { " FILE *f1 = fopen(\"tmp\", \"wt\");\n" " FILE *f2 = fopen(\"tmp\", \"rt\");\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) The file '\"tmp\"' is opened for read and write access at the same time on different streams\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) The file '\"tmp\"' is opened for read and write access at the same time on different streams\n", errout_str()); } @@ -759,7 +756,7 @@ class TestIO : public TestFixture { "[test.cpp:5]: (warning) scanf() without field width limits can crash with huge input data.\n" "[test.cpp:6]: (warning) scanf() without field width limits can crash with huge input data.\n" "[test.cpp:7]: (warning) sscanf() without field width limits can crash with huge input data.\n" - "[test.cpp:8]: (warning) scanf() without field width limits can crash with huge input data.\n", errout.str()); + "[test.cpp:8]: (warning) scanf() without field width limits can crash with huge input data.\n", errout_str()); } void testScanf2() { @@ -771,7 +768,7 @@ class TestIO : public TestFixture { " scanf(\"aa%ld\", &a);\n" // No %s " scanf(\"%*[^~]\");\n" // Ignore input "}"); - ASSERT_EQUALS("[test.cpp:4]: (warning) scanf format string requires 0 parameters but 1 is given.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (warning) scanf format string requires 0 parameters but 1 is given.\n", errout_str()); } void testScanf3() { // ticket #3494 @@ -781,7 +778,7 @@ class TestIO : public TestFixture { " scanf(\"%8c\", str);\n" " scanf(\"%9c\", str);\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (error) Width 9 given in format string (no. 1) is larger than destination buffer 'str[8]', use %8c to prevent overflowing it.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Width 9 given in format string (no. 1) is larger than destination buffer 'str[8]', use %8c to prevent overflowing it.\n", errout_str()); } void testScanf4() { // ticket #2553 @@ -790,7 +787,7 @@ class TestIO : public TestFixture { " char str [8];\n" " scanf (\"%70s\",str);\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Width 70 given in format string (no. 1) is larger than destination buffer 'str[8]', use %7s to prevent overflowing it.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Width 70 given in format string (no. 1) is larger than destination buffer 'str[8]', use %7s to prevent overflowing it.\n", errout_str()); } void testScanf5() { // #10632 @@ -799,7 +796,7 @@ class TestIO : public TestFixture { " scanf(\"%42s%42[a-z]\", s1, s2);\n" "}"); ASSERT_EQUALS("[test.cpp:3]: (error) Width 42 given in format string (no. 1) is larger than destination buffer 's1[42]', use %41s to prevent overflowing it.\n" - "[test.cpp:3]: (error) Width 42 given in format string (no. 2) is larger than destination buffer 's2[42]', use %41[a-z] to prevent overflowing it.\n", errout.str()); + "[test.cpp:3]: (error) Width 42 given in format string (no. 2) is larger than destination buffer 's2[42]', use %41[a-z] to prevent overflowing it.\n", errout_str()); } @@ -836,65 +833,65 @@ class TestIO : public TestFixture { void testFormatStrNoWarn(const char *filename, unsigned int linenr, const char* code, bool cpp = false) { check(code, dinit(CheckOptions, $.inconclusive = true, $.platform = Platform::Type::Unix32, $.onlyFormatStr = true, $.cpp = cpp)); - assertEquals(filename, linenr, emptyString, errout.str()); + assertEquals(filename, linenr, emptyString, errout_str()); check(code, dinit(CheckOptions, $.inconclusive = true, $.platform = Platform::Type::Unix64, $.onlyFormatStr = true, $.cpp = cpp)); - assertEquals(filename, linenr, emptyString, errout.str()); + assertEquals(filename, linenr, emptyString, errout_str()); check(code, dinit(CheckOptions, $.inconclusive = true, $.platform = Platform::Type::Win32A, $.onlyFormatStr = true, $.cpp = cpp)); - assertEquals(filename, linenr, emptyString, errout.str()); + assertEquals(filename, linenr, emptyString, errout_str()); check(code, dinit(CheckOptions, $.inconclusive = true, $.platform = Platform::Type::Win64, $.onlyFormatStr = true, $.cpp = cpp)); - assertEquals(filename, linenr, emptyString, errout.str()); + assertEquals(filename, linenr, emptyString, errout_str()); } void testFormatStrWarn(const char *filename, unsigned int linenr, const char* code, const char* testScanfErrString, bool cpp = false) { check(code, dinit(CheckOptions, $.inconclusive = true, $.platform = Platform::Type::Unix32, $.onlyFormatStr = true, $.cpp = cpp)); - assertEquals(filename, linenr, testScanfErrString, errout.str()); + assertEquals(filename, linenr, testScanfErrString, errout_str()); check(code, dinit(CheckOptions, $.inconclusive = true, $.platform = Platform::Type::Unix64, $.onlyFormatStr = true, $.cpp = cpp)); - assertEquals(filename, linenr, testScanfErrString, errout.str()); + assertEquals(filename, linenr, testScanfErrString, errout_str()); check(code, dinit(CheckOptions, $.inconclusive = true, $.platform = Platform::Type::Win32A, $.onlyFormatStr = true, $.cpp = cpp)); - assertEquals(filename, linenr, testScanfErrString, errout.str()); + assertEquals(filename, linenr, testScanfErrString, errout_str()); check(code, dinit(CheckOptions, $.inconclusive = true, $.platform = Platform::Type::Win64, $.onlyFormatStr = true, $.cpp = cpp)); - assertEquals(filename, linenr, testScanfErrString, errout.str()); + assertEquals(filename, linenr, testScanfErrString, errout_str()); } void testFormatStrWarnAka(const char *filename, unsigned int linenr, const char* code, const char* testScanfErrAkaString, const char* testScanfErrAkaWin64String, bool cpp = false) { check(code, dinit(CheckOptions, $.inconclusive = true, $.portability = true, $.platform = Platform::Type::Unix32, $.onlyFormatStr = true, $.cpp = cpp)); - assertEquals(filename, linenr, testScanfErrAkaString, errout.str()); + assertEquals(filename, linenr, testScanfErrAkaString, errout_str()); check(code, dinit(CheckOptions, $.inconclusive = true, $.portability = true, $.platform = Platform::Type::Unix64, $.onlyFormatStr = true, $.cpp = cpp)); - assertEquals(filename, linenr, testScanfErrAkaString, errout.str()); + assertEquals(filename, linenr, testScanfErrAkaString, errout_str()); check(code, dinit(CheckOptions, $.inconclusive = true, $.portability = true, $.platform = Platform::Type::Win32A, $.onlyFormatStr = true, $.cpp = cpp)); - assertEquals(filename, linenr, testScanfErrAkaString, errout.str()); + assertEquals(filename, linenr, testScanfErrAkaString, errout_str()); check(code, dinit(CheckOptions, $.inconclusive = true, $.portability = true, $.platform = Platform::Type::Win64, $.onlyFormatStr = true, $.cpp = cpp)); - assertEquals(filename, linenr, testScanfErrAkaWin64String, errout.str()); + assertEquals(filename, linenr, testScanfErrAkaWin64String, errout_str()); } void testFormatStrWarnAkaWin64(const char *filename, unsigned int linenr, const char* code, const char* testScanfErrAkaWin64String, bool cpp = false) { check(code, dinit(CheckOptions, $.inconclusive = true, $.portability = true, $.platform = Platform::Type::Unix32, $.onlyFormatStr = true, $.cpp = cpp)); - assertEquals(filename, linenr, emptyString, errout.str()); + assertEquals(filename, linenr, emptyString, errout_str()); check(code, dinit(CheckOptions, $.inconclusive = true, $.portability = true, $.platform = Platform::Type::Unix64, $.onlyFormatStr = true, $.cpp = cpp)); - assertEquals(filename, linenr, emptyString, errout.str()); + assertEquals(filename, linenr, emptyString, errout_str()); check(code, dinit(CheckOptions, $.inconclusive = true, $.portability = true, $.platform = Platform::Type::Win32A, $.onlyFormatStr = true, $.cpp = cpp)); - assertEquals(filename, linenr, emptyString, errout.str()); + assertEquals(filename, linenr, emptyString, errout_str()); check(code, dinit(CheckOptions, $.inconclusive = true, $.portability = true, $.platform = Platform::Type::Win64, $.onlyFormatStr = true, $.cpp = cpp)); - assertEquals(filename, linenr, testScanfErrAkaWin64String, errout.str()); + assertEquals(filename, linenr, testScanfErrAkaWin64String, errout_str()); } void testFormatStrWarnAkaWin32(const char *filename, unsigned int linenr, const char* code, const char* testScanfErrAkaString, bool cpp = false) { check(code, dinit(CheckOptions, $.inconclusive = true, $.portability = true, $.platform = Platform::Type::Unix32, $.onlyFormatStr = true, $.cpp = cpp)); - assertEquals(filename, linenr, testScanfErrAkaString, errout.str()); + assertEquals(filename, linenr, testScanfErrAkaString, errout_str()); check(code, dinit(CheckOptions, $.inconclusive = true, $.portability = true, $.platform = Platform::Type::Unix64, $.onlyFormatStr = true, $.cpp = cpp)); - assertEquals(filename, linenr, testScanfErrAkaString, errout.str()); + assertEquals(filename, linenr, testScanfErrAkaString, errout_str()); check(code, dinit(CheckOptions, $.inconclusive = true, $.portability = true, $.platform = Platform::Type::Win32A, $.onlyFormatStr = true, $.cpp = cpp)); - assertEquals(filename, linenr, testScanfErrAkaString, errout.str()); + assertEquals(filename, linenr, testScanfErrAkaString, errout_str()); check(code, dinit(CheckOptions, $.inconclusive = true, $.portability = true, $.platform = Platform::Type::Win64, $.onlyFormatStr = true, $.cpp = cpp)); - assertEquals(filename, linenr, emptyString, errout.str()); + assertEquals(filename, linenr, emptyString, errout_str()); } #define TEST_SCANF_NOWARN(FORMAT, FORMATSTR, TYPE) \ @@ -944,7 +941,7 @@ class TestIO : public TestFixture { " fscanf(f, \"%7ms\", &ref);\n" // #3461 " sscanf(ip_port, \"%*[^:]:%4d\", &port);\n" // #3468 "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() {\n" " scanf(\"\", &foo);\n" @@ -955,7 +952,7 @@ class TestIO : public TestFixture { ASSERT_EQUALS("[test.cpp:2]: (warning) scanf format string requires 0 parameters but 1 is given.\n" "[test.cpp:3]: (warning) scanf format string requires 1 parameter but 2 are given.\n" "[test.cpp:4]: (warning) fscanf format string requires 1 parameter but 2 are given.\n" - "[test.cpp:5]: (warning) scanf format string requires 2 parameters but 3 are given.\n", errout.str()); + "[test.cpp:5]: (warning) scanf format string requires 2 parameters but 3 are given.\n", errout_str()); check("void foo() {\n" " scanf(\"%1d\");\n" @@ -966,7 +963,7 @@ class TestIO : public TestFixture { ASSERT_EQUALS("[test.cpp:2]: (error) scanf format string requires 1 parameter but only 0 are given.\n" "[test.cpp:3]: (error) scanf format string requires 2 parameters but only 1 is given.\n" "[test.cpp:4]: (error) sscanf format string requires 2 parameters but only 1 is given.\n" - "[test.cpp:5]: (error) scanf format string requires 2 parameters but only 1 is given.\n", errout.str()); + "[test.cpp:5]: (error) scanf format string requires 2 parameters but only 1 is given.\n", errout_str()); check("void foo() {\n" " char input[10];\n" @@ -975,7 +972,7 @@ class TestIO : public TestFixture { " sscanf(input, \"%4s\", output);\n" " sscanf(input, \"%5s\", output);\n" "}"); - ASSERT_EQUALS("[test.cpp:6]: (error) Width 5 given in format string (no. 1) is larger than destination buffer 'output[5]', use %4s to prevent overflowing it.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (error) Width 5 given in format string (no. 1) is larger than destination buffer 'output[5]', use %4s to prevent overflowing it.\n", errout_str()); check("void foo() {\n" " char input[10];\n" @@ -987,7 +984,7 @@ class TestIO : public TestFixture { "}", dinit(CheckOptions, $.inconclusive = true)); ASSERT_EQUALS("[test.cpp:5]: (warning, inconclusive) Width 3 given in format string (no. 1) is smaller than destination buffer 'output[5]'.\n" "[test.cpp:7]: (error) Width 5 given in format string (no. 1) is larger than destination buffer 'output[5]', use %4s to prevent overflowing it.\n" - "[test.cpp:4]: (warning) sscanf() without field width limits can crash with huge input data.\n", errout.str()); + "[test.cpp:4]: (warning) sscanf() without field width limits can crash with huge input data.\n", errout_str()); check("void foo() {\n" " const size_t BUFLENGTH(2048);\n" @@ -997,7 +994,7 @@ class TestIO : public TestFixture { " const int scanrc=sscanf(line, \"Project(\\\"{%36s}\\\")\", projectId);\n" " sscanf(input, \"%5s\", output);\n" "}", dinit(CheckOptions, $.inconclusive = true)); - ASSERT_EQUALS("[test.cpp:6]: (warning, inconclusive) Width 36 given in format string (no. 1) is smaller than destination buffer 'projectId[2048]'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (warning, inconclusive) Width 36 given in format string (no. 1) is smaller than destination buffer 'projectId[2048]'.\n", errout_str()); check("void foo(unsigned int i) {\n" " scanf(\"%h\", &i);\n" @@ -1018,7 +1015,7 @@ class TestIO : public TestFixture { "[test.cpp:7]: (warning) 'z' in format string (no. 1) is a length modifier and cannot be used without a conversion specifier.\n" "[test.cpp:8]: (warning) 't' in format string (no. 1) is a length modifier and cannot be used without a conversion specifier.\n" "[test.cpp:9]: (warning) 'L' in format string (no. 1) is a length modifier and cannot be used without a conversion specifier.\n" - "[test.cpp:10]: (warning) 'I' in format string (no. 1) is a length modifier and cannot be used without a conversion specifier.\n", errout.str()); + "[test.cpp:10]: (warning) 'I' in format string (no. 1) is a length modifier and cannot be used without a conversion specifier.\n", errout_str()); // Unrecognized (and non-existent in standard library) specifiers. // Perhaps should emit warnings @@ -1067,12 +1064,12 @@ class TestIO : public TestFixture { " scanf(\"%u\", L\"s5W\");\n" "}", dinit(CheckOptions, $.inconclusive = true)); ASSERT_EQUALS("[test.cpp:2]: (warning) %u in format string (no. 1) requires 'unsigned int *' but the argument type is 'const char *'.\n" - "[test.cpp:3]: (warning) %u in format string (no. 1) requires 'unsigned int *' but the argument type is 'const wchar_t *'.\n", errout.str()); + "[test.cpp:3]: (warning) %u in format string (no. 1) requires 'unsigned int *' but the argument type is 'const wchar_t *'.\n", errout_str()); check("void foo(long l) {\n" " scanf(\"%u\", l);\n" "}", dinit(CheckOptions, $.inconclusive = true)); - ASSERT_EQUALS("[test.cpp:2]: (warning) %u in format string (no. 1) requires 'unsigned int *' but the argument type is 'signed long'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) %u in format string (no. 1) requires 'unsigned int *' but the argument type is 'signed long'.\n", errout_str()); TEST_SCANF_WARN("%lu","unsigned long","bool"); TEST_SCANF_WARN("%lu","unsigned long","char"); @@ -1455,12 +1452,12 @@ class TestIO : public TestFixture { " scanf(\"%Ld\", L\"s5W\");\n" "}", dinit(CheckOptions, $.inconclusive = true)); ASSERT_EQUALS("[test.cpp:2]: (warning) %Ld in format string (no. 1) requires 'long long *' but the argument type is 'const char *'.\n" - "[test.cpp:3]: (warning) %Ld in format string (no. 1) requires 'long long *' but the argument type is 'const wchar_t *'.\n", errout.str()); + "[test.cpp:3]: (warning) %Ld in format string (no. 1) requires 'long long *' but the argument type is 'const wchar_t *'.\n", errout_str()); check("void foo(int i) {\n" " scanf(\"%Ld\", i);\n" "}", dinit(CheckOptions, $.inconclusive = true)); - ASSERT_EQUALS("[test.cpp:2]: (warning) %Ld in format string (no. 1) requires 'long long *' but the argument type is 'signed int'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) %Ld in format string (no. 1) requires 'long long *' but the argument type is 'signed int'.\n", errout_str()); TEST_SCANF_WARN("%ju", "uintmax_t", "bool"); TEST_SCANF_WARN("%ju", "uintmax_t", "char"); @@ -1932,12 +1929,12 @@ class TestIO : public TestFixture { " scanf(\"%d\", L\"s5W\");\n" "}", dinit(CheckOptions, $.inconclusive = true)); ASSERT_EQUALS("[test.cpp:2]: (warning) %d in format string (no. 1) requires 'int *' but the argument type is 'const char *'.\n" - "[test.cpp:3]: (warning) %d in format string (no. 1) requires 'int *' but the argument type is 'const wchar_t *'.\n", errout.str()); + "[test.cpp:3]: (warning) %d in format string (no. 1) requires 'int *' but the argument type is 'const wchar_t *'.\n", errout_str()); check("void foo(long l) {\n" " scanf(\"%d\", l);\n" "}", dinit(CheckOptions, $.inconclusive = true)); - ASSERT_EQUALS("[test.cpp:2]: (warning) %d in format string (no. 1) requires 'int *' but the argument type is 'signed long'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) %d in format string (no. 1) requires 'int *' but the argument type is 'signed long'.\n", errout_str()); TEST_SCANF_WARN("%x", "unsigned int", "bool"); TEST_SCANF_WARN("%x", "unsigned int", "char"); @@ -1976,12 +1973,12 @@ class TestIO : public TestFixture { " scanf(\"%x\", L\"s5W\");\n" "}", dinit(CheckOptions, $.inconclusive = true)); ASSERT_EQUALS("[test.cpp:2]: (warning) %x in format string (no. 1) requires 'unsigned int *' but the argument type is 'const char *'.\n" - "[test.cpp:3]: (warning) %x in format string (no. 1) requires 'unsigned int *' but the argument type is 'const wchar_t *'.\n", errout.str()); + "[test.cpp:3]: (warning) %x in format string (no. 1) requires 'unsigned int *' but the argument type is 'const wchar_t *'.\n", errout_str()); check("void foo(long l) {\n" " scanf(\"%x\", l);\n" "}", dinit(CheckOptions, $.inconclusive = true)); - ASSERT_EQUALS("[test.cpp:2]: (warning) %x in format string (no. 1) requires 'unsigned int *' but the argument type is 'signed long'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) %x in format string (no. 1) requires 'unsigned int *' but the argument type is 'signed long'.\n", errout_str()); TEST_SCANF_WARN("%f", "float", "bool"); TEST_SCANF_WARN("%f", "float", "char"); @@ -2016,12 +2013,12 @@ class TestIO : public TestFixture { " scanf(\"%f\", L\"s5W\");\n" "}", dinit(CheckOptions, $.inconclusive = true)); ASSERT_EQUALS("[test.cpp:2]: (warning) %f in format string (no. 1) requires 'float *' but the argument type is 'const char *'.\n" - "[test.cpp:3]: (warning) %f in format string (no. 1) requires 'float *' but the argument type is 'const wchar_t *'.\n", errout.str()); + "[test.cpp:3]: (warning) %f in format string (no. 1) requires 'float *' but the argument type is 'const wchar_t *'.\n", errout_str()); check("void foo(float f) {\n" " scanf(\"%f\", f);\n" "}", dinit(CheckOptions, $.inconclusive = true)); - ASSERT_EQUALS("[test.cpp:2]: (warning) %f in format string (no. 1) requires 'float *' but the argument type is 'float'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) %f in format string (no. 1) requires 'float *' but the argument type is 'float'.\n", errout_str()); TEST_SCANF_WARN("%lf", "double", "bool"); TEST_SCANF_WARN("%lf", "double", "char"); @@ -2112,12 +2109,12 @@ class TestIO : public TestFixture { " scanf(\"%n\", L\"s5W\");\n" "}", dinit(CheckOptions, $.inconclusive = true)); ASSERT_EQUALS("[test.cpp:2]: (warning) %n in format string (no. 1) requires 'int *' but the argument type is 'const char *'.\n" - "[test.cpp:3]: (warning) %n in format string (no. 1) requires 'int *' but the argument type is 'const wchar_t *'.\n", errout.str()); + "[test.cpp:3]: (warning) %n in format string (no. 1) requires 'int *' but the argument type is 'const wchar_t *'.\n", errout_str()); check("void foo(long l) {\n" " scanf(\"%n\", l);\n" "}", dinit(CheckOptions, $.inconclusive = true)); - ASSERT_EQUALS("[test.cpp:2]: (warning) %n in format string (no. 1) requires 'int *' but the argument type is 'signed long'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) %n in format string (no. 1) requires 'int *' but the argument type is 'signed long'.\n", errout_str()); check("void g() {\n" // #5104 " myvector v1(1);\n" @@ -2131,7 +2128,7 @@ class TestIO : public TestFixture { " myvector v5(1);\n" " scanf(\"%10s\",v5[0]);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); { const char * code = "void g() {\n" // #5348 @@ -2148,13 +2145,13 @@ class TestIO : public TestFixture { "[test.cpp:6]: (portability) %zd in format string (no. 1) requires 'ssize_t *' but the argument type is 'ptrdiff_t * {aka signed long long *}'.\n"); check(code, dinit(CheckOptions, $.portability = true, $.platform = Platform::Type::Unix32)); - ASSERT_EQUALS(result, errout.str()); + ASSERT_EQUALS(result, errout_str()); check(code, dinit(CheckOptions, $.portability = true, $.platform = Platform::Type::Unix64)); - ASSERT_EQUALS(result, errout.str()); + ASSERT_EQUALS(result, errout_str()); check(code, dinit(CheckOptions, $.portability = true, $.platform = Platform::Type::Win32A)); - ASSERT_EQUALS(result, errout.str()); + ASSERT_EQUALS(result, errout_str()); check(code, dinit(CheckOptions, $.portability = true, $.platform = Platform::Type::Win64)); - ASSERT_EQUALS(result_win64, errout.str()); + ASSERT_EQUALS(result_win64, errout_str()); } { check("void g() {\n" @@ -2162,13 +2159,13 @@ class TestIO : public TestFixture { " scanf(\"%s\", c);\n" "}"); ASSERT_EQUALS("[test.cpp:3]: (warning) %s in format string (no. 1) requires a 'char *' but the argument type is 'const char *'.\n" - "[test.cpp:3]: (warning) scanf() without field width limits can crash with huge input data.\n", errout.str()); + "[test.cpp:3]: (warning) scanf() without field width limits can crash with huge input data.\n", errout_str()); } check("void f() {\n" // #7038 " scanf(\"%i\", \"abc\" + 1);\n" "}\n"); - ASSERT_EQUALS("[test.cpp:2]: (warning) %i in format string (no. 1) requires 'int *' but the argument type is 'const char *'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) %i in format string (no. 1) requires 'int *' but the argument type is 'const char *'.\n", errout_str()); } void testPrintfArgument() { @@ -2191,7 +2188,7 @@ class TestIO : public TestFixture { "[test.cpp:7]: (error) fprintf format string requires 2 parameters but only 0 are given.\n" "[test.cpp:8]: (error) snprintf format string requires 2 parameters but only 0 are given.\n" "[test.cpp:9]: (error) sprintf format string requires 3 parameters but only 2 are given.\n" - "[test.cpp:10]: (error) snprintf format string requires 2 parameters but only 1 is given.\n", errout.str()); + "[test.cpp:10]: (error) snprintf format string requires 2 parameters but only 1 is given.\n", errout_str()); check("void foo(char *str) {\n" " printf(\"\", 0);\n" @@ -2200,7 +2197,7 @@ class TestIO : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:2]: (warning) printf format string requires 0 parameters but 1 is given.\n" "[test.cpp:3]: (warning) printf format string requires 1 parameter but 2 are given.\n" - "[test.cpp:4]: (warning) printf format string requires 2 parameters but 3 are given.\n", errout.str()); + "[test.cpp:4]: (warning) printf format string requires 2 parameters but 3 are given.\n", errout_str()); check("void foo() {\n" // swprintf exists as MSVC extension and as standard function: #4790 " swprintf(string1, L\"%i\", 32, string2);\n" // MSVC implementation @@ -2209,7 +2206,7 @@ class TestIO : public TestFixture { " swprintf(string1, 6, L\"%i%s\", 32, string2);\n" // Standard implementation "}"); ASSERT_EQUALS("[test.cpp:2]: (warning) swprintf format string requires 1 parameter but 2 are given.\n" - "[test.cpp:4]: (warning) swprintf format string requires 1 parameter but 2 are given.\n", errout.str()); + "[test.cpp:4]: (warning) swprintf format string requires 1 parameter but 2 are given.\n", errout_str()); check("void foo(char *str) {\n" " printf(\"%i\", 0);\n" @@ -2225,7 +2222,7 @@ class TestIO : public TestFixture { " fprintf(stderr, \"%*cText.\", indent, ' ');\n" // #3313 " sprintf(string1, \"%*\", 32);\n" // #3364 "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(char* s, const char* s2, std::string s3, int i) {\n" " printf(\"%s%s\", s, s2);\n" @@ -2238,7 +2235,7 @@ class TestIO : public TestFixture { ASSERT_EQUALS("[test.cpp:3]: (warning) %s in format string (no. 1) requires 'char *' but the argument type is 'signed int'.\n" "[test.cpp:4]: (warning) %s in format string (no. 2) requires 'char *' but the argument type is 'signed int'.\n" "[test.cpp:5]: (warning) %s in format string (no. 1) requires 'char *' but the argument type is 'std::string'.\n" - "[test.cpp:7]: (warning) %u in format string (no. 1) requires 'unsigned int' but the argument type is 'char *'.\n", errout.str()); + "[test.cpp:7]: (warning) %u in format string (no. 1) requires 'unsigned int' but the argument type is 'char *'.\n", errout_str()); check("void foo(char* s, const char* s2, std::string s3, int i) {\n" " printf(\"%jd\", s);\n" @@ -2253,7 +2250,7 @@ class TestIO : public TestFixture { "[test.cpp:4]: (warning) %ju in format string (no. 1) requires 'uintmax_t' but the argument type is 'const char *'.\n" "[test.cpp:5]: (warning) %jo in format string (no. 1) requires 'uintmax_t' but the argument type is 'std::string'.\n" "[test.cpp:6]: (warning) %jx in format string (no. 1) requires 'uintmax_t' but the argument type is 'signed int'.\n" - "[test.cpp:7]: (warning) %jX in format string (no. 1) requires 'uintmax_t' but the argument type is 'signed int'.\n", errout.str()); + "[test.cpp:7]: (warning) %jX in format string (no. 1) requires 'uintmax_t' but the argument type is 'signed int'.\n", errout_str()); check("void foo(uintmax_t uim, std::string s3, unsigned int ui, int i) {\n" " printf(\"%ju\", uim);\n" @@ -2265,7 +2262,7 @@ class TestIO : public TestFixture { ASSERT_EQUALS("[test.cpp:3]: (warning) %ju in format string (no. 1) requires 'uintmax_t' but the argument type is 'unsigned int'.\n" "[test.cpp:4]: (warning) %jd in format string (no. 1) requires 'intmax_t' but the argument type is 'unsigned int'.\n" "[test.cpp:5]: (warning) %jd in format string (no. 1) requires 'intmax_t' but the argument type is 'std::string'.\n" - "[test.cpp:6]: (warning) %jd in format string (no. 1) requires 'intmax_t' but the argument type is 'signed int'.\n", errout.str()); + "[test.cpp:6]: (warning) %jd in format string (no. 1) requires 'intmax_t' but the argument type is 'signed int'.\n", errout_str()); check("void foo(const int* cpi, const int ci, int i, int* pi, std::string s) {\n" " printf(\"%n\", cpi);\n" @@ -2278,12 +2275,12 @@ class TestIO : public TestFixture { ASSERT_EQUALS("[test.cpp:3]: (warning) %n in format string (no. 1) requires 'int *' but the argument type is 'signed int'.\n" "[test.cpp:4]: (warning) %n in format string (no. 1) requires 'int *' but the argument type is 'signed int'.\n" "[test.cpp:6]: (warning) %n in format string (no. 1) requires 'int *' but the argument type is 'std::string'.\n" - "[test.cpp:7]: (warning) %n in format string (no. 1) requires 'int *' but the argument type is 'const char *'.\n", errout.str()); + "[test.cpp:7]: (warning) %n in format string (no. 1) requires 'int *' but the argument type is 'const char *'.\n", errout_str()); check("void foo() {\n" " printf(\"%n\", L\"s5W\");\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) %n in format string (no. 1) requires 'int *' but the argument type is 'const wchar_t *'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) %n in format string (no. 1) requires 'int *' but the argument type is 'const wchar_t *'.\n", errout_str()); check("class foo {};\n" "void foo(const int* cpi, foo f, bar b, bar* bp, double d, int i, unsigned int u) {\n" @@ -2300,7 +2297,7 @@ class TestIO : public TestFixture { "[test.cpp:4]: (warning) %c in format string (no. 1) requires 'unsigned int' but the argument type is 'const char *'.\n" "[test.cpp:5]: (warning) %o in format string (no. 1) requires 'unsigned int' but the argument type is 'double'.\n" "[test.cpp:6]: (warning) %x in format string (no. 1) requires 'unsigned int' but the argument type is 'const signed int *'.\n" - "[test.cpp:8]: (warning) %X in format string (no. 1) requires 'unsigned int' but the argument type is 'bar *'.\n", errout.str()); + "[test.cpp:8]: (warning) %X in format string (no. 1) requires 'unsigned int' but the argument type is 'bar *'.\n", errout_str()); check("class foo {};\n" "void foo(const char* cpc, char* pc) {\n" @@ -2308,7 +2305,7 @@ class TestIO : public TestFixture { " printf(\"%x\", pc);\n" "}"); ASSERT_EQUALS("[test.cpp:3]: (warning) %x in format string (no. 1) requires 'unsigned int' but the argument type is 'const char *'.\n" - "[test.cpp:4]: (warning) %x in format string (no. 1) requires 'unsigned int' but the argument type is 'char *'.\n", errout.str()); + "[test.cpp:4]: (warning) %x in format string (no. 1) requires 'unsigned int' but the argument type is 'char *'.\n", errout_str()); check("class foo {};\n" "void foo() {\n" @@ -2320,7 +2317,7 @@ class TestIO : public TestFixture { ASSERT_EQUALS("[test.cpp:3]: (warning) %x in format string (no. 1) requires 'unsigned int' but the argument type is 'const wchar_t *'.\n" "[test.cpp:4]: (warning) %X in format string (no. 1) requires 'unsigned int' but the argument type is 'const wchar_t *'.\n" "[test.cpp:5]: (warning) %c in format string (no. 1) requires 'unsigned int' but the argument type is 'const wchar_t *'.\n" - "[test.cpp:6]: (warning) %o in format string (no. 1) requires 'unsigned int' but the argument type is 'const wchar_t *'.\n", errout.str()); + "[test.cpp:6]: (warning) %o in format string (no. 1) requires 'unsigned int' but the argument type is 'const wchar_t *'.\n", errout_str()); check("class foo {};\n" "void foo(const int* cpi, foo f, bar b, bar* bp, double d, unsigned int u, unsigned char uc) {\n" @@ -2338,7 +2335,7 @@ class TestIO : public TestFixture { "[test.cpp:5]: (warning) %d in format string (no. 1) requires 'int' but the argument type is 'double'.\n" "[test.cpp:6]: (warning) %d in format string (no. 1) requires 'int' but the argument type is 'unsigned int'.\n" "[test.cpp:7]: (warning) %d in format string (no. 1) requires 'int' but the argument type is 'const signed int *'.\n" - "[test.cpp:9]: (warning) %i in format string (no. 1) requires 'int' but the argument type is 'bar *'.\n", errout.str()); + "[test.cpp:9]: (warning) %i in format string (no. 1) requires 'int' but the argument type is 'bar *'.\n", errout_str()); check("class foo {};\n" "void foo() {\n" @@ -2346,7 +2343,7 @@ class TestIO : public TestFixture { " printf(\"%d\", L\"s5W\");\n" "}"); ASSERT_EQUALS("[test.cpp:3]: (warning) %i in format string (no. 1) requires 'int' but the argument type is 'const wchar_t *'.\n" - "[test.cpp:4]: (warning) %d in format string (no. 1) requires 'int' but the argument type is 'const wchar_t *'.\n", errout.str()); + "[test.cpp:4]: (warning) %d in format string (no. 1) requires 'int' but the argument type is 'const wchar_t *'.\n", errout_str()); check("class foo {};\n" "void foo(const int* cpi, foo f, bar b, bar* bp, double d, int i, bool bo) {\n" @@ -2364,13 +2361,13 @@ class TestIO : public TestFixture { "[test.cpp:5]: (warning) %u in format string (no. 1) requires 'unsigned int' but the argument type is 'double'.\n" "[test.cpp:6]: (warning) %u in format string (no. 1) requires 'unsigned int' but the argument type is 'signed int'.\n" "[test.cpp:7]: (warning) %u in format string (no. 1) requires 'unsigned int' but the argument type is 'const signed int *'.\n" - "[test.cpp:9]: (warning) %u in format string (no. 1) requires 'unsigned int' but the argument type is 'bar *'.\n", errout.str()); + "[test.cpp:9]: (warning) %u in format string (no. 1) requires 'unsigned int' but the argument type is 'bar *'.\n", errout_str()); check("class foo {};\n" "void foo(const int* cpi, foo f, bar b, bar* bp, double d, int i, bool bo) {\n" " printf(\"%u\", L\"s5W\");\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) %u in format string (no. 1) requires 'unsigned int' but the argument type is 'const wchar_t *'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) %u in format string (no. 1) requires 'unsigned int' but the argument type is 'const wchar_t *'.\n", errout_str()); check("class foo {};\n" "void foo(const int* cpi, foo f, bar b, bar* bp, char c) {\n" @@ -2381,7 +2378,7 @@ class TestIO : public TestFixture { " printf(\"%p\", b);\n" "}"); ASSERT_EQUALS("[test.cpp:3]: (warning) %p in format string (no. 1) requires an address but the argument type is 'foo'.\n" - "[test.cpp:4]: (warning) %p in format string (no. 1) requires an address but the argument type is 'char'.\n", errout.str()); + "[test.cpp:4]: (warning) %p in format string (no. 1) requires an address but the argument type is 'char'.\n", errout_str()); check("class foo {};\n" "void foo(char* pc, const char* cpc, wchar_t* pwc, const wchar_t* cpwc) {\n" @@ -2392,7 +2389,7 @@ class TestIO : public TestFixture { " printf(\"%p\", \"s4\");\n" " printf(\"%p\", L\"s5W\");\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class foo {};\n" "void foo(const int* cpi, foo f, bar b, bar* bp, double d) {\n" @@ -2407,7 +2404,7 @@ class TestIO : public TestFixture { ASSERT_EQUALS("[test.cpp:3]: (warning) %e in format string (no. 1) requires 'double' but the argument type is 'foo'.\n" "[test.cpp:4]: (warning) %E in format string (no. 1) requires 'double' but the argument type is 'const char *'.\n" "[test.cpp:5]: (warning) %f in format string (no. 1) requires 'double' but the argument type is 'const signed int *'.\n" - "[test.cpp:6]: (warning) %G in format string (no. 1) requires 'double' but the argument type is 'bar *'.\n", errout.str()); + "[test.cpp:6]: (warning) %G in format string (no. 1) requires 'double' but the argument type is 'bar *'.\n", errout_str()); check("class foo {};\n" "void foo(const char* cpc, char* pc) {\n" @@ -2421,7 +2418,7 @@ class TestIO : public TestFixture { "[test.cpp:4]: (warning) %E in format string (no. 1) requires 'double' but the argument type is 'char *'.\n" "[test.cpp:5]: (warning) %f in format string (no. 1) requires 'double' but the argument type is 'const char *'.\n" "[test.cpp:6]: (warning) %G in format string (no. 1) requires 'double' but the argument type is 'char *'.\n" - "[test.cpp:7]: (warning) %f in format string (no. 1) requires 'double' but the argument type is 'char *'.\n", errout.str()); + "[test.cpp:7]: (warning) %f in format string (no. 1) requires 'double' but the argument type is 'char *'.\n", errout_str()); check("class foo {};\n" "void foo() {\n" @@ -2433,7 +2430,7 @@ class TestIO : public TestFixture { ASSERT_EQUALS("[test.cpp:3]: (warning) %e in format string (no. 1) requires 'double' but the argument type is 'const wchar_t *'.\n" "[test.cpp:4]: (warning) %E in format string (no. 1) requires 'double' but the argument type is 'const wchar_t *'.\n" "[test.cpp:5]: (warning) %f in format string (no. 1) requires 'double' but the argument type is 'const wchar_t *'.\n" - "[test.cpp:6]: (warning) %G in format string (no. 1) requires 'double' but the argument type is 'const wchar_t *'.\n", errout.str()); + "[test.cpp:6]: (warning) %G in format string (no. 1) requires 'double' but the argument type is 'const wchar_t *'.\n", errout_str()); check("class foo;\n" "void foo(foo f) {\n" @@ -2443,7 +2440,7 @@ class TestIO : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:3]: (warning) %u in format string (no. 1) requires 'unsigned int' but the argument type is 'foo'.\n" "[test.cpp:4]: (warning) %f in format string (no. 1) requires 'double' but the argument type is 'foo'.\n" - "[test.cpp:5]: (warning) %p in format string (no. 1) requires an address but the argument type is 'foo'.\n", errout.str()); + "[test.cpp:5]: (warning) %p in format string (no. 1) requires an address but the argument type is 'foo'.\n", errout_str()); // Ticket #4189 (Improve check (printf("%l") not detected)) tests (according to C99 7.19.6.1.7) // False positive tests @@ -2452,13 +2449,13 @@ class TestIO : public TestFixture { " printf(\"%hd %hu\", si, usi);\n" "}"); ASSERT_EQUALS("[test.cpp:2]: (warning) %hhx in format string (no. 1) requires 'unsigned char' but the argument type is 'signed char'.\n" - "[test.cpp:2]: (warning) %hhd in format string (no. 2) requires 'char' but the argument type is 'unsigned char'.\n", errout.str()); + "[test.cpp:2]: (warning) %hhd in format string (no. 2) requires 'char' but the argument type is 'unsigned char'.\n", errout_str()); check("void foo(long long int lli, unsigned long long int ulli, long int li, unsigned long int uli) {\n" " printf(\"%llo %llx\", lli, ulli);\n" " printf(\"%ld %lu\", li, uli);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(intmax_t im, uintmax_t uim, size_t s, ptrdiff_t p, long double ld, std::size_t ss, std::ptrdiff_t sp) {\n" " printf(\"%jd %jo\", im, uim);\n" @@ -2468,7 +2465,7 @@ class TestIO : public TestFixture { " printf(\"%zx\", ss);\n" " printf(\"%ti\", sp);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Unrecognized (and non-existent in standard library) specifiers. // Perhaps should emit warnings @@ -2480,32 +2477,32 @@ class TestIO : public TestFixture { " printf(\"%zv\", ss);\n" " printf(\"%tp\", sp);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(long long l, ptrdiff_t p, std::ptrdiff_t sp) {\n" " printf(\"%td\", p);\n" " printf(\"%td\", sp);\n" " printf(\"%td\", l);\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (warning) %td in format string (no. 1) requires 'ptrdiff_t' but the argument type is 'signed long long'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (warning) %td in format string (no. 1) requires 'ptrdiff_t' but the argument type is 'signed long long'.\n", errout_str()); check("void foo(int i, long double ld) {\n" " printf(\"%zx %zu\", i, ld);\n" "}"); ASSERT_EQUALS("[test.cpp:2]: (warning) %zx in format string (no. 1) requires 'size_t' but the argument type is 'signed int'.\n" - "[test.cpp:2]: (warning) %zu in format string (no. 2) requires 'size_t' but the argument type is 'long double'.\n", errout.str()); + "[test.cpp:2]: (warning) %zu in format string (no. 2) requires 'size_t' but the argument type is 'long double'.\n", errout_str()); check("void foo(unsigned int ui, long double ld) {\n" " printf(\"%zu %zx\", ui, ld);\n" "}"); ASSERT_EQUALS("[test.cpp:2]: (warning) %zu in format string (no. 1) requires 'size_t' but the argument type is 'unsigned int'.\n" - "[test.cpp:2]: (warning) %zx in format string (no. 2) requires 'size_t' but the argument type is 'long double'.\n", errout.str()); + "[test.cpp:2]: (warning) %zx in format string (no. 2) requires 'size_t' but the argument type is 'long double'.\n", errout_str()); check("void foo(int i, long double ld) {\n" " printf(\"%tx %tu\", i, ld);\n" "}"); ASSERT_EQUALS("[test.cpp:2]: (warning) %tx in format string (no. 1) requires 'unsigned ptrdiff_t' but the argument type is 'signed int'.\n" - "[test.cpp:2]: (warning) %tu in format string (no. 2) requires 'unsigned ptrdiff_t' but the argument type is 'long double'.\n", errout.str()); + "[test.cpp:2]: (warning) %tu in format string (no. 2) requires 'unsigned ptrdiff_t' but the argument type is 'long double'.\n", errout_str()); // False negative test check("void foo(unsigned int i) {\n" @@ -2527,7 +2524,7 @@ class TestIO : public TestFixture { "[test.cpp:7]: (warning) 'z' in format string (no. 1) is a length modifier and cannot be used without a conversion specifier.\n" "[test.cpp:8]: (warning) 't' in format string (no. 1) is a length modifier and cannot be used without a conversion specifier.\n" "[test.cpp:9]: (warning) 'L' in format string (no. 1) is a length modifier and cannot be used without a conversion specifier.\n" - "[test.cpp:10]: (warning) 'I' in format string (no. 1) is a length modifier and cannot be used without a conversion specifier.\n", errout.str()); + "[test.cpp:10]: (warning) 'I' in format string (no. 1) is a length modifier and cannot be used without a conversion specifier.\n", errout_str()); check("void foo(unsigned int i) {\n" " printf(\"%hd\", i);\n" @@ -2538,63 +2535,63 @@ class TestIO : public TestFixture { ASSERT_EQUALS("[test.cpp:2]: (warning) %hd in format string (no. 1) requires 'short' but the argument type is 'unsigned int'.\n" "[test.cpp:3]: (warning) %hhd in format string (no. 1) requires 'char' but the argument type is 'unsigned int'.\n" "[test.cpp:4]: (warning) %ld in format string (no. 1) requires 'long' but the argument type is 'unsigned int'.\n" - "[test.cpp:5]: (warning) %lld in format string (no. 1) requires 'long long' but the argument type is 'unsigned int'.\n", errout.str()); + "[test.cpp:5]: (warning) %lld in format string (no. 1) requires 'long long' but the argument type is 'unsigned int'.\n", errout_str()); check("void foo(size_t s, ptrdiff_t p) {\n" " printf(\"%zd\", s);\n" " printf(\"%tu\", p);\n" "}", dinit(CheckOptions, $.portability = true, $.platform = Platform::Type::Unix32)); ASSERT_EQUALS("[test.cpp:2]: (portability) %zd in format string (no. 1) requires 'ssize_t' but the argument type is 'size_t {aka unsigned long}'.\n" - "[test.cpp:3]: (portability) %tu in format string (no. 1) requires 'unsigned ptrdiff_t' but the argument type is 'ptrdiff_t {aka signed long}'.\n", errout.str()); + "[test.cpp:3]: (portability) %tu in format string (no. 1) requires 'unsigned ptrdiff_t' but the argument type is 'ptrdiff_t {aka signed long}'.\n", errout_str()); check("void foo(std::size_t s, std::ptrdiff_t p) {\n" " printf(\"%zd\", s);\n" " printf(\"%tu\", p);\n" "}", dinit(CheckOptions, $.portability = true, $.platform = Platform::Type::Unix32)); ASSERT_EQUALS("[test.cpp:2]: (portability) %zd in format string (no. 1) requires 'ssize_t' but the argument type is 'std::size_t {aka unsigned long}'.\n" - "[test.cpp:3]: (portability) %tu in format string (no. 1) requires 'unsigned ptrdiff_t' but the argument type is 'std::ptrdiff_t {aka signed long}'.\n", errout.str()); + "[test.cpp:3]: (portability) %tu in format string (no. 1) requires 'unsigned ptrdiff_t' but the argument type is 'std::ptrdiff_t {aka signed long}'.\n", errout_str()); check("void foo(size_t s, ptrdiff_t p) {\n" " printf(\"%zd\", s);\n" " printf(\"%tu\", p);\n" "}", dinit(CheckOptions, $.portability = true, $.platform = Platform::Type::Unix64)); ASSERT_EQUALS("[test.cpp:2]: (portability) %zd in format string (no. 1) requires 'ssize_t' but the argument type is 'size_t {aka unsigned long}'.\n" - "[test.cpp:3]: (portability) %tu in format string (no. 1) requires 'unsigned ptrdiff_t' but the argument type is 'ptrdiff_t {aka signed long}'.\n", errout.str()); + "[test.cpp:3]: (portability) %tu in format string (no. 1) requires 'unsigned ptrdiff_t' but the argument type is 'ptrdiff_t {aka signed long}'.\n", errout_str()); check("void foo(std::size_t s, std::ptrdiff_t p) {\n" " printf(\"%zd\", s);\n" " printf(\"%tu\", p);\n" "}", dinit(CheckOptions, $.portability = true, $.platform = Platform::Type::Unix64)); ASSERT_EQUALS("[test.cpp:2]: (portability) %zd in format string (no. 1) requires 'ssize_t' but the argument type is 'std::size_t {aka unsigned long}'.\n" - "[test.cpp:3]: (portability) %tu in format string (no. 1) requires 'unsigned ptrdiff_t' but the argument type is 'std::ptrdiff_t {aka signed long}'.\n", errout.str()); + "[test.cpp:3]: (portability) %tu in format string (no. 1) requires 'unsigned ptrdiff_t' but the argument type is 'std::ptrdiff_t {aka signed long}'.\n", errout_str()); check("void foo(size_t s, ptrdiff_t p) {\n" " printf(\"%zd\", s);\n" " printf(\"%tu\", p);\n" "}", dinit(CheckOptions, $.portability = true, $.platform = Platform::Type::Win32A)); ASSERT_EQUALS("[test.cpp:2]: (portability) %zd in format string (no. 1) requires 'ssize_t' but the argument type is 'size_t {aka unsigned long}'.\n" - "[test.cpp:3]: (portability) %tu in format string (no. 1) requires 'unsigned ptrdiff_t' but the argument type is 'ptrdiff_t {aka signed long}'.\n", errout.str()); + "[test.cpp:3]: (portability) %tu in format string (no. 1) requires 'unsigned ptrdiff_t' but the argument type is 'ptrdiff_t {aka signed long}'.\n", errout_str()); check("void foo(std::size_t s, std::ptrdiff_t p) {\n" " printf(\"%zd\", s);\n" " printf(\"%tu\", p);\n" "}", dinit(CheckOptions, $.portability = true, $.platform = Platform::Type::Win32A)); ASSERT_EQUALS("[test.cpp:2]: (portability) %zd in format string (no. 1) requires 'ssize_t' but the argument type is 'std::size_t {aka unsigned long}'.\n" - "[test.cpp:3]: (portability) %tu in format string (no. 1) requires 'unsigned ptrdiff_t' but the argument type is 'std::ptrdiff_t {aka signed long}'.\n", errout.str()); + "[test.cpp:3]: (portability) %tu in format string (no. 1) requires 'unsigned ptrdiff_t' but the argument type is 'std::ptrdiff_t {aka signed long}'.\n", errout_str()); check("void foo(size_t s, ptrdiff_t p) {\n" " printf(\"%zd\", s);\n" " printf(\"%tu\", p);\n" "}", dinit(CheckOptions, $.portability = true, $.platform = Platform::Type::Win64)); ASSERT_EQUALS("[test.cpp:2]: (portability) %zd in format string (no. 1) requires 'ssize_t' but the argument type is 'size_t {aka unsigned long long}'.\n" - "[test.cpp:3]: (portability) %tu in format string (no. 1) requires 'unsigned ptrdiff_t' but the argument type is 'ptrdiff_t {aka signed long long}'.\n", errout.str()); + "[test.cpp:3]: (portability) %tu in format string (no. 1) requires 'unsigned ptrdiff_t' but the argument type is 'ptrdiff_t {aka signed long long}'.\n", errout_str()); check("void foo(std::size_t s, std::ptrdiff_t p) {\n" " printf(\"%zd\", s);\n" " printf(\"%tu\", p);\n" "}", dinit(CheckOptions, $.portability = true, $.platform = Platform::Type::Win64)); ASSERT_EQUALS("[test.cpp:2]: (portability) %zd in format string (no. 1) requires 'ssize_t' but the argument type is 'std::size_t {aka unsigned long long}'.\n" - "[test.cpp:3]: (portability) %tu in format string (no. 1) requires 'unsigned ptrdiff_t' but the argument type is 'std::ptrdiff_t {aka signed long long}'.\n", errout.str()); + "[test.cpp:3]: (portability) %tu in format string (no. 1) requires 'unsigned ptrdiff_t' but the argument type is 'std::ptrdiff_t {aka signed long long}'.\n", errout_str()); check("void foo(size_t s, uintmax_t um) {\n" " printf(\"%lu\", s);\n" @@ -2605,7 +2602,7 @@ class TestIO : public TestFixture { ASSERT_EQUALS("[test.cpp:2]: (portability) %lu in format string (no. 1) requires 'unsigned long' but the argument type is 'size_t {aka unsigned long long}'.\n" "[test.cpp:3]: (portability) %lu in format string (no. 1) requires 'unsigned long' but the argument type is 'uintmax_t {aka unsigned long long}'.\n" "[test.cpp:4]: (portability) %llu in format string (no. 1) requires 'unsigned long long' but the argument type is 'size_t {aka unsigned long long}'.\n" - "[test.cpp:5]: (portability) %llu in format string (no. 1) requires 'unsigned long long' but the argument type is 'uintmax_t {aka unsigned long long}'.\n", errout.str()); + "[test.cpp:5]: (portability) %llu in format string (no. 1) requires 'unsigned long long' but the argument type is 'uintmax_t {aka unsigned long long}'.\n", errout_str()); check("void foo(unsigned int i) {\n" " printf(\"%ld\", i);\n" @@ -2620,21 +2617,21 @@ class TestIO : public TestFixture { "[test.cpp:4]: (warning) %lu in format string (no. 1) requires 'unsigned long' but the argument type is 'unsigned int'.\n" "[test.cpp:5]: (warning) %llu in format string (no. 1) requires 'unsigned long long' but the argument type is 'unsigned int'.\n" "[test.cpp:6]: (warning) %lx in format string (no. 1) requires 'unsigned long' but the argument type is 'unsigned int'.\n" - "[test.cpp:7]: (warning) %llx in format string (no. 1) requires 'unsigned long long' but the argument type is 'unsigned int'.\n", errout.str()); + "[test.cpp:7]: (warning) %llx in format string (no. 1) requires 'unsigned long long' but the argument type is 'unsigned int'.\n", errout_str()); check("void foo(int i, intmax_t im, ptrdiff_t p) {\n" " printf(\"%lld\", i);\n" " printf(\"%lld\", im);\n" " printf(\"%lld\", p);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) %lld in format string (no. 1) requires 'long long' but the argument type is 'signed int'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) %lld in format string (no. 1) requires 'long long' but the argument type is 'signed int'.\n", errout_str()); check("void foo(intmax_t im, ptrdiff_t p) {\n" " printf(\"%lld\", im);\n" " printf(\"%lld\", p);\n" "}", dinit(CheckOptions, $.portability = true, $.platform = Platform::Type::Win64)); ASSERT_EQUALS("[test.cpp:2]: (portability) %lld in format string (no. 1) requires 'long long' but the argument type is 'intmax_t {aka signed long long}'.\n" - "[test.cpp:3]: (portability) %lld in format string (no. 1) requires 'long long' but the argument type is 'ptrdiff_t {aka signed long long}'.\n", errout.str()); + "[test.cpp:3]: (portability) %lld in format string (no. 1) requires 'long long' but the argument type is 'ptrdiff_t {aka signed long long}'.\n", errout_str()); check("class Foo {\n" " double d;\n" @@ -2657,7 +2654,7 @@ class TestIO : public TestFixture { "[test.cpp:13]: (warning) %f in format string (no. 3) requires 'double' but the argument type is 'int'.\n" "[test.cpp:13]: (warning) %d in format string (no. 4) requires 'int' but the argument type is 'double'.\n" "[test.cpp:13]: (warning) %f in format string (no. 5) requires 'double' but the argument type is 'int'.\n" - "[test.cpp:13]: (warning) %f in format string (no. 6) requires 'double' but the argument type is 'int'.\n", errout.str()); + "[test.cpp:13]: (warning) %f in format string (no. 6) requires 'double' but the argument type is 'int'.\n", errout_str()); check("short f() { return 0; }\n" "void foo() { printf(\"%d %u %lu %I64u %I64d %f %Lf %p\", f(), f(), f(), f(), f(), f(), f(), f()); }"); @@ -2667,7 +2664,7 @@ class TestIO : public TestFixture { "[test.cpp:2]: (warning) %I64d in format string (no. 5) requires '__int64' but the argument type is 'signed short'.\n" "[test.cpp:2]: (warning) %f in format string (no. 6) requires 'double' but the argument type is 'signed short'.\n" "[test.cpp:2]: (warning) %Lf in format string (no. 7) requires 'long double' but the argument type is 'signed short'.\n" - "[test.cpp:2]: (warning) %p in format string (no. 8) requires an address but the argument type is 'signed short'.\n", errout.str()); + "[test.cpp:2]: (warning) %p in format string (no. 8) requires an address but the argument type is 'signed short'.\n", errout_str()); check("unsigned short f() { return 0; }\n" "void foo() { printf(\"%u %d %ld %I64d %I64u %f %Lf %p\", f(), f(), f(), f(), f(), f(), f(), f()); }"); @@ -2676,7 +2673,7 @@ class TestIO : public TestFixture { "[test.cpp:2]: (warning) %I64u in format string (no. 5) requires 'unsigned __int64' but the argument type is 'unsigned short'.\n" "[test.cpp:2]: (warning) %f in format string (no. 6) requires 'double' but the argument type is 'unsigned short'.\n" "[test.cpp:2]: (warning) %Lf in format string (no. 7) requires 'long double' but the argument type is 'unsigned short'.\n" - "[test.cpp:2]: (warning) %p in format string (no. 8) requires an address but the argument type is 'unsigned short'.\n", errout.str()); + "[test.cpp:2]: (warning) %p in format string (no. 8) requires an address but the argument type is 'unsigned short'.\n", errout_str()); check("int f() { return 0; }\n" "void foo() { printf(\"%d %u %lu %I64u %I64d %f %Lf %p\", f(), f(), f(), f(), f(), f(), f(), f()); }"); @@ -2686,7 +2683,7 @@ class TestIO : public TestFixture { "[test.cpp:2]: (warning) %I64d in format string (no. 5) requires '__int64' but the argument type is 'signed int'.\n" "[test.cpp:2]: (warning) %f in format string (no. 6) requires 'double' but the argument type is 'signed int'.\n" "[test.cpp:2]: (warning) %Lf in format string (no. 7) requires 'long double' but the argument type is 'signed int'.\n" - "[test.cpp:2]: (warning) %p in format string (no. 8) requires an address but the argument type is 'signed int'.\n", errout.str()); + "[test.cpp:2]: (warning) %p in format string (no. 8) requires an address but the argument type is 'signed int'.\n", errout_str()); check("unsigned int f() { return 0; }\n" "void foo() { printf(\"%u %d %ld %I64d %I64u %f %Lf %p\", f(), f(), f(), f(), f(), f(), f(), f()); }"); @@ -2696,7 +2693,7 @@ class TestIO : public TestFixture { "[test.cpp:2]: (warning) %I64u in format string (no. 5) requires 'unsigned __int64' but the argument type is 'unsigned int'.\n" "[test.cpp:2]: (warning) %f in format string (no. 6) requires 'double' but the argument type is 'unsigned int'.\n" "[test.cpp:2]: (warning) %Lf in format string (no. 7) requires 'long double' but the argument type is 'unsigned int'.\n" - "[test.cpp:2]: (warning) %p in format string (no. 8) requires an address but the argument type is 'unsigned int'.\n", errout.str()); + "[test.cpp:2]: (warning) %p in format string (no. 8) requires an address but the argument type is 'unsigned int'.\n", errout_str()); check("long f() { return 0; }\n" "void foo() { printf(\"%ld %u %lu %I64u %I64d %f %Lf %p\", f(), f(), f(), f(), f(), f(), f(), f()); }"); @@ -2706,7 +2703,7 @@ class TestIO : public TestFixture { "[test.cpp:2]: (warning) %I64d in format string (no. 5) requires '__int64' but the argument type is 'signed long'.\n" "[test.cpp:2]: (warning) %f in format string (no. 6) requires 'double' but the argument type is 'signed long'.\n" "[test.cpp:2]: (warning) %Lf in format string (no. 7) requires 'long double' but the argument type is 'signed long'.\n" - "[test.cpp:2]: (warning) %p in format string (no. 8) requires an address but the argument type is 'signed long'.\n", errout.str()); + "[test.cpp:2]: (warning) %p in format string (no. 8) requires an address but the argument type is 'signed long'.\n", errout_str()); check("unsigned long f() { return 0; }\n" "void foo() { printf(\"%lu %d %ld %I64d %I64u %f %Lf %p\", f(), f(), f(), f(), f(), f(), f(), f()); }"); @@ -2716,7 +2713,7 @@ class TestIO : public TestFixture { "[test.cpp:2]: (warning) %I64u in format string (no. 5) requires 'unsigned __int64' but the argument type is 'unsigned long'.\n" "[test.cpp:2]: (warning) %f in format string (no. 6) requires 'double' but the argument type is 'unsigned long'.\n" "[test.cpp:2]: (warning) %Lf in format string (no. 7) requires 'long double' but the argument type is 'unsigned long'.\n" - "[test.cpp:2]: (warning) %p in format string (no. 8) requires an address but the argument type is 'unsigned long'.\n", errout.str()); + "[test.cpp:2]: (warning) %p in format string (no. 8) requires an address but the argument type is 'unsigned long'.\n", errout_str()); check("long long f() { return 0; }\n" "void foo() { printf(\"%lld %u %lu %I64u %I64d %f %Lf %p\", f(), f(), f(), f(), f(), f(), f(), f()); }"); @@ -2725,7 +2722,7 @@ class TestIO : public TestFixture { "[test.cpp:2]: (warning) %I64u in format string (no. 4) requires 'unsigned __int64' but the argument type is 'signed long long'.\n" "[test.cpp:2]: (warning) %f in format string (no. 6) requires 'double' but the argument type is 'signed long long'.\n" "[test.cpp:2]: (warning) %Lf in format string (no. 7) requires 'long double' but the argument type is 'signed long long'.\n" - "[test.cpp:2]: (warning) %p in format string (no. 8) requires an address but the argument type is 'signed long long'.\n", errout.str()); + "[test.cpp:2]: (warning) %p in format string (no. 8) requires an address but the argument type is 'signed long long'.\n", errout_str()); check("unsigned long long f() { return 0; }\n" "void foo() { printf(\"%llu %d %ld %I64d %I64u %f %Lf %p\", f(), f(), f(), f(), f(), f(), f(), f()); }"); @@ -2734,7 +2731,7 @@ class TestIO : public TestFixture { "[test.cpp:2]: (warning) %I64d in format string (no. 4) requires '__int64' but the argument type is 'unsigned long long'.\n" "[test.cpp:2]: (warning) %f in format string (no. 6) requires 'double' but the argument type is 'unsigned long long'.\n" "[test.cpp:2]: (warning) %Lf in format string (no. 7) requires 'long double' but the argument type is 'unsigned long long'.\n" - "[test.cpp:2]: (warning) %p in format string (no. 8) requires an address but the argument type is 'unsigned long long'.\n", errout.str()); + "[test.cpp:2]: (warning) %p in format string (no. 8) requires an address but the argument type is 'unsigned long long'.\n", errout_str()); check("float f() { return 0; }\n" "void foo() { printf(\"%f %d %ld %u %lu %I64d %I64u %Lf %p\", f(), f(), f(), f(), f(), f(), f(), f(), f()); }"); @@ -2745,7 +2742,7 @@ class TestIO : public TestFixture { "[test.cpp:2]: (warning) %I64d in format string (no. 6) requires '__int64' but the argument type is 'float'.\n" "[test.cpp:2]: (warning) %I64u in format string (no. 7) requires 'unsigned __int64' but the argument type is 'float'.\n" "[test.cpp:2]: (warning) %Lf in format string (no. 8) requires 'long double' but the argument type is 'float'.\n" - "[test.cpp:2]: (warning) %p in format string (no. 9) requires an address but the argument type is 'float'.\n", errout.str()); + "[test.cpp:2]: (warning) %p in format string (no. 9) requires an address but the argument type is 'float'.\n", errout_str()); check("double f() { return 0; }\n" "void foo() { printf(\"%f %d %ld %u %lu %I64d %I64u %Lf %p\", f(), f(), f(), f(), f(), f(), f(), f(), f()); }"); @@ -2756,7 +2753,7 @@ class TestIO : public TestFixture { "[test.cpp:2]: (warning) %I64d in format string (no. 6) requires '__int64' but the argument type is 'double'.\n" "[test.cpp:2]: (warning) %I64u in format string (no. 7) requires 'unsigned __int64' but the argument type is 'double'.\n" "[test.cpp:2]: (warning) %Lf in format string (no. 8) requires 'long double' but the argument type is 'double'.\n" - "[test.cpp:2]: (warning) %p in format string (no. 9) requires an address but the argument type is 'double'.\n", errout.str()); + "[test.cpp:2]: (warning) %p in format string (no. 9) requires an address but the argument type is 'double'.\n", errout_str()); check("long double f() { return 0; }\n" "void foo() { printf(\"%Lf %d %ld %u %lu %I64d %I64u %f %p\", f(), f(), f(), f(), f(), f(), f(), f(), f()); }"); @@ -2767,37 +2764,37 @@ class TestIO : public TestFixture { "[test.cpp:2]: (warning) %I64d in format string (no. 6) requires '__int64' but the argument type is 'long double'.\n" "[test.cpp:2]: (warning) %I64u in format string (no. 7) requires 'unsigned __int64' but the argument type is 'long double'.\n" "[test.cpp:2]: (warning) %f in format string (no. 8) requires 'double' but the argument type is 'long double'.\n" - "[test.cpp:2]: (warning) %p in format string (no. 9) requires an address but the argument type is 'long double'.\n", errout.str()); + "[test.cpp:2]: (warning) %p in format string (no. 9) requires an address but the argument type is 'long double'.\n", errout_str()); check("int f() { return 0; }\n" "void foo() { printf(\"%I64d %I64u %I64x %d\", f(), f(), f(), f()); }"); ASSERT_EQUALS("[test.cpp:2]: (warning) %I64d in format string (no. 1) requires '__int64' but the argument type is 'signed int'.\n" "[test.cpp:2]: (warning) %I64u in format string (no. 2) requires 'unsigned __int64' but the argument type is 'signed int'.\n" - "[test.cpp:2]: (warning) %I64x in format string (no. 3) requires 'unsigned __int64' but the argument type is 'signed int'.\n", errout.str()); + "[test.cpp:2]: (warning) %I64x in format string (no. 3) requires 'unsigned __int64' but the argument type is 'signed int'.\n", errout_str()); check("long long f() { return 0; }\n" "void foo() { printf(\"%I32d %I32u %I32x %lld\", f(), f(), f(), f()); }"); ASSERT_EQUALS("[test.cpp:2]: (warning) %I32d in format string (no. 1) requires '__int32' but the argument type is 'signed long long'.\n" "[test.cpp:2]: (warning) %I32u in format string (no. 2) requires 'unsigned __int32' but the argument type is 'signed long long'.\n" - "[test.cpp:2]: (warning) %I32x in format string (no. 3) requires 'unsigned __int32' but the argument type is 'signed long long'.\n", errout.str()); + "[test.cpp:2]: (warning) %I32x in format string (no. 3) requires 'unsigned __int32' but the argument type is 'signed long long'.\n", errout_str()); check("unsigned long long f() { return 0; }\n" "void foo() { printf(\"%I32d %I32u %I32x %llx\", f(), f(), f(), f()); }"); ASSERT_EQUALS("[test.cpp:2]: (warning) %I32d in format string (no. 1) requires '__int32' but the argument type is 'unsigned long long'.\n" "[test.cpp:2]: (warning) %I32u in format string (no. 2) requires 'unsigned __int32' but the argument type is 'unsigned long long'.\n" - "[test.cpp:2]: (warning) %I32x in format string (no. 3) requires 'unsigned __int32' but the argument type is 'unsigned long long'.\n", errout.str()); + "[test.cpp:2]: (warning) %I32x in format string (no. 3) requires 'unsigned __int32' but the argument type is 'unsigned long long'.\n", errout_str()); check("signed char f() { return 0; }\n" "void foo() { printf(\"%Id %Iu %Ix %hhi\", f(), f(), f(), f()); }"); ASSERT_EQUALS("[test.cpp:2]: (warning) %Id in format string (no. 1) requires 'ptrdiff_t' but the argument type is 'signed char'.\n" "[test.cpp:2]: (warning) %Iu in format string (no. 2) requires 'size_t' but the argument type is 'signed char'.\n" - "[test.cpp:2]: (warning) %Ix in format string (no. 3) requires 'size_t' but the argument type is 'signed char'.\n", errout.str()); + "[test.cpp:2]: (warning) %Ix in format string (no. 3) requires 'size_t' but the argument type is 'signed char'.\n", errout_str()); check("unsigned char f() { return 0; }\n" "void foo() { printf(\"%Id %Iu %Ix %hho\", f(), f(), f(), f()); }"); ASSERT_EQUALS("[test.cpp:2]: (warning) %Id in format string (no. 1) requires 'ptrdiff_t' but the argument type is 'unsigned char'.\n" "[test.cpp:2]: (warning) %Iu in format string (no. 2) requires 'size_t' but the argument type is 'unsigned char'.\n" - "[test.cpp:2]: (warning) %Ix in format string (no. 3) requires 'size_t' but the argument type is 'unsigned char'.\n", errout.str()); + "[test.cpp:2]: (warning) %Ix in format string (no. 3) requires 'size_t' but the argument type is 'unsigned char'.\n", errout_str()); check("namespace bar { int f() { return 0; } }\n" "void foo() { printf(\"%d %u %lu %f %Lf %p\", bar::f(), bar::f(), bar::f(), bar::f(), bar::f(), bar::f()); }"); @@ -2805,7 +2802,7 @@ class TestIO : public TestFixture { "[test.cpp:2]: (warning) %lu in format string (no. 3) requires 'unsigned long' but the argument type is 'signed int'.\n" "[test.cpp:2]: (warning) %f in format string (no. 4) requires 'double' but the argument type is 'signed int'.\n" "[test.cpp:2]: (warning) %Lf in format string (no. 5) requires 'long double' but the argument type is 'signed int'.\n" - "[test.cpp:2]: (warning) %p in format string (no. 6) requires an address but the argument type is 'signed int'.\n", errout.str()); + "[test.cpp:2]: (warning) %p in format string (no. 6) requires an address but the argument type is 'signed int'.\n", errout_str()); check("struct Fred { int i; } f;\n" "void foo() { printf(\"%d %u %lu %f %Lf %p\", f.i, f.i, f.i, f.i, f.i, f.i); }"); @@ -2813,7 +2810,7 @@ class TestIO : public TestFixture { "[test.cpp:2]: (warning) %lu in format string (no. 3) requires 'unsigned long' but the argument type is 'signed int'.\n" "[test.cpp:2]: (warning) %f in format string (no. 4) requires 'double' but the argument type is 'signed int'.\n" "[test.cpp:2]: (warning) %Lf in format string (no. 5) requires 'long double' but the argument type is 'signed int'.\n" - "[test.cpp:2]: (warning) %p in format string (no. 6) requires an address but the argument type is 'signed int'.\n", errout.str()); + "[test.cpp:2]: (warning) %p in format string (no. 6) requires an address but the argument type is 'signed int'.\n", errout_str()); check("struct Fred { unsigned int u; } f;\n" "void foo() { printf(\"%u %d %ld %f %Lf %p\", f.u, f.u, f.u, f.u, f.u, f.u); }"); @@ -2821,7 +2818,7 @@ class TestIO : public TestFixture { "[test.cpp:2]: (warning) %ld in format string (no. 3) requires 'long' but the argument type is 'unsigned int'.\n" "[test.cpp:2]: (warning) %f in format string (no. 4) requires 'double' but the argument type is 'unsigned int'.\n" "[test.cpp:2]: (warning) %Lf in format string (no. 5) requires 'long double' but the argument type is 'unsigned int'.\n" - "[test.cpp:2]: (warning) %p in format string (no. 6) requires an address but the argument type is 'unsigned int'.\n", errout.str()); + "[test.cpp:2]: (warning) %p in format string (no. 6) requires an address but the argument type is 'unsigned int'.\n", errout_str()); check("struct Fred { unsigned int ui() { return 0; } } f;\n" "void foo() { printf(\"%u %d %ld %f %Lf %p\", f.ui(), f.ui(), f.ui(), f.ui(), f.ui(), f.ui()); }"); @@ -2829,14 +2826,14 @@ class TestIO : public TestFixture { "[test.cpp:2]: (warning) %ld in format string (no. 3) requires 'long' but the argument type is 'unsigned int'.\n" "[test.cpp:2]: (warning) %f in format string (no. 4) requires 'double' but the argument type is 'unsigned int'.\n" "[test.cpp:2]: (warning) %Lf in format string (no. 5) requires 'long double' but the argument type is 'unsigned int'.\n" - "[test.cpp:2]: (warning) %p in format string (no. 6) requires an address but the argument type is 'unsigned int'.\n", errout.str()); + "[test.cpp:2]: (warning) %p in format string (no. 6) requires an address but the argument type is 'unsigned int'.\n", errout_str()); // #4975 check("void f(int len, int newline) {\n" " printf(\"%s\", newline ? a : str + len);\n" " printf(\"%s\", newline + newline);\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) %s in format string (no. 1) requires 'char *' but the argument type is 'signed int'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) %s in format string (no. 1) requires 'char *' but the argument type is 'signed int'.\n", errout_str()); check("struct Fred { int i; } f;\n" "struct Fred & bar() { };\n" @@ -2845,7 +2842,7 @@ class TestIO : public TestFixture { "[test.cpp:3]: (warning) %lu in format string (no. 3) requires 'unsigned long' but the argument type is 'signed int'.\n" "[test.cpp:3]: (warning) %f in format string (no. 4) requires 'double' but the argument type is 'signed int'.\n" "[test.cpp:3]: (warning) %Lf in format string (no. 5) requires 'long double' but the argument type is 'signed int'.\n" - "[test.cpp:3]: (warning) %p in format string (no. 6) requires an address but the argument type is 'signed int'.\n", errout.str()); + "[test.cpp:3]: (warning) %p in format string (no. 6) requires an address but the argument type is 'signed int'.\n", errout_str()); check("struct Fred { int i; } f;\n" "const struct Fred & bar() { };\n" @@ -2854,7 +2851,7 @@ class TestIO : public TestFixture { "[test.cpp:3]: (warning) %lu in format string (no. 3) requires 'unsigned long' but the argument type is 'signed int'.\n" "[test.cpp:3]: (warning) %f in format string (no. 4) requires 'double' but the argument type is 'signed int'.\n" "[test.cpp:3]: (warning) %Lf in format string (no. 5) requires 'long double' but the argument type is 'signed int'.\n" - "[test.cpp:3]: (warning) %p in format string (no. 6) requires an address but the argument type is 'signed int'.\n", errout.str()); + "[test.cpp:3]: (warning) %p in format string (no. 6) requires an address but the argument type is 'signed int'.\n", errout_str()); check("struct Fred { int i; } f;\n" "static const struct Fred & bar() { };\n" @@ -2863,7 +2860,7 @@ class TestIO : public TestFixture { "[test.cpp:3]: (warning) %lu in format string (no. 3) requires 'unsigned long' but the argument type is 'signed int'.\n" "[test.cpp:3]: (warning) %f in format string (no. 4) requires 'double' but the argument type is 'signed int'.\n" "[test.cpp:3]: (warning) %Lf in format string (no. 5) requires 'long double' but the argument type is 'signed int'.\n" - "[test.cpp:3]: (warning) %p in format string (no. 6) requires an address but the argument type is 'signed int'.\n", errout.str()); + "[test.cpp:3]: (warning) %p in format string (no. 6) requires an address but the argument type is 'signed int'.\n", errout_str()); check("struct Fred { int i; } f[2];\n" "struct Fred * bar() { return f; };\n" @@ -2872,7 +2869,7 @@ class TestIO : public TestFixture { "[test.cpp:3]: (warning) %lu in format string (no. 3) requires 'unsigned long' but the argument type is 'signed int'.\n" "[test.cpp:3]: (warning) %f in format string (no. 4) requires 'double' but the argument type is 'signed int'.\n" "[test.cpp:3]: (warning) %Lf in format string (no. 5) requires 'long double' but the argument type is 'signed int'.\n" - "[test.cpp:3]: (warning) %p in format string (no. 6) requires an address but the argument type is 'signed int'.\n", errout.str()); + "[test.cpp:3]: (warning) %p in format string (no. 6) requires an address but the argument type is 'signed int'.\n", errout_str()); check("struct Fred { int i; } f[2];\n" "const struct Fred * bar() { return f; };\n" @@ -2881,7 +2878,7 @@ class TestIO : public TestFixture { "[test.cpp:3]: (warning) %lu in format string (no. 3) requires 'unsigned long' but the argument type is 'signed int'.\n" "[test.cpp:3]: (warning) %f in format string (no. 4) requires 'double' but the argument type is 'signed int'.\n" "[test.cpp:3]: (warning) %Lf in format string (no. 5) requires 'long double' but the argument type is 'signed int'.\n" - "[test.cpp:3]: (warning) %p in format string (no. 6) requires an address but the argument type is 'signed int'.\n", errout.str()); + "[test.cpp:3]: (warning) %p in format string (no. 6) requires an address but the argument type is 'signed int'.\n", errout_str()); check("struct Fred { int i; } f[2];\n" "static const struct Fred * bar() { return f; };\n" @@ -2890,7 +2887,7 @@ class TestIO : public TestFixture { "[test.cpp:3]: (warning) %lu in format string (no. 3) requires 'unsigned long' but the argument type is 'signed int'.\n" "[test.cpp:3]: (warning) %f in format string (no. 4) requires 'double' but the argument type is 'signed int'.\n" "[test.cpp:3]: (warning) %Lf in format string (no. 5) requires 'long double' but the argument type is 'signed int'.\n" - "[test.cpp:3]: (warning) %p in format string (no. 6) requires an address but the argument type is 'signed int'.\n", errout.str()); + "[test.cpp:3]: (warning) %p in format string (no. 6) requires an address but the argument type is 'signed int'.\n", errout_str()); check("struct Fred { int32_t i; } f;\n" "struct Fred & bar() { };\n" @@ -2900,41 +2897,41 @@ class TestIO : public TestFixture { "[test.cpp:3]: (warning) %lu in format string (no. 4) requires 'unsigned long' but the argument type is 'signed int'.\n" "[test.cpp:3]: (warning) %f in format string (no. 5) requires 'double' but the argument type is 'signed int'.\n" "[test.cpp:3]: (warning) %Lf in format string (no. 6) requires 'long double' but the argument type is 'signed int'.\n", - errout.str()); + errout_str()); // #4984 check("void f(double *x) {\n" " printf(\"%f\", x[0]);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int array[10];\n" "int * foo() { return array; }\n" "void f() {\n" " printf(\"%f\", foo()[0]);\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (warning) %f in format string (no. 1) requires 'double' but the argument type is 'signed int'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (warning) %f in format string (no. 1) requires 'double' but the argument type is 'signed int'.\n", errout_str()); check("struct Base { int length() { } };\n" "struct Derived : public Base { };\n" "void foo(Derived * d) {\n" " printf(\"%f\", d.length());\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (warning) %f in format string (no. 1) requires 'double' but the argument type is 'signed int'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (warning) %f in format string (no. 1) requires 'double' but the argument type is 'signed int'.\n", errout_str()); check("std::vector v;\n" "void foo() {\n" " printf(\"%d %u %f\", v[0], v[0], v[0]);\n" "}"); ASSERT_EQUALS("[test.cpp:3]: (warning) %u in format string (no. 2) requires 'unsigned int' but the argument type is 'signed int'.\n" - "[test.cpp:3]: (warning) %f in format string (no. 3) requires 'double' but the argument type is 'signed int'.\n", errout.str()); + "[test.cpp:3]: (warning) %f in format string (no. 3) requires 'double' but the argument type is 'signed int'.\n", errout_str()); // #4999 (crash) check("int bar(int a);\n" "void foo() {\n" " printf(\"%d\", bar(0));\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("std::vector v;\n" "std::string s;\n" @@ -2945,7 +2942,7 @@ class TestIO : public TestFixture { ASSERT_EQUALS("[test.cpp:4]: (portability) %d in format string (no. 3) requires 'int' but the argument type is 'std::size_t {aka unsigned long}'.\n" "[test.cpp:4]: (portability) %f in format string (no. 4) requires 'double' but the argument type is 'std::size_t {aka unsigned long}'.\n" "[test.cpp:5]: (portability) %d in format string (no. 3) requires 'int' but the argument type is 'std::size_t {aka unsigned long}'.\n" - "[test.cpp:5]: (portability) %f in format string (no. 4) requires 'double' but the argument type is 'std::size_t {aka unsigned long}'.\n", errout.str()); + "[test.cpp:5]: (portability) %f in format string (no. 4) requires 'double' but the argument type is 'std::size_t {aka unsigned long}'.\n", errout_str()); check("std::vector v;\n" "std::string s;\n" @@ -2956,7 +2953,7 @@ class TestIO : public TestFixture { ASSERT_EQUALS("[test.cpp:4]: (portability) %d in format string (no. 3) requires 'int' but the argument type is 'std::size_t {aka unsigned long long}'.\n" "[test.cpp:4]: (portability) %f in format string (no. 4) requires 'double' but the argument type is 'std::size_t {aka unsigned long long}'.\n" "[test.cpp:5]: (portability) %d in format string (no. 3) requires 'int' but the argument type is 'std::size_t {aka unsigned long long}'.\n" - "[test.cpp:5]: (portability) %f in format string (no. 4) requires 'double' but the argument type is 'std::size_t {aka unsigned long long}'.\n", errout.str()); + "[test.cpp:5]: (portability) %f in format string (no. 4) requires 'double' but the argument type is 'std::size_t {aka unsigned long long}'.\n", errout_str()); check("std::vector v;\n" "std::string s;\n" @@ -2967,7 +2964,7 @@ class TestIO : public TestFixture { ASSERT_EQUALS("[test.cpp:4]: (portability) %d in format string (no. 3) requires 'int' but the argument type is 'std::size_t {aka unsigned long}'.\n" "[test.cpp:4]: (portability) %f in format string (no. 4) requires 'double' but the argument type is 'std::size_t {aka unsigned long}'.\n" "[test.cpp:5]: (portability) %d in format string (no. 3) requires 'int' but the argument type is 'std::size_t {aka unsigned long}'.\n" - "[test.cpp:5]: (portability) %f in format string (no. 4) requires 'double' but the argument type is 'std::size_t {aka unsigned long}'.\n", errout.str()); + "[test.cpp:5]: (portability) %f in format string (no. 4) requires 'double' but the argument type is 'std::size_t {aka unsigned long}'.\n", errout_str()); check("std::vector v;\n" "std::string s;\n" @@ -2978,7 +2975,7 @@ class TestIO : public TestFixture { ASSERT_EQUALS("[test.cpp:4]: (portability) %d in format string (no. 3) requires 'int' but the argument type is 'std::size_t {aka unsigned long}'.\n" "[test.cpp:4]: (portability) %f in format string (no. 4) requires 'double' but the argument type is 'std::size_t {aka unsigned long}'.\n" "[test.cpp:5]: (portability) %d in format string (no. 3) requires 'int' but the argument type is 'std::size_t {aka unsigned long}'.\n" - "[test.cpp:5]: (portability) %f in format string (no. 4) requires 'double' but the argument type is 'std::size_t {aka unsigned long}'.\n", errout.str()); + "[test.cpp:5]: (portability) %f in format string (no. 4) requires 'double' but the argument type is 'std::size_t {aka unsigned long}'.\n", errout_str()); check("class Fred : public std::vector {} v;\n" "std::string s;\n" @@ -2989,14 +2986,14 @@ class TestIO : public TestFixture { ASSERT_EQUALS("[test.cpp:4]: (portability) %d in format string (no. 3) requires 'int' but the argument type is 'size_t {aka unsigned long}'.\n" "[test.cpp:4]: (portability) %f in format string (no. 4) requires 'double' but the argument type is 'size_t {aka unsigned long}'.\n" "[test.cpp:5]: (portability) %d in format string (no. 3) requires 'int' but the argument type is 'std::size_t {aka unsigned long}'.\n" - "[test.cpp:5]: (portability) %f in format string (no. 4) requires 'double' but the argument type is 'std::size_t {aka unsigned long}'.\n", errout.str()); + "[test.cpp:5]: (portability) %f in format string (no. 4) requires 'double' but the argument type is 'std::size_t {aka unsigned long}'.\n", errout_str()); check("class Fred : public std::vector {} v;\n" "void foo() {\n" " printf(\"%d %u %f\", v[0], v[0], v[0]);\n" "}\n", dinit(CheckOptions, $.portability = true, $.platform = Platform::Type::Unix64)); ASSERT_EQUALS("[test.cpp:3]: (warning) %u in format string (no. 2) requires 'unsigned int' but the argument type is 'int'.\n" - "[test.cpp:3]: (warning) %f in format string (no. 3) requires 'double' but the argument type is 'int'.\n", errout.str()); + "[test.cpp:3]: (warning) %f in format string (no. 3) requires 'double' but the argument type is 'int'.\n", errout_str()); check("std::string s;\n" "void foo() {\n" @@ -3004,7 +3001,7 @@ class TestIO : public TestFixture { "}\n", dinit(CheckOptions, $.portability = true, $.platform = Platform::Type::Unix64)); ASSERT_EQUALS("[test.cpp:3]: (warning) %u in format string (no. 3) requires 'unsigned int' but the argument type is 'const char *'.\n" "[test.cpp:3]: (warning) %d in format string (no. 4) requires 'int' but the argument type is 'const char *'.\n" - "[test.cpp:3]: (warning) %f in format string (no. 5) requires 'double' but the argument type is 'const char *'.\n", errout.str()); + "[test.cpp:3]: (warning) %f in format string (no. 5) requires 'double' but the argument type is 'const char *'.\n", errout_str()); check("std::vector array;\n" "char * p = 0;\n" @@ -3026,7 +3023,7 @@ class TestIO : public TestFixture { "[test.cpp:10]: (portability) %lu in format string (no. 1) requires 'unsigned long' but the argument type is 'std::size_t {aka unsigned long}'.\n" "[test.cpp:10]: (portability) %lu in format string (no. 2) requires 'unsigned long' but the argument type is 'size_t {aka unsigned long}'.\n" "[test.cpp:11]: (portability) %llu in format string (no. 1) requires 'unsigned long long' but the argument type is 'std::size_t {aka unsigned long}'.\n" - "[test.cpp:11]: (portability) %llu in format string (no. 2) requires 'unsigned long long' but the argument type is 'size_t {aka unsigned long}'.\n", errout.str()); + "[test.cpp:11]: (portability) %llu in format string (no. 2) requires 'unsigned long long' but the argument type is 'size_t {aka unsigned long}'.\n", errout_str()); check("bool b; bool bf();\n" "char c; char cf();\n" @@ -3047,7 +3044,7 @@ class TestIO : public TestFixture { "[test.cpp:13]: (portability) %d in format string (no. 10) requires 'int' but the argument type is 'ptrdiff_t {aka signed long}'.\n" "[test.cpp:13]: (warning) %d in format string (no. 11) requires 'int' but the argument type is 'char *'.\n" "[test.cpp:13]: (warning) %d in format string (no. 12) requires 'int' but the argument type is 'char *'.\n" - "[test.cpp:13]: (warning) %d in format string (no. 13) requires 'int' but the argument type is 'char *'.\n", errout.str()); + "[test.cpp:13]: (warning) %d in format string (no. 13) requires 'int' but the argument type is 'char *'.\n", errout_str()); check("bool b; bool bf();\n" "char c; char cf();\n" @@ -3073,7 +3070,7 @@ class TestIO : public TestFixture { "[test.cpp:13]: (portability) %ld in format string (no. 8) requires 'long' but the argument type is 'ptrdiff_t {aka signed long}'.\n" "[test.cpp:13]: (warning) %ld in format string (no. 9) requires 'long' but the argument type is 'char *'.\n" "[test.cpp:13]: (warning) %ld in format string (no. 10) requires 'long' but the argument type is 'char *'.\n" - "[test.cpp:13]: (warning) %ld in format string (no. 11) requires 'long' but the argument type is 'char *'.\n", errout.str()); + "[test.cpp:13]: (warning) %ld in format string (no. 11) requires 'long' but the argument type is 'char *'.\n", errout_str()); check("bool b; bool bf();\n" @@ -3093,7 +3090,7 @@ class TestIO : public TestFixture { ASSERT_EQUALS("[test.cpp:13]: (portability) %zd in format string (no. 2) requires 'ssize_t' but the argument type is 'ptrdiff_t {aka signed long}'.\n" "[test.cpp:13]: (portability) %d in format string (no. 9) requires 'int' but the argument type is 'size_t {aka unsigned long}'.\n" "[test.cpp:13]: (portability) %d in format string (no. 10) requires 'int' but the argument type is 'ptrdiff_t {aka signed long}'.\n" - "[test.cpp:13]: (warning) %d in format string (no. 11) requires 'int' but the argument type is 'char *'.\n", errout.str()); + "[test.cpp:13]: (warning) %d in format string (no. 11) requires 'int' but the argument type is 'char *'.\n", errout_str()); check("bool b; bool bf();\n" "char c; char cf();\n" @@ -3117,7 +3114,7 @@ class TestIO : public TestFixture { "[test.cpp:13]: (warning) %ld in format string (no. 6) requires 'long' but the argument type is 'unsigned short'.\n" "[test.cpp:13]: (portability) %ld in format string (no. 7) requires 'long' but the argument type is 'size_t {aka unsigned long}'.\n" "[test.cpp:13]: (portability) %ld in format string (no. 8) requires 'long' but the argument type is 'ptrdiff_t {aka signed long}'.\n" - "[test.cpp:13]: (warning) %ld in format string (no. 9) requires 'long' but the argument type is 'char *'.\n", errout.str()); + "[test.cpp:13]: (warning) %ld in format string (no. 9) requires 'long' but the argument type is 'char *'.\n", errout_str()); check("struct A {};\n" "class B : public std::vector {} b;\n" @@ -3132,7 +3129,7 @@ class TestIO : public TestFixture { ASSERT_EQUALS("[test.cpp:6]: (portability) %u in format string (no. 2) requires 'unsigned int' but the argument type is 'size_t {aka unsigned long}'.\n" "[test.cpp:7]: (warning) %d in format string (no. 2) requires 'int' but the argument type is 'const int *'.\n" "[test.cpp:8]: (warning) %d in format string (no. 2) requires 'int' but the argument type is 'const struct A *'.\n" - "[test.cpp:9]: (warning) %d in format string (no. 2) requires 'int' but the argument type is 'const char *'.\n", errout.str()); + "[test.cpp:9]: (warning) %d in format string (no. 2) requires 'int' but the argument type is 'const char *'.\n", errout_str()); check("class A : public std::vector {} a;\n" "class B : public std::string {} b;\n" @@ -3144,7 +3141,7 @@ class TestIO : public TestFixture { "}\n", dinit(CheckOptions, $.platform = Platform::Type::Unix64)); ASSERT_EQUALS("[test.cpp:5]: (warning) %d in format string (no. 2) requires 'int' but the argument type is 'const char *'.\n" "[test.cpp:6]: (warning) %p in format string (no. 2) requires an address but the argument type is 'char'.\n" - "[test.cpp:7]: (warning) %p in format string (no. 2) requires an address but the argument type is 'char'.\n", errout.str()); + "[test.cpp:7]: (warning) %p in format string (no. 2) requires an address but the argument type is 'char'.\n", errout_str()); check("template \n" "struct buffer {\n" @@ -3154,7 +3151,7 @@ class TestIO : public TestFixture { "void foo() {\n" " printf(\"%u\", b.size());\n" "}\n", dinit(CheckOptions, $.portability = true, $.platform = Platform::Type::Unix64)); - ASSERT_EQUALS("[test.cpp:7]: (portability) %u in format string (no. 1) requires 'unsigned int' but the argument type is 'size_t {aka unsigned long}'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (portability) %u in format string (no. 1) requires 'unsigned int' but the argument type is 'size_t {aka unsigned long}'.\n", errout_str()); check("DWORD a;\n" "DWORD_PTR b;\n" @@ -3162,7 +3159,7 @@ class TestIO : public TestFixture { " printf(\"%u %u\", a, b);\n" "}\n", dinit(CheckOptions, $.portability = true, $.platform = Platform::Type::Win32A)); ASSERT_EQUALS("[test.cpp:4]: (portability) %u in format string (no. 1) requires 'unsigned int' but the argument type is 'DWORD {aka unsigned long}'.\n" - "[test.cpp:4]: (portability) %u in format string (no. 2) requires 'unsigned int' but the argument type is 'DWORD_PTR {aka unsigned long}'.\n", errout.str()); + "[test.cpp:4]: (portability) %u in format string (no. 2) requires 'unsigned int' but the argument type is 'DWORD_PTR {aka unsigned long}'.\n", errout_str()); check("unsigned long a[] = { 1, 2 };\n" "void foo() {\n" @@ -3170,24 +3167,24 @@ class TestIO : public TestFixture { "}\n", dinit(CheckOptions, $.platform = Platform::Type::Win32A)); ASSERT_EQUALS("[test.cpp:3]: (warning) %d in format string (no. 1) requires 'int' but the argument type is 'unsigned long'.\n" "[test.cpp:3]: (warning) %d in format string (no. 2) requires 'int' but the argument type is 'unsigned long'.\n" - "[test.cpp:3]: (warning) %x in format string (no. 3) requires 'unsigned int' but the argument type is 'unsigned long'.\n", errout.str()); + "[test.cpp:3]: (warning) %x in format string (no. 3) requires 'unsigned int' but the argument type is 'unsigned long'.\n", errout_str()); check("void foo (wchar_t c) {\n" // ticket #5051 false positive " printf(\"%c\", c);\n" "}\n", dinit(CheckOptions, $.platform = Platform::Type::Win64)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() {\n" " printf(\"%f %d\", static_cast(1.0f), reinterpret_cast(0));\n" "}"); ASSERT_EQUALS("[test.cpp:2]: (warning) %f in format string (no. 1) requires 'double' but the argument type is 'signed int'.\n" - "[test.cpp:2]: (warning) %d in format string (no. 2) requires 'int' but the argument type is 'const void *'.\n", errout.str()); + "[test.cpp:2]: (warning) %d in format string (no. 2) requires 'int' but the argument type is 'const void *'.\n", errout_str()); check("void foo() {\n" " UNKNOWN * u;\n" " printf(\"%d %x %u %f\", u[i], u[i], u[i], u[i]);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() {\n" " long * l;\n" @@ -3196,7 +3193,7 @@ class TestIO : public TestFixture { ASSERT_EQUALS("[test.cpp:3]: (warning) %d in format string (no. 1) requires 'int' but the argument type is 'signed long'.\n" "[test.cpp:3]: (warning) %x in format string (no. 2) requires 'unsigned int' but the argument type is 'signed long'.\n" "[test.cpp:3]: (warning) %u in format string (no. 3) requires 'unsigned int' but the argument type is 'signed long'.\n" - "[test.cpp:3]: (warning) %f in format string (no. 4) requires 'double' but the argument type is 'signed long'.\n", errout.str()); + "[test.cpp:3]: (warning) %f in format string (no. 4) requires 'double' but the argument type is 'signed long'.\n", errout_str()); check("void f() {\n" // #5104 " myvector v1(1,0);\n" @@ -3214,27 +3211,27 @@ class TestIO : public TestFixture { " myvector v7(1,0);\n" " printf(\"%s\",v7[0]);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("std::vector v;\n" // #5151 "void foo() {\n" " printf(\"%c %u %f\", v.at(32), v.at(32), v.at(32));\n" "}"); ASSERT_EQUALS("[test.cpp:3]: (warning) %u in format string (no. 2) requires 'unsigned int' but the argument type is 'char'.\n" - "[test.cpp:3]: (warning) %f in format string (no. 3) requires 'double' but the argument type is 'char'.\n", errout.str()); + "[test.cpp:3]: (warning) %f in format string (no. 3) requires 'double' but the argument type is 'char'.\n", errout_str()); // #5195 (segmentation fault) check("void T::a(const std::vector& vx) {\n" " printf(\"%f\", vx.at(0));\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #5486 check("void foo() {\n" " ssize_t test = 0;\n" " printf(\"%zd\", test);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #6009 check("extern std::string StringByReturnValue();\n" @@ -3243,7 +3240,7 @@ class TestIO : public TestFixture { " printf( \"%s - %s\", StringByReturnValue(), IntByReturnValue() );\n" "}"); ASSERT_EQUALS("[test.cpp:4]: (warning) %s in format string (no. 1) requires 'char *' but the argument type is 'std::string'.\n" - "[test.cpp:4]: (warning) %s in format string (no. 2) requires 'char *' but the argument type is 'signed int'.\n", errout.str()); + "[test.cpp:4]: (warning) %s in format string (no. 2) requires 'char *' but the argument type is 'signed int'.\n", errout_str()); check("template \n" "struct Array {\n" @@ -3256,21 +3253,21 @@ class TestIO : public TestFixture { " printf(\"%u %u\", array1[0], array2[0]);\n" "}"); ASSERT_EQUALS("[test.cpp:9]: (warning) %u in format string (no. 1) requires 'unsigned int' but the argument type is 'int'.\n" - "[test.cpp:9]: (warning) %u in format string (no. 2) requires 'unsigned int' but the argument type is 'float'.\n", errout.str()); + "[test.cpp:9]: (warning) %u in format string (no. 2) requires 'unsigned int' but the argument type is 'float'.\n", errout_str()); // Ticket #7445 check("struct S { unsigned short x; } s = {0};\n" "void foo() {\n" " printf(\"%d\", s.x);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Ticket #7601 check("void foo(int i, unsigned int ui, long long ll, unsigned long long ull) {\n" " printf(\"%Ld %Lu %Ld %Lu\", i, ui, ll, ull);\n" "}"); ASSERT_EQUALS("[test.cpp:2]: (warning) %Ld in format string (no. 1) requires 'long long' but the argument type is 'signed int'.\n" - "[test.cpp:2]: (warning) %Lu in format string (no. 2) requires 'unsigned long long' but the argument type is 'unsigned int'.\n", errout.str()); + "[test.cpp:2]: (warning) %Lu in format string (no. 2) requires 'unsigned long long' but the argument type is 'unsigned int'.\n", errout_str()); check("void foo(char c, unsigned char uc, short s, unsigned short us, int i, unsigned int ui, long l, unsigned long ul) {\n" " printf(\"%hhd %hhd %hhd %hhd %hhd %hhd %hhd %hhd\", c, uc, s, us, i, ui, l, ul);\n" @@ -3281,7 +3278,7 @@ class TestIO : public TestFixture { "[test.cpp:2]: (warning) %hhd in format string (no. 5) requires 'char' but the argument type is 'signed int'.\n" "[test.cpp:2]: (warning) %hhd in format string (no. 6) requires 'char' but the argument type is 'unsigned int'.\n" "[test.cpp:2]: (warning) %hhd in format string (no. 7) requires 'char' but the argument type is 'signed long'.\n" - "[test.cpp:2]: (warning) %hhd in format string (no. 8) requires 'char' but the argument type is 'unsigned long'.\n", errout.str()); + "[test.cpp:2]: (warning) %hhd in format string (no. 8) requires 'char' but the argument type is 'unsigned long'.\n", errout_str()); check("void foo(char c, unsigned char uc, short s, unsigned short us, int i, unsigned int ui, long l, unsigned long ul) {\n" " printf(\"%hhu %hhu %hhu %hhu %hhu %hhu %hhu %hhu\", c, uc, s, us, i, ui, l, ul);\n" @@ -3292,7 +3289,7 @@ class TestIO : public TestFixture { "[test.cpp:2]: (warning) %hhu in format string (no. 5) requires 'unsigned char' but the argument type is 'signed int'.\n" "[test.cpp:2]: (warning) %hhu in format string (no. 6) requires 'unsigned char' but the argument type is 'unsigned int'.\n" "[test.cpp:2]: (warning) %hhu in format string (no. 7) requires 'unsigned char' but the argument type is 'signed long'.\n" - "[test.cpp:2]: (warning) %hhu in format string (no. 8) requires 'unsigned char' but the argument type is 'unsigned long'.\n", errout.str()); + "[test.cpp:2]: (warning) %hhu in format string (no. 8) requires 'unsigned char' but the argument type is 'unsigned long'.\n", errout_str()); check("void foo(char c, unsigned char uc, short s, unsigned short us, int i, unsigned int ui, long l, unsigned long ul) {\n" " printf(\"%hhx %hhx %hhx %hhx %hhx %hhx %hhx %hhx\", c, uc, s, us, i, ui, l, ul);\n" @@ -3303,7 +3300,7 @@ class TestIO : public TestFixture { "[test.cpp:2]: (warning) %hhx in format string (no. 5) requires 'unsigned char' but the argument type is 'signed int'.\n" "[test.cpp:2]: (warning) %hhx in format string (no. 6) requires 'unsigned char' but the argument type is 'unsigned int'.\n" "[test.cpp:2]: (warning) %hhx in format string (no. 7) requires 'unsigned char' but the argument type is 'signed long'.\n" - "[test.cpp:2]: (warning) %hhx in format string (no. 8) requires 'unsigned char' but the argument type is 'unsigned long'.\n", errout.str()); + "[test.cpp:2]: (warning) %hhx in format string (no. 8) requires 'unsigned char' but the argument type is 'unsigned long'.\n", errout_str()); check("void foo(char c, unsigned char uc, short s, unsigned short us, int i, unsigned int ui, long l, unsigned long ul) {\n" " printf(\"%hd %hd %hd %hd %hd %hd %hd %hd\", c, uc, s, us, i, ui, l, ul);\n" @@ -3314,7 +3311,7 @@ class TestIO : public TestFixture { "[test.cpp:2]: (warning) %hd in format string (no. 5) requires 'short' but the argument type is 'signed int'.\n" "[test.cpp:2]: (warning) %hd in format string (no. 6) requires 'short' but the argument type is 'unsigned int'.\n" "[test.cpp:2]: (warning) %hd in format string (no. 7) requires 'short' but the argument type is 'signed long'.\n" - "[test.cpp:2]: (warning) %hd in format string (no. 8) requires 'short' but the argument type is 'unsigned long'.\n", errout.str()); + "[test.cpp:2]: (warning) %hd in format string (no. 8) requires 'short' but the argument type is 'unsigned long'.\n", errout_str()); check("void foo(char c, unsigned char uc, short s, unsigned short us, int i, unsigned int ui, long l, unsigned long ul) {\n" " printf(\"%hu %hu %hu %hu %hu %hu %hu %hu\", c, uc, s, us, i, ui, l, ul);\n" @@ -3325,7 +3322,7 @@ class TestIO : public TestFixture { "[test.cpp:2]: (warning) %hu in format string (no. 5) requires 'unsigned short' but the argument type is 'signed int'.\n" "[test.cpp:2]: (warning) %hu in format string (no. 6) requires 'unsigned short' but the argument type is 'unsigned int'.\n" "[test.cpp:2]: (warning) %hu in format string (no. 7) requires 'unsigned short' but the argument type is 'signed long'.\n" - "[test.cpp:2]: (warning) %hu in format string (no. 8) requires 'unsigned short' but the argument type is 'unsigned long'.\n", errout.str()); + "[test.cpp:2]: (warning) %hu in format string (no. 8) requires 'unsigned short' but the argument type is 'unsigned long'.\n", errout_str()); check("void foo(char c, unsigned char uc, short s, unsigned short us, int i, unsigned int ui, long l, unsigned long ul) {\n" " printf(\"%hx %hx %hx %hx %hx %hx %hx %hx\", c, uc, s, us, i, ui, l, ul);\n" @@ -3336,7 +3333,7 @@ class TestIO : public TestFixture { "[test.cpp:2]: (warning) %hx in format string (no. 5) requires 'unsigned short' but the argument type is 'signed int'.\n" "[test.cpp:2]: (warning) %hx in format string (no. 6) requires 'unsigned short' but the argument type is 'unsigned int'.\n" "[test.cpp:2]: (warning) %hx in format string (no. 7) requires 'unsigned short' but the argument type is 'signed long'.\n" - "[test.cpp:2]: (warning) %hx in format string (no. 8) requires 'unsigned short' but the argument type is 'unsigned long'.\n", errout.str()); + "[test.cpp:2]: (warning) %hx in format string (no. 8) requires 'unsigned short' but the argument type is 'unsigned long'.\n", errout_str()); // #7837 - Use ValueType for function call check("struct S {\n" @@ -3346,13 +3343,13 @@ class TestIO : public TestFixture { "void foo(struct S x) {\n" " printf(\"%f\", x.f(4.0));\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " printf(\"%lu\", sizeof(char));\n" "}\n", dinit(CheckOptions, $.portability = true, $.platform = Platform::Type::Win64)); ASSERT_EQUALS("[test.cpp:2]: (portability) %lu in format string (no. 1) requires 'unsigned long' but the argument type is 'size_t {aka unsigned long long}'.\n", - errout.str()); + errout_str()); } void testPrintfArgumentVariables() { @@ -4107,7 +4104,7 @@ class TestIO : public TestFixture { " printf(\"%1$d, %d, %1$d\", 1, 2);" " scanf(\"%1$d\", &bar);" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() {\n" " int bar;\n" @@ -4120,7 +4117,7 @@ class TestIO : public TestFixture { "[test.cpp:4]: (warning) printf: referencing parameter 4 while 3 arguments given\n" "[test.cpp:5]: (warning) scanf: referencing parameter 2 while 1 arguments given\n" "[test.cpp:6]: (warning) printf: parameter positions start at 1, not 0\n" - "", errout.str()); + "", errout_str()); } @@ -4145,7 +4142,7 @@ class TestIO : public TestFixture { "[test.cpp:10]: (portability) %I32u in format string (no. 2) requires 'unsigned __int32' but the argument type is '__int32 {aka signed int}'.\n" "[test.cpp:11]: (portability) %I32d in format string (no. 1) requires '__int32' but the argument type is 'unsigned __int32 {aka unsigned int}'.\n" "[test.cpp:12]: (portability) %I64u in format string (no. 2) requires 'unsigned __int64' but the argument type is '__int64 {aka signed long long}'.\n" - "[test.cpp:13]: (portability) %I64d in format string (no. 1) requires '__int64' but the argument type is 'unsigned __int64 {aka unsigned long long}'.\n", errout.str()); + "[test.cpp:13]: (portability) %I64d in format string (no. 1) requires '__int64' but the argument type is 'unsigned __int64 {aka unsigned long long}'.\n", errout_str()); check("void foo() {\n" " size_t s;\n" @@ -4167,7 +4164,7 @@ class TestIO : public TestFixture { "[test.cpp:10]: (portability) %I32u in format string (no. 2) requires 'unsigned __int32' but the argument type is '__int32 {aka signed int}'.\n" "[test.cpp:11]: (portability) %I32d in format string (no. 1) requires '__int32' but the argument type is 'unsigned __int32 {aka unsigned int}'.\n" "[test.cpp:12]: (portability) %I64u in format string (no. 2) requires 'unsigned __int64' but the argument type is '__int64 {aka signed long long}'.\n" - "[test.cpp:13]: (portability) %I64d in format string (no. 1) requires '__int64' but the argument type is 'unsigned __int64 {aka unsigned long long}'.\n", errout.str()); + "[test.cpp:13]: (portability) %I64d in format string (no. 1) requires '__int64' but the argument type is 'unsigned __int64 {aka unsigned long long}'.\n", errout_str()); check("void foo() {\n" " size_t s;\n" @@ -4200,30 +4197,30 @@ class TestIO : public TestFixture { "[test.cpp:14]: (warning) 'I' in format string (no. 1) is a length modifier and cannot be used without a conversion specifier.\n" "[test.cpp:15]: (warning) 'I' in format string (no. 1) is a length modifier and cannot be used without a conversion specifier.\n" "[test.cpp:16]: (warning) 'I32' in format string (no. 1) is a length modifier and cannot be used without a conversion specifier.\n" - "[test.cpp:17]: (warning) 'I64' in format string (no. 1) is a length modifier and cannot be used without a conversion specifier.\n", errout.str()); + "[test.cpp:17]: (warning) 'I64' in format string (no. 1) is a length modifier and cannot be used without a conversion specifier.\n", errout_str()); // ticket #5264 check("void foo(LPARAM lp, WPARAM wp, LRESULT lr) {\n" " printf(\"%Ix %Ix %Ix\", lp, wp, lr);\n" "}\n", dinit(CheckOptions, $.portability = true, $.platform = Platform::Type::Win64)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(LPARAM lp, WPARAM wp, LRESULT lr) {\n" " printf(\"%Ix %Ix %Ix\", lp, wp, lr);\n" "}\n", dinit(CheckOptions, $.portability = true, $.platform = Platform::Type::Win32A)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(UINT32 a, ::UINT32 b, Fred::UINT32 c) {\n" " printf(\"%d %d %d\", a, b, c);\n" "};\n", dinit(CheckOptions, $.portability = true, $.platform = Platform::Type::Win32A)); ASSERT_EQUALS("[test.cpp:2]: (portability) %d in format string (no. 1) requires 'int' but the argument type is 'UINT32 {aka unsigned int}'.\n" - "[test.cpp:2]: (portability) %d in format string (no. 2) requires 'int' but the argument type is 'UINT32 {aka unsigned int}'.\n", errout.str()); + "[test.cpp:2]: (portability) %d in format string (no. 2) requires 'int' but the argument type is 'UINT32 {aka unsigned int}'.\n", errout_str()); check("void foo(LPCVOID a, ::LPCVOID b, Fred::LPCVOID c) {\n" " printf(\"%d %d %d\", a, b, c);\n" "};\n", dinit(CheckOptions, $.portability = true, $.platform = Platform::Type::Win32A)); ASSERT_EQUALS("[test.cpp:2]: (warning) %d in format string (no. 1) requires 'int' but the argument type is 'const void *'.\n" - "[test.cpp:2]: (warning) %d in format string (no. 2) requires 'int' but the argument type is 'const void *'.\n", errout.str()); + "[test.cpp:2]: (warning) %d in format string (no. 2) requires 'int' but the argument type is 'const void *'.\n", errout_str()); check("void foo() {\n" " SSIZE_T s = -2;\n" // In MSVC, SSIZE_T is available in capital letters using #include @@ -4232,7 +4229,7 @@ class TestIO : public TestFixture { " printf(\"%zd%i\", s, i);\n" " printf(\"%zu\", s);\n" "}", dinit(CheckOptions, $.portability = true, $.platform = Platform::Type::Win32A)); - ASSERT_EQUALS("[test.cpp:6]: (portability) %zu in format string (no. 1) requires 'size_t' but the argument type is 'SSIZE_T {aka signed long}'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (portability) %zu in format string (no. 1) requires 'size_t' but the argument type is 'SSIZE_T {aka signed long}'.\n", errout_str()); check("void foo() {\n" " SSIZE_T s = -2;\n" // In MSVC, SSIZE_T is available in capital letters using #include @@ -4241,7 +4238,7 @@ class TestIO : public TestFixture { " printf(\"%zd%i\", s, i);\n" " printf(\"%zu\", s);\n" "}", dinit(CheckOptions, $.portability = true, $.platform = Platform::Type::Win64)); - ASSERT_EQUALS("[test.cpp:6]: (portability) %zu in format string (no. 1) requires 'size_t' but the argument type is 'SSIZE_T {aka signed long long}'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (portability) %zu in format string (no. 1) requires 'size_t' but the argument type is 'SSIZE_T {aka signed long long}'.\n", errout_str()); check("void foo() {\n" " SSIZE_T s = -2;\n" // Under Unix, ssize_t has to be written in small letters. Not Cppcheck, but the compiler will report this. @@ -4250,7 +4247,7 @@ class TestIO : public TestFixture { " printf(\"%zd%i\", s, i);\n" " printf(\"%zu\", s);\n" "}", dinit(CheckOptions, $.portability = true, $.platform = Platform::Type::Unix64)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() {\n" " typedef SSIZE_T ssize_t;\n" // Test using typedef @@ -4260,7 +4257,7 @@ class TestIO : public TestFixture { " printf(\"%zd%i\", s, i);\n" " printf(\"%zu\", s);\n" "}", dinit(CheckOptions, $.portability = true, $.platform = Platform::Type::Win64)); - ASSERT_EQUALS("[test.cpp:7]: (portability) %zu in format string (no. 1) requires 'size_t' but the argument type is 'SSIZE_T {aka signed long long}'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (portability) %zu in format string (no. 1) requires 'size_t' but the argument type is 'SSIZE_T {aka signed long long}'.\n", errout_str()); } @@ -4287,7 +4284,7 @@ class TestIO : public TestFixture { "[test.cpp:11]: (portability) %I32d in format string (no. 1) requires '__int32 *' but the argument type is 'unsigned __int32 * {aka unsigned int *}'.\n" "[test.cpp:12]: (portability) %I64u in format string (no. 2) requires 'unsigned __int64 *' but the argument type is '__int64 * {aka signed long long *}'.\n" "[test.cpp:12]: (portability) %I64x in format string (no. 3) requires 'unsigned __int64 *' but the argument type is '__int64 * {aka signed long long *}'.\n" - "[test.cpp:13]: (portability) %I64d in format string (no. 1) requires '__int64 *' but the argument type is 'unsigned __int64 * {aka unsigned long long *}'.\n", errout.str()); + "[test.cpp:13]: (portability) %I64d in format string (no. 1) requires '__int64 *' but the argument type is 'unsigned __int64 * {aka unsigned long long *}'.\n", errout_str()); check("void foo() {\n" " size_t s;\n" @@ -4311,7 +4308,7 @@ class TestIO : public TestFixture { "[test.cpp:11]: (portability) %I32d in format string (no. 1) requires '__int32 *' but the argument type is 'unsigned __int32 * {aka unsigned int *}'.\n" "[test.cpp:12]: (portability) %I64u in format string (no. 2) requires 'unsigned __int64 *' but the argument type is '__int64 * {aka signed long long *}'.\n" "[test.cpp:12]: (portability) %I64x in format string (no. 3) requires 'unsigned __int64 *' but the argument type is '__int64 * {aka signed long long *}'.\n" - "[test.cpp:13]: (portability) %I64d in format string (no. 1) requires '__int64 *' but the argument type is 'unsigned __int64 * {aka unsigned long long *}'.\n", errout.str()); + "[test.cpp:13]: (portability) %I64d in format string (no. 1) requires '__int64 *' but the argument type is 'unsigned __int64 * {aka unsigned long long *}'.\n", errout_str()); check("void foo() {\n" " size_t s;\n" @@ -4344,7 +4341,7 @@ class TestIO : public TestFixture { "[test.cpp:14]: (warning) 'I' in format string (no. 1) is a length modifier and cannot be used without a conversion specifier.\n" "[test.cpp:15]: (warning) 'I' in format string (no. 1) is a length modifier and cannot be used without a conversion specifier.\n" "[test.cpp:16]: (warning) 'I32' in format string (no. 1) is a length modifier and cannot be used without a conversion specifier.\n" - "[test.cpp:17]: (warning) 'I64' in format string (no. 1) is a length modifier and cannot be used without a conversion specifier.\n", errout.str()); + "[test.cpp:17]: (warning) 'I64' in format string (no. 1) is a length modifier and cannot be used without a conversion specifier.\n", errout_str()); check("void foo() {\n" " SSIZE_T s;\n" // In MSVC, SSIZE_T is available in capital letters using #include @@ -4353,7 +4350,7 @@ class TestIO : public TestFixture { " scanf(\"%zd%i\", &s, &i);\n" " scanf(\"%zu\", &s);\n" "}", dinit(CheckOptions, $.portability = true, $.platform = Platform::Type::Win32A)); - ASSERT_EQUALS("[test.cpp:6]: (portability) %zu in format string (no. 1) requires 'size_t *' but the argument type is 'SSIZE_T * {aka signed long *}'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (portability) %zu in format string (no. 1) requires 'size_t *' but the argument type is 'SSIZE_T * {aka signed long *}'.\n", errout_str()); check("void foo() {\n" " SSIZE_T s;\n" // In MSVC, SSIZE_T is available in capital letters using #include @@ -4362,7 +4359,7 @@ class TestIO : public TestFixture { " scanf(\"%zd%i\", &s, &i);\n" " scanf(\"%zu\", &s);\n" "}", dinit(CheckOptions, $.portability = true, $.platform = Platform::Type::Win64)); - ASSERT_EQUALS("[test.cpp:6]: (portability) %zu in format string (no. 1) requires 'size_t *' but the argument type is 'SSIZE_T * {aka signed long long *}'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (portability) %zu in format string (no. 1) requires 'size_t *' but the argument type is 'SSIZE_T * {aka signed long long *}'.\n", errout_str()); check("void foo() {\n" " SSIZE_T s;\n" // Under Unix, ssize_t has to be written in small letters. Not Cppcheck, but the compiler will report this. @@ -4371,7 +4368,7 @@ class TestIO : public TestFixture { " scanf(\"%zd%i\", &s, &i);\n" " scanf(\"%zu\", &s);\n" "}", dinit(CheckOptions, $.portability = true, $.platform = Platform::Type::Unix64)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() {\n" " typedef SSIZE_T ssize_t;\n" // Test using typedef @@ -4381,7 +4378,7 @@ class TestIO : public TestFixture { " scanf(\"%zd%i\", &s, &i);\n" " scanf(\"%zu\", &s);\n" "}", dinit(CheckOptions, $.portability = true, $.platform = Platform::Type::Win64)); - ASSERT_EQUALS("[test.cpp:7]: (portability) %zu in format string (no. 1) requires 'size_t *' but the argument type is 'SSIZE_T * {aka signed long long *}'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (portability) %zu in format string (no. 1) requires 'size_t *' but the argument type is 'SSIZE_T * {aka signed long long *}'.\n", errout_str()); } @@ -4392,7 +4389,7 @@ class TestIO : public TestFixture { " string.Format(\"%I32d\", u32);\n" " string.AppendFormat(\"%I32d\", u32);\n" "}", dinit(CheckOptions, $.portability = true, $.platform = Platform::Type::Win32A)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() {\n" " unsigned __int32 u32;\n" @@ -4400,7 +4397,7 @@ class TestIO : public TestFixture { " string.Format(\"%I32d\", u32);\n" " string.AppendFormat(\"%I32d\", u32);\n" "}", dinit(CheckOptions, $.portability = true, $.platform = Platform::Type::Unix32)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() {\n" " unsigned __int32 u32;\n" @@ -4411,7 +4408,7 @@ class TestIO : public TestFixture { "}", dinit(CheckOptions, $.portability = true, $.platform = Platform::Type::Win32A)); ASSERT_EQUALS("[test.cpp:4]: (portability) %I32d in format string (no. 1) requires '__int32' but the argument type is 'unsigned __int32 {aka unsigned int}'.\n" "[test.cpp:5]: (portability) %I32d in format string (no. 1) requires '__int32' but the argument type is 'unsigned __int32 {aka unsigned int}'.\n" - "[test.cpp:6]: (portability) %I32d in format string (no. 1) requires '__int32' but the argument type is 'unsigned __int32 {aka unsigned int}'.\n", errout.str()); + "[test.cpp:6]: (portability) %I32d in format string (no. 1) requires '__int32' but the argument type is 'unsigned __int32 {aka unsigned int}'.\n", errout_str()); } void testMicrosoftSecurePrintfArgument() { @@ -4422,7 +4419,7 @@ class TestIO : public TestFixture { "}\n", dinit(CheckOptions, $.platform = Platform::Type::Win32A)); ASSERT_EQUALS("[test.cpp:4]: (warning) %d in format string (no. 1) requires 'int' but the argument type is 'unsigned int'.\n" "[test.cpp:4]: (warning) %u in format string (no. 2) requires 'unsigned int' but the argument type is 'signed int'.\n" - "[test.cpp:4]: (warning) _tprintf_s format string requires 2 parameters but 3 are given.\n", errout.str()); + "[test.cpp:4]: (warning) _tprintf_s format string requires 2 parameters but 3 are given.\n", errout_str()); check("void foo() {\n" " int i;\n" @@ -4431,7 +4428,7 @@ class TestIO : public TestFixture { "}\n", dinit(CheckOptions, $.platform = Platform::Type::Win32W)); ASSERT_EQUALS("[test.cpp:4]: (warning) %d in format string (no. 1) requires 'int' but the argument type is 'unsigned int'.\n" "[test.cpp:4]: (warning) %u in format string (no. 2) requires 'unsigned int' but the argument type is 'signed int'.\n" - "[test.cpp:4]: (warning) _tprintf_s format string requires 2 parameters but 3 are given.\n", errout.str()); + "[test.cpp:4]: (warning) _tprintf_s format string requires 2 parameters but 3 are given.\n", errout_str()); check("void foo() {\n" " int i;\n" @@ -4440,7 +4437,7 @@ class TestIO : public TestFixture { "}\n", dinit(CheckOptions, $.platform = Platform::Type::Win32A)); ASSERT_EQUALS("[test.cpp:4]: (warning) %d in format string (no. 1) requires 'int' but the argument type is 'unsigned int'.\n" "[test.cpp:4]: (warning) %u in format string (no. 2) requires 'unsigned int' but the argument type is 'signed int'.\n" - "[test.cpp:4]: (warning) printf_s format string requires 2 parameters but 3 are given.\n", errout.str()); + "[test.cpp:4]: (warning) printf_s format string requires 2 parameters but 3 are given.\n", errout_str()); check("void foo() {\n" " int i;\n" @@ -4449,7 +4446,7 @@ class TestIO : public TestFixture { "}\n", dinit(CheckOptions, $.platform = Platform::Type::Win32W)); ASSERT_EQUALS("[test.cpp:4]: (warning) %d in format string (no. 1) requires 'int' but the argument type is 'unsigned int'.\n" "[test.cpp:4]: (warning) %u in format string (no. 2) requires 'unsigned int' but the argument type is 'signed int'.\n" - "[test.cpp:4]: (warning) wprintf_s format string requires 2 parameters but 3 are given.\n", errout.str()); + "[test.cpp:4]: (warning) wprintf_s format string requires 2 parameters but 3 are given.\n", errout_str()); check("void foo() {\n" " TCHAR str[10];\n" @@ -4459,7 +4456,7 @@ class TestIO : public TestFixture { "}\n", dinit(CheckOptions, $.platform = Platform::Type::Win32A)); ASSERT_EQUALS("[test.cpp:5]: (warning) %d in format string (no. 1) requires 'int' but the argument type is 'unsigned int'.\n" "[test.cpp:5]: (warning) %u in format string (no. 2) requires 'unsigned int' but the argument type is 'signed int'.\n" - "[test.cpp:5]: (warning) _stprintf_s format string requires 2 parameters but 3 are given.\n", errout.str()); + "[test.cpp:5]: (warning) _stprintf_s format string requires 2 parameters but 3 are given.\n", errout_str()); check("void foo() {\n" " TCHAR str[10];\n" @@ -4469,7 +4466,7 @@ class TestIO : public TestFixture { "}\n", dinit(CheckOptions, $.platform = Platform::Type::Win32W)); ASSERT_EQUALS("[test.cpp:5]: (warning) %d in format string (no. 1) requires 'int' but the argument type is 'unsigned int'.\n" "[test.cpp:5]: (warning) %u in format string (no. 2) requires 'unsigned int' but the argument type is 'signed int'.\n" - "[test.cpp:5]: (warning) _stprintf_s format string requires 2 parameters but 3 are given.\n", errout.str()); + "[test.cpp:5]: (warning) _stprintf_s format string requires 2 parameters but 3 are given.\n", errout_str()); check("void foo() {\n" " char str[10];\n" @@ -4479,7 +4476,7 @@ class TestIO : public TestFixture { "}\n", dinit(CheckOptions, $.platform = Platform::Type::Win32A)); ASSERT_EQUALS("[test.cpp:5]: (warning) %d in format string (no. 1) requires 'int' but the argument type is 'unsigned int'.\n" "[test.cpp:5]: (warning) %u in format string (no. 2) requires 'unsigned int' but the argument type is 'signed int'.\n" - "[test.cpp:5]: (warning) sprintf_s format string requires 2 parameters but 3 are given.\n", errout.str()); + "[test.cpp:5]: (warning) sprintf_s format string requires 2 parameters but 3 are given.\n", errout_str()); check("void foo() {\n" " char str[10];\n" @@ -4489,7 +4486,7 @@ class TestIO : public TestFixture { "}\n", dinit(CheckOptions, $.platform = Platform::Type::Win32A)); ASSERT_EQUALS("[test.cpp:5]: (warning) %d in format string (no. 1) requires 'int' but the argument type is 'unsigned int'.\n" "[test.cpp:5]: (warning) %u in format string (no. 2) requires 'unsigned int' but the argument type is 'signed int'.\n" - "[test.cpp:5]: (warning) sprintf_s format string requires 2 parameters but 3 are given.\n", errout.str()); + "[test.cpp:5]: (warning) sprintf_s format string requires 2 parameters but 3 are given.\n", errout_str()); check("void foo() {\n" " wchar_t str[10];\n" @@ -4499,7 +4496,7 @@ class TestIO : public TestFixture { "}\n", dinit(CheckOptions, $.platform = Platform::Type::Win32W)); ASSERT_EQUALS("[test.cpp:5]: (warning) %d in format string (no. 1) requires 'int' but the argument type is 'unsigned int'.\n" "[test.cpp:5]: (warning) %u in format string (no. 2) requires 'unsigned int' but the argument type is 'signed int'.\n" - "[test.cpp:5]: (warning) swprintf_s format string requires 2 parameters but 3 are given.\n", errout.str()); + "[test.cpp:5]: (warning) swprintf_s format string requires 2 parameters but 3 are given.\n", errout_str()); check("void foo() {\n" " wchar_t str[10];\n" @@ -4509,7 +4506,7 @@ class TestIO : public TestFixture { "}\n", dinit(CheckOptions, $.platform = Platform::Type::Win32W)); ASSERT_EQUALS("[test.cpp:5]: (warning) %d in format string (no. 1) requires 'int' but the argument type is 'unsigned int'.\n" "[test.cpp:5]: (warning) %u in format string (no. 2) requires 'unsigned int' but the argument type is 'signed int'.\n" - "[test.cpp:5]: (warning) swprintf_s format string requires 2 parameters but 3 are given.\n", errout.str()); + "[test.cpp:5]: (warning) swprintf_s format string requires 2 parameters but 3 are given.\n", errout_str()); check("void foo() {\n" " TCHAR str[10];\n" @@ -4519,7 +4516,7 @@ class TestIO : public TestFixture { "}\n", dinit(CheckOptions, $.platform = Platform::Type::Win32A)); ASSERT_EQUALS("[test.cpp:5]: (warning) %d in format string (no. 1) requires 'int' but the argument type is 'unsigned int'.\n" "[test.cpp:5]: (warning) %u in format string (no. 2) requires 'unsigned int' but the argument type is 'signed int'.\n" - "[test.cpp:5]: (warning) _sntprintf_s format string requires 2 parameters but 3 are given.\n", errout.str()); + "[test.cpp:5]: (warning) _sntprintf_s format string requires 2 parameters but 3 are given.\n", errout_str()); check("void foo() {\n" " TCHAR str[10];\n" @@ -4529,7 +4526,7 @@ class TestIO : public TestFixture { "}\n", dinit(CheckOptions, $.platform = Platform::Type::Win32W)); ASSERT_EQUALS("[test.cpp:5]: (warning) %d in format string (no. 1) requires 'int' but the argument type is 'unsigned int'.\n" "[test.cpp:5]: (warning) %u in format string (no. 2) requires 'unsigned int' but the argument type is 'signed int'.\n" - "[test.cpp:5]: (warning) _sntprintf_s format string requires 2 parameters but 3 are given.\n", errout.str()); + "[test.cpp:5]: (warning) _sntprintf_s format string requires 2 parameters but 3 are given.\n", errout_str()); check("void foo() {\n" " char str[10];\n" @@ -4539,7 +4536,7 @@ class TestIO : public TestFixture { "}\n", dinit(CheckOptions, $.platform = Platform::Type::Win32A)); ASSERT_EQUALS("[test.cpp:5]: (warning) %d in format string (no. 1) requires 'int' but the argument type is 'unsigned int'.\n" "[test.cpp:5]: (warning) %u in format string (no. 2) requires 'unsigned int' but the argument type is 'signed int'.\n" - "[test.cpp:5]: (warning) _snprintf_s format string requires 2 parameters but 3 are given.\n", errout.str()); + "[test.cpp:5]: (warning) _snprintf_s format string requires 2 parameters but 3 are given.\n", errout_str()); check("void foo() {\n" " wchar_t str[10];\n" @@ -4549,7 +4546,7 @@ class TestIO : public TestFixture { "}\n", dinit(CheckOptions, $.platform = Platform::Type::Win32W)); ASSERT_EQUALS("[test.cpp:5]: (warning) %d in format string (no. 1) requires 'int' but the argument type is 'unsigned int'.\n" "[test.cpp:5]: (warning) %u in format string (no. 2) requires 'unsigned int' but the argument type is 'signed int'.\n" - "[test.cpp:5]: (warning) _snwprintf_s format string requires 2 parameters but 3 are given.\n", errout.str()); + "[test.cpp:5]: (warning) _snwprintf_s format string requires 2 parameters but 3 are given.\n", errout_str()); check("void foo(FILE * fp) {\n" " int i;\n" @@ -4558,7 +4555,7 @@ class TestIO : public TestFixture { "}\n", dinit(CheckOptions, $.platform = Platform::Type::Win32A)); ASSERT_EQUALS("[test.cpp:4]: (warning) %d in format string (no. 1) requires 'int' but the argument type is 'unsigned int'.\n" "[test.cpp:4]: (warning) %u in format string (no. 2) requires 'unsigned int' but the argument type is 'signed int'.\n" - "[test.cpp:4]: (warning) _ftprintf_s format string requires 2 parameters but 3 are given.\n", errout.str()); + "[test.cpp:4]: (warning) _ftprintf_s format string requires 2 parameters but 3 are given.\n", errout_str()); check("void foo(FILE * fp) {\n" " int i;\n" @@ -4567,7 +4564,7 @@ class TestIO : public TestFixture { "}\n", dinit(CheckOptions, $.platform = Platform::Type::Win32W)); ASSERT_EQUALS("[test.cpp:4]: (warning) %d in format string (no. 1) requires 'int' but the argument type is 'unsigned int'.\n" "[test.cpp:4]: (warning) %u in format string (no. 2) requires 'unsigned int' but the argument type is 'signed int'.\n" - "[test.cpp:4]: (warning) _ftprintf_s format string requires 2 parameters but 3 are given.\n", errout.str()); + "[test.cpp:4]: (warning) _ftprintf_s format string requires 2 parameters but 3 are given.\n", errout_str()); check("void foo(FILE * fp) {\n" " int i;\n" @@ -4576,7 +4573,7 @@ class TestIO : public TestFixture { "}\n", dinit(CheckOptions, $.platform = Platform::Type::Win32A)); ASSERT_EQUALS("[test.cpp:4]: (warning) %d in format string (no. 1) requires 'int' but the argument type is 'unsigned int'.\n" "[test.cpp:4]: (warning) %u in format string (no. 2) requires 'unsigned int' but the argument type is 'signed int'.\n" - "[test.cpp:4]: (warning) fprintf_s format string requires 2 parameters but 3 are given.\n", errout.str()); + "[test.cpp:4]: (warning) fprintf_s format string requires 2 parameters but 3 are given.\n", errout_str()); check("void foo(FILE * fp) {\n" " int i;\n" @@ -4585,7 +4582,7 @@ class TestIO : public TestFixture { "}\n", dinit(CheckOptions, $.platform = Platform::Type::Win32W)); ASSERT_EQUALS("[test.cpp:4]: (warning) %d in format string (no. 1) requires 'int' but the argument type is 'unsigned int'.\n" "[test.cpp:4]: (warning) %u in format string (no. 2) requires 'unsigned int' but the argument type is 'signed int'.\n" - "[test.cpp:4]: (warning) fwprintf_s format string requires 2 parameters but 3 are given.\n", errout.str()); + "[test.cpp:4]: (warning) fwprintf_s format string requires 2 parameters but 3 are given.\n", errout_str()); check("void foo() {\n" " char lineBuffer [600];\n" @@ -4593,7 +4590,7 @@ class TestIO : public TestFixture { " sprintf_s(lineBuffer, 600, format, \"type\", \"sum\", \"avg\", \"min\", \"max\");\n" " sprintf_s(lineBuffer, format, \"type\", \"sum\", \"avg\", \"min\", \"max\");\n" "}\n", dinit(CheckOptions, $.platform = Platform::Type::Win32A)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() {\n" " const char * const format1 = \"%15s%17s%17s%17s%17s\";\n" @@ -4636,7 +4633,7 @@ class TestIO : public TestFixture { "[test.cpp:16]: (warning) %s in format string (no. 5) requires 'char *' but the argument type is 'signed int'.\n" "[test.cpp:16]: (warning) sprintf_s format string requires 5 parameters but 6 are given.\n" "[test.cpp:17]: (warning) %s in format string (no. 5) requires 'char *' but the argument type is 'signed int'.\n" - "[test.cpp:17]: (warning) sprintf_s format string requires 5 parameters but 6 are given.\n", errout.str()); + "[test.cpp:17]: (warning) sprintf_s format string requires 5 parameters but 6 are given.\n", errout_str()); } @@ -4649,7 +4646,7 @@ class TestIO : public TestFixture { "}\n", dinit(CheckOptions, $.platform = Platform::Type::Win32A)); ASSERT_EQUALS("[test.cpp:5]: (warning) %d in format string (no. 2) requires 'int *' but the argument type is 'unsigned int *'.\n" "[test.cpp:5]: (warning) %u in format string (no. 3) requires 'unsigned int *' but the argument type is 'signed int *'.\n" - "[test.cpp:5]: (warning) _tscanf_s format string requires 6 parameters but 7 are given.\n", errout.str()); + "[test.cpp:5]: (warning) _tscanf_s format string requires 6 parameters but 7 are given.\n", errout_str()); check("void foo() {\n" " int i;\n" @@ -4659,7 +4656,7 @@ class TestIO : public TestFixture { "}\n", dinit(CheckOptions, $.platform = Platform::Type::Win32W)); ASSERT_EQUALS("[test.cpp:5]: (warning) %d in format string (no. 2) requires 'int *' but the argument type is 'unsigned int *'.\n" "[test.cpp:5]: (warning) %u in format string (no. 3) requires 'unsigned int *' but the argument type is 'signed int *'.\n" - "[test.cpp:5]: (warning) _tscanf_s format string requires 6 parameters but 7 are given.\n", errout.str()); + "[test.cpp:5]: (warning) _tscanf_s format string requires 6 parameters but 7 are given.\n", errout_str()); check("void foo() {\n" " int i;\n" @@ -4669,7 +4666,7 @@ class TestIO : public TestFixture { "}\n", dinit(CheckOptions, $.platform = Platform::Type::Win32A)); ASSERT_EQUALS("[test.cpp:5]: (warning) %d in format string (no. 2) requires 'int *' but the argument type is 'unsigned int *'.\n" "[test.cpp:5]: (warning) %u in format string (no. 3) requires 'unsigned int *' but the argument type is 'signed int *'.\n" - "[test.cpp:5]: (warning) scanf_s format string requires 6 parameters but 7 are given.\n", errout.str()); + "[test.cpp:5]: (warning) scanf_s format string requires 6 parameters but 7 are given.\n", errout_str()); check("void foo() {\n" " int i;\n" @@ -4679,14 +4676,14 @@ class TestIO : public TestFixture { "}\n", dinit(CheckOptions, $.platform = Platform::Type::Win32W)); ASSERT_EQUALS("[test.cpp:5]: (warning) %d in format string (no. 2) requires 'int *' but the argument type is 'unsigned int *'.\n" "[test.cpp:5]: (warning) %u in format string (no. 3) requires 'unsigned int *' but the argument type is 'signed int *'.\n" - "[test.cpp:5]: (warning) wscanf_s format string requires 6 parameters but 7 are given.\n", errout.str()); + "[test.cpp:5]: (warning) wscanf_s format string requires 6 parameters but 7 are given.\n", errout_str()); check("void f() {\n" " char str[8];\n" " scanf_s(\"%8c\", str, sizeof(str));\n" " scanf_s(\"%9c\", str, sizeof(str));\n" "}\n", dinit(CheckOptions, $.platform = Platform::Type::Win32A)); - ASSERT_EQUALS("[test.cpp:4]: (error) Width 9 given in format string (no. 1) is larger than destination buffer 'str[8]', use %8c to prevent overflowing it.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Width 9 given in format string (no. 1) is larger than destination buffer 'str[8]', use %8c to prevent overflowing it.\n", errout_str()); check("void foo() {\n" " TCHAR txt[100];\n" @@ -4697,7 +4694,7 @@ class TestIO : public TestFixture { "}\n", dinit(CheckOptions, $.platform = Platform::Type::Win32A)); ASSERT_EQUALS("[test.cpp:6]: (warning) %d in format string (no. 2) requires 'int *' but the argument type is 'unsigned int *'.\n" "[test.cpp:6]: (warning) %u in format string (no. 3) requires 'unsigned int *' but the argument type is 'signed int *'.\n" - "[test.cpp:6]: (warning) _stscanf_s format string requires 6 parameters but 7 are given.\n", errout.str()); + "[test.cpp:6]: (warning) _stscanf_s format string requires 6 parameters but 7 are given.\n", errout_str()); check("void foo() {\n" " TCHAR txt[100];\n" @@ -4708,7 +4705,7 @@ class TestIO : public TestFixture { "}\n", dinit(CheckOptions, $.platform = Platform::Type::Win32W)); ASSERT_EQUALS("[test.cpp:6]: (warning) %d in format string (no. 2) requires 'int *' but the argument type is 'unsigned int *'.\n" "[test.cpp:6]: (warning) %u in format string (no. 3) requires 'unsigned int *' but the argument type is 'signed int *'.\n" - "[test.cpp:6]: (warning) _stscanf_s format string requires 6 parameters but 7 are given.\n", errout.str()); + "[test.cpp:6]: (warning) _stscanf_s format string requires 6 parameters but 7 are given.\n", errout_str()); check("void foo() {\n" " char txt[100];\n" @@ -4719,7 +4716,7 @@ class TestIO : public TestFixture { "}\n", dinit(CheckOptions, $.platform = Platform::Type::Win32A)); ASSERT_EQUALS("[test.cpp:6]: (warning) %d in format string (no. 2) requires 'int *' but the argument type is 'unsigned int *'.\n" "[test.cpp:6]: (warning) %u in format string (no. 3) requires 'unsigned int *' but the argument type is 'signed int *'.\n" - "[test.cpp:6]: (warning) sscanf_s format string requires 6 parameters but 7 are given.\n", errout.str()); + "[test.cpp:6]: (warning) sscanf_s format string requires 6 parameters but 7 are given.\n", errout_str()); check("void foo() {\n" " wchar_t txt[100];\n" @@ -4730,7 +4727,7 @@ class TestIO : public TestFixture { "}\n", dinit(CheckOptions, $.platform = Platform::Type::Win32W)); ASSERT_EQUALS("[test.cpp:6]: (warning) %d in format string (no. 2) requires 'int *' but the argument type is 'unsigned int *'.\n" "[test.cpp:6]: (warning) %u in format string (no. 3) requires 'unsigned int *' but the argument type is 'signed int *'.\n" - "[test.cpp:6]: (warning) swscanf_s format string requires 6 parameters but 7 are given.\n", errout.str()); + "[test.cpp:6]: (warning) swscanf_s format string requires 6 parameters but 7 are given.\n", errout_str()); check("void foo(FILE * fp) {\n" " int i;\n" @@ -4740,7 +4737,7 @@ class TestIO : public TestFixture { "}\n", dinit(CheckOptions, $.platform = Platform::Type::Win32A)); ASSERT_EQUALS("[test.cpp:5]: (warning) %d in format string (no. 2) requires 'int *' but the argument type is 'unsigned int *'.\n" "[test.cpp:5]: (warning) %u in format string (no. 3) requires 'unsigned int *' but the argument type is 'signed int *'.\n" - "[test.cpp:5]: (warning) _ftscanf_s format string requires 6 parameters but 7 are given.\n", errout.str()); + "[test.cpp:5]: (warning) _ftscanf_s format string requires 6 parameters but 7 are given.\n", errout_str()); check("void foo(FILE * fp) {\n" " int i;\n" @@ -4750,7 +4747,7 @@ class TestIO : public TestFixture { "}\n", dinit(CheckOptions, $.platform = Platform::Type::Win32W)); ASSERT_EQUALS("[test.cpp:5]: (warning) %d in format string (no. 2) requires 'int *' but the argument type is 'unsigned int *'.\n" "[test.cpp:5]: (warning) %u in format string (no. 3) requires 'unsigned int *' but the argument type is 'signed int *'.\n" - "[test.cpp:5]: (warning) _ftscanf_s format string requires 6 parameters but 7 are given.\n", errout.str()); + "[test.cpp:5]: (warning) _ftscanf_s format string requires 6 parameters but 7 are given.\n", errout_str()); check("void foo(FILE * fp) {\n" " int i;\n" @@ -4760,7 +4757,7 @@ class TestIO : public TestFixture { "}\n", dinit(CheckOptions, $.platform = Platform::Type::Win32A)); ASSERT_EQUALS("[test.cpp:5]: (warning) %d in format string (no. 2) requires 'int *' but the argument type is 'unsigned int *'.\n" "[test.cpp:5]: (warning) %u in format string (no. 3) requires 'unsigned int *' but the argument type is 'signed int *'.\n" - "[test.cpp:5]: (warning) fscanf_s format string requires 6 parameters but 7 are given.\n", errout.str()); + "[test.cpp:5]: (warning) fscanf_s format string requires 6 parameters but 7 are given.\n", errout_str()); check("void foo(FILE * fp) {\n" " int i;\n" @@ -4770,13 +4767,13 @@ class TestIO : public TestFixture { "}\n", dinit(CheckOptions, $.platform = Platform::Type::Win32W)); ASSERT_EQUALS("[test.cpp:5]: (warning) %d in format string (no. 2) requires 'int *' but the argument type is 'unsigned int *'.\n" "[test.cpp:5]: (warning) %u in format string (no. 3) requires 'unsigned int *' but the argument type is 'signed int *'.\n" - "[test.cpp:5]: (warning) fwscanf_s format string requires 6 parameters but 7 are given.\n", errout.str()); + "[test.cpp:5]: (warning) fwscanf_s format string requires 6 parameters but 7 are given.\n", errout_str()); check("void foo() {\n" " WCHAR msStr1[5] = {0};\n" " wscanf_s(L\"%4[^-]\", msStr1, _countof(msStr1));\n" "}\n", dinit(CheckOptions, $.platform = Platform::Type::Win32W)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void testQStringFormatArguments() { @@ -4784,20 +4781,20 @@ class TestIO : public TestFixture { " QString string;\n" " string.sprintf(\"%d\", f);\n" "}", dinit(CheckOptions, $.platform = Platform::Type::Win32A)); - ASSERT_EQUALS("[test.cpp:3]: (warning) %d in format string (no. 1) requires 'int' but the argument type is 'float'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) %d in format string (no. 1) requires 'int' but the argument type is 'float'.\n", errout_str()); check("void foo(float f) {\n" " QString string;\n" " string = QString::asprintf(\"%d\", f);\n" "}", dinit(CheckOptions, $.platform = Platform::Type::Win32A)); - ASSERT_EQUALS("[test.cpp:3]: (warning) %d in format string (no. 1) requires 'int' but the argument type is 'float'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) %d in format string (no. 1) requires 'int' but the argument type is 'float'.\n", errout_str()); } void testTernary() { // ticket #6182 check("void test(const std::string &val) {\n" " printf(\"%s\", val.empty() ? \"I like to eat bananas\" : val.c_str());\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void testUnsignedConst() { // ticket #6321 @@ -4805,30 +4802,30 @@ class TestIO : public TestFixture { " unsigned const x = 5;\n" " printf(\"%u\", x);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void testAstType() { // ticket #7014 check("void test() {\n" " printf(\"%c\", \"hello\"[0]);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void test() {\n" " printf(\"%lld\", (long long)1);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void test() {\n" " printf(\"%i\", (short *)x);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) %i in format string (no. 1) requires 'int' but the argument type is 'signed short *'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) %i in format string (no. 1) requires 'int' but the argument type is 'signed short *'.\n", errout_str()); check("int (*fp)();\n" // #7178 - function pointer call "void test() {\n" " printf(\"%i\", fp());\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void testPrintf0WithSuffix() { // ticket #7069 @@ -4836,7 +4833,7 @@ class TestIO : public TestFixture { " printf(\"%u %lu %llu\", 0U, 0UL, 0ULL);\n" " printf(\"%u %lu %llu\", 0u, 0ul, 0ull);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void testReturnValueTypeStdLib() { @@ -4844,13 +4841,13 @@ class TestIO : public TestFixture { " const char *s = \"0\";\n" " printf(\"%ld%lld\", atol(s), atoll(s));\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // 8141 check("void f(int i) {\n" " printf(\"%f\", imaxabs(i));\n" "}\n", dinit(CheckOptions, $.portability = true, $.platform = Platform::Type::Unix64)); - ASSERT_EQUALS("[test.cpp:2]: (portability) %f in format string (no. 1) requires 'double' but the argument type is 'intmax_t {aka signed long}'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (portability) %f in format string (no. 1) requires 'double' but the argument type is 'intmax_t {aka signed long}'.\n", errout_str()); } void testPrintfTypeAlias1() { @@ -4863,7 +4860,7 @@ class TestIO : public TestFixture { "void foo() {\n" " printf(\"%d %p %p\", i, pi, pci);\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("using INT = int;\n\n" "using PINT = INT *;\n" @@ -4876,7 +4873,7 @@ class TestIO : public TestFixture { "};"); ASSERT_EQUALS("[test.cpp:8]: (warning) %f in format string (no. 1) requires 'double' but the argument type is 'signed int'.\n" "[test.cpp:8]: (warning) %f in format string (no. 2) requires 'double' but the argument type is 'signed int *'.\n" - "[test.cpp:8]: (warning) %f in format string (no. 3) requires 'double' but the argument type is 'const signed int *'.\n", errout.str()); + "[test.cpp:8]: (warning) %f in format string (no. 3) requires 'double' but the argument type is 'const signed int *'.\n", errout_str()); } void testPrintfAuto() { // #8992 @@ -4885,24 +4882,24 @@ class TestIO : public TestFixture { " printf(\"%zu\", s);\n" " printf(\"%f\", s);\n" "}\n", dinit(CheckOptions, $.portability = true)); - ASSERT_EQUALS("[test.cpp:4]: (portability) %f in format string (no. 1) requires 'double' but the argument type is 'size_t {aka unsigned long}'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (portability) %f in format string (no. 1) requires 'double' but the argument type is 'size_t {aka unsigned long}'.\n", errout_str()); } void testPrintfParenthesis() { // #8489 check("void f(int a) {\n" " printf(\"%f\", (a >> 24) & 0xff);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) %f in format string (no. 1) requires 'double' but the argument type is 'signed int'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) %f in format string (no. 1) requires 'double' but the argument type is 'signed int'.\n", errout_str()); check("void f(int a) {\n" " printf(\"%f\", 0xff & (a >> 24));\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) %f in format string (no. 1) requires 'double' but the argument type is 'signed int'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) %f in format string (no. 1) requires 'double' but the argument type is 'signed int'.\n", errout_str()); check("void f(int a) {\n" " printf(\"%f\", ((a >> 24) + 1) & 0xff);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) %f in format string (no. 1) requires 'double' but the argument type is 'signed int'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) %f in format string (no. 1) requires 'double' but the argument type is 'signed int'.\n", errout_str()); } void testStdDistance() { // #10304 @@ -4910,7 +4907,7 @@ class TestIO : public TestFixture { "const auto Idx = std::distance(&IO.front(), pio);\n" "printf(\"Idx = %td\", Idx);\n" "}", dinit(CheckOptions, $.portability = true)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void testParameterPack() { // #11289 @@ -4920,7 +4917,7 @@ class TestIO : public TestFixture { "void g() {\n" " f(\"%d%d\", 1, 2);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } }; diff --git a/test/testleakautovar.cpp b/test/testleakautovar.cpp index bca832f98dc6..f8f89534341b 100644 --- a/test/testleakautovar.cpp +++ b/test/testleakautovar.cpp @@ -231,9 +231,6 @@ class TestLeakAutoVar : public TestFixture { #define check(...) check_(__FILE__, __LINE__, __VA_ARGS__) void check_(const char* file, int line, const char code[], bool cpp = false, const Settings *s = nullptr) { - // Clear the error buffer.. - errout.str(""); - const Settings settings1 = settingsBuilder(s ? *s : settings).checkLibrary().build(); // Tokenize.. @@ -246,9 +243,6 @@ class TestLeakAutoVar : public TestFixture { } void check_(const char* file, int line, const char code[], const Settings & s) { - // Clear the error buffer.. - errout.str(""); - const Settings settings0 = settingsBuilder(s).checkLibrary().build(); // Tokenize.. @@ -266,7 +260,7 @@ class TestLeakAutoVar : public TestFixture { " p = NULL;\n" " free(p);\n" "}"); - ASSERT_EQUALS("[test.c:3]: (error) Memory leak: p\n", errout.str()); + ASSERT_EQUALS("[test.c:3]: (error) Memory leak: p\n", errout_str()); } void assign2() { @@ -275,7 +269,7 @@ class TestLeakAutoVar : public TestFixture { " char *q = p;\n" " free(q);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void assign3() { @@ -284,7 +278,7 @@ class TestLeakAutoVar : public TestFixture { " char *q = p + 1;\n" " free(q - 1);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void assign4() { @@ -293,7 +287,7 @@ class TestLeakAutoVar : public TestFixture { " a += 10;\n" " free(a - 10);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void assign5() { @@ -302,7 +296,7 @@ class TestLeakAutoVar : public TestFixture { " char *p = new char[100];\n" " list += p;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void assign6() { // #2806 - FP when there is redundant assignment @@ -311,7 +305,7 @@ class TestLeakAutoVar : public TestFixture { " p = strcpy(p,q);\n" " free(p);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void assign7() { @@ -319,7 +313,7 @@ class TestLeakAutoVar : public TestFixture { " struct str *p = malloc(10);\n" " d->p = p;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void assign8() { // linux list @@ -327,7 +321,7 @@ class TestLeakAutoVar : public TestFixture { " struct str *p = malloc(10);\n" " d->p = &p->x;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void assign9() { @@ -336,7 +330,7 @@ class TestLeakAutoVar : public TestFixture { " free(p);\n" " p = NULL;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void assign10() { @@ -346,7 +340,7 @@ class TestLeakAutoVar : public TestFixture { " if (!x) { p = NULL; }\n" " free(p);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void assign11() { // #3942 - FP for x = a(b(p)); @@ -354,7 +348,7 @@ class TestLeakAutoVar : public TestFixture { " char *p = malloc(10);\n" " x = a(b(p));\n" "}"); - ASSERT_EQUALS("[test.c:4]: (information) --check-library: Function b() should have / configuration\n", errout.str()); + ASSERT_EQUALS("[test.c:4]: (information) --check-library: Function b() should have / configuration\n", errout_str()); } void assign12() { // #4236: FP. bar(&x) @@ -364,7 +358,7 @@ class TestLeakAutoVar : public TestFixture { " bar(&p);\n" " free(p);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void assign13() { // #4237: FP. char *&ref=p; p=malloc(10); free(ref); @@ -374,7 +368,7 @@ class TestLeakAutoVar : public TestFixture { " p = malloc(10);\n" " free(ref);\n" "}", /*cpp*/ true); - TODO_ASSERT_EQUALS("", "[test.cpp:6]: (error) Memory leak: p\n", errout.str()); + TODO_ASSERT_EQUALS("", "[test.cpp:6]: (error) Memory leak: p\n", errout_str()); } void assign14() { @@ -382,13 +376,13 @@ class TestLeakAutoVar : public TestFixture { " char *p;\n" " if (x && (p = malloc(10))) { }" "}"); - ASSERT_EQUALS("[test.c:3]: (error) Memory leak: p\n", errout.str()); + ASSERT_EQUALS("[test.c:3]: (error) Memory leak: p\n", errout_str()); check("void f(int x) {\n" " char *p;\n" " if (x && (p = new char[10])) { }" "}", true); - ASSERT_EQUALS("[test.cpp:3]: (error) Memory leak: p\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Memory leak: p\n", errout_str()); } void assign15() { @@ -400,7 +394,7 @@ class TestLeakAutoVar : public TestFixture { " p = malloc(sizeof *p);\n" " free(p);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void assign16() { @@ -409,19 +403,19 @@ class TestLeakAutoVar : public TestFixture { " free(p);\n" " if (p=dostuff()) *p = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void assign17() { // #9047 check("void f() {\n" " char *p = (char*)malloc(10);\n" "}"); - ASSERT_EQUALS("[test.c:3]: (error) Memory leak: p\n", errout.str()); + ASSERT_EQUALS("[test.c:3]: (error) Memory leak: p\n", errout_str()); check("void f() {\n" " char *p = (char*)(int*)malloc(10);\n" "}"); - ASSERT_EQUALS("[test.c:3]: (error) Memory leak: p\n", errout.str()); + ASSERT_EQUALS("[test.c:3]: (error) Memory leak: p\n", errout_str()); } void assign18() { @@ -429,13 +423,13 @@ class TestLeakAutoVar : public TestFixture { " char *p;\n" " if (x && (p = (char*)malloc(10))) { }" "}"); - ASSERT_EQUALS("[test.c:3]: (error) Memory leak: p\n", errout.str()); + ASSERT_EQUALS("[test.c:3]: (error) Memory leak: p\n", errout_str()); check("void f(int x) {\n" " char *p;\n" " if (x && (p = (char*)(int*)malloc(10))) { }" "}"); - ASSERT_EQUALS("[test.c:3]: (error) Memory leak: p\n", errout.str()); + ASSERT_EQUALS("[test.c:3]: (error) Memory leak: p\n", errout_str()); } void assign19() { @@ -443,14 +437,14 @@ class TestLeakAutoVar : public TestFixture { " char *p = malloc(10);\n" " free((void*)p);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void assign20() { // #9187 check("void f() {\n" " char *p = static_cast(malloc(10));\n" "}", true); - ASSERT_EQUALS("[test.cpp:3]: (error) Memory leak: p\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Memory leak: p\n", errout_str()); } void assign21() { @@ -458,26 +452,26 @@ class TestLeakAutoVar : public TestFixture { " void *p = malloc(10);\n" " *x = (int*)p;\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S { int i; };\n" // #10996 "void f() {\n" " S* s = new S();\n" " (void)s;\n" "}", true); - ASSERT_EQUALS("[test.cpp:5]: (error) Memory leak: s\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Memory leak: s\n", errout_str()); } void assign22() { // #9139 check("void f(char tempFileName[256]) {\n" " const int fd = socket(AF_INET, SOCK_PACKET, 0 );\n" "}", true); - ASSERT_EQUALS("[test.cpp:3]: (error) Resource leak: fd\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Resource leak: fd\n", errout_str()); check("void f() {\n" " const void * const p = malloc(10);\n" "}", true); - ASSERT_EQUALS("[test.cpp:3]: (error) Memory leak: p\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Memory leak: p\n", errout_str()); } void assign23() { @@ -513,7 +507,7 @@ class TestLeakAutoVar : public TestFixture { "[test.cpp:17]: (error) Resource leak: n12\n" "[test.cpp:17]: (error) Resource leak: n13\n" "[test.cpp:17]: (error) Resource leak: n14\n", - errout.str()); + errout_str()); } void assign24() { @@ -522,7 +516,7 @@ class TestLeakAutoVar : public TestFixture { " char** dataPtr = &data;\n" " delete[] *dataPtr;\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " char* data = new char[100];\n" @@ -530,7 +524,7 @@ class TestLeakAutoVar : public TestFixture { " printf(\"test\");\n" " delete[] *dataPtr;\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" // #9279 " int* p = new int;\n" @@ -538,7 +532,7 @@ class TestLeakAutoVar : public TestFixture { " g();\n" "}\n", /*cpp*/ true); ASSERT_EQUALS("[test.cpp:4]: (information) --check-library: Function g() should have configuration\n", - errout.str()); + errout_str()); check("void g();\n" "void f() {\n" @@ -546,7 +540,7 @@ class TestLeakAutoVar : public TestFixture { " *p = 42;\n" " g();\n" "}\n", /*cpp*/ true); - ASSERT_EQUALS("[test.cpp:6]: (error) Memory leak: p\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (error) Memory leak: p\n", errout_str()); check("void g() {}\n" "void f() {\n" @@ -554,7 +548,7 @@ class TestLeakAutoVar : public TestFixture { " *p = 42;\n" " g();\n" "}\n", /*cpp*/ true); - ASSERT_EQUALS("[test.cpp:6]: (error) Memory leak: p\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (error) Memory leak: p\n", errout_str()); check("[[noreturn]] void g();\n" "void f() {\n" @@ -562,7 +556,7 @@ class TestLeakAutoVar : public TestFixture { " *p = 42;\n" " g();\n" "}\n", /*cpp*/ true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void g() { exit(1); }\n" "void f() {\n" @@ -570,14 +564,14 @@ class TestLeakAutoVar : public TestFixture { " *p = 42;\n" " g();\n" "}\n", /*cpp*/ true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void g() {}\n" // #10517 "void f() {\n" " char* p = malloc(10);\n" " g();\n" "}\n"); - ASSERT_EQUALS("[test.c:5]: (error) Memory leak: p\n", errout.str()); + ASSERT_EQUALS("[test.c:5]: (error) Memory leak: p\n", errout_str()); } void assign25() { @@ -587,7 +581,7 @@ class TestLeakAutoVar : public TestFixture { "}", true); ASSERT_EQUALS("[test.cpp:4]: (error) Memory leak: p\n" "[test.cpp:4]: (error) Memory leak: q\n", - errout.str()); + errout_str()); check("struct S : B {\n" // #12239 " void f();\n" @@ -601,7 +595,7 @@ class TestLeakAutoVar : public TestFixture { " FD* fd{ new FD(this) };\n" " fd->exec();\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct C {\n" // #12327 " char* m_p;\n" @@ -628,24 +622,24 @@ class TestLeakAutoVar : public TestFixture { " li.push_back(c);\n" " delete[] li.front().m_p;\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void isAutoDealloc() { check("void f() {\n" " char *p = new char[100];" "}", true); - ASSERT_EQUALS("[test.cpp:2]: (error) Memory leak: p\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (error) Memory leak: p\n", errout_str()); check("void f() {\n" " Fred *fred = new Fred;" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " std::string *str = new std::string;" "}", true); - TODO_ASSERT_EQUALS("[test.cpp:2]: (error) Memory leak: str\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:2]: (error) Memory leak: str\n", "", errout_str()); check("class TestType {\n" // #9028 "public:\n" @@ -654,13 +648,13 @@ class TestLeakAutoVar : public TestFixture { "void f() {\n" " TestType *tt = new TestType();\n" "}", true); - ASSERT_EQUALS("[test.cpp:7]: (error) Memory leak: tt\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (error) Memory leak: tt\n", errout_str()); check("void f(Bar& b) {\n" // #7622 " char* data = new char[10];\n" " b = Bar(*new Foo(data));\n" "}", /*cpp*/ true); - ASSERT_EQUALS("[test.cpp:4]: (information) --check-library: Function Foo() should have / configuration\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (information) --check-library: Function Foo() should have / configuration\n", errout_str()); check("class B {};\n" " class D : public B {};\n" @@ -668,7 +662,7 @@ class TestLeakAutoVar : public TestFixture { " auto d = new D();\n" " if (d) {}\n" "}", /*cpp*/ true); - ASSERT_EQUALS("[test.cpp:6]: (error) Memory leak: d\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (error) Memory leak: d\n", errout_str()); check("struct S {\n" // #12354 " int i{};\n" @@ -679,7 +673,7 @@ class TestLeakAutoVar : public TestFixture { " p = new S();\n" " p->f();\n" "}", /*cpp*/ true); - ASSERT_EQUALS("[test.cpp:9]: (error) Memory leak: p\n", errout.str()); + ASSERT_EQUALS("[test.cpp:9]: (error) Memory leak: p\n", errout_str()); } void realloc1() { @@ -688,7 +682,7 @@ class TestLeakAutoVar : public TestFixture { " void *q = realloc(p, 20);\n" " free(q)\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void realloc2() { @@ -696,7 +690,7 @@ class TestLeakAutoVar : public TestFixture { " void *p = malloc(10);\n" " void *q = realloc(p, 20);\n" "}"); - ASSERT_EQUALS("[test.c:4]: (error) Memory leak: q\n", errout.str()); + ASSERT_EQUALS("[test.c:4]: (error) Memory leak: q\n", errout_str()); } void realloc3() { @@ -704,7 +698,7 @@ class TestLeakAutoVar : public TestFixture { " char *p = malloc(10);\n" " char *q = (char*) realloc(p, 20);\n" "}"); - ASSERT_EQUALS("[test.c:4]: (error) Memory leak: q\n", errout.str()); + ASSERT_EQUALS("[test.c:4]: (error) Memory leak: q\n", errout_str()); } void realloc4() { @@ -713,7 +707,7 @@ class TestLeakAutoVar : public TestFixture { " if (q == NULL)\n" " return;\n" "}"); - ASSERT_EQUALS("[test.c:5]: (error) Memory leak: q\n", errout.str()); + ASSERT_EQUALS("[test.c:5]: (error) Memory leak: q\n", errout_str()); } void realloc5() { @@ -724,7 +718,7 @@ class TestLeakAutoVar : public TestFixture { " free(ptr);\n" " return datap;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #9990 check("void f() {\n" @@ -738,7 +732,7 @@ class TestLeakAutoVar : public TestFixture { " }\n" " free(p2);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void freopen1() { @@ -747,7 +741,7 @@ class TestLeakAutoVar : public TestFixture { " void *q = freopen(name, b, p);\n" " fclose(q)\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void freopen2() { @@ -755,7 +749,7 @@ class TestLeakAutoVar : public TestFixture { " void *p = fopen(name,a);\n" " void *q = freopen(name, b, p);\n" "}"); - ASSERT_EQUALS("[test.c:4]: (error) Resource leak: q\n", errout.str()); + ASSERT_EQUALS("[test.c:4]: (error) Resource leak: q\n", errout_str()); } void deallocuse1() { @@ -763,13 +757,13 @@ class TestLeakAutoVar : public TestFixture { " free(p);\n" " *p = 0;\n" "}"); - ASSERT_EQUALS("[test.c:3]: (error) Dereferencing 'p' after it is deallocated / released\n", errout.str()); + ASSERT_EQUALS("[test.c:3]: (error) Dereferencing 'p' after it is deallocated / released\n", errout_str()); check("void f(char *p) {\n" " free(p);\n" " char c = *p;\n" "}"); - ASSERT_EQUALS("[test.c:3]: (error) Dereferencing 'p' after it is deallocated / released\n", errout.str()); + ASSERT_EQUALS("[test.c:3]: (error) Dereferencing 'p' after it is deallocated / released\n", errout_str()); } void deallocuse3() { @@ -777,7 +771,7 @@ class TestLeakAutoVar : public TestFixture { " free(p);\n" " p = p->next;\n" "}"); - ASSERT_EQUALS("[test.c:3]: (error) Dereferencing 'p' after it is deallocated / released\n", errout.str()); + ASSERT_EQUALS("[test.c:3]: (error) Dereferencing 'p' after it is deallocated / released\n", errout_str()); } void deallocuse4() { @@ -785,25 +779,25 @@ class TestLeakAutoVar : public TestFixture { " free(p);\n" " return p;\n" "}"); - ASSERT_EQUALS("[test.c:2] -> [test.c:3]: (error) Returning/dereferencing 'p' after it is deallocated / released\n", errout.str()); + ASSERT_EQUALS("[test.c:2] -> [test.c:3]: (error) Returning/dereferencing 'p' after it is deallocated / released\n", errout_str()); check("void f(char *p) {\n" " if (!p) free(p);\n" " return p;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(char *p) {\n" " if (!p) delete p;\n" " return p;\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(char *p) {\n" " if (!p) delete [] p;\n" " return p;\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(void* p) {\n" " if (a) {\n" @@ -813,7 +807,7 @@ class TestLeakAutoVar : public TestFixture { " g(p);\n" " return;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void deallocuse5() { // #4018 @@ -821,7 +815,7 @@ class TestLeakAutoVar : public TestFixture { " free(p), p = 0;\n" " *p = 0;\n" // <- Make sure pointer info is reset. It is NOT a freed pointer dereference "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void deallocuse6() { // #4034 @@ -829,7 +823,7 @@ class TestLeakAutoVar : public TestFixture { " free(p);\n" " x = p = foo();\n" // <- p is not dereferenced "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void deallocuse7() { // #6467, #6469, #6473, #6648 @@ -838,14 +832,14 @@ class TestLeakAutoVar : public TestFixture { " delete foo->ptr;\n" " foo->ptr = new Foo;\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct Foo { int* ptr; };\n" "void f(Foo* foo) {\n" " delete foo->ptr;\n" " x = *foo->ptr;\n" "}", true); - TODO_ASSERT_EQUALS("[test.cpp:4]: (error) Dereferencing 'ptr' after it is deallocated / released\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:4]: (error) Dereferencing 'ptr' after it is deallocated / released\n", "", errout_str()); check("void parse() {\n" " struct Buf {\n" @@ -854,7 +848,7 @@ class TestLeakAutoVar : public TestFixture { " uint8_t *m_buf;\n" " };\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct Foo {\n" " Foo();\n" @@ -866,14 +860,14 @@ class TestLeakAutoVar : public TestFixture { " foo->ptr = new Foo;\n" " foo->ptr->func();\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(void (*conv)(char**)) {\n" " char * ptr=(char*)malloc(42);\n" " free(ptr);\n" " (*conv)(&ptr);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void deallocuse8() { // #1765 @@ -882,7 +876,7 @@ class TestLeakAutoVar : public TestFixture { " delete(ptr);\n" " *ptr = 0;\n" "}", true); - ASSERT_EQUALS("[test.cpp:4]: (error) Dereferencing 'ptr' after it is deallocated / released\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Dereferencing 'ptr' after it is deallocated / released\n", errout_str()); } void deallocuse9() { @@ -891,7 +885,7 @@ class TestLeakAutoVar : public TestFixture { " bool b = p->foo();\n" " return b;\n" "}\n", /*cpp*/ true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A {\n" // #8635 " std::vector> array_;\n" @@ -901,7 +895,7 @@ class TestLeakAutoVar : public TestFixture { " return a;\n" " }\n" "};\n", /*cpp*/ true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int g(int *p) {\n" // #9838 " std::unique_ptr temp(p);\n" @@ -910,7 +904,7 @@ class TestLeakAutoVar : public TestFixture { "int f() {\n" " return g(new int(3));\n" "}\n", /*cpp*/ true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void deallocuse10() { @@ -918,13 +912,13 @@ class TestLeakAutoVar : public TestFixture { " free(p);\n" " p[0] = 10;\n" "}\n"); - ASSERT_EQUALS("[test.c:3]: (error) Dereferencing 'p' after it is deallocated / released\n", errout.str()); + ASSERT_EQUALS("[test.c:3]: (error) Dereferencing 'p' after it is deallocated / released\n", errout_str()); check("int f(int* p) {\n" " free(p);\n" " return p[1];\n" "}\n"); - ASSERT_EQUALS("[test.c:2] -> [test.c:3]: (error) Returning/dereferencing 'p' after it is deallocated / released\n", errout.str()); + ASSERT_EQUALS("[test.c:2] -> [test.c:3]: (error) Returning/dereferencing 'p' after it is deallocated / released\n", errout_str()); } void deallocuse11() { // #8302 @@ -933,14 +927,14 @@ class TestLeakAutoVar : public TestFixture { " delete [] array;\n" " return array[1];" // << "}", true); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (error) Returning/dereferencing 'array' after it is deallocated / released\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (error) Returning/dereferencing 'array' after it is deallocated / released\n", errout_str()); check("int f() {\n" " int *array = (int*)malloc(40);\n" " free(array);\n" " return array[1];" // << "}"); - ASSERT_EQUALS("[test.c:3] -> [test.c:4]: (error) Returning/dereferencing 'array' after it is deallocated / released\n", errout.str()); + ASSERT_EQUALS("[test.c:3] -> [test.c:4]: (error) Returning/dereferencing 'array' after it is deallocated / released\n", errout_str()); } void deallocuse12() { @@ -951,7 +945,7 @@ class TestLeakAutoVar : public TestFixture { "void f2(struct foo *f, int *out) {\n" " *out = f->x;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void deallocuse13() { @@ -965,7 +959,7 @@ class TestLeakAutoVar : public TestFixture { "}\n", true); ASSERT_EQUALS("[test.cpp:4]: (error) Dereferencing 'a' after it is deallocated / released\n" "[test.cpp:7]: (error) Dereferencing 'b' after it is deallocated / released\n", - errout.str()); + errout_str()); } void deallocuse14() { @@ -976,7 +970,7 @@ class TestLeakAutoVar : public TestFixture { " s->f();\n" "}\n", true); ASSERT_EQUALS("[test.cpp:5]: (error) Dereferencing 's' after it is deallocated / released\n", - errout.str()); + errout_str()); check("void f() {\n" " int *p = (int*)malloc(4);\n" @@ -984,7 +978,7 @@ class TestLeakAutoVar : public TestFixture { " if (*p == 5) {}\n" "}\n"); ASSERT_EQUALS("[test.c:4]: (error) Dereferencing 'p' after it is deallocated / released\n", - errout.str()); + errout_str()); check("int g(int);\n" "void f(int* p) {\n" @@ -997,7 +991,7 @@ class TestLeakAutoVar : public TestFixture { "}\n"); ASSERT_EQUALS("[test.c:4]: (error) Dereferencing 'p' after it is deallocated / released\n" "[test.c:7] -> [test.c:8]: (error) Returning/dereferencing 'p' after it is deallocated / released\n", - errout.str()); + errout_str()); check("int g(int);\n" "void f(int* p) {\n" @@ -1010,7 +1004,7 @@ class TestLeakAutoVar : public TestFixture { "}\n"); ASSERT_EQUALS("[test.c:4]: (error) Dereferencing 'p' after it is deallocated / released\n" "[test.c:7] -> [test.c:8]: (error) Returning/dereferencing 'p' after it is deallocated / released\n", - errout.str()); + errout_str()); check("int g(int, int);\n" "void f(int* p) {\n" @@ -1023,12 +1017,12 @@ class TestLeakAutoVar : public TestFixture { "}\n"); ASSERT_EQUALS("[test.c:4]: (error) Dereferencing 'p' after it is deallocated / released\n" "[test.c:7] -> [test.c:8]: (error) Returning/dereferencing 'p' after it is deallocated / released\n", - errout.str()); + errout_str()); check("void f() {\n" " FOREACH(callables, ());\n" "}\n"); - ASSERT_EQUALS("[test.c:2]: (information) --check-library: Function FOREACH() should have configuration\n", errout.str()); // don't crash + ASSERT_EQUALS("[test.c:2]: (information) --check-library: Function FOREACH() should have configuration\n", errout_str()); // don't crash check("int f() {\n" // #12321 " std::invoke([](int i) {\n" @@ -1042,7 +1036,7 @@ class TestLeakAutoVar : public TestFixture { " }, 1);\n" " return 0;\n" "}\n", /*cpp*/ true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void deallocuse15() { @@ -1051,7 +1045,7 @@ class TestLeakAutoVar : public TestFixture { " if (f) fclose(f);\n" " return f;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void doublefree1() { // #3895 @@ -1062,35 +1056,35 @@ class TestLeakAutoVar : public TestFixture { " p = 0;\n" " free(p);\n" "}"); - ASSERT_EQUALS("[test.c:3] -> [test.c:6]: (error) Memory pointed to by 'p' is freed twice.\n", errout.str()); + ASSERT_EQUALS("[test.c:3] -> [test.c:6]: (error) Memory pointed to by 'p' is freed twice.\n", errout_str()); check( "void foo(char *p) {\n" " free(p);\n" " free(p);\n" "}"); - ASSERT_EQUALS("[test.c:2] -> [test.c:3]: (error) Memory pointed to by 'p' is freed twice.\n", errout.str()); + ASSERT_EQUALS("[test.c:2] -> [test.c:3]: (error) Memory pointed to by 'p' is freed twice.\n", errout_str()); check( "void foo(char *p, char *r) {\n" " free(p);\n" " free(r);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check( "void foo() {\n" " free(p);\n" " free(r);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check( "void foo(char *p) {\n" " if (x < 3) free(p);\n" " else { if (x > 9) free(p); }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check( "void foo(char *p) {\n" @@ -1098,7 +1092,7 @@ class TestLeakAutoVar : public TestFixture { " getNext(&p);\n" " free(p);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check( "void foo(char *p) {\n" @@ -1106,7 +1100,7 @@ class TestLeakAutoVar : public TestFixture { " bar();\n" " free(p);\n" "}"); - ASSERT_EQUALS("[test.c:2] -> [test.c:4]: (error) Memory pointed to by 'p' is freed twice.\n", errout.str()); + ASSERT_EQUALS("[test.c:2] -> [test.c:4]: (error) Memory pointed to by 'p' is freed twice.\n", errout_str()); check( "void foo(char *p) {\n" @@ -1114,28 +1108,28 @@ class TestLeakAutoVar : public TestFixture { " printf(\"Freed memory at location %x\", p);\n" " free(p);\n" "}"); - ASSERT_EQUALS("[test.c:2] -> [test.c:4]: (error) Memory pointed to by 'p' is freed twice.\n", errout.str()); + ASSERT_EQUALS("[test.c:2] -> [test.c:4]: (error) Memory pointed to by 'p' is freed twice.\n", errout_str()); check( "void foo(FILE *p) {\n" " fclose(p);\n" " fclose(p);\n" "}"); - ASSERT_EQUALS("[test.c:2] -> [test.c:3]: (error) Resource handle 'p' freed twice.\n", errout.str()); + ASSERT_EQUALS("[test.c:2] -> [test.c:3]: (error) Resource handle 'p' freed twice.\n", errout_str()); check( "void foo(FILE *p, FILE *r) {\n" " fclose(p);\n" " fclose(r);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check( "void foo(FILE *p) {\n" " if (x < 3) fclose(p);\n" " else { if (x > 9) fclose(p); }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check( "void foo(FILE *p) {\n" @@ -1143,7 +1137,7 @@ class TestLeakAutoVar : public TestFixture { " gethandle(&p);\n" " fclose(p);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check( "void foo(FILE *p) {\n" @@ -1151,14 +1145,14 @@ class TestLeakAutoVar : public TestFixture { " gethandle();\n" " fclose(p);\n" "}"); - ASSERT_EQUALS("[test.c:2] -> [test.c:4]: (error) Resource handle 'p' freed twice.\n", errout.str()); + ASSERT_EQUALS("[test.c:2] -> [test.c:4]: (error) Resource handle 'p' freed twice.\n", errout_str()); check( "void foo(Data* p) {\n" " free(p->a);\n" " free(p->b);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check( "void f() {\n" @@ -1169,7 +1163,7 @@ class TestLeakAutoVar : public TestFixture { " }\n" " free(p);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check( "void f() {\n" @@ -1180,7 +1174,7 @@ class TestLeakAutoVar : public TestFixture { " }\n" " free(p);\n" "}"); - ASSERT_EQUALS("[test.c:4] -> [test.c:7]: (error) Memory pointed to by 'p' is freed twice.\n", errout.str()); + ASSERT_EQUALS("[test.c:4] -> [test.c:7]: (error) Memory pointed to by 'p' is freed twice.\n", errout_str()); check( "void f() {\n" @@ -1189,35 +1183,35 @@ class TestLeakAutoVar : public TestFixture { " p = do_something();\n" " free(p);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check( "void foo(char *p) {\n" " delete p;\n" " delete p;\n" "}", true); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (error) Memory pointed to by 'p' is freed twice.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (error) Memory pointed to by 'p' is freed twice.\n", errout_str()); check( "void foo(char *p, char *r) {\n" " delete p;\n" " delete r;\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check( "void foo(P p) {\n" " delete p.x;\n" " delete p;\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check( "void foo(char **p) {\n" " delete p[0];\n" " delete p[1];\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check( "void foo(char *p) {\n" @@ -1225,7 +1219,7 @@ class TestLeakAutoVar : public TestFixture { " getNext(&p);\n" " delete p;\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check( "void foo(char *p) {\n" @@ -1233,21 +1227,21 @@ class TestLeakAutoVar : public TestFixture { " bar();\n" " delete p;\n" "}", true); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:4]: (error) Memory pointed to by 'p' is freed twice.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:4]: (error) Memory pointed to by 'p' is freed twice.\n", errout_str()); check( "void foo(char *p) {\n" " delete[] p;\n" " delete[] p;\n" "}", true); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (error) Memory pointed to by 'p' is freed twice.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (error) Memory pointed to by 'p' is freed twice.\n", errout_str()); check( "void foo(char *p, char *r) {\n" " delete[] p;\n" " delete[] r;\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check( "void foo(char *p) {\n" @@ -1255,7 +1249,7 @@ class TestLeakAutoVar : public TestFixture { " getNext(&p);\n" " delete[] p;\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check( "void foo(char *p) {\n" @@ -1263,7 +1257,7 @@ class TestLeakAutoVar : public TestFixture { " bar();\n" " delete[] p;\n" "}", true); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:4]: (error) Memory pointed to by 'p' is freed twice.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:4]: (error) Memory pointed to by 'p' is freed twice.\n", errout_str()); check( "LineMarker::~LineMarker() {\n" @@ -1274,7 +1268,7 @@ class TestLeakAutoVar : public TestFixture { " pxpm = NULL;\n" " return *this;\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check( "void foo()\n" @@ -1291,7 +1285,7 @@ class TestLeakAutoVar : public TestFixture { " }\n" " delete ptr;\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check( "int foo()\n" @@ -1307,7 +1301,7 @@ class TestLeakAutoVar : public TestFixture { " delete a;\n" " return 0;\n" "}", true); - TODO_ASSERT_EQUALS("", "[test.cpp:8] -> [test.cpp:11]: (error) Memory pointed to by 'a' is freed twice.\n", errout.str()); + TODO_ASSERT_EQUALS("", "[test.cpp:8] -> [test.cpp:11]: (error) Memory pointed to by 'a' is freed twice.\n", errout_str()); check( "void foo(int y)\n" @@ -1321,7 +1315,7 @@ class TestLeakAutoVar : public TestFixture { " }\n" " delete[] x;\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check( "void foo(int y)\n" @@ -1333,7 +1327,7 @@ class TestLeakAutoVar : public TestFixture { " }\n" " delete[] x;\n" "}", true); - TODO_ASSERT_EQUALS("[test.cpp:8]: (error) Memory pointed to by 'x' is freed twice.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:8]: (error) Memory pointed to by 'x' is freed twice.\n", "", errout_str()); check( "void foo(int y)\n" @@ -1345,7 +1339,7 @@ class TestLeakAutoVar : public TestFixture { " }\n" " delete[] x;\n" "}", true); - TODO_ASSERT_EQUALS("[test.cpp:8]: (error) Memory pointed to by 'x' is freed twice.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:8]: (error) Memory pointed to by 'x' is freed twice.\n", "", errout_str()); check( "void foo(int y)\n" @@ -1357,7 +1351,7 @@ class TestLeakAutoVar : public TestFixture { " }\n" " free(x);\n" "}"); - TODO_ASSERT_EQUALS("[test.c:8]: (error) Memory pointed to by 'x' is freed twice.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.c:8]: (error) Memory pointed to by 'x' is freed twice.\n", "", errout_str()); check( "void foo(int y)\n" @@ -1371,7 +1365,7 @@ class TestLeakAutoVar : public TestFixture { " }\n" " delete[] x;\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check( "void foo(int y)\n" @@ -1385,7 +1379,7 @@ class TestLeakAutoVar : public TestFixture { " } while (true);\n" " delete[] x;\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check( "void f()\n" @@ -1397,7 +1391,7 @@ class TestLeakAutoVar : public TestFixture { " }\n" " free(p);\n" "}"); - ASSERT_EQUALS("[test.c:6] -> [test.c:8]: (error) Memory pointed to by 'p' is freed twice.\n", errout.str()); + ASSERT_EQUALS("[test.c:6] -> [test.c:8]: (error) Memory pointed to by 'p' is freed twice.\n", errout_str()); check( "void MyFunction()\n" @@ -1418,7 +1412,7 @@ class TestLeakAutoVar : public TestFixture { "{\n" " throw(err);\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check( "void MyFunction()\n" @@ -1439,7 +1433,7 @@ class TestLeakAutoVar : public TestFixture { "{\n" " exit(err);\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check( // #6252 "struct Wrapper {\n" @@ -1454,14 +1448,14 @@ class TestLeakAutoVar : public TestFixture { " m_thing = new Thing;\n" " }\n" "};", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #7401 check("void pCodeLabelDestruct(pCode *pc) {\n" " free(PCL(pc)->label);\n" " free(pc);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void doublefree2() { // #3891 @@ -1471,7 +1465,7 @@ class TestLeakAutoVar : public TestFixture { " free(p);\n" " return 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void doublefree3() { // #4914 @@ -1489,7 +1483,7 @@ class TestLeakAutoVar : public TestFixture { " return;" "}" ); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void doublefree4() { @@ -1500,7 +1494,7 @@ class TestLeakAutoVar : public TestFixture { " }\n" " free(p);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(void* p, int i) {\n" // #11391 " if (i)\n" @@ -1511,7 +1505,7 @@ class TestLeakAutoVar : public TestFixture { " free(p);\n" " exit(1);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void doublefree5() { // #5522 @@ -1520,7 +1514,7 @@ class TestLeakAutoVar : public TestFixture { " x = (q == p);\n" " free(p);\n" "}"); - ASSERT_EQUALS("[test.c:2] -> [test.c:4]: (error) Memory pointed to by 'p' is freed twice.\n", errout.str()); + ASSERT_EQUALS("[test.c:2] -> [test.c:4]: (error) Memory pointed to by 'p' is freed twice.\n", errout_str()); } void doublefree6() { // #7685 @@ -1528,7 +1522,7 @@ class TestLeakAutoVar : public TestFixture { " free(getword(f));\n" " fclose(f);\n" "}", /*cpp=*/ false); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void doublefree7() { @@ -1537,14 +1531,14 @@ class TestLeakAutoVar : public TestFixture { " if (x && (p = malloc(10)))\n" " free(p);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(char *p, int x) {\n" " delete[] p;\n" " if (x && (p = new char[10]))\n" " delete[] p;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void doublefree8() { @@ -1553,35 +1547,35 @@ class TestLeakAutoVar : public TestFixture { " std::unique_ptr x(i);\n" " delete i;\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (error) Memory pointed to by 'i' is freed twice.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (error) Memory pointed to by 'i' is freed twice.\n", errout_str()); check("void f() {\n" " int * i = new int;\n" " delete i;\n" " std::unique_ptr x(i);\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (error) Memory pointed to by 'i' is freed twice.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (error) Memory pointed to by 'i' is freed twice.\n", errout_str()); check("void f() {\n" " int * i = new int;\n" " std::unique_ptr x{i};\n" " delete i;\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (error) Memory pointed to by 'i' is freed twice.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (error) Memory pointed to by 'i' is freed twice.\n", errout_str()); check("void f() {\n" " int * i = new int;\n" " std::shared_ptr x(i);\n" " delete i;\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (error) Memory pointed to by 'i' is freed twice.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (error) Memory pointed to by 'i' is freed twice.\n", errout_str()); check("void f() {\n" " int * i = new int;\n" " std::shared_ptr x{i};\n" " delete i;\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (error) Memory pointed to by 'i' is freed twice.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (error) Memory pointed to by 'i' is freed twice.\n", errout_str()); // Check for use-after-free FP check("void f() {\n" @@ -1589,14 +1583,14 @@ class TestLeakAutoVar : public TestFixture { " std::shared_ptr x{i};\n" " *i = 123;\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " int * i = new int[1];\n" " std::unique_ptr x(i);\n" " delete i;\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (error) Memory pointed to by 'i' is freed twice.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (error) Memory pointed to by 'i' is freed twice.\n", errout_str()); check("using namespace std;\n" // #9708 "void f() {\n" @@ -1604,7 +1598,7 @@ class TestLeakAutoVar : public TestFixture { " unique_ptr x(i);\n" " delete i;\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:5]: (error) Memory pointed to by 'i' is freed twice.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:5]: (error) Memory pointed to by 'i' is freed twice.\n", errout_str()); } void doublefree9() { @@ -1615,7 +1609,7 @@ class TestLeakAutoVar : public TestFixture { " std::unique_ptr x(b->get(0));\n" " std::unique_ptr y(b->get(1));\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void doublefree10() { @@ -1629,7 +1623,7 @@ class TestLeakAutoVar : public TestFixture { " if (p != NULL)\n" " free(p);\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(char* s) {\n" " char *p = malloc(strlen(s));\n" @@ -1641,7 +1635,7 @@ class TestLeakAutoVar : public TestFixture { " if (p != NULL)\n" " free(p);\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void doublefree11() { @@ -1657,7 +1651,7 @@ class TestLeakAutoVar : public TestFixture { " return;\n" " free(q)\n" "}"); - ASSERT_EQUALS("[test.c:3] -> [test.c:8]: (error) Memory pointed to by 'p' is freed twice.\n", errout.str()); + ASSERT_EQUALS("[test.c:3] -> [test.c:8]: (error) Memory pointed to by 'p' is freed twice.\n", errout_str()); } void doublefree12() { // #10502 @@ -1667,7 +1661,7 @@ class TestLeakAutoVar : public TestFixture { " fclose(fp);\n" " return 0;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void doublefree13() { // #11008 @@ -1681,7 +1675,7 @@ class TestLeakAutoVar : public TestFixture { " return;\n" " free(buf.ptr);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void doublefree14() { // #9708 @@ -1693,7 +1687,7 @@ class TestLeakAutoVar : public TestFixture { " unique_ptr x(i);\n" " delete i;\n" "}", true); - ASSERT_EQUALS("[test.cpp:6] -> [test.cpp:7]: (error) Memory pointed to by 'i' is freed twice.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6] -> [test.cpp:7]: (error) Memory pointed to by 'i' is freed twice.\n", errout_str()); check("using namespace std;\n" " \n" @@ -1702,14 +1696,14 @@ class TestLeakAutoVar : public TestFixture { " int *i = new int;\n" " unique_ptr x(i);\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void doublefree15() { // #11966 check("void f(FILE* fp) {\n" " static_cast(fclose(fp));\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void doublefree16() { // #12236 @@ -1718,7 +1712,7 @@ class TestLeakAutoVar : public TestFixture { " decltype(fclose(f)) y;\n" " y = fclose(f);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " FILE *fp = fopen(\"abc\", \"r\");\n" @@ -1728,7 +1722,7 @@ class TestLeakAutoVar : public TestFixture { " r;\n" " })) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void exit1() { @@ -1736,7 +1730,7 @@ class TestLeakAutoVar : public TestFixture { " char *p = malloc(10);\n" " exit(0);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void exit2() { @@ -1745,7 +1739,7 @@ class TestLeakAutoVar : public TestFixture { " fatal_error();\n" "}"); ASSERT_EQUALS("[test.c:3]: (information) --check-library: Function fatal_error() should have configuration\n", - errout.str()); + errout_str()); } void exit3() { @@ -1757,7 +1751,7 @@ class TestLeakAutoVar : public TestFixture { " }" " free(p);\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " char *p = malloc(100);\n" @@ -1767,7 +1761,7 @@ class TestLeakAutoVar : public TestFixture { " }" " free(p);\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void functioncall1() { @@ -1776,14 +1770,14 @@ class TestLeakAutoVar : public TestFixture { " free(p->x);\n" " p->x = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(s_t s) {\n" // #11061 " s->p = (char*)malloc(10);\n" " free((void*)s->p);\n" " s->p = NULL;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const Settings s = settingsBuilder().library("std.cfg").build(); check("struct S {};\n" @@ -1793,13 +1787,13 @@ class TestLeakAutoVar : public TestFixture { " v.push_back(std::unique_ptr(s));\n" " }\n" "}\n", /*cpp*/ true, &s); - ASSERT_EQUALS("", errout.str()); // don't crash + 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" "}", /*cpp*/ true, &s); - ASSERT_EQUALS("[test.cpp:4]: (error) Memory leak: b\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Memory leak: b\n", errout_str()); } void goto1() { @@ -1810,7 +1804,7 @@ class TestLeakAutoVar : public TestFixture { " free(reg);\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void goto2() { // #4231 @@ -1823,7 +1817,7 @@ class TestLeakAutoVar : public TestFixture { " }\n" " return p;\n" // no error since there is a goto "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void goto3() { // #11431 @@ -1838,7 +1832,7 @@ class TestLeakAutoVar : public TestFixture { "err:\n" " (void)0;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void ifelse1() { @@ -1848,7 +1842,7 @@ class TestLeakAutoVar : public TestFixture { " else { return 0; }\n" " free(p);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void ifelse2() { @@ -1857,7 +1851,7 @@ class TestLeakAutoVar : public TestFixture { " if (x) { p = malloc(10); }\n" " else { return 0; }\n" "}"); - ASSERT_EQUALS("[test.c:5]: (error) Memory leak: p\n", errout.str()); + ASSERT_EQUALS("[test.c:5]: (error) Memory leak: p\n", errout_str()); } void ifelse3() { @@ -1866,7 +1860,7 @@ class TestLeakAutoVar : public TestFixture { " if (!p) { return; }\n" " free(p);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("char * f(size_t size) {" " void *p = malloc(1);" @@ -1874,14 +1868,14 @@ class TestLeakAutoVar : public TestFixture { " return NULL;" " return p;" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " char *p = malloc(10);\n" " if (p) { } else { return; }\n" " free(p);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #3866 - UNLIKELY check("void f() {\n" @@ -1889,7 +1883,7 @@ class TestLeakAutoVar : public TestFixture { " if (UNLIKELY(!p)) { return; }\n" " free(p);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void ifelse4() { @@ -1898,7 +1892,7 @@ class TestLeakAutoVar : public TestFixture { " if (x) { p = malloc(10); }\n" " if (x) { free(p); }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x) {\n" " char *p;\n" @@ -1906,7 +1900,7 @@ class TestLeakAutoVar : public TestFixture { " if (!x) { return; }\n" " free(p);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void ifelse5() { @@ -1915,7 +1909,7 @@ class TestLeakAutoVar : public TestFixture { " if (!p && x) { p = malloc(10); }\n" " free(p);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void ifelse6() { // #3370 @@ -1926,7 +1920,7 @@ class TestLeakAutoVar : public TestFixture { " else\n" " a = 0;\n" "}"); - ASSERT_EQUALS("[test.c:6]: (error) Memory leak: a\n", errout.str()); + ASSERT_EQUALS("[test.c:6]: (error) Memory leak: a\n", errout_str()); } void ifelse7() { // #5576 @@ -1936,7 +1930,7 @@ class TestLeakAutoVar : public TestFixture { " return;\n" " free(x);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void ifelse8() { // #5747 @@ -1946,7 +1940,7 @@ class TestLeakAutoVar : public TestFixture { " return -1;\n" " return fd;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f() {\n" " int fd = socket(AF_INET, SOCK_PACKET, 0 );\n" @@ -1954,7 +1948,7 @@ class TestLeakAutoVar : public TestFixture { " return fd;\n" " return -1;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void ifelse9() { // #5273 @@ -1964,7 +1958,7 @@ class TestLeakAutoVar : public TestFixture { " return;\n" " free(p);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void ifelse10() { // #8794 @@ -1974,7 +1968,7 @@ class TestLeakAutoVar : public TestFixture { " return;\n" " free(x);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void ifelse11() { // #8365 @@ -1984,7 +1978,7 @@ class TestLeakAutoVar : public TestFixture { " return;\n" " free(p);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void ifelse12() { // #8340 @@ -1992,7 +1986,7 @@ class TestLeakAutoVar : public TestFixture { " if ((*p = malloc(4)) == NULL)\n" " return;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void ifelse13() { // #8392 @@ -2003,7 +1997,7 @@ class TestLeakAutoVar : public TestFixture { " free(path);\n" " return 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f(int fd, const char *mode) {\n" " char *path;\n" @@ -2012,7 +2006,7 @@ class TestLeakAutoVar : public TestFixture { " free(path);\n" " return 0;\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:4] memory leak", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:4] memory leak", "", errout_str()); } void ifelse14() { // #9130 @@ -2022,7 +2016,7 @@ class TestLeakAutoVar : public TestFixture { " return NULL;\n" " return buf;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void ifelse15() { // #9206 @@ -2032,14 +2026,14 @@ class TestLeakAutoVar : public TestFixture { " if ( global_ptr = new SSS()) {}\n" " return;\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("FILE* hFile;\n" "int openFile( void ) {\n" " if ((hFile = fopen(\"1.txt\", \"wb\" )) == NULL) return 0;\n" " return 1;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void ifelse16() { // #9635 @@ -2050,7 +2044,7 @@ class TestLeakAutoVar : public TestFixture { " free(p);\n" " return;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(void) {\n" " char *p, q;\n" @@ -2059,7 +2053,7 @@ class TestLeakAutoVar : public TestFixture { " free(p);\n" " return;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void ifelse17() { @@ -2069,7 +2063,7 @@ class TestLeakAutoVar : public TestFixture { " return NULL;\n" " return p;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int *f() {\n" " int *p = realloc(nullptr, 10);\n" @@ -2077,7 +2071,7 @@ class TestLeakAutoVar : public TestFixture { " return NULL;\n" " return p;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void ifelse18() { @@ -2088,7 +2082,7 @@ class TestLeakAutoVar : public TestFixture { " return;\n" " free(q);\n" "}"); - ASSERT_EQUALS("[test.c:5]: (error) Memory leak: p\n", errout.str()); + ASSERT_EQUALS("[test.c:5]: (error) Memory leak: p\n", errout_str()); check("void f() {\n" " void * p = malloc(10);\n" @@ -2099,7 +2093,7 @@ class TestLeakAutoVar : public TestFixture { " } else\n" " return;\n" "}"); - ASSERT_EQUALS("[test.c:8]: (error) Memory leak: p\n", errout.str()); + ASSERT_EQUALS("[test.c:8]: (error) Memory leak: p\n", errout_str()); } void ifelse19() { @@ -2110,7 +2104,7 @@ class TestLeakAutoVar : public TestFixture { " return;\n" " a = b;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void ifelse20() { @@ -2122,7 +2116,7 @@ class TestLeakAutoVar : public TestFixture { " return;\n" "}"); ASSERT_EQUALS("[test.c:3]: (error) Memory leak: p1\n" - "[test.c:5]: (error) Memory leak: p2\n", errout.str()); + "[test.c:5]: (error) Memory leak: p2\n", errout_str()); check("void f() {\n" " if (x > 0)\n" @@ -2131,7 +2125,7 @@ class TestLeakAutoVar : public TestFixture { " void * p2 = malloc(2);\n" "}"); ASSERT_EQUALS("[test.c:3]: (error) Memory leak: p1\n" - "[test.c:5]: (error) Memory leak: p2\n", errout.str()); + "[test.c:5]: (error) Memory leak: p2\n", errout_str()); } void ifelse21() { @@ -2143,7 +2137,7 @@ class TestLeakAutoVar : public TestFixture { " }\n" " return;\n" "}"); - ASSERT_EQUALS("[test.c:6]: (error) Memory leak: p\n", errout.str()); + ASSERT_EQUALS("[test.c:6]: (error) Memory leak: p\n", errout_str()); } void ifelse22() { // #10187 @@ -2153,7 +2147,7 @@ class TestLeakAutoVar : public TestFixture { " return fd;\n" " return -1;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f(const char * pathname, int flags) {\n" " int fd = socket(pathname, flags);\n" @@ -2161,14 +2155,14 @@ class TestLeakAutoVar : public TestFixture { " return -1;\n" " return fd;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void ifelse23() { // #5473 check("void f() {\n" " if (FILE* fp = fopen(\"x\", \"r\")) {}\n" "}\n"); - ASSERT_EQUALS("[test.c:2]: (error) Resource leak: fp\n", errout.str()); + ASSERT_EQUALS("[test.c:2]: (error) Resource leak: fp\n", errout_str()); } void ifelse24() { // #1733 @@ -2183,14 +2177,14 @@ class TestLeakAutoVar : public TestFixture { ASSERT_EQUALS("[test.cpp:5]: (error) Memory leak: temp\n" "[test.cpp:6]: (error) Memory leak: temp\n" "[test.cpp:6]: (error) Resource leak: fp\n", - errout.str()); + errout_str()); check("FILE* f() {\n" " char* temp = strdup(\"temp.txt\");\n" " FILE* fp = fopen(temp, \"rt\");\n" " return fp;\n" "}\n", s); - ASSERT_EQUALS("[test.cpp:4]: (error) Memory leak: temp\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Memory leak: temp\n", errout_str()); check("FILE* f() {\n" " char* temp = strdup(\"temp.txt\");\n" @@ -2198,7 +2192,7 @@ class TestLeakAutoVar : public TestFixture { " fopen_s(&fp, temp, \"rt\");\n" " return fp;\n" "}\n", s); - ASSERT_EQUALS("[test.cpp:5]: (error) Memory leak: temp\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Memory leak: temp\n", errout_str()); check("void f() {\n" " char* temp = strdup(\"temp.txt\");\n" @@ -2208,13 +2202,13 @@ class TestLeakAutoVar : public TestFixture { "}\n", s); ASSERT_EQUALS("[test.cpp:6]: (error) Memory leak: temp\n" "[test.cpp:6]: (error) Resource leak: fp\n", - errout.str()); + errout_str()); check("FILE* f() {\n" " char* temp = strdup(\"temp.txt\");\n" " return fopen(temp, \"rt\");\n" "}\n", s); - TODO_ASSERT_EQUALS("[test.cpp:3]: (error) Memory leak: temp\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:3]: (error) Memory leak: temp\n", "", errout_str()); } void ifelse25() { // #9966 @@ -2225,7 +2219,7 @@ class TestLeakAutoVar : public TestFixture { " (void)p;\n" " free(p2);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void ifelse26() { // don't crash @@ -2236,7 +2230,7 @@ class TestLeakAutoVar : public TestFixture { "void f(long long val) {\n" " if (val == ({ union tidi d = {.di = {0x0, 0x80000000}}; d.ti; })) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void ifelse27() { @@ -2252,7 +2246,7 @@ class TestLeakAutoVar : public TestFixture { " *handle = key;\n" " return 1;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void ifelse28() { // #11038 @@ -2263,7 +2257,7 @@ class TestLeakAutoVar : public TestFixture { " { buf = temp; }\n" " return buf;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void switch1() { @@ -2275,7 +2269,7 @@ class TestLeakAutoVar : public TestFixture { " }\n" " free(p);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void loop1() { @@ -2286,7 +2280,7 @@ class TestLeakAutoVar : public TestFixture { " if (x) { free(p) }\n" " else { a = p; }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void loop2() { @@ -2297,7 +2291,7 @@ class TestLeakAutoVar : public TestFixture { " free(p);\n" " }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(node **p) {\n" " node* n = *p;\n" @@ -2313,7 +2307,7 @@ class TestLeakAutoVar : public TestFixture { " for (int i = 0; i < 4; ++i) {}\n" " }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void mismatchAllocDealloc() { @@ -2321,13 +2315,13 @@ class TestLeakAutoVar : public TestFixture { " FILE*f=fopen(fname,a);\n" " free(f);\n" "}"); - ASSERT_EQUALS("[test.c:2] -> [test.c:3]: (error) Mismatching allocation and deallocation: f\n", errout.str()); + ASSERT_EQUALS("[test.c:2] -> [test.c:3]: (error) Mismatching allocation and deallocation: f\n", errout_str()); check("void f() {\n" " FILE*f=fopen(fname,a);\n" " free((void*)f);\n" "}"); - ASSERT_EQUALS("[test.c:2] -> [test.c:3]: (error) Mismatching allocation and deallocation: f\n", errout.str()); + ASSERT_EQUALS("[test.c:2] -> [test.c:3]: (error) Mismatching allocation and deallocation: f\n", errout_str()); check("void f() {\n" " char *cPtr = new char[100];\n" @@ -2337,30 +2331,30 @@ class TestLeakAutoVar : public TestFixture { " cPtr = new char[100];\n" " delete cPtr;\n" "}", true); - ASSERT_EQUALS("[test.cpp:6] -> [test.cpp:7]: (error) Mismatching allocation and deallocation: cPtr\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6] -> [test.cpp:7]: (error) Mismatching allocation and deallocation: cPtr\n", errout_str()); check("void f() {\n" " char *cPtr = new char[100];\n" " free(cPtr);\n" "}", true); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (error) Mismatching allocation and deallocation: cPtr\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (error) Mismatching allocation and deallocation: cPtr\n", errout_str()); check("void f() {\n" " char *cPtr = new (buf) char[100];\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " int * i = new int[1];\n" " std::unique_ptr x(i);\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (error) Mismatching allocation and deallocation: i\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (error) Mismatching allocation and deallocation: i\n", errout_str()); check("void f() {\n" " int * i = new int;\n" " std::unique_ptr x(i);\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (error) Mismatching allocation and deallocation: i\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (error) Mismatching allocation and deallocation: i\n", errout_str()); check("void f() {\n" " void* a = malloc(1);\n" @@ -2368,14 +2362,14 @@ class TestLeakAutoVar : public TestFixture { " free(b);\n" "}"); ASSERT_EQUALS("[test.c:2] -> [test.c:3]: (error) Mismatching allocation and deallocation: a\n" - "[test.c:3] -> [test.c:4]: (error) Mismatching allocation and deallocation: b\n", errout.str()); + "[test.c:3] -> [test.c:4]: (error) Mismatching allocation and deallocation: b\n", errout_str()); check("void f() {\n" " void* a;\n" " void* b = realloc(a, 10);\n" " free(b);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " int * i = new int;\n" @@ -2383,7 +2377,7 @@ class TestLeakAutoVar : public TestFixture { " delete[] j;\n" "}", true); ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (error) Mismatching allocation and deallocation: i\n" - "[test.cpp:3] -> [test.cpp:4]: (error) Mismatching allocation and deallocation: j\n", errout.str()); + "[test.cpp:3] -> [test.cpp:4]: (error) Mismatching allocation and deallocation: j\n", errout_str()); check("static void deleter(int* p) { free(p); }\n" // #11392 "void f() {\n" @@ -2391,20 +2385,20 @@ class TestLeakAutoVar : public TestFixture { " std::unique_ptr guard(p, &deleter);\n" " }\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " if (int* p = static_cast(malloc(4))) {\n" " std::unique_ptr guard(p, &deleter);\n" " }\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int i) {\n" " int* a = new int[i] {};\n" " delete[] a;\n" "}\n", /*cpp*/ true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void smartPointerDeleter() { @@ -2412,26 +2406,26 @@ class TestLeakAutoVar : public TestFixture { " FILE*f=fopen(fname,a);\n" " std::unique_ptr fp{f};\n" "}", true); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (error) Mismatching allocation and deallocation: f\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (error) Mismatching allocation and deallocation: f\n", errout_str()); check("void f() {\n" " FILE*f=fopen(fname,a);\n" " std::unique_ptr fp{f, &fclose};\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " FILE*f=fopen(fname,a);\n" " std::shared_ptr fp{f, &fclose};\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct deleter { void operator()(FILE* f) { fclose(f); }};\n" "void f() {\n" " FILE*f=fopen(fname,a);\n" " std::unique_ptr fp{f};\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int * create();\n" "void destroy(int * x);\n" @@ -2439,7 +2433,7 @@ class TestLeakAutoVar : public TestFixture { " int x * = create()\n" " std::unique_ptr xp{x, &destroy()};\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int * create();\n" "void destroy(int * x);\n" @@ -2447,45 +2441,45 @@ class TestLeakAutoVar : public TestFixture { " int x * = create()\n" " std::unique_ptr xp(x, &destroy());\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " FILE*f=fopen(fname,a);\n" " std::shared_ptr fp{f, [](FILE* x) { fclose(x); }};\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " FILE*f=fopen(fname,a);\n" " std::shared_ptr fp{f, +[](FILE* x) { fclose(x); }};\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " FILE*f=fopen(fname,a);\n" " std::shared_ptr fp{f, [](FILE* x) { free(f); }};\n" "}", true); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (error) Mismatching allocation and deallocation: f\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (error) Mismatching allocation and deallocation: f\n", errout_str()); check("void f() {\n" " FILE*f=fopen(fname,a);\n" " std::shared_ptr fp{f, [](FILE* x) {}};\n" "}", true); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (error) Mismatching allocation and deallocation: f\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (error) Mismatching allocation and deallocation: f\n", errout_str()); check("class C;\n" "void f() {\n" " C* c = new C{};\n" " std::shared_ptr a{c, [](C*) {}};\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class C;\n" "void f() {\n" " C* c = new C{};\n" " std::shared_ptr a{c, [](C* x) { delete x; }};\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void smartPointerRelease() { check("void f() {\n" @@ -2494,14 +2488,14 @@ class TestLeakAutoVar : public TestFixture { " x.release();\n" " delete i;\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " int * i = new int;\n" " std::unique_ptr x(i);\n" " x.release();\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:5]: (error) Memory leak: i\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Memory leak: i\n", errout_str()); } void return1() { @@ -2509,7 +2503,7 @@ class TestLeakAutoVar : public TestFixture { " char *p = malloc(100);\n" " return 123;\n" "}"); - ASSERT_EQUALS("[test.c:3]: (error) Memory leak: p\n", errout.str()); + ASSERT_EQUALS("[test.c:3]: (error) Memory leak: p\n", errout_str()); } void return2() { @@ -2517,7 +2511,7 @@ class TestLeakAutoVar : public TestFixture { " char *p = malloc(100);\n" " return p;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void return3() { @@ -2525,7 +2519,7 @@ class TestLeakAutoVar : public TestFixture { " struct ABC *abc = malloc(100);\n" " return &abc->dev;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void return4() { // ticket #3862 @@ -2537,7 +2531,7 @@ class TestLeakAutoVar : public TestFixture { " }\n" " free(p);\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(char *p, int x) {\n" " if (x==12) {\n" @@ -2546,7 +2540,7 @@ class TestLeakAutoVar : public TestFixture { " }\n" " delete p;\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(char *p, int x) {\n" " if (x==12) {\n" @@ -2555,7 +2549,7 @@ class TestLeakAutoVar : public TestFixture { " }\n" " delete [] p;\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void return5() { // ticket #6397 - conditional allocation/deallocation and conditional return @@ -2569,7 +2563,7 @@ class TestLeakAutoVar : public TestFixture { " }\n" " *p = 0;\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void return6() { // #8282 @@ -2577,7 +2571,7 @@ class TestLeakAutoVar : public TestFixture { " char* p = (char* )malloc(n);\n" " return {p, p};\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void return7() { // #9343 @@ -2585,43 +2579,43 @@ class TestLeakAutoVar : public TestFixture { " void *x = malloc(1);\n" " return (uint8_t *)x;\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("uint8_t f() {\n" " void *x = malloc(1);\n" " return (uint8_t)x;\n" "}", true); - ASSERT_EQUALS("[test.cpp:3]: (error) Memory leak: x\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Memory leak: x\n", errout_str()); check("void** f() {\n" " void *x = malloc(1);\n" " return (void**)x;\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void* f() {\n" " void *x = malloc(1);\n" " return (long long)x;\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void* f() {\n" " void *x = malloc(1);\n" " return (void*)(short)x;\n" "}", true); - ASSERT_EQUALS("[test.cpp:3]: (error) Memory leak: x\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Memory leak: x\n", errout_str()); check("void* f() {\n" " void *x = malloc(1);\n" " return (mytype)x;\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void* f() {\n" // Do not crash " void *x = malloc(1);\n" " return (mytype)y;\n" "}", true); - ASSERT_EQUALS("[test.cpp:3]: (error) Memory leak: x\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Memory leak: x\n", errout_str()); } void return8() { @@ -2629,25 +2623,25 @@ class TestLeakAutoVar : public TestFixture { " void *x = malloc(1);\n" " return (x);\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void* f() {\n" " void *x = malloc(1);\n" " return ((x));\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void* f() {\n" " void *x = malloc(1);\n" " return ((((x))));\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("char* f() {\n" " void *x = malloc(1);\n" " return (char*)(x);\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void return9() { @@ -2655,7 +2649,7 @@ class TestLeakAutoVar : public TestFixture { " void *x = malloc (sizeof (struct alloc));\n" " return x + sizeof (struct alloc);\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void return10() { @@ -2664,7 +2658,7 @@ class TestLeakAutoVar : public TestFixture { " p[0] = 'x';\n" " return p[0];\n" "}"); - ASSERT_EQUALS("[test.c:4]: (error) Memory leak: p\n", errout.str()); + ASSERT_EQUALS("[test.c:4]: (error) Memory leak: p\n", errout_str()); check("struct S { int f(); };\n" // #11746 "int g() {\n" @@ -2672,34 +2666,34 @@ class TestLeakAutoVar : public TestFixture { " delete s;\n" " return s->f();\n" "}", true); - ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:5]: (error) Returning/dereferencing 's' after it is deallocated / released\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:5]: (error) Returning/dereferencing 's' after it is deallocated / released\n", errout_str()); check("int f() {\n" " int* p = new int(3);\n" " delete p;\n" " return *p;\n" "}", true); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (error) Returning/dereferencing 'p' after it is deallocated / released\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (error) Returning/dereferencing 'p' after it is deallocated / released\n", errout_str()); } void test1() { check("void f(double*&p) {\n" // 3809 " p = malloc(0x100);\n" "}", /*cpp*/ true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int*& p) {\n" // #4400 " p = (int*)malloc(4);\n" " p = (int*)malloc(4);\n" "}\n", /*cpp*/ true); - ASSERT_EQUALS("[test.cpp:3]: (error) Memory leak: p\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Memory leak: p\n", errout_str()); check("void f() {\n" " int* p = (int*)malloc(4);\n" " int*& r = p;\n" " r = (int*)malloc(4);\n" "}\n", /*cpp*/ true); - TODO_ASSERT_EQUALS("[test.cpp:4]: (error) Memory leak: p\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:4]: (error) Memory leak: p\n", "", errout_str()); check("void f() {\n" " int* p = (int*)malloc(4);\n" @@ -2707,7 +2701,7 @@ class TestLeakAutoVar : public TestFixture { " free(r);\n" " p = (int*)malloc(4);\n" "}\n", /*cpp*/ true); - TODO_ASSERT_EQUALS("", "[test.cpp:6]: (error) Memory leak: p\n", errout.str()); + TODO_ASSERT_EQUALS("", "[test.cpp:6]: (error) Memory leak: p\n", errout_str()); } void test2() { // 3899 @@ -2715,7 +2709,7 @@ class TestLeakAutoVar : public TestFixture { " char *p;\n" " void f1() { free(p); }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void test3() { // 3954 - reference pointer @@ -2723,7 +2717,7 @@ class TestLeakAutoVar : public TestFixture { " char *&p = x();\n" " p = malloc(10);\n" "};", /*cpp*/ true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void test4() { // 5923 - static pointer @@ -2732,21 +2726,21 @@ class TestLeakAutoVar : public TestFixture { " if (!p) p = malloc(10);\n" " if (x) { free(p); p = 0; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void test5() { // unknown type check("void f() { Fred *p = malloc(10); }", true); - ASSERT_EQUALS("[test.cpp:1]: (error) Memory leak: p\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (error) Memory leak: p\n", errout_str()); check("void f() { Fred *p = malloc(10); }", false); - ASSERT_EQUALS("[test.c:1]: (error) Memory leak: p\n", errout.str()); + ASSERT_EQUALS("[test.c:1]: (error) Memory leak: p\n", errout_str()); check("void f() { Fred *p = new Fred; }", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() { Fred fred = malloc(10); }", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void throw1() { // 3987 - Execution reach a 'throw' @@ -2754,7 +2748,7 @@ class TestLeakAutoVar : public TestFixture { " char *p = malloc(10);\n" " throw 123;\n" "}", true); - ASSERT_EQUALS("[test.cpp:3]: (error) Memory leak: p\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Memory leak: p\n", errout_str()); check("void f() {\n" " char *p;\n" @@ -2764,7 +2758,7 @@ class TestLeakAutoVar : public TestFixture { " } catch (...) { }\n" " free(p);\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void throw2() { // do not miss ::NS::Except() @@ -2781,7 +2775,7 @@ class TestLeakAutoVar : public TestFixture { " }\n" " delete pi;\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void configuration1() { @@ -2796,13 +2790,13 @@ class TestLeakAutoVar : public TestFixture { "}"); ASSERT_EQUALS("[test.c:3]: (information) --check-library: Function x() should have configuration\n" "[test.c:4]: (information) --check-library: Function x() should have / configuration\n", - errout.str()); + errout_str()); check("void cb();\n" // #11190, #11523 "void f() {\n" " cb();\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void configuration2() { @@ -2814,7 +2808,7 @@ class TestLeakAutoVar : public TestFixture { "}"); ASSERT_EQUALS("[test.c:3]: (information) --check-library: Function x() should have configuration\n" "[test.c:4]: (information) --check-library: Function x() should have / configuration\n", - errout.str()); + errout_str()); } void configuration3() { @@ -2823,9 +2817,9 @@ class TestLeakAutoVar : public TestFixture { " if (set_data(p)) { }\n" "}"; check(code); - ASSERT_EQUALS("[test.c:4]: (information) --check-library: Function set_data() should have / configuration\n", errout.str()); + ASSERT_EQUALS("[test.c:4]: (information) --check-library: Function set_data() should have / configuration\n", errout_str()); check(code, true); - ASSERT_EQUALS("[test.cpp:4]: (information) --check-library: Function set_data() should have / configuration\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (information) --check-library: Function set_data() should have / configuration\n", errout_str()); code = "void f() {\n" " char *p = malloc(10);\n" @@ -2834,11 +2828,11 @@ class TestLeakAutoVar : public TestFixture { check(code); ASSERT_EQUALS("[test.c:3]: (information) --check-library: Function set_data() should have / configuration\n" "[test.c:4]: (information) --check-library: Function set_data() should have / configuration\n" - , errout.str()); + , errout_str()); check(code, true); ASSERT_EQUALS("[test.cpp:3]: (information) --check-library: Function set_data() should have / configuration\n" "[test.cpp:4]: (information) --check-library: Function set_data() should have / configuration\n" - , errout.str()); + , errout_str()); } void configuration4() { @@ -2847,19 +2841,19 @@ class TestLeakAutoVar : public TestFixture { " int ret = set_data(p);\n" " return ret;\n" "}"); - ASSERT_EQUALS("[test.c:4]: (information) --check-library: Function set_data() should have / configuration\n", errout.str()); + ASSERT_EQUALS("[test.c:4]: (information) --check-library: Function set_data() should have / configuration\n", errout_str()); } void configuration5() { check("void f() {\n" " int(i);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " static_assert(1 == sizeof(char), \"test\");\n" "}\n", /*cpp*/ true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("namespace pal {\n" // #11237 " struct AutoTimer {};\n" @@ -2867,30 +2861,30 @@ class TestLeakAutoVar : public TestFixture { "int main() {\n" " pal::AutoTimer();\n" "}\n", /*cpp*/ true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct AutoTimer {};\n" "int main() {\n" " AutoTimer();\n" "}\n", /*cpp*/ true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" // #8666 " asm(\"assembler code\");\n" " asm volatile(\"assembler code\");\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" // #11239 " asm goto(\"assembler code\");\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " FILE* p = fopen(\"abc.txt\", \"r\");\n" " if (fclose(p) != 0) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S;\n" "void f(int a, int b, S*& p) {\n" @@ -2902,7 +2896,7 @@ class TestLeakAutoVar : public TestFixture { " p = reinterpret_cast(buf);\n" " }\n" "}\n", /*cpp*/ true); - ASSERT_EQUALS("[test.cpp:5]: (error) Resource leak: file\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Resource leak: file\n", errout_str()); } void configuration6() { @@ -2910,7 +2904,7 @@ class TestLeakAutoVar : public TestFixture { "void g() {\n" " f();\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(std::function cb) {\n" // #11189 " cb();\n" @@ -2918,14 +2912,14 @@ class TestLeakAutoVar : public TestFixture { "void g(void (*cb)()) {\n" " cb();\n" "}\n", /*cpp*/ true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void ptrptr() { check("void f() {\n" " char **p = malloc(10);\n" "}"); - ASSERT_EQUALS("[test.c:3]: (error) Memory leak: p\n", errout.str()); + ASSERT_EQUALS("[test.c:3]: (error) Memory leak: p\n", errout_str()); } void nestedAllocation() { @@ -2933,19 +2927,19 @@ class TestLeakAutoVar : public TestFixture { " unsigned char *dataCopy = malloc(length * sizeof(unsigned char));\n" " m_dsmccQueue.enqueue(new DSMCCPacket(dataCopy));\n" "}", true); - ASSERT_EQUALS("[test.cpp:4]: (information) --check-library: Function DSMCCPacket() should have / configuration\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (information) --check-library: Function DSMCCPacket() should have / configuration\n", errout_str()); check("void QueueDSMCCPacket(unsigned char *data, int length) {\n" " unsigned char *dataCopy = malloc(length * sizeof(unsigned char));\n" " m_dsmccQueue.enqueue(new DSMCCPacket(somethingunrelated));\n" "}", true); - ASSERT_EQUALS("[test.cpp:4]: (error) Memory leak: dataCopy\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Memory leak: dataCopy\n", errout_str()); check("void f() {\n" " char *buf = new char[1000];\n" " clist.push_back(new (std::nothrow) C(buf));\n" "}", true); - ASSERT_EQUALS("[test.cpp:4]: (information) --check-library: Function C() should have / configuration\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (information) --check-library: Function C() should have / configuration\n", errout_str()); } void testKeywords() { @@ -2954,7 +2948,7 @@ class TestLeakAutoVar : public TestFixture { " free(new);\n" " return 0;\n" "}", false); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void inlineFunction() { @@ -2967,7 +2961,7 @@ class TestLeakAutoVar : public TestFixture { " c = malloc(128);\n" " return ret();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } // #8262 @@ -2979,7 +2973,7 @@ class TestLeakAutoVar : public TestFixture { "}\n", true ); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void functionCallCastConfig() { // #9652 @@ -3002,7 +2996,7 @@ class TestLeakAutoVar : public TestFixture { " char * buf = malloc(4);\n" " free_func((void *)(1), buf);\n" "}", settingsFunctionCall); - ASSERT_EQUALS("[test.cpp:5]: (information) --check-library: Function free_func() should have / configuration\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (information) --check-library: Function free_func() should have / configuration\n", errout_str()); check("void g(void*);\n" "void h(int, void*);\n" @@ -3016,7 +3010,7 @@ class TestLeakAutoVar : public TestFixture { "}\n", /*cpp*/ true); ASSERT_EQUALS("[test.cpp:6]: (information) --check-library: Function g() should have / configuration\n" "[test.cpp:10]: (information) --check-library: Function h() should have / configuration\n", - errout.str()); + errout_str()); } void functionCallLeakIgnoreConfig() { // #7923 @@ -3033,7 +3027,7 @@ class TestLeakAutoVar : public TestFixture { " double* a = new double[1024];\n" " SomeClass::someMethod(a);\n" "}\n", settingsLeakIgnore); - ASSERT_EQUALS("[test.cpp:4]: (error) Memory leak: a\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Memory leak: a\n", errout_str()); check("void bar(int* p) {\n" " if (p)\n" @@ -3043,13 +3037,13 @@ class TestLeakAutoVar : public TestFixture { " int* p = malloc(4);\n" " bar(p);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int n) {\n" " char* p = new char[n];\n" " v.push_back(p);\n" "}\n", /*cpp*/ true); - ASSERT_EQUALS("[test.cpp:4]: (information) --check-library: Function unknown::push_back() should have / configuration\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (information) --check-library: Function unknown::push_back() should have / configuration\n", errout_str()); } }; @@ -3064,9 +3058,6 @@ class TestLeakAutoVarRecursiveCountLimit : public TestFixture { #define checkP(...) checkP_(__FILE__, __LINE__, __VA_ARGS__) void checkP_(const char* file, int line, const char code[], bool cpp = false) { - // Clear the error buffer.. - errout.str(""); - std::vector files(1, cpp?"test.cpp":"test.c"); Tokenizer tokenizer(settings, this); PreprocessorHelper::preprocess(code, files, tokenizer); @@ -3115,9 +3106,6 @@ class TestLeakAutoVarStrcpy : public TestFixture { const Settings settings = settingsBuilder().library("std.cfg").checkLibrary().build(); void check_(const char* file, int line, const char code[]) { - // Clear the error buffer.. - errout.str(""); - // Tokenize.. Tokenizer tokenizer(settings, this); std::istringstream istr(code); @@ -3143,7 +3131,7 @@ class TestLeakAutoVarStrcpy : public TestFixture { " char* ptr = new char[strlen(str)+1];\n" " m = strcpy(ptr, str);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void deallocuse2() { @@ -3151,25 +3139,25 @@ class TestLeakAutoVarStrcpy : public TestFixture { " free(p);\n" " strcpy(a, p);\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Dereferencing 'p' after it is deallocated / released\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Dereferencing 'p' after it is deallocated / released\n", errout_str()); check("void f(char *p, const char *q) {\n" // #11665 " free(p);\n" " strcpy(p, q);\n" "}\n"); ASSERT_EQUALS("[test.cpp:3]: (error) Dereferencing 'p' after it is deallocated / released\n", - errout.str()); + errout_str()); check("void f(char *p) {\n" // #3041 - assigning pointer when it's used " free(p);\n" " strcpy(a, p=b());\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void fclose_false_positive() { // #9575 check("int f(FILE *fp) { return fclose(fp); }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void strcpy_false_negative() { // #12289 @@ -3177,7 +3165,7 @@ class TestLeakAutoVarStrcpy : public TestFixture { " char* buf = new char[12];\n" " strcpy(buf, \"123\");\n" "}\n"); - ASSERT_EQUALS("[test.cpp:4]: (error) Memory leak: buf\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Memory leak: buf\n", errout_str()); } void doubleFree() { @@ -3186,7 +3174,7 @@ class TestLeakAutoVarStrcpy : public TestFixture { " printf(\"%s\", p = strdup(\"abc\"));\n" " free(p);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void memleak_std_string() { @@ -3199,7 +3187,7 @@ class TestLeakAutoVarStrcpy : public TestFixture { " p = new S();\n" " p->f();\n" "}"); - ASSERT_EQUALS("[test.cpp:9]: (error) Memory leak: p\n", errout.str()); + ASSERT_EQUALS("[test.cpp:9]: (error) Memory leak: p\n", errout_str()); check("class B { std::string s; };\n" // #12062 "class D : public B {};\n" @@ -3207,7 +3195,7 @@ class TestLeakAutoVarStrcpy : public TestFixture { " auto d = new D();\n" " if (d) {}\n" "}\n"); - ASSERT_EQUALS("[test.cpp:6]: (error) Memory leak: d\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (error) Memory leak: d\n", errout_str()); } }; @@ -3222,9 +3210,6 @@ class TestLeakAutoVarWindows : public TestFixture { const Settings settings = settingsBuilder().library("windows.cfg").build(); void check_(const char* file, int line, const char code[]) { - // Clear the error buffer.. - errout.str(""); - // Tokenize.. Tokenizer tokenizer(settings, this); std::istringstream istr(code); @@ -3247,7 +3232,7 @@ class TestLeakAutoVarWindows : public TestFixture { " HeapFree(MyHeap, 0, b);" " HeapDestroy(MyHeap);" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {" " int *a = HeapAlloc(GetProcessHeap(), 0, sizeof(int));" @@ -3255,7 +3240,7 @@ class TestLeakAutoVarWindows : public TestFixture { " HeapFree(GetProcessHeap(), 0, a);" " HeapFree(GetProcessHeap(), 0, b);" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {" " HANDLE MyHeap = HeapCreate(0, 0, 0);" @@ -3264,7 +3249,7 @@ class TestLeakAutoVarWindows : public TestFixture { " HeapFree(MyHeap, 0, a);" " HeapDestroy(MyHeap);" "}"); - ASSERT_EQUALS("[test.c:1]: (error) Memory leak: b\n", errout.str()); + ASSERT_EQUALS("[test.c:1]: (error) Memory leak: b\n", errout_str()); check("void f() {" " HANDLE MyHeap = HeapCreate(0, 0, 0);" @@ -3273,7 +3258,7 @@ class TestLeakAutoVarWindows : public TestFixture { " HeapFree(MyHeap, 0, a);" " HeapFree(MyHeap, 0, b);" "}"); - ASSERT_EQUALS("[test.c:1]: (error) Resource leak: MyHeap\n", errout.str()); + ASSERT_EQUALS("[test.c:1]: (error) Resource leak: MyHeap\n", errout_str()); check("void f() {" " HANDLE MyHeap = HeapCreate(0, 0, 0);" @@ -3283,7 +3268,7 @@ class TestLeakAutoVarWindows : public TestFixture { "}"); ASSERT_EQUALS("[test.c:1]: (error) Resource leak: MyHeap\n" "[test.c:1]: (error) Memory leak: b\n", - errout.str()); + errout_str()); } }; @@ -3297,9 +3282,6 @@ class TestLeakAutoVarPosix : public TestFixture { const Settings settings = settingsBuilder().library("std.cfg").library("posix.cfg").build(); void check_(const char* file, int line, const char code[]) { - // Clear the error buffer.. - errout.str(""); - // Tokenize.. Tokenizer tokenizer(settings, this); std::istringstream istr(code); @@ -3319,7 +3301,7 @@ class TestLeakAutoVarPosix : public TestFixture { " if (getline(is, str, 'x').good()) {};\n" " if (!getline(is, str, 'x').good()) {};\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } }; diff --git a/test/testmemleak.cpp b/test/testmemleak.cpp index a1049869c307..467ed90ce00c 100644 --- a/test/testmemleak.cpp +++ b/test/testmemleak.cpp @@ -41,9 +41,6 @@ class TestMemleak : private TestFixture { #define functionReturnType(code) functionReturnType_(code, __FILE__, __LINE__) CheckMemoryLeak::AllocType functionReturnType_(const char code[], const char* file, int line) { - // Clear the error buffer.. - errout.str(""); - // Tokenize.. Tokenizer tokenizer(settings, this); std::istringstream istr(code); @@ -94,9 +91,6 @@ class TestMemleak : private TestFixture { " }\n" "};\n"; - // Clear the error buffer.. - errout.str(""); - Tokenizer tokenizer(settings, this); std::istringstream istr(code); ASSERT(tokenizer.tokenize(istr, "test.cpp")); @@ -123,9 +117,6 @@ class TestMemleakInFunction : public TestFixture { #define check(...) check_(__FILE__, __LINE__, __VA_ARGS__) void check_(const char* file, int line, const char code[]) { - // Clear the error buffer.. - errout.str(""); - // Tokenize.. Tokenizer tokenizer(settings, this); std::istringstream istr(code); @@ -169,7 +160,7 @@ class TestMemleakInFunction : public TestFixture { " char *a = (char *)malloc(10);\n" " a = realloc(a, 100);\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Common realloc mistake: \'a\' nulled but not freed upon failure\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Common realloc mistake: \'a\' nulled but not freed upon failure\n", errout_str()); } void realloc2() { @@ -180,7 +171,7 @@ class TestMemleakInFunction : public TestFixture { " free(a);\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Common realloc mistake: \'a\' nulled but not freed upon failure\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Common realloc mistake: \'a\' nulled but not freed upon failure\n", errout_str()); } void realloc3() { @@ -192,7 +183,7 @@ class TestMemleakInFunction : public TestFixture { " free(a);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void realloc4() { @@ -206,7 +197,7 @@ class TestMemleakInFunction : public TestFixture { TODO_ASSERT_EQUALS("[test.cpp:5]: (error) Memory leak: a\n", "[test.cpp:4]: (error) Common realloc mistake: \'a\' nulled but not freed upon failure\n", - errout.str()); + errout_str()); } void realloc5() { @@ -221,7 +212,7 @@ class TestMemleakInFunction : public TestFixture { " else\n" " free(new_buf);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void realloc7() { @@ -235,7 +226,7 @@ class TestMemleakInFunction : public TestFixture { " free(pData);\n" " return true;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void realloc8() { @@ -247,7 +238,7 @@ class TestMemleakInFunction : public TestFixture { " m_buf = origBuf;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void realloc9() { @@ -255,7 +246,7 @@ class TestMemleakInFunction : public TestFixture { "{\n" " x = realloc(x,100);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void realloc10() { @@ -265,7 +256,7 @@ class TestMemleakInFunction : public TestFixture { " pa = realloc(pa, 20);" " exit();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void realloc11() { @@ -276,7 +267,7 @@ class TestMemleakInFunction : public TestFixture { " error();\n" " usep(p);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void realloc12() { @@ -287,7 +278,7 @@ class TestMemleakInFunction : public TestFixture { " return;\n" " free(a);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void realloc13() { @@ -297,7 +288,7 @@ class TestMemleakInFunction : public TestFixture { " *str = realloc(*str,100);\n" " free (*str);\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Common realloc mistake: \'str\' nulled but not freed upon failure\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Common realloc mistake: \'str\' nulled but not freed upon failure\n", errout_str()); } void realloc14() { @@ -308,7 +299,7 @@ class TestMemleakInFunction : public TestFixture { " error();\n" " usep(p);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void realloc15() { @@ -319,7 +310,7 @@ class TestMemleakInFunction : public TestFixture { " return false;\n" " return true;\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Common realloc mistake: \'m_options\' nulled but not freed upon failure\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Common realloc mistake: \'m_options\' nulled but not freed upon failure\n", errout_str()); } void realloc16() { @@ -329,7 +320,7 @@ class TestMemleakInFunction : public TestFixture { " free(zLine);\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void realloc17() { @@ -338,7 +329,7 @@ class TestMemleakInFunction : public TestFixture { " void ***a = malloc(sizeof(a));\n" " ***a = realloc(***(a), sizeof(a) * 2);\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Common realloc mistake: \'a\' nulled but not freed upon failure\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Common realloc mistake: \'a\' nulled but not freed upon failure\n", errout_str()); } void realloc18() { @@ -347,7 +338,7 @@ class TestMemleakInFunction : public TestFixture { " void *a = malloc(sizeof(a));\n" " a = realloc((void*)a, sizeof(a) * 2);\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Common realloc mistake: \'a\' nulled but not freed upon failure\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Common realloc mistake: \'a\' nulled but not freed upon failure\n", errout_str()); } void realloc19() { @@ -356,7 +347,7 @@ class TestMemleakInFunction : public TestFixture { " void *a = malloc(sizeof(a));\n" " a = (realloc((void*)((a)), sizeof(a) * 2));\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Common realloc mistake: \'a\' nulled but not freed upon failure\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Common realloc mistake: \'a\' nulled but not freed upon failure\n", errout_str()); } void realloc20() { @@ -365,7 +356,7 @@ class TestMemleakInFunction : public TestFixture { " void *a = malloc(sizeof(a));\n" " a = realloc((a) + 1, sizeof(a) * 2);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void realloc21() { @@ -376,7 +367,7 @@ class TestMemleakInFunction : public TestFixture { " if (bs == NULL) return bs0;\n" " return bs;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void realloc22() { @@ -387,7 +378,7 @@ class TestMemleakInFunction : public TestFixture { " if (bs == NULL) return;\n" " *bsp = bs;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void realloc23() { @@ -398,7 +389,7 @@ class TestMemleakInFunction : public TestFixture { " return;\n" " s->cigar = cigar;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void realloc24() { // #9228 @@ -406,28 +397,28 @@ class TestMemleakInFunction : public TestFixture { "void *a = NULL;\n" "a = realloc(a, 20);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" "void *a = NULL;\n" "a = malloc(10);\n" "a = realloc(a, 20);\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Common realloc mistake: \'a\' nulled but not freed upon failure\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Common realloc mistake: \'a\' nulled but not freed upon failure\n", errout_str()); check("void f() {\n" "void *a = std::nullptr;\n" "a = malloc(10);\n" "a = realloc(a, 20);\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Common realloc mistake: \'a\' nulled but not freed upon failure\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Common realloc mistake: \'a\' nulled but not freed upon failure\n", errout_str()); check("void f(char *b) {\n" "void *a = NULL;\n" "a = b;\n" "a = realloc(a, 20);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } }; @@ -452,9 +443,6 @@ class TestMemleakInClass : public TestFixture { * @param code Source code */ void check_(const char* file, int line, const char code[]) { - // Clear the error buffer.. - errout.str(""); - // Tokenize.. Tokenizer tokenizer(settings, this); std::istringstream istr(code); @@ -527,7 +515,7 @@ class TestMemleakInClass : public TestFixture { "{\n" " delete [] str2;\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (style) Class 'Fred' is unsafe, 'Fred::str1' can leak by wrong usage.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Class 'Fred' is unsafe, 'Fred::str1' can leak by wrong usage.\n", errout_str()); check("class Fred\n" "{\n" @@ -545,7 +533,7 @@ class TestMemleakInClass : public TestFixture { " delete [] str2;\n" " }\n" "};"); - ASSERT_EQUALS("[test.cpp:4]: (style) Class 'Fred' is unsafe, 'Fred::str1' can leak by wrong usage.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Class 'Fred' is unsafe, 'Fred::str1' can leak by wrong usage.\n", errout_str()); } void class2() { @@ -567,7 +555,7 @@ class TestMemleakInClass : public TestFixture { "{\n" " free(str1);\n" "}"); - ASSERT_EQUALS("[test.cpp:17]: (error) Mismatching allocation and deallocation: Fred::str1\n", errout.str()); + ASSERT_EQUALS("[test.cpp:17]: (error) Mismatching allocation and deallocation: Fred::str1\n", errout_str()); check("class Fred\n" "{\n" @@ -583,7 +571,7 @@ class TestMemleakInClass : public TestFixture { " free(str1);\n" " }\n" "};"); - ASSERT_EQUALS("[test.cpp:12]: (error) Mismatching allocation and deallocation: Fred::str1\n", errout.str()); + ASSERT_EQUALS("[test.cpp:12]: (error) Mismatching allocation and deallocation: Fred::str1\n", errout_str()); } void class3() { @@ -620,7 +608,7 @@ class TestMemleakInClass : public TestFixture { " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class Token;\n" "\n" @@ -649,7 +637,7 @@ class TestMemleakInClass : public TestFixture { " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void class4() { @@ -672,7 +660,7 @@ class TestMemleakInClass : public TestFixture { " ABC *p = new ABC;\n" " addAbc( p );\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct ABC;\n" "class Fred\n" @@ -689,7 +677,7 @@ class TestMemleakInClass : public TestFixture { " addAbc( p );\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void class6() { @@ -705,7 +693,7 @@ class TestMemleakInClass : public TestFixture { " delete [] str;\n" " hello();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class Fred\n" "{\n" @@ -717,7 +705,7 @@ class TestMemleakInClass : public TestFixture { " hello();\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void class7() { @@ -737,7 +725,7 @@ class TestMemleakInClass : public TestFixture { "{\n" " delete this->i;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class Fred\n" "{\n" @@ -752,7 +740,7 @@ class TestMemleakInClass : public TestFixture { " delete this->i;\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void class8() { @@ -769,7 +757,7 @@ class TestMemleakInClass : public TestFixture { " delete c;\n" " doNothing(c);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class A\n" "{\n" @@ -782,7 +770,7 @@ class TestMemleakInClass : public TestFixture { " }\n" " void doNothing() { }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void class9() { @@ -799,7 +787,7 @@ class TestMemleakInClass : public TestFixture { "\n" "A::~A()\n" "{ delete (p); }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class A\n" "{\n" @@ -810,7 +798,7 @@ class TestMemleakInClass : public TestFixture { " ~A()\n" " { delete (p); }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void class10() { @@ -822,7 +810,7 @@ class TestMemleakInClass : public TestFixture { "};\n" "A::A()\n" "{ p = new int; }"); - ASSERT_EQUALS("[test.cpp:4]: (style) Class 'A' is unsafe, 'A::p' can leak by wrong usage.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Class 'A' is unsafe, 'A::p' can leak by wrong usage.\n", errout_str()); check("class A\n" "{\n" @@ -830,7 +818,7 @@ class TestMemleakInClass : public TestFixture { " int * p;\n" " A() { p = new int; }\n" "};"); - ASSERT_EQUALS("[test.cpp:4]: (style) Class 'A' is unsafe, 'A::p' can leak by wrong usage.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Class 'A' is unsafe, 'A::p' can leak by wrong usage.\n", errout_str()); } void class11() { @@ -841,7 +829,7 @@ class TestMemleakInClass : public TestFixture { " A() : p(new int[10])\n" " { }" "};"); - ASSERT_EQUALS("[test.cpp:4]: (style) Class 'A' is unsafe, 'A::p' can leak by wrong usage.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Class 'A' is unsafe, 'A::p' can leak by wrong usage.\n", errout_str()); check("class A\n" "{\n" @@ -851,7 +839,7 @@ class TestMemleakInClass : public TestFixture { "};\n" "A::A() : p(new int[10])\n" "{ }"); - ASSERT_EQUALS("[test.cpp:4]: (style) Class 'A' is unsafe, 'A::p' can leak by wrong usage.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Class 'A' is unsafe, 'A::p' can leak by wrong usage.\n", errout_str()); } void class12() { @@ -873,7 +861,7 @@ class TestMemleakInClass : public TestFixture { "\n" "void A::cleanup()\n" "{ delete [] p; }"); - ASSERT_EQUALS("[test.cpp:4]: (style) Class 'A' is unsafe, 'A::p' can leak by wrong usage.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Class 'A' is unsafe, 'A::p' can leak by wrong usage.\n", errout_str()); check("class A\n" "{\n" @@ -887,7 +875,7 @@ class TestMemleakInClass : public TestFixture { " void cleanup()\n" " { delete [] p; }\n" "};"); - ASSERT_EQUALS("[test.cpp:4]: (style) Class 'A' is unsafe, 'A::p' can leak by wrong usage.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Class 'A' is unsafe, 'A::p' can leak by wrong usage.\n", errout_str()); } void class13() { @@ -909,7 +897,7 @@ class TestMemleakInClass : public TestFixture { "\n" "void A::foo()\n" "{ p = new int[10]; delete [] p; }"); - ASSERT_EQUALS("[test.cpp:17]: (warning) Possible leak in public function. The pointer 'p' is not deallocated before it is allocated.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:17]: (warning) Possible leak in public function. The pointer 'p' is not deallocated before it is allocated.\n", errout_str()); check("class A\n" "{\n" @@ -923,7 +911,7 @@ class TestMemleakInClass : public TestFixture { " void foo()\n" " { p = new int[10]; delete [] p; }\n" "};"); - ASSERT_EQUALS("[test.cpp:11]: (warning) Possible leak in public function. The pointer 'p' is not deallocated before it is allocated.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:11]: (warning) Possible leak in public function. The pointer 'p' is not deallocated before it is allocated.\n", errout_str()); } void class14() { @@ -937,7 +925,7 @@ class TestMemleakInClass : public TestFixture { "void A::init()\n" "{ p = new int[10]; }"); ASSERT_EQUALS("[test.cpp:9]: (warning) Possible leak in public function. The pointer 'p' is not deallocated before it is allocated.\n" - "[test.cpp:3]: (style) Class 'A' is unsafe, 'A::p' can leak by wrong usage.\n", errout.str()); + "[test.cpp:3]: (style) Class 'A' is unsafe, 'A::p' can leak by wrong usage.\n", errout_str()); check("class A\n" "{\n" @@ -947,7 +935,7 @@ class TestMemleakInClass : public TestFixture { " { p = new int[10]; }\n" "};"); ASSERT_EQUALS("[test.cpp:6]: (warning) Possible leak in public function. The pointer 'p' is not deallocated before it is allocated.\n" - "[test.cpp:3]: (style) Class 'A' is unsafe, 'A::p' can leak by wrong usage.\n", errout.str()); + "[test.cpp:3]: (style) Class 'A' is unsafe, 'A::p' can leak by wrong usage.\n", errout_str()); check("class A\n" @@ -960,7 +948,7 @@ class TestMemleakInClass : public TestFixture { "void A::init()\n" "{ p = new int; }"); ASSERT_EQUALS("[test.cpp:9]: (warning) Possible leak in public function. The pointer 'p' is not deallocated before it is allocated.\n" - "[test.cpp:3]: (style) Class 'A' is unsafe, 'A::p' can leak by wrong usage.\n", errout.str()); + "[test.cpp:3]: (style) Class 'A' is unsafe, 'A::p' can leak by wrong usage.\n", errout_str()); check("class A\n" "{\n" @@ -970,7 +958,7 @@ class TestMemleakInClass : public TestFixture { " { p = new int; }\n" "};"); ASSERT_EQUALS("[test.cpp:6]: (warning) Possible leak in public function. The pointer 'p' is not deallocated before it is allocated.\n" - "[test.cpp:3]: (style) Class 'A' is unsafe, 'A::p' can leak by wrong usage.\n", errout.str()); + "[test.cpp:3]: (style) Class 'A' is unsafe, 'A::p' can leak by wrong usage.\n", errout_str()); check("class A\n" @@ -983,7 +971,7 @@ class TestMemleakInClass : public TestFixture { "void A::init()\n" "{ p = malloc(sizeof(int)*10); }"); ASSERT_EQUALS("[test.cpp:9]: (warning) Possible leak in public function. The pointer 'p' is not deallocated before it is allocated.\n" - "[test.cpp:3]: (style) Class 'A' is unsafe, 'A::p' can leak by wrong usage.\n", errout.str()); + "[test.cpp:3]: (style) Class 'A' is unsafe, 'A::p' can leak by wrong usage.\n", errout_str()); check("class A\n" "{\n" @@ -993,7 +981,7 @@ class TestMemleakInClass : public TestFixture { " { p = malloc(sizeof(int)*10); }\n" "};"); ASSERT_EQUALS("[test.cpp:6]: (warning) Possible leak in public function. The pointer 'p' is not deallocated before it is allocated.\n" - "[test.cpp:3]: (style) Class 'A' is unsafe, 'A::p' can leak by wrong usage.\n", errout.str()); + "[test.cpp:3]: (style) Class 'A' is unsafe, 'A::p' can leak by wrong usage.\n", errout_str()); } void class15() { @@ -1006,7 +994,7 @@ class TestMemleakInClass : public TestFixture { "};\n" "A::A()\n" "{ p = new int[10]; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class A\n" "{\n" @@ -1016,7 +1004,7 @@ class TestMemleakInClass : public TestFixture { " { p = new int[10]; }\n" " ~A() { delete [] p; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class A\n" @@ -1028,7 +1016,7 @@ class TestMemleakInClass : public TestFixture { "};\n" "A::A()\n" "{ p = new int; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class A\n" "{\n" @@ -1038,7 +1026,7 @@ class TestMemleakInClass : public TestFixture { " { p = new int; }\n" " ~A() { delete p; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class A\n" @@ -1050,7 +1038,7 @@ class TestMemleakInClass : public TestFixture { "};\n" "A::A()\n" "{ p = malloc(sizeof(int)*10); }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class A\n" "{\n" @@ -1060,7 +1048,7 @@ class TestMemleakInClass : public TestFixture { " { p = malloc(sizeof(int)*10); }\n" " ~A() { free(p); }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void class16() { @@ -1073,7 +1061,7 @@ class TestMemleakInClass : public TestFixture { " A() { a = b = new int[10]; }\n" " ~A() { delete [] a; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void class17() { @@ -1090,7 +1078,7 @@ class TestMemleakInClass : public TestFixture { " A::pd = new char[12];\n" " delete [] A::pd;\n" "}"); - ASSERT_EQUALS("[test.cpp:10]: (warning) Possible leak in public function. The pointer 'pd' is not deallocated before it is allocated.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:10]: (warning) Possible leak in public function. The pointer 'pd' is not deallocated before it is allocated.\n", errout_str()); check("class A {\n" "private:\n" @@ -1102,7 +1090,7 @@ class TestMemleakInClass : public TestFixture { " delete [] pd;\n" " }\n" "};"); - ASSERT_EQUALS("[test.cpp:7]: (warning) Possible leak in public function. The pointer 'pd' is not deallocated before it is allocated.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (warning) Possible leak in public function. The pointer 'pd' is not deallocated before it is allocated.\n", errout_str()); check("class A {\n" "private:\n" @@ -1116,7 +1104,7 @@ class TestMemleakInClass : public TestFixture { " pd = new char[12];\n" " delete [] pd;\n" "}"); - ASSERT_EQUALS("[test.cpp:10]: (warning) Possible leak in public function. The pointer 'pd' is not deallocated before it is allocated.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:10]: (warning) Possible leak in public function. The pointer 'pd' is not deallocated before it is allocated.\n", errout_str()); } void class18() { @@ -1132,7 +1120,7 @@ class TestMemleakInClass : public TestFixture { "private:\n" " char *a;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class A : public x\n" "{\n" @@ -1146,7 +1134,7 @@ class TestMemleakInClass : public TestFixture { " a = new char[10];\n" " foo(a);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void class19() { @@ -1164,7 +1152,7 @@ class TestMemleakInClass : public TestFixture { " rp1 = new TRadioButton(this);\n" " rp2 = new TRadioButton(this);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class TRadioButton { };\n" "class Foo\n" @@ -1181,7 +1169,7 @@ class TestMemleakInClass : public TestFixture { " rp2 = new TRadioButton;\n" "}"); ASSERT_EQUALS("[test.cpp:5]: (style) Class 'Foo' is unsafe, 'Foo::rp1' can leak by wrong usage.\n" - "[test.cpp:6]: (style) Class 'Foo' is unsafe, 'Foo::rp2' can leak by wrong usage.\n", errout.str()); + "[test.cpp:6]: (style) Class 'Foo' is unsafe, 'Foo::rp2' can leak by wrong usage.\n", errout_str()); check("class TRadioButton { };\n" "class Foo\n" @@ -1203,7 +1191,7 @@ class TestMemleakInClass : public TestFixture { " delete rp1;\n" " delete rp2;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void class20() { @@ -1225,7 +1213,7 @@ class TestMemleakInClass : public TestFixture { " }\n" " };\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (style) Class 'Fred' is unsafe, 'Fred::str1' can leak by wrong usage.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (style) Class 'Fred' is unsafe, 'Fred::str1' can leak by wrong usage.\n", errout_str()); check("namespace ns1 {\n" " class Fred\n" @@ -1249,7 +1237,7 @@ class TestMemleakInClass : public TestFixture { " delete [] str2;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (style) Class 'Fred' is unsafe, 'Fred::str1' can leak by wrong usage.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (style) Class 'Fred' is unsafe, 'Fred::str1' can leak by wrong usage.\n", errout_str()); check("namespace ns1 {\n" " class Fred\n" @@ -1272,7 +1260,7 @@ class TestMemleakInClass : public TestFixture { "{\n" " delete [] str2;\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (style) Class 'Fred' is unsafe, 'Fred::str1' can leak by wrong usage.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (style) Class 'Fred' is unsafe, 'Fred::str1' can leak by wrong usage.\n", errout_str()); check("namespace ns1 {\n" " namespace ns2 {\n" @@ -1297,7 +1285,7 @@ class TestMemleakInClass : public TestFixture { "{\n" " delete [] str2;\n" "}"); - ASSERT_EQUALS("[test.cpp:6]: (style) Class 'Fred' is unsafe, 'Fred::str1' can leak by wrong usage.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (style) Class 'Fred' is unsafe, 'Fred::str1' can leak by wrong usage.\n", errout_str()); check("namespace ns1 {\n" " namespace ns2 {\n" @@ -1324,7 +1312,7 @@ class TestMemleakInClass : public TestFixture { "{\n" " delete [] str2;\n" "}"); - ASSERT_EQUALS("[test.cpp:7]: (style) Class 'Fred' is unsafe, 'Fred::str1' can leak by wrong usage.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (style) Class 'Fred' is unsafe, 'Fred::str1' can leak by wrong usage.\n", errout_str()); } void class21() { // ticket #2517 @@ -1344,7 +1332,7 @@ class TestMemleakInClass : public TestFixture { TODO_ASSERT_EQUALS("[test.cpp:9]: (style) Class 'A' is unsafe, 'A::b' can leak by wrong usage.\n" "[test.cpp:10]: (style) Class 'A' is unsafe, 'A::c' can leak by wrong usage.\n", "[test.cpp:9]: (style) Class 'A' is unsafe, 'A::b' can leak by wrong usage.\n", - errout.str()); + errout_str()); check("struct B { };\n" "struct C\n" @@ -1366,7 +1354,7 @@ class TestMemleakInClass : public TestFixture { TODO_ASSERT_EQUALS("[test.cpp:9]: (style) Class 'A' is unsafe, 'A::b' can leak by wrong usage.\n" "[test.cpp:10]: (style) Class 'A' is unsafe, 'A::c' can leak by wrong usage.\n", "[test.cpp:9]: (style) Class 'A' is unsafe, 'A::b' can leak by wrong usage.\n", - errout.str()); + errout_str()); } void class22() { // ticket #3012 - false positive @@ -1377,7 +1365,7 @@ class TestMemleakInClass : public TestFixture { " Fred() { a = new int; }\n" " ~Fred() { (delete(a), (a)=NULL); }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void class23() { // ticket #3303 - false positive @@ -1396,7 +1384,7 @@ class TestMemleakInClass : public TestFixture { "private:\n" " CDataImpl *m_impl;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void class24() { // ticket #3806 - false positive in copy constructor @@ -1407,7 +1395,7 @@ class TestMemleakInClass : public TestFixture { " Fred(const Fred &fred) { a = new int; }\n" " ~Fred() { delete a; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void class25() { // ticket #4367 - false positive when implementation for destructor is not seen @@ -1418,7 +1406,7 @@ class TestMemleakInClass : public TestFixture { " Fred() { a = new int; }\n" " ~Fred();\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void class26() { // ticket #10789 - crash @@ -1429,7 +1417,7 @@ class TestMemleakInClass : public TestFixture { " C* p;\n" "};\n" "S::~S() = default;\n"); - ASSERT_EQUALS("[test.cpp:5]: (style) Class 'S' is unsafe, 'S::p' can leak by wrong usage.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (style) Class 'S' is unsafe, 'S::p' can leak by wrong usage.\n", errout_str()); } void class27() { // ticket #8126 - array of pointers @@ -1440,7 +1428,7 @@ class TestMemleakInClass : public TestFixture { " }\n" " char* a[5];\n" "};\n"); - ASSERT_EQUALS("[test.cpp:6]: (style) Class 'S' is unsafe, 'S::a' can leak by wrong usage.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (style) Class 'S' is unsafe, 'S::a' can leak by wrong usage.\n", errout_str()); } void staticvar() { @@ -1455,7 +1443,7 @@ class TestMemleakInClass : public TestFixture { " p = new int[100];\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } @@ -1487,7 +1475,7 @@ class TestMemleakInClass : public TestFixture { "{\n" " delete tok;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Global function check("void deleteTokens(int *tok)\n" @@ -1514,7 +1502,7 @@ class TestMemleakInClass : public TestFixture { " deleteTokens(_tokens);\n" " _tokens = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void mismatch1() { @@ -1539,7 +1527,7 @@ class TestMemleakInClass : public TestFixture { "A::~A() {\n" " delete [] pkt_buffer;\n" "}"); - ASSERT_EQUALS("[test.cpp:14]: (error) Mismatching allocation and deallocation: A::pkt_buffer\n", errout.str()); + ASSERT_EQUALS("[test.cpp:14]: (error) Mismatching allocation and deallocation: A::pkt_buffer\n", errout_str()); check("struct S {\n" // 5678 " ~S();\n" @@ -1551,7 +1539,7 @@ class TestMemleakInClass : public TestFixture { " delete p;\n" " p = 0;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:8]: (error) Mismatching allocation and deallocation: S::p\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8]: (error) Mismatching allocation and deallocation: S::p\n", errout_str()); } void mismatch2() { // #5659 @@ -1576,7 +1564,7 @@ class TestMemleakInClass : public TestFixture { " data_ = 0;\n" "}"); ASSERT_EQUALS("[test.cpp:17]: (warning) Possible leak in public function. The pointer 'data_' is not deallocated before it is allocated.\n" - "[test.cpp:18]: (error) Mismatching allocation and deallocation: Foo::data_\n", errout.str()); + "[test.cpp:18]: (error) Mismatching allocation and deallocation: Foo::data_\n", errout_str()); check("namespace NS\n" "{\n" @@ -1599,7 +1587,7 @@ class TestMemleakInClass : public TestFixture { " data_ = 0;\n" "}"); ASSERT_EQUALS("[test.cpp:17]: (warning) Possible leak in public function. The pointer 'data_' is not deallocated before it is allocated.\n" - "[test.cpp:18]: (error) Mismatching allocation and deallocation: Foo::data_\n", errout.str()); + "[test.cpp:18]: (error) Mismatching allocation and deallocation: Foo::data_\n", errout_str()); } void func1() { @@ -1613,7 +1601,7 @@ class TestMemleakInClass : public TestFixture { " void xy()\n" " { s = malloc(100); }\n" "};"); - ASSERT_EQUALS("[test.cpp:9]: (warning) Possible leak in public function. The pointer 's' is not deallocated before it is allocated.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:9]: (warning) Possible leak in public function. The pointer 's' is not deallocated before it is allocated.\n", errout_str()); check("class Fred\n" "{\n" @@ -1625,7 +1613,7 @@ class TestMemleakInClass : public TestFixture { "private:\n" " char *s;\n" "};"); - ASSERT_EQUALS("[test.cpp:7]: (warning) Possible leak in public function. The pointer 's' is not deallocated before it is allocated.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (warning) Possible leak in public function. The pointer 's' is not deallocated before it is allocated.\n", errout_str()); } void func2() { @@ -1639,7 +1627,7 @@ class TestMemleakInClass : public TestFixture { " const Fred & operator = (const Fred &f)\n" " { s = malloc(100); }\n" "};"); - ASSERT_EQUALS("[test.cpp:9]: (warning) Possible leak in public function. The pointer 's' is not deallocated before it is allocated.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:9]: (warning) Possible leak in public function. The pointer 's' is not deallocated before it is allocated.\n", errout_str()); } }; @@ -1659,9 +1647,6 @@ class TestMemleakStructMember : public TestFixture { const Settings settings = settingsBuilder().library("std.cfg").library("posix.cfg").build(); void check_(const char* file, int line, const char code[], bool isCPP = true) { - // Clear the error buffer.. - errout.str(""); - // Tokenize.. Tokenizer tokenizer(settings, this); std::istringstream istr(code); @@ -1731,14 +1716,14 @@ class TestMemleakStructMember : public TestFixture { " abc->a = malloc(10);\n" " free(abc);\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (error) Memory leak: abc.a\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Memory leak: abc.a\n", errout_str()); check("static void foo()\n" "{\n" " struct ABC *abc = malloc(sizeof(struct ABC));\n" " abc->a = malloc(10);\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (error) Memory leak: abc.a\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Memory leak: abc.a\n", errout_str()); check("static ABC * foo()\n" "{\n" @@ -1751,7 +1736,7 @@ class TestMemleakStructMember : public TestFixture { " }\n" " return abc;\n" "}"); - ASSERT_EQUALS("[test.cpp:8]: (error) Memory leak: abc.a\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8]: (error) Memory leak: abc.a\n", errout_str()); check("static void foo(int a)\n" "{\n" @@ -1763,7 +1748,7 @@ class TestMemleakStructMember : public TestFixture { " return;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:10]: (error) Memory leak: abc.a\n", errout.str()); + ASSERT_EQUALS("[test.cpp:10]: (error) Memory leak: abc.a\n", errout_str()); } void goto_() { @@ -1779,7 +1764,7 @@ class TestMemleakStructMember : public TestFixture { " free(abc->a);\n" " free(abc);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void ret1() { @@ -1789,13 +1774,13 @@ class TestMemleakStructMember : public TestFixture { " abc->a = malloc(10);\n" " return abc;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("static void foo(struct ABC *abc)\n" "{\n" " abc->a = malloc(10);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #7302 check("void* foo() {\n" @@ -1803,14 +1788,14 @@ class TestMemleakStructMember : public TestFixture { " abc.a = malloc(10);\n" " return abc.a;\n" "}", false); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void* foo() {\n" " struct ABC abc;\n" " abc.a = malloc(10);\n" " return abc.b;\n" "}", false); - ASSERT_EQUALS("[test.c:4]: (error) Memory leak: abc.a\n", errout.str()); + ASSERT_EQUALS("[test.c:4]: (error) Memory leak: abc.a\n", errout_str()); } void ret2() { @@ -1820,7 +1805,7 @@ class TestMemleakStructMember : public TestFixture { " abc->a = malloc(10);\n" " return &abc->self;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void assign1() { @@ -1829,7 +1814,7 @@ class TestMemleakStructMember : public TestFixture { " struct ABC *abc = abc1;\n" " abc->a = malloc(10);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("static void foo()\n" "{\n" @@ -1837,7 +1822,7 @@ class TestMemleakStructMember : public TestFixture { " abc1 = abc = malloc(sizeof(ABC));\n" " abc->a = malloc(10);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("static void foo()\n" "{\n" @@ -1846,7 +1831,7 @@ class TestMemleakStructMember : public TestFixture { " ptr->msn = malloc(100);\n" " back = ptr;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } @@ -1855,7 +1840,7 @@ class TestMemleakStructMember : public TestFixture { " struct ABC *abc = malloc(123);\n" " abc->a = abc->b = malloc(10);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void assign3() { @@ -1864,7 +1849,7 @@ class TestMemleakStructMember : public TestFixture { " f2.a = malloc(100);\n" " *f1 = f2;\n" "}", false); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void assign4() { @@ -1878,7 +1863,7 @@ class TestMemleakStructMember : public TestFixture { ASSERT_EQUALS("[test.c:7]: (error) Memory leak: s.a\n" "[test.c:7]: (error) Memory leak: s.b\n" "[test.c:7]: (error) Memory leak: s.c\n", - errout.str()); + errout_str()); check("struct S { int *p, *q; };\n" // #7705 "void f(S s) {\n" @@ -1887,7 +1872,7 @@ class TestMemleakStructMember : public TestFixture { "}\n"); ASSERT_EQUALS("[test.cpp:5]: (error) Memory leak: s.p\n" "[test.cpp:5]: (error) Memory leak: s.q\n", - errout.str()); + errout_str()); check("struct S** f(struct S** s) {\n" // don't throw " struct S** ret = malloc(sizeof(*ret));\n" @@ -1895,12 +1880,12 @@ class TestMemleakStructMember : public TestFixture { " ret[0]->g = strdup(s[0]->g);\n" " return ret;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void run_rcmd(enum rcommand rcmd, rsh_session *sess, char *cmd) {\n" " sess->fp = popen(cmd, rcmd == RSH_PIPE_READ ? \"r\" : \"w\");\n" "}\n", false); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S { char* a[2]; };\n" "enum E { E0, E1 };\n" @@ -1908,13 +1893,13 @@ class TestMemleakStructMember : public TestFixture { " free(s->a[e]);\n" " s->a[e] = strdup(n);\n" "}\n", false); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(struct S** s, const char* c) {\n" " *s = malloc(sizeof(struct S));\n" " (*s)->value = strdup(c);\n" "}\n", false); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S {\n" " size_t mpsz;\n" @@ -1924,14 +1909,14 @@ class TestMemleakStructMember : public TestFixture { " s->mpsz = size;\n" " s->hdr = mmap(NULL, s->mpsz, PROT_READ, MAP_SHARED, fd, 0);\n" "}\n", false); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(type_t t) {\n" " t->p = malloc(10);\n" " t->x.p = malloc(10);\n" " t->y[2].p = malloc(10);\n" "}\n", false); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void failedAllocation() { @@ -1946,7 +1931,7 @@ class TestMemleakStructMember : public TestFixture { " }\n" " return abc;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void function1() { @@ -1957,7 +1942,7 @@ class TestMemleakStructMember : public TestFixture { " abc->a = malloc(10);\n" " func(abc);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("static void foo()\n" "{\n" @@ -1965,7 +1950,7 @@ class TestMemleakStructMember : public TestFixture { " abclist.push_back(abc);\n" " abc->a = malloc(10);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } // #2848: Taking address in function 'assign' @@ -1975,7 +1960,7 @@ class TestMemleakStructMember : public TestFixture { " a.foo = (char *) malloc(10);\n" " assign(&a);\n" "}", false); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } // #3024: kernel list @@ -1985,7 +1970,7 @@ class TestMemleakStructMember : public TestFixture { " abc.a = (char *) malloc(10);\n" " list_add_tail(&abc->list, head);\n" "}", false); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } // #3038: deallocating in function @@ -1996,7 +1981,7 @@ class TestMemleakStructMember : public TestFixture { " abc.a = (char *) malloc(10);\n" " a(abc.a);\n" "}", false); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void function5() { @@ -2005,21 +1990,21 @@ class TestMemleakStructMember : public TestFixture { " s1->x = malloc(1);\n" " return (s1);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct nc_rpc nc_rpc_getconfig() {\n" // #10382 " struct nc_rpc rpc;\n" " rpc->filter = malloc(1);\n" " return (nc_rpc)rpc;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("T* f(const char *str) {\n" // #10158 " S* s = malloc(sizeof(S));\n" " s->str = strdup(str);\n" " return NewT(s);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("typedef struct s { char* str; } attr_t;\n" // #10152 "attr_t* f(int type) {\n" @@ -2033,7 +2018,7 @@ class TestMemleakStructMember : public TestFixture { " }\n" " return g(&a);\n" "}\n"); - TODO_ASSERT_EQUALS("", "[test.cpp:9]: (error) Memory leak: a.str\n", errout.str()); + TODO_ASSERT_EQUALS("", "[test.cpp:9]: (error) Memory leak: a.str\n", errout_str()); } void ifelse() { @@ -2052,7 +2037,7 @@ class TestMemleakStructMember : public TestFixture { " free(abc->a);\n" " free(abc);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void linkedlist() { @@ -2068,7 +2053,7 @@ class TestMemleakStructMember : public TestFixture { " abc = next;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void globalvar() { @@ -2080,7 +2065,7 @@ class TestMemleakStructMember : public TestFixture { " abc->a = malloc(10);\n" " return;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } // Ticket #933 Leaks with struct members not detected @@ -2102,10 +2087,10 @@ class TestMemleakStructMember : public TestFixture { check(code1, true); ASSERT_EQUALS("[test.cpp:12]: (error) Memory leak: a.f\n" "[test.cpp:12]: (error) Memory leak: a.c\n" - "[test.cpp:12]: (error) Memory leak: a.m\n", errout.str()); + "[test.cpp:12]: (error) Memory leak: a.m\n", errout_str()); check(code1, false); ASSERT_EQUALS("[test.c:12]: (error) Memory leak: a.f\n" - "[test.c:12]: (error) Memory leak: a.m\n", errout.str()); + "[test.c:12]: (error) Memory leak: a.m\n", errout_str()); // Test OK case const char code2[] = "struct A {\n" @@ -2125,9 +2110,9 @@ class TestMemleakStructMember : public TestFixture { "}"; check(code2, true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check(code2, false); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Test unknown struct. In C++, it might have a destructor const char code3[] = "void func() {\n" @@ -2136,9 +2121,9 @@ class TestMemleakStructMember : public TestFixture { "}"; check(code3, true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check(code3, false); - ASSERT_EQUALS("[test.c:4]: (error) Memory leak: a.f\n", errout.str()); + ASSERT_EQUALS("[test.c:4]: (error) Memory leak: a.f\n", errout_str()); // Test struct with destructor const char code4[] = "struct A {\n" @@ -2151,7 +2136,7 @@ class TestMemleakStructMember : public TestFixture { "}"; check(code4, true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void refvar() { // #8116 @@ -2165,7 +2150,7 @@ class TestMemleakStructMember : public TestFixture { " Test& y = *x;\n" " y.data = malloc(10);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } // don't crash @@ -2175,7 +2160,7 @@ class TestMemleakStructMember : public TestFixture { "char *const oldbuffer = otherbuffer.get();\n" "int const oldbufsize = otherbufsize;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void varid() { // #5201 @@ -2188,7 +2173,7 @@ class TestMemleakStructMember : public TestFixture { " if (s.state_check_buff == 0)\n" " return;\n" "}", false); - ASSERT_EQUALS("[test.c:9]: (error) Memory leak: s.state_check_buff\n", errout.str()); + ASSERT_EQUALS("[test.c:9]: (error) Memory leak: s.state_check_buff\n", errout_str()); } void varid_2() { // #5315 @@ -2198,7 +2183,7 @@ class TestMemleakStructMember : public TestFixture { " ((f)->realm) = strdup(realm);\n" " if(f->realm == NULL) {}\n" "}", false); - ASSERT_EQUALS("[test.c:6]: (error) Memory leak: f.realm\n", errout.str()); + ASSERT_EQUALS("[test.c:6]: (error) Memory leak: f.realm\n", errout_str()); } void customAllocation() { // #4770 @@ -2209,7 +2194,7 @@ class TestMemleakStructMember : public TestFixture { " struct ABC abc;\n" " abc.a = myalloc();\n" "}", false); - ASSERT_EQUALS("[test.c:7]: (error) Memory leak: abc.a\n", errout.str()); + ASSERT_EQUALS("[test.c:7]: (error) Memory leak: abc.a\n", errout_str()); } void lambdaInScope() { @@ -2225,7 +2210,7 @@ class TestMemleakStructMember : public TestFixture { " delete[] s.p;\n" " return 0;\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check( "struct S { int* p; };\n" @@ -2235,7 +2220,7 @@ class TestMemleakStructMember : public TestFixture { " s.p = new int;\n" " };\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:6]: (error) Memory leak: s.p\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (error) Memory leak: s.p\n", errout_str()); check( "struct S { int* p; };\n" @@ -2254,7 +2239,7 @@ class TestMemleakStructMember : public TestFixture { " delete s.p;\n" " }();\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } }; @@ -2272,9 +2257,6 @@ class TestMemleakNoVar : public TestFixture { const Settings settings = settingsBuilder().certainty(Certainty::inconclusive).severity(Severity::warning).library("std.cfg").library("posix.cfg").build(); void check_(const char* file, int line, const char code[]) { - // Clear the error buffer.. - errout.str(""); - // Tokenize.. Tokenizer tokenizer(settings, this); std::istringstream istr(code); @@ -2308,23 +2290,23 @@ class TestMemleakNoVar : public TestFixture { check("void x() {\n" " strcpy(a, strdup(p));\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (error) Allocation with strdup, strcpy doesn't release it.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (error) Allocation with strdup, strcpy doesn't release it.\n", errout_str()); check("char *x() {\n" " char *ret = strcpy(malloc(10), \"abc\");\n" " return ret;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("char *x() {\n" " return strcpy(malloc(10), \"abc\");\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void x() {\n" " free(malloc(10));\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // user function.. check("void set_error(const char *msg) {\n" @@ -2333,7 +2315,7 @@ class TestMemleakNoVar : public TestFixture { "void x() {\n" " set_error(strdup(p));\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:5]: (error) Allocation with strdup, set_error doesn't release it.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:5]: (error) Allocation with strdup, set_error doesn't release it.\n", "", errout_str()); check("void f()\n" "{\n" @@ -2341,74 +2323,74 @@ class TestMemleakNoVar : public TestFixture { " fd = mkstemp(strdup(\"/tmp/file.XXXXXXXX\"));\n" " close(fd);\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:4]: (error) Allocation with strdup, mkstemp doesn't release it.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:4]: (error) Allocation with strdup, mkstemp doesn't release it.\n", "", errout_str()); check("void f()\n" "{\n" " if(TRUE || strcmp(strdup(a), b));\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Allocation with strdup, strcmp doesn't release it.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Allocation with strdup, strcmp doesn't release it.\n", errout_str()); check("void f()\n" "{\n" " if(!strcmp(strdup(a), b) == 0);\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Allocation with strdup, strcmp doesn't release it.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Allocation with strdup, strcmp doesn't release it.\n", errout_str()); check("void f()\n" "{\n" " 42, strcmp(strdup(a), b);\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Allocation with strdup, strcmp doesn't release it.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Allocation with strdup, strcmp doesn't release it.\n", errout_str()); check("void f() {\n" " assert(freopen(\"/dev/null\", \"r\", stdin));\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void x() {\n" " strcpy(a, (void*)strdup(p));\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (error) Allocation with strdup, strcpy doesn't release it.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (error) Allocation with strdup, strcpy doesn't release it.\n", errout_str()); check("void* malloc1() {\n" " return (malloc(1));\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("char *x() {\n" " char *ret = (char*)strcpy(malloc(10), \"abc\");\n" " return ret;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " free(malloc(1));\n" " strcpy(a, strdup(p));\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Allocation with strdup, strcpy doesn't release it.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Allocation with strdup, strcpy doesn't release it.\n", errout_str()); check("void f() {\n" " memcmp(calloc(10, 10), strdup(q), 100);\n" "}"); ASSERT_EQUALS("[test.cpp:2]: (error) Allocation with calloc, memcmp doesn't release it.\n" - "[test.cpp:2]: (error) Allocation with strdup, memcmp doesn't release it.\n", errout.str()); + "[test.cpp:2]: (error) Allocation with strdup, memcmp doesn't release it.\n", errout_str()); check("void* f(int size) {\n" " return (void*) malloc(size);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int* f(int size) {\n" " return static_cast(malloc(size));\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() { if (new int[42]) {} }\n" // #10857 "void g() { if (malloc(42)) {} }\n"); ASSERT_EQUALS("[test.cpp:1]: (error) Allocation with new, if doesn't release it.\n" "[test.cpp:2]: (error) Allocation with malloc, if doesn't release it.\n", - errout.str()); + errout_str()); check("const char* string(const char* s) {\n" " StringSet::iterator it = strings_.find(s);\n" @@ -2416,7 +2398,7 @@ class TestMemleakNoVar : public TestFixture { " return *it;\n" " return *strings_.insert(it, std::strcpy(new char[std::strlen(s) + 1], s));\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S {\n" " static void load(const QString& projPath) {\n" @@ -2428,19 +2410,19 @@ class TestMemleakNoVar : public TestFixture { "private:\n" " static Core::ProjectBase* proj_;\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(const std::string& s, int n) {\n" " std::unique_ptr u;\n" " u.reset(strcpy(new char[n], s.c_str()));\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S { char* p; };\n" "void f(S* s, int N) {\n" " s->p = s->p ? strcpy(new char[N], s->p) : nullptr;\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S {};\n" // #11866 "void f(bool b);\n" @@ -2456,20 +2438,20 @@ class TestMemleakNoVar : public TestFixture { "[test.cpp:6]: (error) Allocation with new, f doesn't release it.\n" "[test.cpp:7]: (error) Allocation with new, f doesn't release it.\n" "[test.cpp:8]: (error) Allocation with malloc, f doesn't release it.\n", - errout.str()); + errout_str()); check("void f(uintptr_t u);\n" "void g() {\n" " f((uintptr_t)new int());\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(uint8_t u);\n" "void g() {\n" " f((uint8_t)new int());\n" "}\n"); ASSERT_EQUALS("[test.cpp:3]: (error) Allocation with new, f doesn't release it.\n", - errout.str()); + errout_str()); check("void f(int i, T t);\n" "void g(int i, U* u);\n" @@ -2477,14 +2459,14 @@ class TestMemleakNoVar : public TestFixture { " f(1, new int());\n" " g(1, new int());\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(T t);\n" "struct U {};\n" "void g() {\n" " f(new U());\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void missingAssignment() { @@ -2492,25 +2474,25 @@ class TestMemleakNoVar : public TestFixture { "{\n" " malloc(10);\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Return value of allocation function 'malloc' is not stored.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Return value of allocation function 'malloc' is not stored.\n", errout_str()); check("void x()\n" "{\n" " calloc(10, 1);\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Return value of allocation function 'calloc' is not stored.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Return value of allocation function 'calloc' is not stored.\n", errout_str()); check("void x()\n" "{\n" " strdup(\"Test\");\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Return value of allocation function 'strdup' is not stored.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Return value of allocation function 'strdup' is not stored.\n", errout_str()); check("void x()\n" "{\n" " (char*) malloc(10);\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Return value of allocation function 'malloc' is not stored.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Return value of allocation function 'malloc' is not stored.\n", errout_str()); check("void x()\n" "{\n" @@ -2518,19 +2500,19 @@ class TestMemleakNoVar : public TestFixture { " foo(ptr);\n" " free(ptr);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("char** x(const char* str) {\n" " char* ptr[] = { malloc(10), malloc(5), strdup(str) };\n" " return ptr;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void x()\n" "{\n" " 42,malloc(42);\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Return value of allocation function 'malloc' is not stored.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Return value of allocation function 'malloc' is not stored.\n", errout_str()); check("void *f()\n" "{\n" @@ -2540,7 +2522,7 @@ class TestMemleakNoVar : public TestFixture { "{\n" " f();\n" "}"); - ASSERT_EQUALS("[test.cpp:7]: (error) Return value of allocation function 'f' is not stored.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (error) Return value of allocation function 'f' is not stored.\n", errout_str()); check("void f()\n" // #8100 "{\n" @@ -2550,7 +2532,7 @@ class TestMemleakNoVar : public TestFixture { "{\n" " f();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void *f() {\n" // #8848 " struct S { void *alloc() { return malloc(10); } };\n" @@ -2559,26 +2541,26 @@ class TestMemleakNoVar : public TestFixture { "{\n" " f();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void x()\n" "{\n" " if(!malloc(5)) fail();\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Return value of allocation function 'malloc' is not stored.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Return value of allocation function 'malloc' is not stored.\n", errout_str()); check("FOO* factory() {\n" " FOO* foo = new (std::nothrow) FOO;\n" " return foo;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Ticket #6536 check("struct S { S(int) {} };\n" "void foo(int i) {\n" " S socket(i);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Ticket #6693 check("struct CTest {\n" @@ -2588,12 +2570,12 @@ class TestMemleakNoVar : public TestFixture { "void CTest::Initialise() {\n" " malloc();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() {\n" // #7348 - cast " p = (::X*)malloc(42);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #7182 "crash: CheckMemoryLeak::functionReturnType()" check("template auto unary_right_comma (Ts... ts) { return (ts , ...); }\n" @@ -2601,7 +2583,7 @@ class TestMemleakNoVar : public TestFixture { "int main() {\n" " unary_right_comma (a);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " new int[10];\n" @@ -2629,7 +2611,7 @@ class TestMemleakNoVar : public TestFixture { "[test.cpp:11]: (error) Return value of allocation function 'new' is not stored.\n" "[test.cpp:12]: (error) Return value of allocation function 'new' is not stored.\n" "[test.cpp:13]: (error) Return value of allocation function 'new' is not stored.\n", - errout.str()); + errout_str()); check("void f(int* p) {\n" " new auto('c');\n" @@ -2638,7 +2620,7 @@ class TestMemleakNoVar : public TestFixture { TODO_ASSERT_EQUALS("[test.cpp:2]: (error) Return value of allocation function 'new' is not stored.\n" "[test.cpp:3]: (error) Return value of allocation function 'new' is not stored.\n", "", - errout.str()); + errout_str()); check("void g(int* p) {\n" " new QWidget;\n" @@ -2672,13 +2654,13 @@ class TestMemleakNoVar : public TestFixture { " C{ new(p) int, 1 };\n" " C{ new QWidget, 1 };\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(bool b) { if (b && malloc(42)) {} }\n" // // #10858 "void g(bool b) { if (b || malloc(42)) {} }\n"); ASSERT_EQUALS("[test.cpp:1]: (error) Return value of allocation function 'malloc' is not stored.\n" "[test.cpp:2]: (error) Return value of allocation function 'malloc' is not stored.\n", - errout.str()); + errout_str()); check("void f0(const bool b) { b ? new int : nullptr; }\n" // #11155 "void f1(const bool b) { b ? nullptr : new int; }\n" @@ -2686,7 +2668,7 @@ class TestMemleakNoVar : public TestFixture { "void g1(const bool b) { h(b, b ? nullptr : new int); }\n"); ASSERT_EQUALS("[test.cpp:1]: (error) Return value of allocation function 'new' is not stored.\n" "[test.cpp:2]: (error) Return value of allocation function 'new' is not stored.\n", - errout.str()); + errout_str()); check("void f() {\n" // #11157 " switch (*new int) { case 42: break; }\n" @@ -2694,94 +2676,94 @@ class TestMemleakNoVar : public TestFixture { "}\n"); ASSERT_EQUALS("[test.cpp:2]: (error) Allocation with new, switch doesn't release it.\n" "[test.cpp:3]: (error) Allocation with malloc, switch doesn't release it.\n", - errout.str()); + errout_str()); check("void f() {\n" " Ref remove(new StringBuffer());\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" // #11039 " delete new int;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" // #11327 " int* p = (new int[3]) + 1;\n" " delete[] &p[-1];\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void smartPointerFunctionParam() { check("void x() {\n" " f(shared_ptr(new int(42)), g());\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Unsafe allocation. If g() throws, memory could be leaked. Use make_shared() instead.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Unsafe allocation. If g() throws, memory could be leaked. Use make_shared() instead.\n", errout_str()); check("void x() {\n" " h(12, f(shared_ptr(new int(42)), g()));\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Unsafe allocation. If g() throws, memory could be leaked. Use make_shared() instead.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Unsafe allocation. If g() throws, memory could be leaked. Use make_shared() instead.\n", errout_str()); check("void x() {\n" " f(unique_ptr(new int(42)), g());\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Unsafe allocation. If g() throws, memory could be leaked. Use make_unique() instead.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Unsafe allocation. If g() throws, memory could be leaked. Use make_unique() instead.\n", errout_str()); check("void x() {\n" " f(g(), shared_ptr(new int(42)));\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Unsafe allocation. If g() throws, memory could be leaked. Use make_shared() instead.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Unsafe allocation. If g() throws, memory could be leaked. Use make_shared() instead.\n", errout_str()); check("void x() {\n" " f(g(), unique_ptr(new int(42)));\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Unsafe allocation. If g() throws, memory could be leaked. Use make_unique() instead.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Unsafe allocation. If g() throws, memory could be leaked. Use make_unique() instead.\n", errout_str()); check("void x() {\n" " f(shared_ptr(new char), make_unique(32));\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Unsafe allocation. If make_unique() throws, memory could be leaked. Use make_shared() instead.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Unsafe allocation. If make_unique() throws, memory could be leaked. Use make_shared() instead.\n", errout_str()); check("void x() {\n" " f(g(124), h(\"test\", 234), shared_ptr(new char));\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Unsafe allocation. If h() throws, memory could be leaked. Use make_shared() instead.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Unsafe allocation. If h() throws, memory could be leaked. Use make_shared() instead.\n", errout_str()); check("void x() {\n" " f(shared_ptr(new std::string(\"\")), g());\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Unsafe allocation. If g() throws, memory could be leaked. Use make_shared() instead.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Unsafe allocation. If g() throws, memory could be leaked. Use make_shared() instead.\n", errout_str()); check("void g(int x) throw() { }\n" "void x() {\n" " f(g(124), shared_ptr(new char));\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void __declspec(nothrow) g(int x) { }\n" "void x() {\n" " f(g(124), shared_ptr(new char));\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void resourceLeak() { check("void foo() {\n" " fopen(\"file.txt\", \"r\");\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (error) Return value of allocation function 'fopen' is not stored.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (error) Return value of allocation function 'fopen' is not stored.\n", errout_str()); check("void foo() {\n" " FILE f* = fopen(\"file.txt\", \"r\");\n" " freopen(\"file.txt\", \"r\", f);\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Return value of allocation function 'freopen' is not stored.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Return value of allocation function 'freopen' is not stored.\n", errout_str()); check("void foo() {\n" " freopen(\"file.txt\", \"r\", stdin);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct Holder {\n" " Holder(FILE* f) : file(f) {}\n" @@ -2791,7 +2773,7 @@ class TestMemleakNoVar : public TestFixture { "void foo() {\n" " Holder h ( fopen(\"file.txt\", \"r\"));\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct Holder {\n" " Holder(FILE* f) : file(f) {}\n" @@ -2801,7 +2783,7 @@ class TestMemleakNoVar : public TestFixture { "void foo() {\n" " Holder ( fopen(\"file.txt\", \"r\"));\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct Holder {\n" " Holder(FILE* f) : file(f) {}\n" @@ -2811,7 +2793,7 @@ class TestMemleakNoVar : public TestFixture { "void foo() {\n" " Holder h { fopen(\"file.txt\", \"r\")};\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct Holder {\n" " Holder(FILE* f) : file(f) {}\n" @@ -2821,7 +2803,7 @@ class TestMemleakNoVar : public TestFixture { "void foo() {\n" " Holder h = fopen(\"file.txt\", \"r\");\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct Holder {\n" " Holder(FILE* f) : file(f) {}\n" @@ -2831,7 +2813,7 @@ class TestMemleakNoVar : public TestFixture { "void foo() {\n" " Holder { fopen(\"file.txt\", \"r\")};\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct Holder {\n" " Holder(int i, FILE* f) : file(f) {}\n" @@ -2841,7 +2823,7 @@ class TestMemleakNoVar : public TestFixture { "void foo() {\n" " Holder { 0, fopen(\"file.txt\", \"r\")};\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void getAllocationType() { @@ -2852,7 +2834,7 @@ class TestMemleakNoVar : public TestFixture { "void f() {\n" " makeThing();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #10631 check("struct Thing {\n" @@ -2872,19 +2854,19 @@ class TestMemleakNoVar : public TestFixture { " delete t;\n" " }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void crash1() { // #10729 check("void foo() {\n" " extern void *realloc (void *ptr, size_t size);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() {\n" " extern void *malloc (size_t size);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void openDevNull() { @@ -2892,7 +2874,7 @@ class TestMemleakNoVar : public TestFixture { " (void)open(\"/dev/null\", O_RDONLY);\n" " open(\"/dev/null\", O_WRONLY);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } }; REGISTER_TEST(TestMemleakNoVar) diff --git a/test/testnullpointer.cpp b/test/testnullpointer.cpp index 2f76746b37d3..df309274172e 100644 --- a/test/testnullpointer.cpp +++ b/test/testnullpointer.cpp @@ -178,9 +178,6 @@ class TestNullPointer : public TestFixture { #define check(...) check_(__FILE__, __LINE__, __VA_ARGS__) void check_(const char* file, int line, const char code[], bool inconclusive = false, const char filename[] = "test.cpp") { - // Clear the error buffer.. - errout.str(""); - const Settings settings1 = settingsBuilder(settings).certainty(Certainty::inconclusive, inconclusive).build(); // Tokenize.. @@ -194,9 +191,6 @@ class TestNullPointer : public TestFixture { #define checkP(...) checkP_(__FILE__, __LINE__, __VA_ARGS__) void checkP_(const char* file, int line, const char code[]) { - // Clear the error buffer.. - errout.str(""); - const Settings settings1 = settingsBuilder(settings).certainty(Certainty::inconclusive, false).build(); std::vector files(1, "test.cpp"); @@ -219,7 +213,7 @@ class TestNullPointer : public TestFixture { " while (tok);\n" " tok = tok->next();\n" "}", true); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (warning) Either the condition 'tok' is redundant or there is possible null pointer dereference: tok.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (warning) Either the condition 'tok' is redundant or there is possible null pointer dereference: tok.\n", errout_str()); // #2681 { @@ -233,7 +227,7 @@ class TestNullPointer : public TestFixture { "}\n"; check(code); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:6]: (warning) Either the condition 'tok' is redundant or there is possible null pointer dereference: tok.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:6]: (warning) Either the condition 'tok' is redundant or there is possible null pointer dereference: tok.\n", errout_str()); } check("void foo()\n" @@ -244,7 +238,7 @@ class TestNullPointer : public TestFixture { " tok = tok->next();\n" " }\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:3]: (warning) Either the condition 'while' is redundant or there is possible null pointer dereference: tok.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:3]: (warning) Either the condition 'while' is redundant or there is possible null pointer dereference: tok.\n", "", errout_str()); check("void foo(Token &tok)\n" "{\n" @@ -254,7 +248,7 @@ class TestNullPointer : public TestFixture { " char c = tok.read();\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo()\n" "{\n" @@ -265,7 +259,7 @@ class TestNullPointer : public TestFixture { " if( !tok ) break;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo()\n" "{\n" @@ -275,7 +269,7 @@ class TestNullPointer : public TestFixture { " tok = tok->next();\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(A*a)\n" "{\n" @@ -290,7 +284,7 @@ class TestNullPointer : public TestFixture { " break;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // dereference in outer scope.. check("void foo(int x, const Token *tok) {\n" @@ -299,20 +293,20 @@ class TestNullPointer : public TestFixture { " }\n" " tok->str();\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:5]: (warning) Either the condition 'tok' is redundant or there is possible null pointer dereference: tok.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:5]: (warning) Either the condition 'tok' is redundant or there is possible null pointer dereference: tok.\n", errout_str()); check("int foo(const Token *tok)\n" "{\n" " while (tok){;}\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int foo(const Token *tok)\n" "{\n" " while (tok){;}\n" " char a[2] = {0,0};\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct b {\n" " b * c;\n" @@ -324,7 +318,7 @@ class TestNullPointer : public TestFixture { " d = d->c;\n" " if (!d) throw;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct b {\n" " b * c;\n" @@ -335,7 +329,7 @@ class TestNullPointer : public TestFixture { " if (d && d->i != 0) {}\n" " }\n" "}\n"); - ASSERT_EQUALS("[test.cpp:7] -> [test.cpp:6]: (warning) Either the condition 'd' is redundant or there is possible null pointer dereference: d.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7] -> [test.cpp:6]: (warning) Either the condition 'd' is redundant or there is possible null pointer dereference: d.\n", errout_str()); } void nullpointer1() { @@ -349,7 +343,7 @@ class TestNullPointer : public TestFixture { " else if (a->x == 2) { }\n" " if (a) { }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // ticket #2134 - sizeof doesn't dereference check("void f() {\n" @@ -359,7 +353,7 @@ class TestNullPointer : public TestFixture { " if (!list)\n" " ;\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // ticket #2245 - sizeof doesn't dereference check("void f(Bar *p) {\n" @@ -367,7 +361,7 @@ class TestNullPointer : public TestFixture { " int sz = sizeof(p->x);\n" " }\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } @@ -379,7 +373,7 @@ class TestNullPointer : public TestFixture { " while (fred);\n" " fred.hello();\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } // Dereferencing a struct and then checking if it is null @@ -395,7 +389,7 @@ class TestNullPointer : public TestFixture { " if (!abc)\n" " ;\n" "}"); - ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:3]: (warning) Either the condition '!abc' is redundant or there is possible null pointer dereference: abc.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:3]: (warning) Either the condition '!abc' is redundant or there is possible null pointer dereference: abc.\n", errout_str()); check("void foo(struct ABC *abc) {\n" " bar(abc->a);\n" @@ -406,7 +400,7 @@ class TestNullPointer : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:2]: (warning) Either the condition '!abc' is redundant or there is possible null pointer dereference: abc.\n" "[test.cpp:5] -> [test.cpp:3]: (warning) Either the condition '!abc' is redundant or there is possible null pointer dereference: abc.\n" - "[test.cpp:5] -> [test.cpp:4]: (warning) Either the condition '!abc' is redundant or there is possible null pointer dereference: abc.\n", errout.str()); + "[test.cpp:5] -> [test.cpp:4]: (warning) Either the condition '!abc' is redundant or there is possible null pointer dereference: abc.\n", errout_str()); check("void foo(ABC *abc) {\n" " if (abc->a == 3) {\n" @@ -416,7 +410,7 @@ class TestNullPointer : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:5] -> [test.cpp:2]: (warning) Either the condition 'abc' is redundant or there is possible null pointer dereference: abc.\n", - errout.str()); + errout_str()); check("void f(ABC *abc) {\n" " if (abc->x == 0) {\n" @@ -424,7 +418,7 @@ class TestNullPointer : public TestFixture { " }\n" " if (!abc);\n" "}"); - ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:2]: (warning) Either the condition '!abc' is redundant or there is possible null pointer dereference: abc.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:2]: (warning) Either the condition '!abc' is redundant or there is possible null pointer dereference: abc.\n", errout_str()); // TODO: False negative if member of member is dereferenced check("void foo(ABC *abc) {\n" @@ -432,7 +426,7 @@ class TestNullPointer : public TestFixture { " if (abc->next)\n" " ;\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2]: (warning) Possible null pointer dereference: abc - otherwise it is redundant to check it against null.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2]: (warning) Possible null pointer dereference: abc - otherwise it is redundant to check it against null.\n", "", errout_str()); check("void foo(ABC *abc) {\n" " abc->a = 0;\n" @@ -441,7 +435,7 @@ class TestNullPointer : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:3] -> [test.cpp:2]: (warning) Either the condition 'abc' is redundant or there is possible null pointer dereference: abc.\n", - errout.str()); + errout_str()); // ok dereferencing in a condition check("void foo(struct ABC *abc)\n" @@ -450,13 +444,13 @@ class TestNullPointer : public TestFixture { " if (!abc)\n" " ;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(struct ABC *abc) {\n" " int x = abc && a(abc->x);\n" " if (abc) { }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // ok to use a linked list.. check("void foo(struct ABC *abc)\n" @@ -465,13 +459,13 @@ class TestNullPointer : public TestFixture { " if (!abc)\n" " ;\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(struct ABC *abc) {\n" " abc = (ABC *)(abc->_next);\n" " if (abc) { }" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // reassign struct.. check("void foo(struct ABC *abc)\n" @@ -481,7 +475,7 @@ class TestNullPointer : public TestFixture { " if (!abc)\n" " ;\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(struct ABC *abc)\n" "{\n" @@ -490,7 +484,7 @@ class TestNullPointer : public TestFixture { " if (!abc)\n" " ;\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // goto.. check("void foo(struct ABC *abc)\n" @@ -504,7 +498,7 @@ class TestNullPointer : public TestFixture { " if (!abc)\n" " ;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // loops.. check("void foo(struct ABC *abc)\n" @@ -518,7 +512,7 @@ class TestNullPointer : public TestFixture { " }\n" " while (a > 0);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f()\n" "{\n" @@ -530,7 +524,7 @@ class TestNullPointer : public TestFixture { " return;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // dynamic_cast.. check("void foo(ABC *abc)\n" @@ -539,7 +533,7 @@ class TestNullPointer : public TestFixture { " if (!dynamic_cast(abc))\n" " ;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #2641 - global pointer, function call check("ABC *abc;\n" @@ -548,14 +542,14 @@ class TestNullPointer : public TestFixture { " do_stuff();\n" " if (abc) { }\n" "}"); - ASSERT_EQUALS("",errout.str()); + ASSERT_EQUALS("",errout_str()); check("Fred *fred;\n" "void f() {\n" " fred->foo();\n" " if (fred) { }\n" "}"); - ASSERT_EQUALS("",errout.str()); + ASSERT_EQUALS("",errout_str()); // #2641 - local pointer, function call check("void f() {\n" @@ -566,7 +560,7 @@ class TestNullPointer : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:5] -> [test.cpp:3]: (warning) Either the condition 'abc' is redundant or there is possible null pointer dereference: abc.\n", - errout.str()); + errout_str()); // #2641 - local pointer, function call check("void f(ABC *abc) {\n" @@ -576,7 +570,7 @@ class TestNullPointer : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:4] -> [test.cpp:2]: (warning) Either the condition 'abc' is redundant or there is possible null pointer dereference: abc.\n", - errout.str()); + errout_str()); // #2691 - switch/break check("void f(ABC *abc) {\n" @@ -589,32 +583,32 @@ class TestNullPointer : public TestFixture { " break;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #3128 check("void f(ABC *abc) {\n" " x(!abc || y(abc->a));\n" " if (abc) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(ABC *abc) {\n" " x(def || !abc || y(def, abc->a));\n" " if (abc) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(ABC *abc) {\n" " x(abc && y(def, abc->a));\n" " if (abc) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(ABC *abc) {\n" " x(def && abc && y(def, abc->a));\n" " if (abc) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #3228 - calling function with null object { @@ -625,7 +619,7 @@ class TestNullPointer : public TestFixture { check(code); ASSERT_EQUALS( "[test.cpp:3] -> [test.cpp:2]: (warning) Either the condition 'fred' is redundant or there is possible null pointer dereference: fred.\n", - errout.str()); + errout_str()); } // #3425 - false positives when there are macros @@ -634,7 +628,7 @@ class TestNullPointer : public TestFixture { " fred->x = 0;\n" " IF(!fred){}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() {\n" " BUFFER *buffer = get_buffer();\n" @@ -642,7 +636,7 @@ class TestNullPointer : public TestFixture { " uv_fatal_error();\n" " buffer->x = 11;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } // Dereferencing a pointer and then checking if it is null @@ -656,7 +650,7 @@ class TestNullPointer : public TestFixture { " if (!p)\n" " ;\n" "}"); - ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:3]: (warning) Either the condition '!p' is redundant or there is possible null pointer dereference: p.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:3]: (warning) Either the condition '!p' is redundant or there is possible null pointer dereference: p.\n", errout_str()); check("void foo(int *p)\n" "{\n" @@ -665,7 +659,7 @@ class TestNullPointer : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:4] -> [test.cpp:3]: (warning) Either the condition 'p' is redundant or there is possible null pointer dereference: p.\n", - errout.str()); + errout_str()); check("void foo(int *p)\n" "{\n" @@ -674,7 +668,7 @@ class TestNullPointer : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:4] -> [test.cpp:3]: (warning) Either the condition 'p' is redundant or there is possible null pointer dereference: p.\n", - errout.str()); + errout_str()); check("void foo(int *p)\n" "{\n" @@ -682,7 +676,7 @@ class TestNullPointer : public TestFixture { " if (!p)\n" " ;\n" "}"); - ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:3]: (warning) Either the condition '!p' is redundant or there is possible null pointer dereference: p.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:3]: (warning) Either the condition '!p' is redundant or there is possible null pointer dereference: p.\n", errout_str()); check("void foo(char *p)\n" "{\n" @@ -690,14 +684,14 @@ class TestNullPointer : public TestFixture { " if (!p)\n" " ;\n" "}"); - ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:3]: (warning) Either the condition '!p' is redundant or there is possible null pointer dereference: p.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:3]: (warning) Either the condition '!p' is redundant or there is possible null pointer dereference: p.\n", errout_str()); check("void foo(char *p)\n" "{\n" " if (*p == 0) { }\n" " if (!p) { }\n" "}"); - ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:3]: (warning) Either the condition '!p' is redundant or there is possible null pointer dereference: p.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:3]: (warning) Either the condition '!p' is redundant or there is possible null pointer dereference: p.\n", errout_str()); // no error check("void foo()\n" @@ -707,7 +701,7 @@ class TestNullPointer : public TestFixture { " if (!p)\n" " ;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo()\n" "{\n" @@ -715,7 +709,7 @@ class TestNullPointer : public TestFixture { " if (!p)\n" " ;\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(int *p)\n" "{\n" @@ -726,7 +720,7 @@ class TestNullPointer : public TestFixture { " if (!p)\n" " ;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(int x)\n" "{\n" @@ -734,7 +728,7 @@ class TestNullPointer : public TestFixture { " if (x == 0)\n" " ;\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(int *p)\n" "{\n" @@ -742,7 +736,7 @@ class TestNullPointer : public TestFixture { " if (!p)\n" " ;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(int *p, bool x)\n" "{\n" @@ -752,14 +746,14 @@ class TestNullPointer : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:4] -> [test.cpp:3]: (warning) Either the condition '!p' is redundant or there is possible null pointer dereference: p.\n", - errout.str()); + errout_str()); // while check("void f(int *p) {\n" " *p = 0;\n" " while (p) { p = 0; }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int *p) {\n" " *p = 0;\n" @@ -767,7 +761,7 @@ class TestNullPointer : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:3] -> [test.cpp:2]: (warning) Either the condition 'p' is redundant or there is possible null pointer dereference: p.\n", - errout.str()); + errout_str()); // Ticket #3125 check("void foo(ABC *p)\n" @@ -776,7 +770,7 @@ class TestNullPointer : public TestFixture { " if (!p)\n" " ;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(ABC *p)\n" "{\n" @@ -784,14 +778,14 @@ class TestNullPointer : public TestFixture { " if (!p)\n" " ;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " int * a=0;\n" " if (!a) {};\n" " int c = a ? 0 : 1;\n" "}\n",true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #3686 check("void f() {\n" @@ -799,14 +793,14 @@ class TestNullPointer : public TestFixture { " if (!a) {};\n" " int c = a ? b : b+1;\n" "}\n",true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " int * a=0;\n" " if (!a) {};\n" " int c = (a) ? b : b+1;\n" "}\n",true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(P *p)\n" "{\n" @@ -816,7 +810,7 @@ class TestNullPointer : public TestFixture { " else\n" " p = p->next();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(Document *doc) {\n" " int x = doc && doc->x;\n" @@ -824,20 +818,20 @@ class TestNullPointer : public TestFixture { " return;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #3128 - false positive check("void f(int *p) {\n" " assert(!p || (*p<=6));\n" " if (p) { *p = 0; }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int *p) {\n" " assert(p && (*p<=6));\n" " if (p) { *p = 0; }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int *p) {\n" " *p = 12;\n" @@ -846,7 +840,7 @@ class TestNullPointer : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:3] -> [test.cpp:2]: (warning) Either the condition 'p' is redundant or there is possible null pointer dereference: p.\n", - errout.str()); + errout_str()); check("void foo(x *p)\n" "{\n" @@ -854,7 +848,7 @@ class TestNullPointer : public TestFixture { " if (!p)\n" " ;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(x *p)\n" "{\n" @@ -862,7 +856,7 @@ class TestNullPointer : public TestFixture { " if (!p)\n" " ;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(x *p)\n" "{\n" @@ -870,7 +864,7 @@ class TestNullPointer : public TestFixture { " if (!p)\n" " ;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(x *p)\n" "{\n" @@ -878,7 +872,7 @@ class TestNullPointer : public TestFixture { " if (!p)\n" " ;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(struct ABC *abc)\n" "{\n" @@ -886,25 +880,25 @@ class TestNullPointer : public TestFixture { " if (!abc)\n" " ;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(struct ABC *abc) {\n" // #4523 " abc = (*abc).next;\n" " if (abc) { }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(struct ABC *abc) {\n" // #4523 " abc = (*abc->ptr);\n" " if (abc) { }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f(Item *item) {\n" " x = item ? ab(item->x) : 0;\n" " if (item) { }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f(Item *item) {\n" " item->x = 0;\n" @@ -913,7 +907,7 @@ class TestNullPointer : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:4] -> [test.cpp:2]: (warning) Either the condition 'item' is redundant or there is possible null pointer dereference: item.\n", - errout.str()); + errout_str()); check("BOOL GotoFlyAnchor()\n" // #2243 "{\n" @@ -925,7 +919,7 @@ class TestNullPointer : public TestFixture { " if( !pFrm )\n" " return FALSE;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Ticket #2463 check("struct A\n" @@ -945,7 +939,7 @@ class TestNullPointer : public TestFixture { " }\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #2525 - sizeof check("void f() {\n" @@ -954,26 +948,26 @@ class TestNullPointer : public TestFixture { " if (!test)\n" " ;\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(type* p) {\n" // #4983 " x(sizeof p[0]);\n" " if (!p)\n" " ;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #3023 - checked deref check("void f(struct ABC *abc) {\n" " WARN_ON(!abc || abc->x == 0);\n" " if (!abc) { }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(struct ABC *abc) {\n" " WARN_ON(!abc || abc->x == 7);\n" " if (!abc) { }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #3425 - false positives when there are macros checkP("#define IF if\n" @@ -981,19 +975,19 @@ class TestNullPointer : public TestFixture { " *p = 0;\n" " IF(!p){}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" // #3914 - false positive " int *p;\n" " ((p=ret()) && (x=*p));\n" " if (p);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S { struct T { char c; } *p; };\n" // #6541 "char f(S* s) { return s->p ? 'a' : s->p->c; }\n"); ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:2]: (warning) Either the condition 's->p' is redundant or there is possible null pointer dereference: s->p.\n", - errout.str()); + errout_str()); } void nullpointer5() { @@ -1004,7 +998,7 @@ class TestNullPointer : public TestFixture { " if (!a)\n" " return;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } // Execution paths.. @@ -1020,17 +1014,17 @@ class TestNullPointer : public TestFixture { " p->abcd();\n" "}"); TODO_ASSERT_EQUALS("[test.cpp:8]: (error) Possible null pointer dereference: p\n", - "", errout.str()); + "", errout_str()); check("static void foo() {\n" " int &r = *(int*)0;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (error) Null pointer dereference: (int*)0\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (error) Null pointer dereference: (int*)0\n", errout_str()); check("static void foo(int x) {\n" " int y = 5 + *(int*)0;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (error) Null pointer dereference: (int*)0\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (error) Null pointer dereference: (int*)0\n", errout_str()); { const char code[] = "static void foo() {\n" @@ -1039,13 +1033,13 @@ class TestNullPointer : public TestFixture { "}\n"; check(code); - ASSERT_EQUALS("[test.cpp:3]: (error) Null pointer dereference: abc\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Null pointer dereference: abc\n", errout_str()); } check("static void foo() {\n" " std::cout << *(int*)0;" "}"); - ASSERT_EQUALS("[test.cpp:2]: (error) Null pointer dereference: (int*)0\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (error) Null pointer dereference: (int*)0\n", errout_str()); check("void f()\n" "{\n" @@ -1055,12 +1049,12 @@ class TestNullPointer : public TestFixture { " }\n" " c[0] = 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:7]: (error) Null pointer dereference: c\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (error) Null pointer dereference: c\n", errout_str()); check("static void foo() {\n" " if (3 > *(int*)0);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (error) Null pointer dereference: (int*)0\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (error) Null pointer dereference: (int*)0\n", errout_str()); // no false positive.. check("static void foo()\n" @@ -1069,20 +1063,20 @@ class TestNullPointer : public TestFixture { " p = new Foo;\n" " p->abcd();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo()\n" "{\n" " int sz = sizeof((*(struct dummy *)0).x);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void get_offset(long &offset)\n" "{\n" " mystruct * temp; temp = 0;\n" " offset = (long)(&(temp->z));\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Ticket #1893 - try/catch inside else check("int *test(int *Z)\n" @@ -1101,7 +1095,7 @@ class TestNullPointer : public TestFixture { " *Q=1;\n" " return Q;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int *test(int *Z)\n" "{\n" @@ -1117,7 +1111,7 @@ class TestNullPointer : public TestFixture { " *Q=1;\n" " return Q;\n" "}"); - ASSERT_EQUALS("[test.cpp:12]: (warning) Possible null pointer dereference: Q\n", errout.str()); + ASSERT_EQUALS("[test.cpp:12]: (warning) Possible null pointer dereference: Q\n", errout_str()); // Ticket #2052 (false positive for 'else continue;') check("void f() {\n" @@ -1128,7 +1122,7 @@ class TestNullPointer : public TestFixture { " *p = 0;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // function pointer.. check("void foo()\n" @@ -1137,7 +1131,7 @@ class TestNullPointer : public TestFixture { " f = 0;\n" " f();\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (error) Null pointer dereference: f\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Null pointer dereference: f\n", errout_str()); check("int* g();\n" // #11007 "int* f() {\n" @@ -1146,7 +1140,7 @@ class TestNullPointer : public TestFixture { " fun = g;\n" " return fun();\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // loops.. check("void f() {\n" @@ -1155,7 +1149,7 @@ class TestNullPointer : public TestFixture { " int x = *p + 1;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Null pointer dereference: p\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Null pointer dereference: p\n", errout_str()); check("void f(int a) {\n" " const char *p = 0;\n" @@ -1166,21 +1160,21 @@ class TestNullPointer : public TestFixture { " if (a && (p[i] == '1'));\n" " }\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // ticket #2251: taking the address of member check("void f() {\n" " Fred *fred = 0;\n" " int x = &fred->x;\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // ticket #3220: dereferencing a null pointer is UB check("void f() {\n" " Fred *fred = NULL;\n" " fred->do_something();\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Null pointer dereference: fred\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Null pointer dereference: fred\n", errout_str()); // ticket #3570 - parsing of conditions { @@ -1190,21 +1184,21 @@ class TestNullPointer : public TestFixture { " p = q;\n" " if (p && *p) { }\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " int *p = NULL;\n" " if (x)\n" " p = q;\n" " if (!p || *p) { }\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " int *p = NULL;\n" " if (x)\n" " p = q;\n" " if (p || *p) { }\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (warning) Possible null pointer dereference: p\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (warning) Possible null pointer dereference: p\n", errout_str()); } // ticket #8831 - FP triggered by if/return/else sequence @@ -1220,14 +1214,14 @@ class TestNullPointer : public TestFixture { "void g() {\n" " f(NULL, NULL);\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } check("void f() {\n" // #5979 " int* const crash = 0;\n" " *crash = 0;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:3]: (error) Null pointer dereference: crash\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Null pointer dereference: crash\n", errout_str()); } // Ticket #2350 @@ -1245,7 +1239,7 @@ class TestNullPointer : public TestFixture { " argv32[i] = 0;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // No false negative: check("void foo() {\n" @@ -1260,7 +1254,7 @@ class TestNullPointer : public TestFixture { " argv32[i] = 0;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:10]: (warning) Possible null pointer dereference: argv32\n", errout.str()); + ASSERT_EQUALS("[test.cpp:10]: (warning) Possible null pointer dereference: argv32\n", errout_str()); // #2231 - error if assignment in loop is not used // extracttests.start: int y[20]; @@ -1276,7 +1270,7 @@ class TestNullPointer : public TestFixture { "\n" " *p = 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:11]: (warning) Possible null pointer dereference: p\n", errout.str()); + ASSERT_EQUALS("[test.cpp:11]: (warning) Possible null pointer dereference: p\n", errout_str()); } void nullpointer7() { @@ -1285,7 +1279,7 @@ class TestNullPointer : public TestFixture { " wxLongLong x = 0;\n" " int y = x.GetValue();\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer9() { //#ticket 1778 @@ -1294,7 +1288,7 @@ class TestNullPointer : public TestFixture { " std::string * x = 0;\n" " *x = \"test\";\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Null pointer dereference: x\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Null pointer dereference: x\n", errout_str()); } void nullpointer10() { @@ -1304,7 +1298,7 @@ class TestNullPointer : public TestFixture { " struct my_type* p = 0;\n" " p->x = 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Null pointer dereference: p\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Null pointer dereference: p\n", errout_str()); } void nullpointer11() { // ticket #2812 @@ -1316,7 +1310,7 @@ class TestNullPointer : public TestFixture { " p = 0;\n" " return p->x;\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (error) Null pointer dereference: p\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Null pointer dereference: p\n", errout_str()); } void nullpointer12() { // ticket #2470, #4035 @@ -1327,10 +1321,10 @@ class TestNullPointer : public TestFixture { "}\n"; check(code, false, "test.cpp"); // C++ file => nullptr means NULL - ASSERT_EQUALS("[test.cpp:4]: (error) Null pointer dereference: i\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Null pointer dereference: i\n", errout_str()); check(code, false, "test.c"); // C file => nullptr does not mean NULL - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer15() { // #3560 @@ -1339,7 +1333,7 @@ class TestNullPointer : public TestFixture { " if (x) p = \"abcd\";\n" " return p ? f(*p) : f(0);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer16() { // #3591 @@ -1348,7 +1342,7 @@ class TestNullPointer : public TestFixture { " bar(&p);\n" " *p = 0;\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer17() { // #3567 @@ -1357,14 +1351,14 @@ class TestNullPointer : public TestFixture { " if (x) { return 0; }\n" " return !p || *p;\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int foo() {\n" " int *p = 0;\n" " if (x) { return 0; }\n" " return p && *p;\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer18() { // #1927 @@ -1377,14 +1371,14 @@ class TestNullPointer : public TestFixture { " i++;\n" " };\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (error) Null pointer dereference: str\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Null pointer dereference: str\n", errout_str()); } void nullpointer19() { // #3811 check("int foo() {\n" " perror(0);\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer20() { // #3807 @@ -1393,14 +1387,14 @@ class TestNullPointer : public TestFixture { " if (x) p = q;\n" " if (p ? p->x || p->y : 0) { }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x) {\n" // false negative " struct xy *p = 0;\n" " if (x) p = q;\n" " if (y ? p->x : p->y) { }\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:4]: (warning) Possible null pointer dereference: p\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:4]: (warning) Possible null pointer dereference: p\n", "", errout_str()); } void nullpointer21() { // #4038 - fp: if (x) p=q; else return; @@ -1410,7 +1404,7 @@ class TestNullPointer : public TestFixture { " else return;\n" " *p = 0;\n" // <- p is not NULL "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer23() { // #4665 @@ -1419,7 +1413,7 @@ class TestNullPointer : public TestFixture { " char cBuf[10];\n" " sprintf(cBuf, \"%s\", c ? c : \"0\" );\n" "}"); - ASSERT_EQUALS("",errout.str()); + ASSERT_EQUALS("",errout_str()); } void nullpointer24() { // #5083 - fp: chained assignment @@ -1428,7 +1422,7 @@ class TestNullPointer : public TestFixture { " x = c = new char[10];\n" " *c = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer25() { // #5061 @@ -1438,7 +1432,7 @@ class TestNullPointer : public TestFixture { " if (data == 1 && array[i] == 0)\n" " std::cout << \"test\";\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Null pointer dereference: array\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Null pointer dereference: array\n", errout_str()); } void nullpointer26() { // #3589 @@ -1455,7 +1449,7 @@ class TestNullPointer : public TestFixture { " return 0.0;\n" " return 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer27() { // #6568 @@ -1469,7 +1463,7 @@ class TestNullPointer : public TestFixture { " *pointer_=0;\n" " return *this;\n" "}"); - ASSERT_EQUALS("[test.cpp:8]: (error) Null pointer dereference: pointer_\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8]: (error) Null pointer dereference: pointer_\n", errout_str()); } void nullpointer28() { // #6491 @@ -1481,7 +1475,7 @@ class TestNullPointer : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:3] -> [test.cpp:4]: (warning) Either the condition 's' is redundant or there is possible null pointer dereference: s.\n", - errout.str()); + errout_str()); } void nullpointer30() { // #6392 @@ -1498,7 +1492,7 @@ class TestNullPointer : public TestFixture { "}\n", true); ASSERT_EQUALS( "[test.cpp:4] -> [test.cpp:3]: (warning) Either the condition 'values' is redundant or there is possible null pointer dereference: values.\n", - errout.str()); + errout_str()); } void nullpointer31() { // #8482 @@ -1513,7 +1507,7 @@ class TestNullPointer : public TestFixture { " else { return; }\n" " (void)f->x;\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("typedef struct\n" "{\n" @@ -1530,7 +1524,7 @@ class TestNullPointer : public TestFixture { "\n" " (void)f->x;\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer32() { // #8460 @@ -1542,7 +1536,7 @@ class TestNullPointer : public TestFixture { " return *p1;\n" " }\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:6]: (warning) Either the condition 'ptr' is redundant or there is possible null pointer dereference: p1.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:6]: (warning) Either the condition 'ptr' is redundant or there is possible null pointer dereference: p1.\n", errout_str()); } void nullpointer33() { @@ -1552,7 +1546,7 @@ class TestNullPointer : public TestFixture { " else\n" " *x = 3;\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:5]: (warning) Either the condition 'x!=nullptr' is redundant or there is possible null pointer dereference: x.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:5]: (warning) Either the condition 'x!=nullptr' is redundant or there is possible null pointer dereference: x.\n", errout_str()); } void nullpointer34() { @@ -1564,7 +1558,7 @@ class TestNullPointer : public TestFixture { " if (!x) g();\n" " return *x;\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer35() { @@ -1577,7 +1571,7 @@ class TestNullPointer : public TestFixture { "void h() {\n" " g(0);\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool f(int*);\n" "void g(int* x) {\n" @@ -1590,7 +1584,7 @@ class TestNullPointer : public TestFixture { " g(0);\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer36() { @@ -1602,7 +1596,7 @@ class TestNullPointer : public TestFixture { " start++;\n" " return (start);\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer37() { @@ -1621,7 +1615,7 @@ class TestNullPointer : public TestFixture { " }\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer38() { @@ -1633,7 +1627,7 @@ class TestNullPointer : public TestFixture { " }\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer39() { @@ -1644,7 +1638,7 @@ class TestNullPointer : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:3] -> [test.cpp:4]: (warning) Either the condition 'a->x==NULL' is redundant or there is possible null pointer dereference: a->x.\n", - errout.str()); + errout_str()); } void nullpointer40() { @@ -1655,7 +1649,7 @@ class TestNullPointer : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:3] -> [test.cpp:4]: (warning) Either the condition 'a->x==nullptr' is redundant or there is possible null pointer dereference: a->x.\n", - errout.str()); + errout_str()); } void nullpointer41() { @@ -1666,14 +1660,14 @@ class TestNullPointer : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:3] -> [test.cpp:4]: (warning) Either the condition 'a->g()==nullptr' is redundant or there is possible null pointer dereference: a->g().\n", - errout.str()); + errout_str()); check("struct A { int * g(); };\n" "void f(struct A *a) {\n" " if (a->g() == nullptr) {}\n" " *(a->g());\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer42() { @@ -1684,7 +1678,7 @@ class TestNullPointer : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:3] -> [test.cpp:4]: (warning) Either the condition 'a->g()==nullptr' is redundant or there is possible null pointer dereference: a->g().\n", - errout.str()); + errout_str()); } void nullpointer43() { @@ -1695,7 +1689,7 @@ class TestNullPointer : public TestFixture { " (void)*a->x;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer44() { @@ -1707,7 +1701,7 @@ class TestNullPointer : public TestFixture { " return 0;\n" " return b->get();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #9423 check("extern F* GetF();\n" "extern L* GetL();\n" @@ -1724,7 +1718,7 @@ class TestNullPointer : public TestFixture { " return;\n" " lPtr->Clear();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer45() { @@ -1741,7 +1735,7 @@ class TestNullPointer : public TestFixture { " a d = *c->b();\n" " return d;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct a {\n" " a *b() const;\n" @@ -1757,7 +1751,7 @@ class TestNullPointer : public TestFixture { " a d = *c->b();\n" " return d;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer46() { @@ -1765,7 +1759,7 @@ class TestNullPointer : public TestFixture { " char* p = new(std::nothrow) char[1];\n" " if( p ) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer47() { @@ -1774,7 +1768,7 @@ class TestNullPointer : public TestFixture { " const int *const a = p;\n" " if(!a){}\n" "}"); - ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:2]: (warning) Either the condition '!a' is redundant or there is possible null pointer dereference: p.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:2]: (warning) Either the condition '!a' is redundant or there is possible null pointer dereference: p.\n", errout_str()); } void nullpointer48() { @@ -1783,7 +1777,7 @@ class TestNullPointer : public TestFixture { "int& g(int* x) {\n" " return f(*x);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer49() { @@ -1793,7 +1787,7 @@ class TestNullPointer : public TestFixture { " *p +=2;\n" " if(n < 120) *q+=12;\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (warning) Possible null pointer dereference: q\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (warning) Possible null pointer dereference: q\n", errout_str()); check("void f(int *p, int n) {\n" " int *q = 0;\n" @@ -1801,7 +1795,7 @@ class TestNullPointer : public TestFixture { " *p +=2;\n" " if(n > 10) *q+=12;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer50() { @@ -1817,7 +1811,7 @@ class TestNullPointer : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:2] -> [test.cpp:6]: (warning) Either the condition '!p' is redundant or there is possible null pointer dereference: p.\n", - errout.str()); + errout_str()); } void nullpointer51() { @@ -1831,7 +1825,7 @@ class TestNullPointer : public TestFixture { " return nullptr;\n" " return e->b();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer52() { @@ -1841,7 +1835,7 @@ class TestNullPointer : public TestFixture { " if (!c) c = &a;\n" " return *c;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f(int a, int* b) {\n" " int* c = nullptr;\n" @@ -1850,7 +1844,7 @@ class TestNullPointer : public TestFixture { " if (d) c = &a;\n" " return *c;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A { int* x; };\n" "int f(int a, int* b) {\n" @@ -1860,7 +1854,7 @@ class TestNullPointer : public TestFixture { " if (!c.x) c.x = &a;\n" " return *c.x;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A { int* x; };\n" "int f(int a, int* b) {\n" @@ -1871,7 +1865,7 @@ class TestNullPointer : public TestFixture { " if (d) c.x = &a;\n" " return *c.x;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A { int* x; };\n" "int f(int a, int* b) {\n" @@ -1882,7 +1876,7 @@ class TestNullPointer : public TestFixture { " if (!d) c.x = &a;\n" " return *c.x;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:8]: (warning) Possible null pointer dereference: c.x\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8]: (warning) Possible null pointer dereference: c.x\n", errout_str()); } void nullpointer53() { @@ -1894,7 +1888,7 @@ class TestNullPointer : public TestFixture { "void bar() {\n" " f(0, 0);\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Possible null pointer dereference: params\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Possible null pointer dereference: params\n", errout_str()); } void nullpointer54() { @@ -1910,7 +1904,7 @@ class TestNullPointer : public TestFixture { " int **array = NULL;\n" " foo (array, 0);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer55() { @@ -1922,7 +1916,7 @@ class TestNullPointer : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:5] -> [test.cpp:3]: (warning) Either the condition 'tok3' is redundant or there is possible null pointer dereference: tok3.\n", - errout.str()); + errout_str()); check("void f(int* t1, int* t2) {\n" " while (t1 && t2 &&\n" @@ -1933,7 +1927,7 @@ class TestNullPointer : public TestFixture { " if (!t1 || !t2)\n" " return;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool f(int* i);\n" "void g(int* i) {\n" @@ -1941,7 +1935,7 @@ class TestNullPointer : public TestFixture { " i++;\n" " if (!i) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer56() { @@ -1953,7 +1947,7 @@ class TestNullPointer : public TestFixture { " for (ListEntry *cursor = listHead; cursor != NULL; prev = cursor, cursor = cursor->next) {}\n" " if (prev) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer57() { @@ -1968,7 +1962,7 @@ class TestNullPointer : public TestFixture { " fn();\n" " }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer58() { @@ -1978,7 +1972,7 @@ class TestNullPointer : public TestFixture { " int sz = (!*(&sPtr) || ((*(&sPtr))->entry[0] > 15)) ?\n" " sizeof((*(&sPtr))->entry[0]) : 123456789;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer59() { @@ -1993,7 +1987,7 @@ class TestNullPointer : public TestFixture { " (*pfreeboxes)->prev = nullptr;\n" " b->next = nullptr;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer60() { @@ -2006,7 +2000,7 @@ class TestNullPointer : public TestFixture { " if (!strcmp(\"00000000000000000000000000000000\", s1) )\n" " return;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer61() { @@ -2024,7 +2018,7 @@ class TestNullPointer : public TestFixture { " ;\n" " }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A {\n" " A* g() const;\n" @@ -2039,7 +2033,7 @@ class TestNullPointer : public TestFixture { " if (!b || b == b->g()->h())\n" " return;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer62() { @@ -2050,7 +2044,7 @@ class TestNullPointer : public TestFixture { " std::string b = x && x->f() ? \"\" : \"\";\n" " if (x) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A {\n" " bool f()() const;\n" @@ -2059,7 +2053,7 @@ class TestNullPointer : public TestFixture { " std::string b = (!x || x->f()) ? \"\" : \"\";\n" " if (x) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A {\n" " A * aa;\n" @@ -2069,7 +2063,7 @@ class TestNullPointer : public TestFixture { " b(x ? x->aa : nullptr);\n" " if (!x) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer63() { @@ -2083,7 +2077,7 @@ class TestNullPointer : public TestFixture { " d = f(d->b()) ? d->a() : nullptr;\n" " if (d && f(d->b())) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer64() { @@ -2101,7 +2095,7 @@ class TestNullPointer : public TestFixture { " if (c)\n" " for (A *d = c; d != aq; d = d->f()) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A {\n" " A* g() const;\n" @@ -2118,7 +2112,7 @@ class TestNullPointer : public TestFixture { " if (!y) {}\n" " }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer65() { @@ -2138,7 +2132,7 @@ class TestNullPointer : public TestFixture { " return a->get();\n" " return 0;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer66() { @@ -2155,7 +2149,7 @@ class TestNullPointer : public TestFixture { " MyFree(&v);\n" " return ret;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer67() { @@ -2170,7 +2164,7 @@ class TestNullPointer : public TestFixture { " return 0;\n" " return -1;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int result;\n" "\n" @@ -2182,7 +2176,7 @@ class TestNullPointer : public TestFixture { " return 0;\n" " return -1;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer68() { @@ -2193,7 +2187,7 @@ class TestNullPointer : public TestFixture { " c = c->b;\n" " if (c->b) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A {\n" " A* b;\n" @@ -2203,7 +2197,7 @@ class TestNullPointer : public TestFixture { " A *e = c;\n" " while (nullptr != (e = e->b)) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer69() { @@ -2216,7 +2210,7 @@ class TestNullPointer : public TestFixture { "}\n"); ASSERT_EQUALS( "[test.cpp:3] -> [test.cpp:5]: (warning) Either the condition 'scope' is redundant or there is possible null pointer dereference: scope.\n", - errout.str()); + errout_str()); check("void f(const Scope *scope) {\n" " if (scope->definedType) {}\n" @@ -2230,7 +2224,7 @@ class TestNullPointer : public TestFixture { "}\n"); ASSERT_EQUALS( "[test.cpp:3] -> [test.cpp:8]: (warning) Either the condition 'scope' is redundant or there is possible null pointer dereference: scope.\n", - errout.str()); + errout_str()); check("struct a {\n" " a *b() const;\n" @@ -2243,7 +2237,7 @@ class TestNullPointer : public TestFixture { " e = e->b();\n" " }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer70() { @@ -2265,7 +2259,7 @@ class TestNullPointer : public TestFixture { " }\n" " return first->varId();\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct Token {\n" " const Token* nextArgument() const;\n" @@ -2282,7 +2276,7 @@ class TestNullPointer : public TestFixture { TODO_ASSERT_EQUALS( "[test.cpp:8] -> [test.cpp:10]: (warning) Either the condition 'first' is redundant or there is possible null pointer dereference: first.\n", "", - errout.str()); + errout_str()); } void nullpointer71() { @@ -2292,7 +2286,7 @@ class TestNullPointer : public TestFixture { " if (dev)\n" " DoSomething(dev);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " Device* dev = Get();\n" @@ -2300,7 +2294,7 @@ class TestNullPointer : public TestFixture { " if (dev)\n" " DoSomething(dev);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer72() { // #10215 @@ -2312,7 +2306,7 @@ class TestNullPointer : public TestFixture { " return {};\n" " return *p0 + *p1;\n" "}\n", true /*inconclusive*/); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int test2() {\n" " int* p0 = nullptr;\n" @@ -2320,7 +2314,7 @@ class TestNullPointer : public TestFixture { " return 0;\n" " return *p0;\n" "}\n", true /*inconclusive*/); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int test3() {\n" " Obj* PObj = nullptr;\n" @@ -2330,7 +2324,7 @@ class TestNullPointer : public TestFixture { " test();\n" " PObj->bar();\n" "}\n", true /*inconclusive*/); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer73() { @@ -2345,7 +2339,7 @@ class TestNullPointer : public TestFixture { " if (flag1 && flag2)\n" " (*ptr)++;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(bool flag2, int* ptr) {\n" " bool flag1 = true;\n" @@ -2358,7 +2352,7 @@ class TestNullPointer : public TestFixture { " if (!flag1 && flag2)\n" " (*ptr)++;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:10]: (warning) Either the condition 'ptr!=nullptr' is redundant or there is possible null pointer dereference: ptr.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:10]: (warning) Either the condition 'ptr!=nullptr' is redundant or there is possible null pointer dereference: ptr.\n", errout_str()); } void nullpointer74() { @@ -2371,7 +2365,7 @@ class TestNullPointer : public TestFixture { " if (f) {}\n" " } while (0);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct d {\n" " d* e();\n" @@ -2385,7 +2379,7 @@ class TestNullPointer : public TestFixture { "}\n"); ASSERT_EQUALS( "[test.cpp:8] -> [test.cpp:7]: (warning) Either the condition 'f' is redundant or there is possible null pointer dereference: f.\n", - errout.str()); + errout_str()); check("struct d {\n" " d* e();\n" @@ -2397,7 +2391,7 @@ class TestNullPointer : public TestFixture { " if (f) {}\n" " } while (f && i > 0);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer75() { @@ -2412,7 +2406,7 @@ class TestNullPointer : public TestFixture { " x->c();\n" " if (x->b()) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer76() @@ -2424,7 +2418,7 @@ class TestNullPointer : public TestFixture { " (*x) ++;\n" " return x.release();\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer77() @@ -2434,7 +2428,7 @@ class TestNullPointer : public TestFixture { " int* i = nullptr;\n" " if (h(i) && *i == 1) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool h(int*);\n" "void f(int* i) {\n" @@ -2442,7 +2436,7 @@ class TestNullPointer : public TestFixture { " if (h(i))\n" " if (*i == 1) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool h(int*);\n" "void f(int* x) {\n" @@ -2451,7 +2445,7 @@ class TestNullPointer : public TestFixture { " i = nullptr;\n" " if (h(i) && *i == 1) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer78() // #7802 @@ -2463,7 +2457,7 @@ class TestNullPointer : public TestFixture { " pp = &p;\n" " **pp = 1;\n" "}"); - ASSERT_EQUALS("[test.cpp:6]: (error) Null pointer dereference: *pp\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (error) Null pointer dereference: *pp\n", errout_str()); } void nullpointer79() // #10400 @@ -2475,7 +2469,7 @@ class TestNullPointer : public TestFixture { " for (size_t cc = 0; cc < nF * nT; ++cc)\n" " pValues[cc] = 42;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer80() // #10410 @@ -2489,7 +2483,7 @@ class TestNullPointer : public TestFixture { " }\n" " return 0;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer81() // #8724 @@ -2506,7 +2500,7 @@ class TestNullPointer : public TestFixture { " }\n" " }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer82() // #10331 @@ -2526,7 +2520,7 @@ class TestNullPointer : public TestFixture { "\n" "done:\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer83() // #9870 @@ -2541,7 +2535,7 @@ class TestNullPointer : public TestFixture { " *p = 1;\n" " return x;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:8]: (warning) Possible null pointer dereference: p\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8]: (warning) Possible null pointer dereference: p\n", errout_str()); } void nullpointer84() // #9873 @@ -2554,7 +2548,7 @@ class TestNullPointer : public TestFixture { "}\n"); ASSERT_EQUALS( "[test.cpp:3] -> [test.cpp:4]: (warning) Either the condition '!RP' is redundant or there is possible null pointer dereference: P.\n", - errout.str()); + errout_str()); } void nullpointer85() // #10210 @@ -2575,7 +2569,7 @@ class TestNullPointer : public TestFixture { "}\n"); ASSERT_EQUALS( "[test.cpp:5] -> [test.cpp:4]: (warning) Either the condition 'm_notebook' is redundant or there is possible null pointer dereference: m_notebook.\n", - errout.str()); + errout_str()); } void nullpointer86() @@ -2594,7 +2588,7 @@ class TestNullPointer : public TestFixture { " t = f(t->a());\n" " if (!t->a()) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer87() // #9291 @@ -2609,7 +2603,7 @@ class TestNullPointer : public TestFixture { " else\n" " return *x + 1;\n" "}\n"); - TODO_ASSERT_EQUALS("", "[test.cpp:6] -> [test.cpp:9]: (warning) Either the condition 'x!=nullptr' is redundant or there is possible null pointer dereference: x.\n", errout.str()); + TODO_ASSERT_EQUALS("", "[test.cpp:6] -> [test.cpp:9]: (warning) Either the condition 'x!=nullptr' is redundant or there is possible null pointer dereference: x.\n", errout_str()); check("void f(int n, int* p) {\n" " int* r = nullptr;\n" @@ -2621,7 +2615,7 @@ class TestNullPointer : public TestFixture { " r = p + 1;\n" " *r;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer88() // #9949 @@ -2641,7 +2635,7 @@ class TestNullPointer : public TestFixture { " if (alloc(s))\n" " s->ppc[0] = \"\";\n" "}\n", /*inconclusive*/ false, "test.c"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer89() // #10640 @@ -2658,7 +2652,7 @@ class TestNullPointer : public TestFixture { "}\n"); ASSERT_EQUALS( "[test.cpp:9] -> [test.cpp:8]: (warning) Either the condition 'ptr->y!=nullptr' is redundant or there is possible null pointer dereference: ptr->y.\n", - errout.str()); + errout_str()); check("bool argsMatch(const Token *first, const Token *second) {\n" // #6145 " if (first->str() == \")\")\n" @@ -2678,7 +2672,7 @@ class TestNullPointer : public TestFixture { ASSERT_EQUALS( "[test.cpp:10] -> [test.cpp:2]: (warning) Either the condition '!first' is redundant or there is possible null pointer dereference: first.\n" "[test.cpp:10] -> [test.cpp:4]: (warning) Either the condition '!first' is redundant or there is possible null pointer dereference: first.\n", - errout.str()); + errout_str()); } void nullpointer90() // #6098 @@ -2700,7 +2694,7 @@ class TestNullPointer : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:7] -> [test.cpp:3]: (warning) Either the condition 'ctx' is redundant or there is possible null pointer dereference: ctx.\n", - errout.str()); + errout_str()); } void nullpointer91() // #10678 @@ -2712,7 +2706,7 @@ class TestNullPointer : public TestFixture { " const int Length = PEnd == nullptr ? 0 : PEnd - PBeg;\n" " };\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer92() @@ -2722,14 +2716,14 @@ class TestNullPointer : public TestFixture { " if (!g(!!i)) return 0;\n" " return *i;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool g(bool);\n" "int f(int* i) {\n" " if (!g(!i)) return 0;\n" " return *i;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer93() // #3929 @@ -2740,7 +2734,7 @@ class TestNullPointer : public TestFixture { " *myNull=42;\n" " return 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Null pointer dereference: myNull\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Null pointer dereference: myNull\n", errout_str()); check("struct foo {\n" " int* GetThing(void) { return 0; }\n" @@ -2751,7 +2745,7 @@ class TestNullPointer : public TestFixture { " *myNull=42;\n" " return 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:7]: (error) Null pointer dereference: myNull\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (error) Null pointer dereference: myNull\n", errout_str()); check("struct T { bool g() const; };\n" "void f(T* p) {\n" @@ -2760,7 +2754,7 @@ class TestNullPointer : public TestFixture { " while (p->g())\n" " p = nullptr;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:5]: (warning) Possible null pointer dereference: p\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (warning) Possible null pointer dereference: p\n", errout_str()); } void nullpointer94() // #11040 @@ -2773,7 +2767,7 @@ class TestNullPointer : public TestFixture { " (*kep)->next = 0;\n" " (*kep)->len = slen;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer95() // #11142 @@ -2783,7 +2777,7 @@ class TestNullPointer : public TestFixture { " if (*p < 2)\n" " p = nullptr;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer96() @@ -2802,7 +2796,7 @@ class TestNullPointer : public TestFixture { " }\n" " if (s) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer97() // #11229 @@ -2816,7 +2810,7 @@ class TestNullPointer : public TestFixture { " }\n" " return 0;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer98() // #11458 @@ -2827,7 +2821,7 @@ class TestNullPointer : public TestFixture { " void g(S* b) const { g(b->d(), nullptr); }\n" " void g(S* b, S* d) const { g(b->d(), d->d()); }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer99() // #10602 @@ -2848,7 +2842,7 @@ class TestNullPointer : public TestFixture { " buf[2] = 0;" // << " }\n" "}"); - ASSERT_EQUALS("[test.cpp:14]: (error) Null pointer dereference: buf\n", errout.str()); + ASSERT_EQUALS("[test.cpp:14]: (error) Null pointer dereference: buf\n", errout_str()); } void nullpointer100() // #11636 @@ -2859,7 +2853,7 @@ class TestNullPointer : public TestFixture { " const char* t = type_of(tmp);\n" " std::cout << t;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer101() // #11382 @@ -2871,7 +2865,7 @@ class TestNullPointer : public TestFixture { " const Derived* derived = dynamic_cast(base);\n" " if (derived && !is_valid(*derived) || base == nullptr) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer102() @@ -2885,7 +2879,7 @@ class TestNullPointer : public TestFixture { " else\n" " str = u.t[0].s.str;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer103() @@ -2905,7 +2899,7 @@ class TestNullPointer : public TestFixture { " }\n" " return *m_P;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int* p, const int* q) {\n" // #11873 " if (*q == -1)\n" @@ -2915,7 +2909,7 @@ class TestNullPointer : public TestFixture { " int x = -2;\n" " f(nullptr, &x);\n" "}\n"); - TODO_ASSERT_EQUALS("", "[test.cpp:3]: (warning) Possible null pointer dereference: p\n", errout.str()); + TODO_ASSERT_EQUALS("", "[test.cpp:3]: (warning) Possible null pointer dereference: p\n", errout_str()); } void nullpointer_addressOf() { // address of @@ -2923,13 +2917,13 @@ class TestNullPointer : public TestFixture { " struct X *x = 0;\n" " if (addr == &x->y) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " struct X *x = 0;\n" " if (addr == &x->y.z[0]) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkP("typedef int Count;\n" // #10018 "#define offsetof(TYPE, MEMBER) ((Count) & ((TYPE*)0)->MEMBER)\n" @@ -2939,7 +2933,7 @@ class TestNullPointer : public TestFixture { "int g(int i) {\n" " return offsetof(S, a[i]);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointerSwitch() { // #2626 @@ -2955,7 +2949,7 @@ class TestNullPointer : public TestFixture { " }\n" " return p;\n" "}", true); - ASSERT_EQUALS("[test.cpp:7]: (warning) Possible null pointer dereference: p\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (warning) Possible null pointer dereference: p\n", errout_str()); } void nullpointer_cast() { @@ -2965,14 +2959,14 @@ class TestNullPointer : public TestFixture { " p++;\n" " return p;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(char* origin) {\n" // #11449 " char* cp = (strchr)(origin, '\\0');\n" " if (cp[-1] != '/')\n" " *cp++ = '/';\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer_castToVoid() { // #3771 @@ -2980,7 +2974,7 @@ class TestNullPointer : public TestFixture { " int *buf; buf = NULL;\n" " buf;\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer_subfunction() { @@ -2992,7 +2986,7 @@ class TestNullPointer : public TestFixture { "void g() {\n" " f(nullptr, nullptr);\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } // Check if pointer is null and the dereference it @@ -3002,27 +2996,27 @@ class TestNullPointer : public TestFixture { " }\n" " *p = 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:4]: (warning) Either the condition '!p' is redundant or there is possible null pointer dereference: p.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:4]: (warning) Either the condition '!p' is redundant or there is possible null pointer dereference: p.\n", errout_str()); check("void foo(char *p) {\n" " if (p && *p == 0) {\n" " }\n" " printf(\"%c\", *p);\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:4]: (warning) Either the condition 'p' is redundant or there is possible null pointer dereference: p.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:4]: (warning) Either the condition 'p' is redundant or there is possible null pointer dereference: p.\n", errout_str()); check("void foo(char *p) {\n" " if (p && *p == 0) {\n" " } else { *p = 0; }\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Either the condition 'p' is redundant or there is possible null pointer dereference: p.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Either the condition 'p' is redundant or there is possible null pointer dereference: p.\n", errout_str()); check("void foo(char *p) {\n" " if (p) {\n" " }\n" " strcpy(p, \"abc\");\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:4]: (warning) Either the condition 'p' is redundant or there is possible null pointer dereference: p.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:4]: (warning) Either the condition 'p' is redundant or there is possible null pointer dereference: p.\n", errout_str()); check("void foo(char *p) {\n" " if (p) {\n" @@ -3030,7 +3024,7 @@ class TestNullPointer : public TestFixture { " bar();\n" " strcpy(p, \"abc\");\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:5]: (warning) Either the condition 'p' is redundant or there is possible null pointer dereference: p.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:5]: (warning) Either the condition 'p' is redundant or there is possible null pointer dereference: p.\n", errout_str()); check("void foo(abc *p) {\n" " if (!p) {\n" @@ -3038,7 +3032,7 @@ class TestNullPointer : public TestFixture { " else { if (!p->x) {\n" " } }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); { static const char code[] = @@ -3049,10 +3043,10 @@ class TestNullPointer : public TestFixture { " *p = 0;\n" "}"; check(code, false); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check(code, true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } check("void foo(char *p) {\n" @@ -3061,7 +3055,7 @@ class TestNullPointer : public TestFixture { " }\n" " *p = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(char *p) {\n" " if (!p) {\n" @@ -3069,7 +3063,7 @@ class TestNullPointer : public TestFixture { " }\n" " *p = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(char *p) {\n" " if (!p) {\n" @@ -3077,21 +3071,21 @@ class TestNullPointer : public TestFixture { " }\n" " *p = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(char *p) {\n" " if (!p) {\n" " switch (x) { }\n" " }\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(char *p) {\n" " if (!p) {\n" " }\n" " return *x;\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int foo(int *p) {\n" " if (!p) {\n" @@ -3100,7 +3094,7 @@ class TestNullPointer : public TestFixture { " }\n" "}"); ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Either the condition '!p' is redundant or there is possible null pointer dereference: p.\n" - "[test.cpp:2] -> [test.cpp:4]: (warning) Either the condition '!p' is redundant or there is possible null pointer dereference: p.\n", errout.str()); + "[test.cpp:2] -> [test.cpp:4]: (warning) Either the condition '!p' is redundant or there is possible null pointer dereference: p.\n", errout_str()); // operator! check("void f() {\n" @@ -3109,7 +3103,7 @@ class TestNullPointer : public TestFixture { " a.x();\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // This is why this check can't be used on the simplified token list check("void f(Foo *foo) {\n" @@ -3117,7 +3111,7 @@ class TestNullPointer : public TestFixture { " *foo = 0;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // ticket: #2300 - calling unknown function that may initialize the pointer check("Fred *fred;\n" @@ -3127,7 +3121,7 @@ class TestNullPointer : public TestFixture { " fred->x = 0;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // ticket #1219 check("void foo(char *p) {\n" @@ -3136,7 +3130,7 @@ class TestNullPointer : public TestFixture { " }\n" " *p = 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:5]: (warning) Either the condition 'p' is redundant or there is possible null pointer dereference: p.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:5]: (warning) Either the condition 'p' is redundant or there is possible null pointer dereference: p.\n", errout_str()); // #2467 - unknown macro may terminate the application check("void f(Fred *fred) {\n" @@ -3145,7 +3139,7 @@ class TestNullPointer : public TestFixture { " }\n" " fred->a();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #2493 - switch check("void f(Fred *fred) {\n" @@ -3158,7 +3152,7 @@ class TestNullPointer : public TestFixture { " break;\n" " };\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #4118 - second if check("void f(char *p) {\n" @@ -3166,7 +3160,7 @@ class TestNullPointer : public TestFixture { " if (!p) x = 0;\n" " if (x) *p = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #2674 - different functions check("class Fred {\n" @@ -3183,7 +3177,7 @@ class TestNullPointer : public TestFixture { "void Fred::b() {\n" " wilma->Reload();\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void test(int *i) {\n" " if(i == NULL) { }\n" @@ -3191,7 +3185,7 @@ class TestNullPointer : public TestFixture { " int b = *i;\n" " }\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #2696 - false positives nr 1 check("void f()\n" @@ -3204,7 +3198,7 @@ class TestNullPointer : public TestFixture { " if (pFoo)\n" " bar();\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #2696 - false positives nr 2 check("void f()\n" @@ -3217,7 +3211,7 @@ class TestNullPointer : public TestFixture { "\n" " len = sizeof(pFoo->data);\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #2696 - false positives nr 3 check("void f()\n" @@ -3230,13 +3224,13 @@ class TestNullPointer : public TestFixture { "\n" " len = decltype(*pFoo);\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int foo(struct Fred *fred) {\n" " if (fred) { }\n" " return fred->a;\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Either the condition 'fred' is redundant or there is possible null pointer dereference: fred.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Either the condition 'fred' is redundant or there is possible null pointer dereference: fred.\n", errout_str()); // #2789 - assign and check pointer check("void f() {\n" @@ -3244,7 +3238,7 @@ class TestNullPointer : public TestFixture { " if (!p) { }\n" " *p = 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (warning) Either the condition '!p' is redundant or there is possible null pointer dereference: p.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (warning) Either the condition '!p' is redundant or there is possible null pointer dereference: p.\n", errout_str()); // check, assign and use check("void f() {\n" @@ -3253,7 +3247,7 @@ class TestNullPointer : public TestFixture { " *p = 0;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // check, assign and use check("void f() {\n" @@ -3262,7 +3256,7 @@ class TestNullPointer : public TestFixture { " *p = 0;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // check, and use check("void f() {\n" @@ -3271,7 +3265,7 @@ class TestNullPointer : public TestFixture { " return;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:3]: (warning) Either the condition 'p==0' is redundant or there is possible null pointer dereference: p.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:3]: (warning) Either the condition 'p==0' is redundant or there is possible null pointer dereference: p.\n", errout_str()); // check, and use check("void f() {\n" @@ -3280,7 +3274,7 @@ class TestNullPointer : public TestFixture { " return;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:3]: (warning) Either the condition 'p==0' is redundant or there is possible null pointer dereference: p.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:3]: (warning) Either the condition 'p==0' is redundant or there is possible null pointer dereference: p.\n", errout_str()); // check, and use check("void f() {\n" @@ -3289,7 +3283,7 @@ class TestNullPointer : public TestFixture { " return;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // check, and use check("void f() {\n" @@ -3298,7 +3292,7 @@ class TestNullPointer : public TestFixture { " return;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:3]: (warning) Either the condition 'p==NULL' is redundant or there is possible null pointer dereference: p.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:3]: (warning) Either the condition 'p==NULL' is redundant or there is possible null pointer dereference: p.\n", errout_str()); // check, and use check("void f(struct X *p, int x) {\n" @@ -3306,7 +3300,7 @@ class TestNullPointer : public TestFixture { " return;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); { const char code[] = "void f(Fred *fred) {\n" @@ -3315,59 +3309,59 @@ class TestNullPointer : public TestFixture { "}"; check(code); // inconclusive - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Either the condition 'fred==NULL' is redundant or there is possible null pointer dereference: fred.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Either the condition 'fred==NULL' is redundant or there is possible null pointer dereference: fred.\n", errout_str()); } check("void f(char *s) {\n" // #3358 " if (s==0);\n" " strcpy(a, s?b:c);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // sizeof check("void f(struct fred_t *fred) {\n" " if (!fred)\n" " int sz = sizeof(fred->x);\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // check in macro check("void f(int *x) {\n" " $if (!x) {}\n" " *x = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // return ?: check("int f(ABC *p) {\n" // FP : return ?: " if (!p) {}\n" " return p ? p->x : 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f(ABC *p) {\n" // no fn " if (!p) {}\n" " return q ? p->x : 0;\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Either the condition '!p' is redundant or there is possible null pointer dereference: p.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Either the condition '!p' is redundant or there is possible null pointer dereference: p.\n", "", errout_str()); check("int f(ABC *p) {\n" // FP : return && " if (!p) {}\n" " return p && p->x;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x, int *p) {\n" " if (x || !p) {}\n" " *p = 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Either the condition '!p' is redundant or there is possible null pointer dereference: p.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Either the condition '!p' is redundant or there is possible null pointer dereference: p.\n", errout_str()); // sizeof check("void f() {\n" " int *pointer = NULL;\n" " pointer = func(sizeof pointer[0]);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } // Test CheckNullPointer::nullConstantDereference @@ -3376,12 +3370,12 @@ class TestNullPointer : public TestFixture { " int* p = 0;\n" " return p[4];\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Null pointer dereference: p\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Null pointer dereference: p\n", errout_str()); check("void f() {\n" " typeof(*NULL) y;\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int * f() {\n" " return NULL;\n" @@ -3389,7 +3383,7 @@ class TestNullPointer : public TestFixture { "int main() {\n" " return *f();\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (error) Null pointer dereference: f()\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Null pointer dereference: f()\n", errout_str()); } void gcc_statement_expression() { @@ -3397,7 +3391,7 @@ class TestNullPointer : public TestFixture { check("void f(struct ABC *abc) {\n" " ({ if (abc) dbg(); })\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void snprintf_with_zero_size() { @@ -3405,7 +3399,7 @@ class TestNullPointer : public TestFixture { check("void f() {\n" " int bytes = snprintf(0, 0, \"%u\", 1);\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void snprintf_with_non_zero_size() { @@ -3413,19 +3407,19 @@ class TestNullPointer : public TestFixture { check("void f() {\n" " int bytes = snprintf(0, 10, \"%u\", 1);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (error) Null pointer dereference\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (error) Null pointer dereference\n", errout_str()); } void printf_with_invalid_va_argument() { check("void f() {\n" " printf(\"%s\", 0);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (error) Null pointer dereference\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (error) Null pointer dereference\n", errout_str()); check("void f(char* s) {\n" " printf(\"%s\", s);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " char* s = 0;\n" @@ -3434,23 +3428,23 @@ class TestNullPointer : public TestFixture { ASSERT_EQUALS( "[test.cpp:3]: (error) Null pointer dereference: s\n" "[test.cpp:3]: (error) Null pointer dereference\n", - errout.str()); + errout_str()); check("void f() {\n" " char *s = 0;\n" " printf(\"%s\", s == 0 ? a : s);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " printf(\"%u%s\", 0, 0);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (error) Null pointer dereference\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (error) Null pointer dereference\n", errout_str()); check("void f(char* s) {\n" " printf(\"%u%s\", 0, s);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " char* s = 0;\n" @@ -3459,43 +3453,43 @@ class TestNullPointer : public TestFixture { ASSERT_EQUALS( "[test.cpp:3]: (error) Null pointer dereference: s\n" "[test.cpp:3]: (error) Null pointer dereference\n", - errout.str()); + errout_str()); check("void f() {\n" " printf(\"%%%s%%\", 0);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (error) Null pointer dereference\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (error) Null pointer dereference\n", errout_str()); check("void f(char* s) {\n" " printf(\"text: %s, %s\", s, 0);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (error) Null pointer dereference\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (error) Null pointer dereference\n", errout_str()); check("void f() {\n" " char* s = \"blabla\";\n" " printf(\"%s\", s);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(char* s) {\n" " printf(\"text: %m%s, %s\", s, 0);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (error) Null pointer dereference\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (error) Null pointer dereference\n", errout_str()); check("void f(char* s) {\n" " printf(\"text: %*s, %s\", s, 0);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (error) Null pointer dereference\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (error) Null pointer dereference\n", errout_str()); // Ticket #3364 check("void f() {\n" " printf(\"%-*.*s\", s, 0);\n" " sprintf(\"%*\", s);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void scanf_with_invalid_va_argument() { @@ -3505,7 +3499,7 @@ class TestNullPointer : public TestFixture { ASSERT_EQUALS( "[test.cpp:2]: (error) Null pointer dereference\n" "[test.cpp:2]: (error) Null pointer dereference\n", // duplicate - errout.str()); + errout_str()); check("void f() {\n" " scanf(\"%d\", 0);\n" @@ -3513,20 +3507,20 @@ class TestNullPointer : public TestFixture { ASSERT_EQUALS( "[test.cpp:2]: (error) Null pointer dereference\n" "[test.cpp:2]: (error) Null pointer dereference\n", // duplicate - errout.str()); + errout_str()); check("void f(char* foo) {\n" " char location[200];\n" " int width, height;\n" " sscanf(imgInfo, \"%s %d %d\", location, &width, &height);\n" "}"); - ASSERT_EQUALS("", errout.str()); // ticket #3207 + ASSERT_EQUALS("", errout_str()); // ticket #3207 check("void f(char *dummy) {\n" " int iVal;\n" " sscanf(dummy, \"%d%c\", &iVal);\n" "}"); - ASSERT_EQUALS("", errout.str()); // ticket #3211 + ASSERT_EQUALS("", errout_str()); // ticket #3211 check("void f(char *dummy) {\n" " int* iVal = 0;\n" @@ -3536,19 +3530,19 @@ class TestNullPointer : public TestFixture { "[test.cpp:3]: (error) Null pointer dereference: iVal\n" "[test.cpp:3]: (error) Null pointer dereference\n" "[test.cpp:3]: (error) Null pointer dereference\n", // duplicate - errout.str()); + errout_str()); check("void f(char *dummy) {\n" " int* iVal;\n" " sscanf(dummy, \"%d\", foo(iVal));\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(char *dummy) {\n" " int* iVal = 0;\n" " sscanf(dummy, \"%d%d\", foo(iVal), iVal);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(char* dummy) {\n" " sscanf(dummy, \"%*d%u\", 0);\n" @@ -3556,7 +3550,7 @@ class TestNullPointer : public TestFixture { ASSERT_EQUALS( "[test.cpp:2]: (error) Null pointer dereference\n" "[test.cpp:2]: (error) Null pointer dereference\n", // duplicate - errout.str()); + errout_str()); } void nullpointer_in_return() { @@ -3566,12 +3560,12 @@ class TestNullPointer : public TestFixture { " if(maybe()) iVal = g();\n" " return iVal[0];\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (warning) Possible null pointer dereference: iVal\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (warning) Possible null pointer dereference: iVal\n", errout_str()); check("int foo(int* iVal) {\n" " return iVal[0];\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer_in_typeid() { @@ -3581,20 +3575,20 @@ class TestNullPointer : public TestFixture { " PolymorphicA* a = 0;\n" " return typeid(*a) == typeid(*a);\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct NonPolymorphicA { ~A() {} };\n" "bool foo() {\n" " NonPolymorphicA* a = 0;\n" " return typeid(*a) == typeid(*a);\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool foo() {\n" " char* c = 0;\n" " return typeid(*c) == typeid(*c);\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer_in_alignof() // #11401 @@ -3603,40 +3597,40 @@ class TestNullPointer : public TestFixture { " char* c = 0;\n" " return alignof(*c);\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("size_t foo() {\n" " return alignof(*0);\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(int *p) {\n" " f(alignof(*p));\n" " if (p) {}\n" " return;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("size_t foo() {\n" " char* c = 0;\n" " return _Alignof(*c);\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("size_t foo() {\n" " return _alignof(*0);\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("size_t foo() {\n" " return __alignof(*0);\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("size_t foo() {\n" " return __alignof__(*0);\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointer_in_for_loop() { @@ -3647,7 +3641,7 @@ class TestNullPointer : public TestFixture { " for (int i = 0; i < cnt; ++i)\n" " *ptr++ = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #11635 check("void f(char *cons, int rlen, int pos) {\n" @@ -3659,7 +3653,7 @@ class TestNullPointer : public TestFixture { " else\n" " i++;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointerDelete() { @@ -3669,7 +3663,7 @@ class TestNullPointer : public TestFixture { " k->doStuff();\n" " delete k;\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " K *k = getK();\n" @@ -3678,7 +3672,7 @@ class TestNullPointer : public TestFixture { " delete [] k;\n" " k = new K[10];\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointerSubFunction() { @@ -3687,7 +3681,7 @@ class TestNullPointer : public TestFixture { " if (x)\n" " g(x);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointerExit() { @@ -3697,7 +3691,7 @@ class TestNullPointer : public TestFixture { " exit(1);\n" " k->f();\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nullpointerStdString() { @@ -3722,7 +3716,7 @@ class TestNullPointer : public TestFixture { "[test.cpp:5]: (error) Null pointer dereference\n" "[test.cpp:7]: (error) Null pointer dereference\n" "[test.cpp:8]: (error) Null pointer dereference\n" - , errout.str()); + , errout_str()); check("void f(std::string s1) {\n" " s1 = nullptr;\n" @@ -3734,7 +3728,7 @@ class TestNullPointer : public TestFixture { "[test.cpp:3]: (error) Null pointer dereference\n" "[test.cpp:4]: (error) Null pointer dereference\n" "[test.cpp:5]: (error) Null pointer dereference\n" - , errout.str()); + , errout_str()); check("void f(std::string s1) {\n" " s1 = NULL;\n" @@ -3746,7 +3740,7 @@ class TestNullPointer : public TestFixture { "[test.cpp:3]: (error) Null pointer dereference\n" "[test.cpp:4]: (error) Null pointer dereference\n" "[test.cpp:5]: (error) Null pointer dereference\n" - , errout.str()); + , errout_str()); check("void f(std::string s1, const std::string& s2, const std::string* s3) {\n" " void* p = 0;\n" @@ -3761,7 +3755,7 @@ class TestNullPointer : public TestFixture { ASSERT_EQUALS("[test.cpp:4]: (error) Null pointer dereference: p\n" "[test.cpp:5]: (error) Null pointer dereference: p\n" "[test.cpp:7]: (error) Null pointer dereference: p\n" - "[test.cpp:8]: (error) Null pointer dereference: p\n", errout.str()); + "[test.cpp:8]: (error) Null pointer dereference: p\n", errout_str()); check("void f(std::string s1, const std::string& s2, const std::string* s3) {\n" " void* p = 0;\n" @@ -3773,7 +3767,7 @@ class TestNullPointer : public TestFixture { " foo(s2.size() == 0);\n" " foo(s3->size() == 0);\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(std::string s1, const std::string& s2) {\n" " if (x) { return; }\n" @@ -3782,7 +3776,7 @@ class TestNullPointer : public TestFixture { " foo(s1[0] == 0);\n" " foo(s2[0] == 0);\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(std::string s1, const std::string& s2) {\n" " if (x) { return; }\n" @@ -3791,7 +3785,7 @@ class TestNullPointer : public TestFixture { " foo('\\0' == s1);\n" " foo('\\0' == s2);\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class Bar {\n" " std::string s;\n" @@ -3803,18 +3797,18 @@ class TestNullPointer : public TestFixture { "};\n" "Foo::Foo() : s(0) {}"); ASSERT_EQUALS("[test.cpp:3]: (error) Null pointer dereference\n" - "[test.cpp:9]: (error) Null pointer dereference\n", errout.str()); + "[test.cpp:9]: (error) Null pointer dereference\n", errout_str()); check("void f() {\n" " std::string s = 0 == x ? \"a\" : \"b\";\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " const std::string s = g();\n" " ASSERT_MESSAGE(\"Error on s\", 0 == s.compare(\"Some text\"));\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(int i, std::string s);\n" "void bar() {\n" @@ -3828,7 +3822,7 @@ class TestNullPointer : public TestFixture { ASSERT_EQUALS("[test.cpp:4]: (error) Null pointer dereference\n" "[test.cpp:5]: (error) Null pointer dereference\n" "[test.cpp:6]: (error) Null pointer dereference\n" - "[test.cpp:7]: (error) Null pointer dereference\n", errout.str()); + "[test.cpp:7]: (error) Null pointer dereference\n", errout_str()); check("std::string f() {\n" // #9827 " char* p = NULL;\n" @@ -3838,7 +3832,7 @@ class TestNullPointer : public TestFixture { " std::string s(p);\n" " return s;\n" "}\n", /*inconclusive*/ true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" // #11078 " const char* p = nullptr;\n" @@ -3847,12 +3841,12 @@ class TestNullPointer : public TestFixture { "}\n"); ASSERT_EQUALS("[test.cpp:3]: (error) Null pointer dereference: p\n" "[test.cpp:4]: (error) Null pointer dereference\n", - errout.str()); + errout_str()); check("const char* g(long) { return nullptr; }\n" // #11561 "void f() { std::string s = g(0L); }\n"); ASSERT_EQUALS("[test.cpp:2]: (error) Null pointer dereference: g(0L)\n", - errout.str()); + errout_str()); } void nullpointerStdStream() { @@ -3860,7 +3854,7 @@ class TestNullPointer : public TestFixture { " char* p = 0;\n" " is >> p;\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:3]: (error) Possible null pointer dereference: p\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:3]: (error) Possible null pointer dereference: p\n", "", errout_str()); check("void f(const std::ostringstream& oss, char* q) {\n" " char const* p = 0;\n" // Simplification makes detection of bug difficult @@ -3871,7 +3865,7 @@ class TestNullPointer : public TestFixture { "}", false); ASSERT_EQUALS("[test.cpp:3]: (error) Null pointer dereference: p\n" "[test.cpp:4]: (error) Null pointer dereference: p\n" - "[test.cpp:5] -> [test.cpp:6]: (warning) Either the condition 'q==0' is redundant or there is possible null pointer dereference: q.\n", errout.str()); + "[test.cpp:5] -> [test.cpp:6]: (warning) Either the condition 'q==0' is redundant or there is possible null pointer dereference: q.\n", errout_str()); check("void f(const char* p) {\n" " if(p == 0) {\n" @@ -3887,7 +3881,7 @@ class TestNullPointer : public TestFixture { "[test.cpp:2] -> [test.cpp:6]: (warning) Either the condition 'p==0' is redundant or there is possible null pointer dereference: p.\n", "[test.cpp:2] -> [test.cpp:3]: (warning) Either the condition 'p==0' is redundant or there is possible null pointer dereference: p.\n" "[test.cpp:2] -> [test.cpp:4]: (warning) Either the condition 'p==0' is redundant or there is possible null pointer dereference: p.\n", - errout.str()); + errout_str()); check("void f() {\n" " void* p1 = 0;\n" @@ -3896,7 +3890,7 @@ class TestNullPointer : public TestFixture { " std::cin >> (int)p;\n" // result casted " std::cout << (int)p;\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(const std::string& str) {\n" " long long ret = 0;\n" @@ -3904,13 +3898,13 @@ class TestNullPointer : public TestFixture { " istr >> std::hex >> ret;\n" // Read integer " return ret;\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int* i) {\n" " if(i) return;\n" " std::cout << i;\n" // Its no char* (#4240) "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #5811 false positive: (error) Null pointer dereference check("using namespace std;\n" @@ -3919,7 +3913,7 @@ class TestNullPointer : public TestFixture { " out << ((ip >> 0) & 0xFF);\n" " return out.str();\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // avoid regression from first fix attempt for #5811... check("void deserialize(const std::string &data) {\n" "std::istringstream iss(data);\n" @@ -3927,7 +3921,7 @@ class TestNullPointer : public TestFixture { "if (!(iss >> len))\n" " return;\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } @@ -3939,42 +3933,42 @@ class TestNullPointer : public TestFixture { " if (p) {}\n" " dostuff(p->x);\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (warning) Either the condition 'p' is redundant or there is possible null pointer dereference: p.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (warning) Either the condition 'p' is redundant or there is possible null pointer dereference: p.\n", errout_str()); check("struct Fred { int x; };\n" "void f(std::shared_ptr p) {\n" " p = nullptr;\n" " dostuff(p->x);\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Null pointer dereference: p\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Null pointer dereference: p\n", errout_str()); check("struct Fred { int x; };\n" "void f(std::unique_ptr p) {\n" " if (p) {}\n" " dostuff(p->x);\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (warning) Either the condition 'p' is redundant or there is possible null pointer dereference: p.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (warning) Either the condition 'p' is redundant or there is possible null pointer dereference: p.\n", errout_str()); check("struct Fred { int x; };\n" "void f(std::unique_ptr p) {\n" " p = nullptr;\n" " dostuff(p->x);\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Null pointer dereference: p\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Null pointer dereference: p\n", errout_str()); check("struct Fred { int x; };\n" "void f() {\n" " std::shared_ptr p;\n" " dostuff(p->x);\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Null pointer dereference: p\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Null pointer dereference: p\n", errout_str()); check("struct Fred { int x; };\n" "void f(std::shared_ptr p) {\n" " p.reset();\n" " dostuff(p->x);\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Null pointer dereference: p\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Null pointer dereference: p\n", errout_str()); check("struct Fred { int x; };\n" "void f(std::shared_ptr p) {\n" @@ -3982,7 +3976,7 @@ class TestNullPointer : public TestFixture { " p.reset(pp);\n" " dostuff(p->x);\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (error) Null pointer dereference: p\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Null pointer dereference: p\n", errout_str()); check("struct Fred { int x; };\n" "void f(Fred& f) {\n" @@ -3990,28 +3984,28 @@ class TestNullPointer : public TestFixture { " p.reset(&f);\n" " dostuff(p->x);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct Fred { int x; };\n" "void f(std::shared_ptr p) {\n" " p.reset();\n" " dostuff(p->x);\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Null pointer dereference: p\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Null pointer dereference: p\n", errout_str()); check("struct Fred { int x; };\n" "void f() {\n" " std::shared_ptr p(nullptr);\n" " dostuff(p->x);\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Null pointer dereference: p\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Null pointer dereference: p\n", errout_str()); check("struct A {};\n" "void f(int n) {\n" " std::unique_ptr p;\n" " p.reset(new const A*[n]);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #9216 check("struct A {\n" @@ -4022,7 +4016,7 @@ class TestNullPointer : public TestFixture { " var->reset();\n" " var->f();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #9439 check("char* g();\n" @@ -4031,7 +4025,7 @@ class TestNullPointer : public TestFixture { " if( x ) {}\n" " return x.release();\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #9496 check("std::shared_ptr f() {\n" @@ -4041,7 +4035,7 @@ class TestNullPointer : public TestFixture { " int a = *f();\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:5]: (error) Null pointer dereference: f()\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Null pointer dereference: f()\n", errout_str()); } void functioncall() { // #3443 - function calls @@ -4053,7 +4047,7 @@ class TestNullPointer : public TestFixture { " foo(p);\n" " if (p) { }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // function seen (taking pointer parameter) check("void foo(int *p) { }\n" @@ -4065,7 +4059,7 @@ class TestNullPointer : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:6] -> [test.cpp:4]: (warning) Either the condition 'p' is redundant or there is possible null pointer dereference: p.\n", - errout.str()); + errout_str()); // function seen (taking reference parameter) check("void foo(int *&p) { }\n" @@ -4075,7 +4069,7 @@ class TestNullPointer : public TestFixture { " foo(p);\n" " if (p) { }\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // function implementation not seen check("void foo(int *p);\n" @@ -4087,7 +4081,7 @@ class TestNullPointer : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:6] -> [test.cpp:4]: (warning) Either the condition 'p' is redundant or there is possible null pointer dereference: p.\n", - errout.str()); + errout_str()); // inconclusive check("void f(int *p) {\n" @@ -4097,7 +4091,7 @@ class TestNullPointer : public TestFixture { "}", true); ASSERT_EQUALS( "[test.cpp:4] -> [test.cpp:2]: (warning, inconclusive) Either the condition 'p' is redundant or there is possible null pointer dereference: p.\n", - errout.str()); + errout_str()); } // dereference struct pointer and then check if it's null @@ -4108,7 +4102,7 @@ class TestNullPointer : public TestFixture { " foo(abc);\n" " if (abc) { }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // function seen (taking pointer parameter) check("void foo(struct ABC *abc) { }\n" @@ -4120,7 +4114,7 @@ class TestNullPointer : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:6] -> [test.cpp:4]: (warning) Either the condition 'abc' is redundant or there is possible null pointer dereference: abc.\n", - errout.str()); + errout_str()); // function implementation not seen check("void foo(struct ABC *abc);\n" @@ -4132,7 +4126,7 @@ class TestNullPointer : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:6] -> [test.cpp:4]: (warning) Either the condition 'abc' is redundant or there is possible null pointer dereference: abc.\n", - errout.str()); + errout_str()); // inconclusive check("void f(struct ABC *abc) {\n" @@ -4142,7 +4136,7 @@ class TestNullPointer : public TestFixture { "}", true); ASSERT_EQUALS( "[test.cpp:4] -> [test.cpp:2]: (warning, inconclusive) Either the condition 'abc' is redundant or there is possible null pointer dereference: abc.\n", - errout.str()); + errout_str()); } } @@ -4186,51 +4180,51 @@ class TestNullPointer : public TestFixture { check("void f(int *p = 0) {\n" " *p = 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Possible null pointer dereference if the default parameter value is used: p\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Possible null pointer dereference if the default parameter value is used: p\n", errout_str()); check("void f(int *p = 0) {\n" " if (!p)\n" " return;\n" " *p = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(char a, int *p = 0) {\n" " *p = 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Possible null pointer dereference if the default parameter value is used: p\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Possible null pointer dereference if the default parameter value is used: p\n", errout_str()); check("void f(int *p = 0) {\n" " printf(\"p = %d\", *p);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Possible null pointer dereference if the default parameter value is used: p\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Possible null pointer dereference if the default parameter value is used: p\n", errout_str()); check("void f(int *p = 0) {\n" " printf(\"p[1] = %d\", p[1]);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Possible null pointer dereference if the default parameter value is used: p\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Possible null pointer dereference if the default parameter value is used: p\n", errout_str()); check("void f(int *p = 0) {\n" " buf[p] = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int *p = 0) {\n" " if (p != 0 && bar())\n" " *p = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int *p) {\n" " *p = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int *p = 0) {\n" " if (p != 0)\n" " *p = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int *p = 0) {\n" " int y;\n" @@ -4238,7 +4232,7 @@ class TestNullPointer : public TestFixture { " p = &y;\n" " *p = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int a, int *p = 0) {\n" " if (a != 0)\n" @@ -4246,19 +4240,19 @@ class TestNullPointer : public TestFixture { "}", true); ASSERT_EQUALS( "[test.cpp:3]: (warning) Possible null pointer dereference if the default parameter value is used: p\n", - errout.str()); + errout_str()); check("void f(int *p = 0) {\n" " p = a;\n" " *p = 0;\n" // <- don't simplify and verify "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int *p = 0) {\n" " p += a;\n" " *p = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f(int *p = 0) {\n" " if (p == 0) {\n" @@ -4266,12 +4260,12 @@ class TestNullPointer : public TestFixture { " }\n" " return *p;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int *p = 0) {\n" " std::cout << p ? *p : 0;\n" // Due to operator precedence, this is equivalent to: (std::cout << p) ? *p : 0; "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Possible null pointer dereference if the default parameter value is used: p\n", errout.str()); // Check the first branch of ternary + ASSERT_EQUALS("[test.cpp:2]: (warning) Possible null pointer dereference if the default parameter value is used: p\n", errout_str()); // Check the first branch of ternary check("void f(char *p = 0) {\n" " std::cout << p ? *p : 0;\n" // Due to operator precedence, this is equivalent to: (std::cout << p) ? *p : 0; @@ -4279,32 +4273,32 @@ class TestNullPointer : public TestFixture { ASSERT_EQUALS( "[test.cpp:2]: (warning) Possible null pointer dereference if the default parameter value is used: p\n" "[test.cpp:2]: (warning) Possible null pointer dereference if the default parameter value is used: p\n", // duplicate - errout.str()); + errout_str()); check("void f(int *p = 0) {\n" " std::cout << (p ? *p : 0);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int *p = 0) {\n" " std::cout << p;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int *p = 0) {\n" " std::cout << (p && p[0] ? *p : 42);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void isEmpty(int *p = 0) {\n" " return p && *p;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void g(int *p = 0) {\n" " return !p || *p;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // bar may initialize p but be can't know for sure without knowing @@ -4313,13 +4307,13 @@ class TestNullPointer : public TestFixture { " bar(p);\n" " *p = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int *p = 0) {\n" " printf(\"%p\", p);\n" " *p = 0;\n" "}", true); - ASSERT_EQUALS("[test.cpp:3]: (warning) Possible null pointer dereference if the default parameter value is used: p\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Possible null pointer dereference if the default parameter value is used: p\n", errout_str()); // The init() function may or may not initialize p, but since the address // of p is passed in, it's a good bet that p may be modified and @@ -4328,14 +4322,14 @@ class TestNullPointer : public TestFixture { " init(&p);\n" " *p = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void init(int* &g);\n" "void f(int *p = 0) {\n" " init(p);\n" " *p = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int *p = 0) {\n" " if (p == 0) {\n" @@ -4343,7 +4337,7 @@ class TestNullPointer : public TestFixture { " }\n" " *p = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int *p = 0) {\n" " if (p == 0) {\n" @@ -4351,12 +4345,12 @@ class TestNullPointer : public TestFixture { " }\n" " *p = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(int x, int *p = 0) {\n" " int var1 = x ? *p : 5;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Possible null pointer dereference if the default parameter value is used: p\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Possible null pointer dereference if the default parameter value is used: p\n", errout_str()); } void nullpointer_internal_error() { // ticket #5080 @@ -4367,7 +4361,7 @@ class TestNullPointer : public TestFixture { " for (j = 0; j < b[0].a->size; ++j) {\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void ticket6505() { @@ -4383,7 +4377,7 @@ class TestNullPointer : public TestFixture { "void bar() {\n" " foo(0);\n" "}\n", true, "test.c"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void subtract() { @@ -4392,32 +4386,32 @@ class TestNullPointer : public TestFixture { "}\n" "void bar() { foo(0); }"); ASSERT_EQUALS("[test.cpp:2]: (error) Overflow in pointer arithmetic, NULL pointer is subtracted.\n", - errout.str()); + errout_str()); check("void foo(char *s) {\n" " if (!s) {}\n" " char *p = s - 20;\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Either the condition '!s' is redundant or there is overflow in pointer subtraction.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Either the condition '!s' is redundant or there is overflow in pointer subtraction.\n", errout_str()); check("void foo(char *s) {\n" " s -= 20;\n" "}\n" "void bar() { foo(0); }"); ASSERT_EQUALS("[test.cpp:2]: (error) Overflow in pointer arithmetic, NULL pointer is subtracted.\n", - errout.str()); + errout_str()); check("void foo(char *s) {\n" " if (!s) {}\n" " s -= 20;\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Either the condition '!s' is redundant or there is overflow in pointer subtraction.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Either the condition '!s' is redundant or there is overflow in pointer subtraction.\n", errout_str()); check("int* f8() { int *x = NULL; return --x; }"); - ASSERT_EQUALS("[test.cpp:1]: (error) Overflow in pointer arithmetic, NULL pointer is subtracted.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (error) Overflow in pointer arithmetic, NULL pointer is subtracted.\n", errout_str()); check("int* f9() { int *x = NULL; return x--; }"); - ASSERT_EQUALS("[test.cpp:1]: (error) Overflow in pointer arithmetic, NULL pointer is subtracted.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (error) Overflow in pointer arithmetic, NULL pointer is subtracted.\n", errout_str()); } void addNull() { @@ -4425,48 +4419,48 @@ class TestNullPointer : public TestFixture { " char * p = s + 20;\n" "}\n" "void bar() { foo(0); }"); - ASSERT_EQUALS("[test.cpp:2]: (error) Pointer addition with NULL pointer.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (error) Pointer addition with NULL pointer.\n", errout_str()); check("void foo(char *s) {\n" " if (!s) {}\n" " char * p = s + 20;\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Either the condition '!s' is redundant or there is pointer arithmetic with NULL pointer.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Either the condition '!s' is redundant or there is pointer arithmetic with NULL pointer.\n", errout_str()); check("void foo(char *s) {\n" " char * p = 20 + s;\n" "}\n" "void bar() { foo(0); }"); - ASSERT_EQUALS("[test.cpp:2]: (error) Pointer addition with NULL pointer.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (error) Pointer addition with NULL pointer.\n", errout_str()); check("void foo(char *s) {\n" " if (!s) {}\n" " char * p = 20 + s;\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Either the condition '!s' is redundant or there is pointer arithmetic with NULL pointer.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Either the condition '!s' is redundant or there is pointer arithmetic with NULL pointer.\n", errout_str()); check("void foo(char *s) {\n" " s += 20;\n" "}\n" "void bar() { foo(0); }"); - ASSERT_EQUALS("[test.cpp:2]: (error) Pointer addition with NULL pointer.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (error) Pointer addition with NULL pointer.\n", errout_str()); check("void foo(char *s) {\n" " if (!s) {}\n" " s += 20;\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Either the condition '!s' is redundant or there is pointer arithmetic with NULL pointer.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Either the condition '!s' is redundant or there is pointer arithmetic with NULL pointer.\n", errout_str()); check("int* f7() { int *x = NULL; return ++x; }"); - ASSERT_EQUALS("[test.cpp:1]: (error) Pointer addition with NULL pointer.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (error) Pointer addition with NULL pointer.\n", errout_str()); check("int* f10() { int *x = NULL; return x++; }"); - ASSERT_EQUALS("[test.cpp:1]: (error) Pointer addition with NULL pointer.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (error) Pointer addition with NULL pointer.\n", errout_str()); check("class foo {};\n" "const char* get() const { return 0; }\n" "void f(foo x) { if (get()) x += get(); }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("typedef struct { uint8_t* buf, *buf_end; } S;\n" // #11117 "void f(S* s, uint8_t* buffer, int buffer_size) {\n" @@ -4477,19 +4471,16 @@ class TestNullPointer : public TestFixture { " s->buf = buffer;\n" " s->buf_end = s->buf + buffer_size;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void isPointerDeRefFunctionDecl() { check("const char** get() { return 0; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } #define ctu(code) ctu_(code, __FILE__, __LINE__) void ctu_(const char code[], const char* file, int line) { - // Clear the error buffer.. - errout.str(""); - // Tokenize.. Tokenizer tokenizer(settings, this); std::istringstream istr(code); @@ -4522,7 +4513,7 @@ class TestNullPointer : public TestFixture { ASSERT_EQUALS("test.cpp:2:error:Null pointer dereference: fp\n" "test.cpp:5:note:Assignment 'p=0', assigned value is 0\n" "test.cpp:6:note:Calling function f, 1st argument is null\n" - "test.cpp:2:note:Dereferencing argument fp that is null\n", errout.str()); + "test.cpp:2:note:Dereferencing argument fp that is null\n", errout_str()); ctu("void use(int *p) { a = *p + 3; }\n" "void call(int x, int *p) { x++; use(p); }\n" @@ -4532,7 +4523,7 @@ class TestNullPointer : public TestFixture { ASSERT_EQUALS("test.cpp:1:error:Null pointer dereference: p\n" "test.cpp:4:note:Calling function call, 2nd argument is null\n" "test.cpp:2:note:Calling function use, 1st argument is null\n" - "test.cpp:1:note:Dereferencing argument p that is null\n", errout.str()); + "test.cpp:1:note:Dereferencing argument p that is null\n", errout_str()); ctu("void dostuff(int *x, int *y) {\n" " if (!var)\n" @@ -4543,7 +4534,7 @@ class TestNullPointer : public TestFixture { "void f() {\n" " dostuff(a, 0);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); ctu("void dostuff(int *x, int *y) {\n" " if (cond)\n" @@ -4554,7 +4545,7 @@ class TestNullPointer : public TestFixture { "void f() {\n" " dostuff(a, 0);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // else ctu("void dostuff(int mask, int *p) {\n" @@ -4565,7 +4556,7 @@ class TestNullPointer : public TestFixture { "void f() {\n" " dostuff(0, 0);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // ?, &&, || ctu("void dostuff(int mask, int *p) {\n" @@ -4575,14 +4566,14 @@ class TestNullPointer : public TestFixture { "void f() {\n" " dostuff(0, 0);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); ctu("void g(int* x) { *x; }\n" "void f(int* x) {\n" " if (x)\n" " g(x);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); ctu("size_t f(int* p) {\n" " size_t len = sizeof(*p);\n" @@ -4591,7 +4582,7 @@ class TestNullPointer : public TestFixture { "void g() {\n" " f(NULL);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); ctu("size_t f(int* p) {\n" " size_t len = alignof(*p);\n" @@ -4600,7 +4591,7 @@ class TestNullPointer : public TestFixture { "void g() {\n" " f(NULL);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } }; diff --git a/test/testother.cpp b/test/testother.cpp index 5d7ff5799899..8c556a27aa18 100644 --- a/test/testother.cpp +++ b/test/testother.cpp @@ -294,9 +294,6 @@ class TestOther : public TestFixture { #define check(...) check_(__FILE__, __LINE__, __VA_ARGS__) void check_(const char* file, int line, const char code[], const char *filename = nullptr, bool inconclusive = true, bool runSimpleChecks=true, bool verbose=false, Settings* settings = nullptr) { - // Clear the error buffer.. - errout.str(""); - if (!settings) { settings = &_settings; } @@ -328,9 +325,6 @@ class TestOther : public TestFixture { #define checkP(...) checkP_(__FILE__, __LINE__, __VA_ARGS__) void checkP_(const char* file, int line, const char code[], const char *filename = "test.cpp") { - // Clear the error buffer.. - errout.str(""); - Settings* settings = &_settings; settings->severity.enable(Severity::style); settings->severity.enable(Severity::warning); @@ -361,7 +355,7 @@ class TestOther : public TestFixture { void emptyBrackets() { check("{\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } @@ -369,22 +363,22 @@ class TestOther : public TestFixture { check("void foo() {\n" " cout << 1. / 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() {\n" " cout << 42 / (double)0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() {\n" " cout << 42 / (float)0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() {\n" " cout << 42 / (int)0;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (error) Division by zero.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (error) Division by zero.\n", errout_str()); } void zeroDiv2() { @@ -397,34 +391,34 @@ class TestOther : public TestFixture { " }\n" " cout<> 1) << std::endl;\n" " std::cout << dx / (i >> 1) << std::endl;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:5]: (error) Division by zero.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (error) Division by zero.\n", errout_str()); } void zeroDiv15() { // #8319 @@ -608,7 +602,7 @@ class TestOther : public TestFixture { " const int r = 1 / f(d);\n" " return r;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:4]: (error) Division by zero.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Division by zero.\n", errout_str()); } // #11158 @@ -622,7 +616,7 @@ class TestOther : public TestFixture { " }\n" " return a;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f(int i) {\n" " int number = 10, a = 0;\n" @@ -633,7 +627,7 @@ class TestOther : public TestFixture { " }\n" " return a;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void zeroDiv17() { // #9931 @@ -642,7 +636,7 @@ class TestOther : public TestFixture { " int x = len % sz;\n" " return x;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void zeroDiv18() @@ -653,7 +647,7 @@ class TestOther : public TestFixture { "}\n"); ASSERT_EQUALS( "[test.cpp:2] -> [test.cpp:3]: (warning) Either the condition 'x==y' is redundant or there is division by zero at line 3.\n", - errout.str()); + errout_str()); } void zeroDiv19() @@ -662,7 +656,7 @@ class TestOther : public TestFixture { " for (int i = 0;;)\n" " int j = 10 / i;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:3]: (error) Division by zero.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Division by zero.\n", errout_str()); } void zeroDivCond() { @@ -670,25 +664,25 @@ class TestOther : public TestFixture { " int y = 17 / x;\n" " if (x > 0) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2]: (warning) Either the condition 'x>0' is redundant or there is division by zero at line 2.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2]: (warning) Either the condition 'x>0' is redundant or there is division by zero at line 2.\n", errout_str()); check("void f(unsigned int x) {\n" " int y = 17 / x;\n" " if (x >= 1) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2]: (warning) Either the condition 'x>=1' is redundant or there is division by zero at line 2.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2]: (warning) Either the condition 'x>=1' is redundant or there is division by zero at line 2.\n", errout_str()); check("void f(int x) {\n" " int y = 17 / x;\n" " if (x == 0) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2]: (warning) Either the condition 'x==0' is redundant or there is division by zero at line 2.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2]: (warning) Either the condition 'x==0' is redundant or there is division by zero at line 2.\n", errout_str()); check("void f(unsigned int x) {\n" " int y = 17 / x;\n" " if (x != 0) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2]: (warning) Either the condition 'x!=0' is redundant or there is division by zero at line 2.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2]: (warning) Either the condition 'x!=0' is redundant or there is division by zero at line 2.\n", errout_str()); // function call check("void f1(int x, int y) { c=x/y; }\n" @@ -698,7 +692,7 @@ class TestOther : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:4] -> [test.cpp:1]: (warning) Either the condition 'y>0' is redundant or there is division by zero at line 1.\n", - errout.str()); + errout_str()); // avoid false positives when variable is changed after division check("void f() {\n" @@ -707,7 +701,7 @@ class TestOther : public TestFixture { " x = some+calculation;\n" " if (x != 0) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); { // function is called that might modify global variable @@ -718,7 +712,7 @@ class TestOther : public TestFixture { " do_something();\n" " if (x != 0) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // function is called. but don't care, variable is local check("void do_something();\n" @@ -728,7 +722,7 @@ class TestOther : public TestFixture { " do_something();\n" " if (x != 0) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:6] -> [test.cpp:4]: (warning) Either the condition 'x!=0' is redundant or there is division by zero at line 4.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6] -> [test.cpp:4]: (warning) Either the condition 'x!=0' is redundant or there is division by zero at line 4.\n", errout_str()); } check("void do_something(int value);\n" @@ -736,14 +730,14 @@ class TestOther : public TestFixture { " int y = 17 / x;\n" " do_something(x);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int x;\n" "void f() {\n" " int y = 17 / x;\n" " while (y || x == 0) { x--; }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // ticket 5033 segmentation fault (valid code) in CheckOther::checkZeroDivisionOrUselessCondition check("void f() {\n" @@ -752,33 +746,33 @@ class TestOther : public TestFixture { "double* p3= new double[1];\n" "double* pp[3] = {p1,p2,p3};\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #5105 - FP check("int f(int a, int b) {\n" " int r = a / b;\n" " if (func(b)) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Unknown types for b and c --> do not warn check("int f(int d) {\n" " int r = (a?b:c) / d;\n" " if (d == 0) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f(int a) {\n" " int r = a ? 1 / a : 0;\n" " if (a == 0) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f(int a) {\n" " int r = (a == 0) ? 0 : 1 / a;\n" " if (a == 0) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int g();\n" "void f(int b) {\n" @@ -788,7 +782,7 @@ class TestOther : public TestFixture { " else\n" " a = b / -x;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A {\n" " int x;\n" @@ -798,7 +792,7 @@ class TestOther : public TestFixture { " a->x = 1;\n" " return 1/a->x;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #10049 check("int f(int argc) {\n" @@ -810,7 +804,7 @@ class TestOther : public TestFixture { " return quotient;\n" " return remainder;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #11315 checkP("#define STATIC_ASSERT(c) \\\n" @@ -818,7 +812,7 @@ class TestOther : public TestFixture { "void f() {\n" " STATIC_ASSERT(sizeof(int) == sizeof(FOO));\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #11505 check("void f(uint16_t num, uint8_t radix) {\n" @@ -826,7 +820,7 @@ class TestOther : public TestFixture { " num /= radix;\n" " if (!num) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void nanInArithmeticExpression() { @@ -835,35 +829,35 @@ class TestOther : public TestFixture { " double x = 3.0 / 0.0 + 1.0;\n" " printf(\"%f\", x);\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Using NaN/Inf in a computation.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Using NaN/Inf in a computation.\n", errout_str()); check("void f()\n" "{\n" " double x = 3.0 / 0.0 - 1.0;\n" " printf(\"%f\", x);\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Using NaN/Inf in a computation.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Using NaN/Inf in a computation.\n", errout_str()); check("void f()\n" "{\n" " double x = 1.0 + 3.0 / 0.0;\n" " printf(\"%f\", x);\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Using NaN/Inf in a computation.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Using NaN/Inf in a computation.\n", errout_str()); check("void f()\n" "{\n" " double x = 1.0 - 3.0 / 0.0;\n" " printf(\"%f\", x);\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Using NaN/Inf in a computation.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Using NaN/Inf in a computation.\n", errout_str()); check("void f()\n" "{\n" " double x = 3.0 / 0.0;\n" " printf(\"%f\", x);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } @@ -894,7 +888,7 @@ class TestOther : public TestFixture { "\n" " return 1;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void varScope2() { @@ -904,7 +898,7 @@ class TestOther : public TestFixture { " e.SetValue(12);\n" " throw e;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void varScope3() { @@ -918,7 +912,7 @@ class TestOther : public TestFixture { " }\n" " *p = 1;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void varScope4() { @@ -926,7 +920,7 @@ class TestOther : public TestFixture { "{\n" " int i;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void varScope5() { @@ -937,7 +931,7 @@ class TestOther : public TestFixture { " for ( ; i < 10; ++i) ;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) The scope of the variable 'i' can be reduced.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) The scope of the variable 'i' can be reduced.\n", errout_str()); check("void f(int x) {\n" " const unsigned char i = 0;\n" @@ -945,7 +939,7 @@ class TestOther : public TestFixture { " for ( ; i < 10; ++i) ;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x)\n" "{\n" @@ -955,7 +949,7 @@ class TestOther : public TestFixture { " for ( ; i < 10; ++i) ;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) The scope of the variable 'i' can be reduced.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) The scope of the variable 'i' can be reduced.\n", errout_str()); } void varScope6() { @@ -969,7 +963,7 @@ class TestOther : public TestFixture { " c(i);\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" // #5398 " bool success = false;\n" @@ -978,14 +972,14 @@ class TestOther : public TestFixture { " foo(notReducable);\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(Test &test) {\n" " int& x = test.getData();\n" " if (test.process())\n" " x = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f()\n" "{\n" @@ -1000,7 +994,7 @@ class TestOther : public TestFixture { " }\n" "}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int &x)\n" "{\n" @@ -1011,7 +1005,7 @@ class TestOther : public TestFixture { " ++x;\n" " } while (x);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void varScope7() { @@ -1023,7 +1017,7 @@ class TestOther : public TestFixture { " y++;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void varScope8() { @@ -1034,7 +1028,7 @@ class TestOther : public TestFixture { " edgeResistance = (edge+1) / 2.0;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) The scope of the variable 'edgeResistance' can be reduced.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) The scope of the variable 'edgeResistance' can be reduced.\n", errout_str()); } void varScope9() { @@ -1049,7 +1043,7 @@ class TestOther : public TestFixture { " f.x();\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void varScope10() { @@ -1060,7 +1054,7 @@ class TestOther : public TestFixture { " foo(x++);\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void varScope11() { @@ -1068,21 +1062,21 @@ class TestOther : public TestFixture { " int x = 0;\n" " AB ab = { x, 0 };\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f() {\n" " int x = 0;\n" " if (a == 0) { ++x; }\n" " AB ab = { x, 0 };\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f() {\n" " int x = 0;\n" " if (a == 0) { ++x; }\n" " if (a == 1) { AB ab = { x, 0 }; }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void varScope12() { @@ -1093,7 +1087,7 @@ class TestOther : public TestFixture { " foo(i);\n" " foo(j);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) The scope of the variable 'i' can be reduced.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) The scope of the variable 'i' can be reduced.\n", errout_str()); check("void f(int x) {\n" " int i[5];\n" @@ -1102,7 +1096,7 @@ class TestOther : public TestFixture { " j = i;\n" " foo(j);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x) {\n" " const bool b = true;\n" @@ -1110,7 +1104,7 @@ class TestOther : public TestFixture { " if (x == 5)\n" " foo(b);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x) {\n" " const bool b = x;\n" @@ -1118,7 +1112,7 @@ class TestOther : public TestFixture { " if (x == 5)\n" " foo(b);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void varScope13() { @@ -1129,7 +1123,7 @@ class TestOther : public TestFixture { " if (i++ == 42) { break; }\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void varScope14() { @@ -1140,7 +1134,7 @@ class TestOther : public TestFixture { " for ( ; i < 10; ++i) ;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void varScope15() { @@ -1152,7 +1146,7 @@ class TestOther : public TestFixture { " else if(c);\n" " else;\n" "}", nullptr, false); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void varScope16() { @@ -1162,7 +1156,7 @@ class TestOther : public TestFixture { " foo();\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " int a = 0;\n" @@ -1170,7 +1164,7 @@ class TestOther : public TestFixture { " foo();\n" " } while((++a) < 56);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " int a = 0;\n" @@ -1179,7 +1173,7 @@ class TestOther : public TestFixture { " foo(a);\n" " } while((++a) < 56);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " int a = 0;\n" @@ -1188,7 +1182,7 @@ class TestOther : public TestFixture { " foo(a);\n" " } while(z());\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) The scope of the variable 'a' can be reduced.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) The scope of the variable 'a' can be reduced.\n", errout_str()); } void varScope17() { @@ -1199,7 +1193,7 @@ class TestOther : public TestFixture { " morestuff(x);\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) The scope of the variable 'x' can be reduced.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) The scope of the variable 'x' can be reduced.\n", errout_str()); check("void f() {\n" " int x;\n" @@ -1209,7 +1203,7 @@ class TestOther : public TestFixture { " }\n" " if (b) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) The scope of the variable 'x' can be reduced.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) The scope of the variable 'x' can be reduced.\n", errout_str()); } void varScope18() { @@ -1229,7 +1223,7 @@ class TestOther : public TestFixture { " do_something(x);\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) The scope of the variable 'x' can be reduced.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) The scope of the variable 'x' can be reduced.\n", errout_str()); check("void f() {\n" " short x;\n" @@ -1248,7 +1242,7 @@ class TestOther : public TestFixture { " do_something(x);\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " short x;\n" @@ -1263,7 +1257,7 @@ class TestOther : public TestFixture { " break;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) The scope of the variable 'x' can be reduced.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) The scope of the variable 'x' can be reduced.\n", errout_str()); check("void f() {\n" " short x;\n" @@ -1280,7 +1274,7 @@ class TestOther : public TestFixture { " break;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void varScope20() { // Ticket #5103 - constant variable only used in inner scope @@ -1290,7 +1284,7 @@ class TestOther : public TestFixture { " if (b > 32) b = x;\n" " return b;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void varScope21() { // Ticket #5382 - initializing two-dimensional array @@ -1299,7 +1293,7 @@ class TestOther : public TestFixture { " int test_array[1][1] = { { test_value } };\n" " return sizeof(test_array);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void varScope22() { // Ticket #5684 - "The scope of the variable 'p' can be reduced" - But it can not. @@ -1312,7 +1306,7 @@ class TestOther : public TestFixture { " ++i;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // try to avoid an obvious false negative after applying the fix for the example above: check("void foo() {\n" " int* p( 42 );\n" @@ -1325,7 +1319,7 @@ class TestOther : public TestFixture { " ++i;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) The scope of the variable 'p' can be reduced.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) The scope of the variable 'p' can be reduced.\n", errout_str()); } void varScope23() { // #6154: Don't suggest to reduce scope if inner scope is a lambda @@ -1335,7 +1329,7 @@ class TestOther : public TestFixture { " std::cout << myCounter += aX << std::endl;\n" " });\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void varScope24() { @@ -1345,7 +1339,7 @@ class TestOther : public TestFixture { " r.dostuff();\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) The scope of the variable 'r' can be reduced.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) The scope of the variable 'r' can be reduced.\n", errout_str()); check("void f(Foo x) {\n" " Foo foo = x;\n" @@ -1353,7 +1347,7 @@ class TestOther : public TestFixture { " foo.dostuff();\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void varScope25() { @@ -1364,7 +1358,7 @@ class TestOther : public TestFixture { " if (currtime > t) {}\n" " }\n" "}", "test.c"); - ASSERT_EQUALS("[test.c:2]: (style) The scope of the variable 'currtime' can be reduced.\n", errout.str()); + ASSERT_EQUALS("[test.c:2]: (style) The scope of the variable 'currtime' can be reduced.\n", errout_str()); } void varScope26() { @@ -1376,7 +1370,7 @@ class TestOther : public TestFixture { " }\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void varScope27() { @@ -1386,7 +1380,7 @@ class TestOther : public TestFixture { "#endif\n" " if (id == ABC) { return x; }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkP("void f() {\n" "#ifdef X\n" @@ -1394,7 +1388,7 @@ class TestOther : public TestFixture { " int x = 0;\n" " if (id == ABC) { return x; }\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (style) The scope of the variable 'x' can be reduced.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) The scope of the variable 'x' can be reduced.\n", errout_str()); } void varScope28() { @@ -1402,7 +1396,7 @@ class TestOther : public TestFixture { " int i{};\n" " if (double d = g(i); d == 1.0) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void varScope29() { // #10888 @@ -1419,7 +1413,7 @@ class TestOther : public TestFixture { "}\n", "test.c"); ASSERT_EQUALS("[test.c:4]: (style) The scope of the variable 'e' can be reduced.\n" "[test.c:5]: (style) The scope of the variable 's' can be reduced.\n", - errout.str()); + errout_str()); check("void f(bool b) {\n" " std::string s;\n" @@ -1428,7 +1422,7 @@ class TestOther : public TestFixture { " g(s);\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) The scope of the variable 's' can be reduced.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) The scope of the variable 's' can be reduced.\n", errout_str()); check("auto foo(std::vector& vec, bool flag) {\n" " std::vector dummy;\n" @@ -1441,7 +1435,7 @@ class TestOther : public TestFixture { " }\n" " return *iter;\n" "}"); - ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'vec' can be declared as reference to const\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'vec' can be declared as reference to const\n", errout_str()); check("auto& foo(std::vector& vec, bool flag) {\n" " std::vector dummy;\n" @@ -1454,7 +1448,7 @@ class TestOther : public TestFixture { " }\n" " return *iter;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void varScope30() { // #8541 @@ -1470,7 +1464,7 @@ class TestOther : public TestFixture { " });\n" " return b;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void varScope31() { // #11099 @@ -1558,7 +1552,7 @@ class TestOther : public TestFixture { "[test.cpp:60]: (style) The scope of the variable 'w' can be reduced.\n" "[test.cpp:67]: (style) The scope of the variable 'w' can be reduced.\n" "[test.cpp:74]: (style) The scope of the variable 'w' can be reduced.\n", - errout.str()); + errout_str()); } void varScope32() { // #11441 @@ -1569,7 +1563,7 @@ class TestOther : public TestFixture { " for (auto x : v)\n" " w = g([&]() { x; }, w);\n" "}\n"); - ASSERT_EQUALS("[test.cpp:6]: (warning) Unused variable value 'x'\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (warning) Unused variable value 'x'\n", errout_str()); } void varScope33() { // #11131 @@ -1619,7 +1613,7 @@ class TestOther : public TestFixture { "[test.cpp:23]: (style) The scope of the variable 'str3' can be reduced.\n" "[test.cpp:31]: (style) The scope of the variable 'i' can be reduced.\n" "[test.cpp:37]: (style) The scope of the variable 'k' can be reduced.\n", - errout.str()); + errout_str()); } void varScope34() { // #11742 @@ -1632,7 +1626,7 @@ class TestOther : public TestFixture { " i++;\n" " }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void varScope35() { // #11845 @@ -1643,7 +1637,7 @@ class TestOther : public TestFixture { " msg = strcpy(buf, src);\n" " printf(\"%d: %s\\n\", err, msg);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("char* g(char* dst, const char* src);\n" "void f(int err, const char* src) {\n" @@ -1653,7 +1647,7 @@ class TestOther : public TestFixture { " msg = g(buf, src);\n" " printf(\"%d: %s\\n\", err, msg);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("char* g(char* dst, const char* src);\n" "void f(int err, const char* src) {\n" @@ -1663,7 +1657,7 @@ class TestOther : public TestFixture { " g(buf, src);\n" " printf(\"%d: %s\\n\", err, msg);\n" "}\n"); - ASSERT_EQUALS("[test.cpp:4]: (style) The scope of the variable 'buf' can be reduced.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) The scope of the variable 'buf' can be reduced.\n", errout_str()); } void varScope36() { @@ -1676,7 +1670,7 @@ class TestOther : public TestFixture { " for( i = 0U; i < 5U; i++ ) {}\n" " }\n" "}\n", nullptr, false); - ASSERT_EQUALS("[test.cpp:2]: (style) The scope of the variable 'i' can be reduced.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) The scope of the variable 'i' can be reduced.\n", errout_str()); } void varScope37() { @@ -1691,15 +1685,12 @@ class TestOther : public TestFixture { " }\n" " }\n" "}\n", nullptr, false); - ASSERT_EQUALS("[test.cpp:2]: (style) The scope of the variable 'i' can be reduced.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) The scope of the variable 'i' can be reduced.\n", errout_str()); } #define checkOldStylePointerCast(code) checkOldStylePointerCast_(code, __FILE__, __LINE__) void checkOldStylePointerCast_(const char code[], const char* file, int line) { - // Clear the error buffer.. - errout.str(""); - // #5560 - set c++03 const Settings settings = settingsBuilder().severity(Severity::style).cpp(Standards::CPP03).build(); @@ -1720,103 +1711,103 @@ class TestOther : public TestFixture { "{\n" " Base * b = (Base *) derived;\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (style) C-style pointer casting\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) C-style pointer casting\n", errout_str()); checkOldStylePointerCast("class Base;\n" "void foo()\n" "{\n" " Base * b = (const Base *) derived;\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (style) C-style pointer casting\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) C-style pointer casting\n", errout_str()); checkOldStylePointerCast("class Base;\n" "void foo()\n" "{\n" " Base * b = (const Base * const) derived;\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (style) C-style pointer casting\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) C-style pointer casting\n", errout_str()); checkOldStylePointerCast("class Base;\n" "void foo()\n" "{\n" " Base * b = (volatile Base *) derived;\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (style) C-style pointer casting\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) C-style pointer casting\n", errout_str()); checkOldStylePointerCast("class Base;\n" "void foo()\n" "{\n" " Base * b = (volatile Base * const) derived;\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (style) C-style pointer casting\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) C-style pointer casting\n", errout_str()); checkOldStylePointerCast("class Base;\n" "void foo()\n" "{\n" " Base * b = (const volatile Base *) derived;\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (style) C-style pointer casting\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) C-style pointer casting\n", errout_str()); checkOldStylePointerCast("class Base;\n" "void foo()\n" "{\n" " Base * b = (const volatile Base * const) derived;\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (style) C-style pointer casting\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) C-style pointer casting\n", errout_str()); checkOldStylePointerCast("class Base;\n" "void foo()\n" "{\n" " Base * b = (const Base *) ( new Derived() );\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (style) C-style pointer casting\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) C-style pointer casting\n", errout_str()); checkOldStylePointerCast("class Base;\n" "void foo()\n" "{\n" " Base * b = (const Base *) new Derived();\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (style) C-style pointer casting\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) C-style pointer casting\n", errout_str()); checkOldStylePointerCast("class Base;\n" "void foo()\n" "{\n" " Base * b = (const Base *) new short[10];\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (style) C-style pointer casting\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) C-style pointer casting\n", errout_str()); checkOldStylePointerCast("class B;\n" "class A\n" "{\n" " virtual void abc(B *) const = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkOldStylePointerCast("class B;\n" "class A\n" "{\n" " virtual void abc(const B *) const = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #3630 checkOldStylePointerCast("class SomeType;\n" "class X : public Base {\n" " X() : Base((SomeType*)7) {}\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (style) C-style pointer casting\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) C-style pointer casting\n", errout_str()); checkOldStylePointerCast("class SomeType;\n" "class X : public Base {\n" " X() : Base((SomeType*)var) {}\n" "};"); - ASSERT_EQUALS("[test.cpp:3]: (style) C-style pointer casting\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) C-style pointer casting\n", errout_str()); checkOldStylePointerCast("class SomeType;\n" "class X : public Base {\n" " X() : Base((SomeType*)0) {}\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #5560 checkOldStylePointerCast("class C;\n" @@ -1826,7 +1817,7 @@ class TestOther : public TestFixture { "\n" "class MS : public M\n" "{ virtual void addController(C*) override {} };"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #6164 checkOldStylePointerCast("class Base {};\n" @@ -1835,7 +1826,7 @@ class TestOther : public TestFixture { " std::vector v;\n" " v.push_back((Base*)new Derived);\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (style) C-style pointer casting\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (style) C-style pointer casting\n", errout_str()); // #7709 checkOldStylePointerCast("typedef struct S S;\n" @@ -1868,7 +1859,7 @@ class TestOther : public TestFixture { "[test.cpp:17]: (style) C-style pointer casting\n" "[test.cpp:18]: (style) C-style pointer casting\n" "[test.cpp:19]: (style) C-style pointer casting\n", - errout.str()); + errout_str()); // #8649 checkOldStylePointerCast("struct S {};\n" @@ -1879,13 +1870,13 @@ class TestOther : public TestFixture { "}\n"); ASSERT_EQUALS("[test.cpp:4]: (style) C-style pointer casting\n" "[test.cpp:5]: (style) C-style pointer casting\n", - errout.str()); + errout_str()); // #10823 checkOldStylePointerCast("void f(void* p) {\n" " auto h = reinterpret_cast(p);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #5210 checkOldStylePointerCast("void f(void* v1, void* v2) {\n" @@ -1894,7 +1885,7 @@ class TestOther : public TestFixture { "}\n"); ASSERT_EQUALS("[test.cpp:2]: (style) C-style pointer casting\n" "[test.cpp:3]: (style) C-style pointer casting\n", - errout.str()); + errout_str()); // #12446 checkOldStylePointerCast("namespace N { struct S {}; }\n" @@ -1910,21 +1901,18 @@ class TestOther : public TestFixture { ASSERT_EQUALS("[test.cpp:7]: (style) C-style pointer casting\n" "[test.cpp:8]: (style) C-style pointer casting\n" "[test.cpp:9]: (style) C-style pointer casting\n", - errout.str()); + errout_str()); // #12447 checkOldStylePointerCast("void f(const int& i) {\n" " int& r = (int&)i;\n" " r = 0;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:2]: (style) C-style reference casting\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) C-style reference casting\n", errout_str()); } #define checkInvalidPointerCast(...) checkInvalidPointerCast_(__FILE__, __LINE__, __VA_ARGS__) void checkInvalidPointerCast_(const char* file, int line, const char code[], bool portability = true, bool inconclusive = false) { - // Clear the error buffer.. - errout.str(""); - /*const*/ Settings settings = settingsBuilder().severity(Severity::warning).severity(Severity::portability, portability).certainty(Certainty::inconclusive, inconclusive).build(); settings.platform.defaultSign = 's'; @@ -1947,19 +1935,19 @@ class TestOther : public TestFixture { " delete [] (long double const*)(new float[10]);\n" "}"); ASSERT_EQUALS("[test.cpp:3]: (portability) Casting between float * and double * which have an incompatible binary data representation.\n" - "[test.cpp:4]: (portability) Casting between float * and const long double * which have an incompatible binary data representation.\n", errout.str()); + "[test.cpp:4]: (portability) Casting between float * and const long double * which have an incompatible binary data representation.\n", errout_str()); checkInvalidPointerCast("void test(const float* f) {\n" " double *d = (double*)f;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (portability) Casting between const float * and double * which have an incompatible binary data representation.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (portability) Casting between const float * and double * which have an incompatible binary data representation.\n", errout_str()); checkInvalidPointerCast("void test(double* d1) {\n" " long double *ld = (long double*)d1;\n" " double *d2 = (double*)ld;\n" "}"); ASSERT_EQUALS("[test.cpp:2]: (portability) Casting between double * and long double * which have an incompatible binary data representation.\n" - "[test.cpp:3]: (portability) Casting between long double * and double * which have an incompatible binary data representation.\n", errout.str()); + "[test.cpp:3]: (portability) Casting between long double * and double * which have an incompatible binary data representation.\n", errout_str()); checkInvalidPointerCast("char* test(int* i) {\n" " long double *d = (long double*)(i);\n" @@ -1968,44 +1956,44 @@ class TestOther : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:2]: (portability) Casting between signed int * and long double * which have an incompatible binary data representation.\n" "[test.cpp:3]: (portability) Casting between signed int * and double * which have an incompatible binary data representation.\n" - "[test.cpp:4]: (portability) Casting between signed int * and float * which have an incompatible binary data representation.\n", errout.str()); + "[test.cpp:4]: (portability) Casting between signed int * and float * which have an incompatible binary data representation.\n", errout_str()); checkInvalidPointerCast("float* test(unsigned int* i) {\n" " return (float*)i;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (portability) Casting between unsigned int * and float * which have an incompatible binary data representation.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (portability) Casting between unsigned int * and float * which have an incompatible binary data representation.\n", errout_str()); checkInvalidPointerCast("float* test(unsigned int* i) {\n" " return (float*)i[0];\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkInvalidPointerCast("float* test(double& d) {\n" " return (float*)&d;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (portability) Casting between double * and float * which have an incompatible binary data representation.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (portability) Casting between double * and float * which have an incompatible binary data representation.\n", errout_str()); checkInvalidPointerCast("void test(float* data) {\n" " f.write((char*)data,sizeof(float));\n" "}", true, false); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkInvalidPointerCast("void test(float* data) {\n" " f.write((char*)data,sizeof(float));\n" "}", true, true); // #3639 - ASSERT_EQUALS("[test.cpp:2]: (portability, inconclusive) Casting from float * to signed char * is not portable due to different binary data representations on different platforms.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (portability, inconclusive) Casting from float * to signed char * is not portable due to different binary data representations on different platforms.\n", errout_str()); checkInvalidPointerCast("long long* test(float* f) {\n" " return (long long*)f;\n" "}", false); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkInvalidPointerCast("long long* test(float* f, char* c) {\n" " foo((long long*)f);\n" " return reinterpret_cast(c);\n" "}", true); - ASSERT_EQUALS("[test.cpp:2]: (portability) Casting from float * to signed long long * is not portable due to different binary data representations on different platforms.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (portability) Casting from float * to signed long long * is not portable due to different binary data representations on different platforms.\n", errout_str()); checkInvalidPointerCast("Q_DECLARE_METATYPE(int*)"); // #4135 - don't crash } @@ -2013,101 +2001,101 @@ class TestOther : public TestFixture { void passedByValue() { check("void f(const std::string str) {}"); - ASSERT_EQUALS("[test.cpp:1]: (performance) Function parameter 'str' should be passed by const reference.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (performance) Function parameter 'str' should be passed by const reference.\n", errout_str()); check("void f(std::unique_ptr ptr) {}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(const std::shared_ptr ptr) {}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(const std::function ptr) {}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); { check("void f(const std::pair x) {}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(const std::pair x) {}"); - TODO_ASSERT_EQUALS("error", "", errout.str()); + TODO_ASSERT_EQUALS("error", "", errout_str()); } check("void f(const std::string::size_type x) {}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class Foo;\nvoid f(const Foo foo) {}"); // Unknown class - ASSERT_EQUALS("[test.cpp:2]: (performance, inconclusive) Function parameter 'foo' should be passed by const reference.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (performance, inconclusive) Function parameter 'foo' should be passed by const reference.\n", errout_str()); check("class Foo { std::vector v; };\nvoid f(const Foo foo) {}"); // Large class (STL member) - ASSERT_EQUALS("[test.cpp:2]: (performance) Function parameter 'foo' should be passed by const reference.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (performance) Function parameter 'foo' should be passed by const reference.\n", errout_str()); check("class Foo { int i; };\nvoid f(const Foo foo) {}"); // Small class - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class Foo { int i[6]; };\nvoid f(const Foo foo) {}"); // Large class (array) - ASSERT_EQUALS("[test.cpp:2]: (performance) Function parameter 'foo' should be passed by const reference.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (performance) Function parameter 'foo' should be passed by const reference.\n", errout_str()); check("class Foo { std::string* s; };\nvoid f(const Foo foo) {}"); // Small class (pointer) - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class Foo { static std::string s; };\nvoid f(const Foo foo) {}"); // Small class (static member) - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class X { std::string s; }; class Foo : X { };\nvoid f(const Foo foo) {}"); // Large class (inherited) - ASSERT_EQUALS("[test.cpp:2]: (performance) Function parameter 'foo' should be passed by const reference.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (performance) Function parameter 'foo' should be passed by const reference.\n", errout_str()); check("class X { std::string s; }; class Foo { X x; };\nvoid f(const Foo foo) {}"); // Large class (inherited) - ASSERT_EQUALS("[test.cpp:2]: (performance) Function parameter 'foo' should be passed by const reference.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (performance) Function parameter 'foo' should be passed by const reference.\n", errout_str()); check("void f(const std::string &str) {}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // The idiomatic way of passing a std::string_view is by value check("void f(const std::string_view str) {}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(std::string_view str) {}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(const std::string_view &str) {}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(const std::vector v) {}"); - ASSERT_EQUALS("[test.cpp:1]: (performance) Function parameter 'v' should be passed by const reference.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (performance) Function parameter 'v' should be passed by const reference.\n", errout_str()); check("void f(const std::vector v) {}"); - ASSERT_EQUALS("[test.cpp:1]: (performance) Function parameter 'v' should be passed by const reference.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (performance) Function parameter 'v' should be passed by const reference.\n", errout_str()); check("void f(const std::vector::size_type s) {}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(const std::vector &v) {}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(const std::map &v) {}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(const std::map v) {}"); - ASSERT_EQUALS("[test.cpp:1]: (performance) Function parameter 'v' should be passed by const reference.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (performance) Function parameter 'v' should be passed by const reference.\n", errout_str()); check("void f(const std::map v) {}"); - ASSERT_EQUALS("[test.cpp:1]: (performance) Function parameter 'v' should be passed by const reference.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (performance) Function parameter 'v' should be passed by const reference.\n", errout_str()); check("void f(const std::map v) {}"); - ASSERT_EQUALS("[test.cpp:1]: (performance) Function parameter 'v' should be passed by const reference.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (performance) Function parameter 'v' should be passed by const reference.\n", errout_str()); check("void f(const std::map v) {}"); - ASSERT_EQUALS("[test.cpp:1]: (performance) Function parameter 'v' should be passed by const reference.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (performance) Function parameter 'v' should be passed by const reference.\n", errout_str()); check("void f(const std::streamoff pos) {}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(std::initializer_list i) {}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #5824 check("void log(const std::string& file, int line, const std::string& function, const std::string str, ...) {}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #5534 check("struct float3 { };\n" @@ -2116,30 +2104,30 @@ class TestOther : public TestFixture { " vec Refract(vec &vec) const;\n" " bool IntersectLinePlane(const vec &planeNormal);\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class X {\n" " virtual void func(const std::string str) {}\n" "};"); - ASSERT_EQUALS("[test.cpp:2]: (performance) Function parameter 'str' should be passed by const reference.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (performance) Function parameter 'str' should be passed by const reference.\n", errout_str()); check("enum X;\n" "void foo(X x1){}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("enum X { a, b, c };\n" "void foo(X x2){}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("enum X { a, b, c };\n" "enum X;" "void foo(X x3){}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("enum X;\n" "enum X { a, b, c };" "void foo(X x4){}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("union U {\n" " char* pc;\n" @@ -2147,18 +2135,18 @@ class TestOther : public TestFixture { " int* pi;\n" "};\n" "void f(U u) {}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S { char A[8][8]; };\n" "void f(S s) {}\n"); - ASSERT_EQUALS("[test.cpp:2]: (performance) Function parameter 's' should be passed by const reference.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (performance) Function parameter 's' should be passed by const reference.\n", errout_str()); check("union U {\n" // don't crash " int a;\n" " decltype(nullptr) b;\n" "};\n" "int* f(U u) { return u.b; }\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct B { virtual int f(std::string s) = 0; };\n" // #11432 "struct D1 : B {\n" @@ -2167,7 +2155,7 @@ class TestOther : public TestFixture { "struct D2 : B {\n" " int f(std::string s) override { return s.size(); }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int x(int);\n" "void f(std::vector v, int& j) {\n" @@ -2197,7 +2185,7 @@ class TestOther : public TestFixture { ASSERT_EQUALS("[test.cpp:2]: (performance) Function parameter 'v' should be passed by const reference.\n" "[test.cpp:10]: (performance) Function parameter 'v' should be passed by const reference.\n" "[test.cpp:18]: (performance) Function parameter 'v' should be passed by const reference.\n", - errout.str()); + errout_str()); check("struct S {\n" // #11995 " explicit S(std::string s) noexcept;\n" @@ -2209,7 +2197,7 @@ class TestOther : public TestFixture { " std::string m;\n" "};\n" "T::T(std::string s) noexcept(true) : m(std::move(s)) {}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("namespace N {\n" // #12086 " void g(int);\n" @@ -2217,12 +2205,12 @@ class TestOther : public TestFixture { "void f(std::vector v) {\n" " N::g(v[0]);\n" "}\n"); - ASSERT_EQUALS("[test.cpp:4]: (performance) Function parameter 'v' should be passed by const reference.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (performance) Function parameter 'v' should be passed by const reference.\n", errout_str()); check("void f(const std::string& s, std::string t) {\n" // #12083 " const std::string& v = !s.empty() ? s : t;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:1]: (performance) Function parameter 't' should be passed by const reference.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (performance) Function parameter 't' should be passed by const reference.\n", errout_str()); /*const*/ Settings settings0 = settingsBuilder(_settings).platform(Platform::Type::Unix64).build(); check("struct S {\n" // #12138 @@ -2242,7 +2230,7 @@ class TestOther : public TestFixture { "void f(S s) {\n" " if (s.x > s.y) {}\n" "}\n", /*filename*/ nullptr, /*inconclusive*/ true, /*runSimpleChecks*/ true, /*verbose*/ false, &settings0); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S { std::list l; };\n" // #12147 "class C { public: std::list l; };\n" @@ -2254,103 +2242,103 @@ class TestOther : public TestFixture { "}\n"); ASSERT_EQUALS("[test.cpp:3]: (performance) Function parameter 's' should be passed by const reference.\n" "[test.cpp:6]: (performance) Function parameter 'c' should be passed by const reference.\n", - errout.str()); + errout_str()); check("struct S { std::list a[1][1]; };\n" "bool f(S s) {\n" " return s.a[0][0].empty();\n" "}\n"); ASSERT_EQUALS("[test.cpp:2]: (performance) Function parameter 's' should be passed by const reference.\n", - errout.str()); + errout_str()); /*const*/ Settings settings1 = settingsBuilder().platform(Platform::Type::Win64).build(); check("using ui64 = unsigned __int64;\n" "ui64 Test(ui64 one, ui64 two) { return one + two; }\n", /*filename*/ nullptr, /*inconclusive*/ true, /*runSimpleChecks*/ true, /*verbose*/ false, &settings1); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void passedByValue_nonConst() { check("void f(std::string str) {}"); - ASSERT_EQUALS("[test.cpp:1]: (performance) Function parameter 'str' should be passed by const reference.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (performance) Function parameter 'str' should be passed by const reference.\n", errout_str()); check("void f(std::string str) {\n" " return str + x;\n" "}"); - ASSERT_EQUALS("[test.cpp:1]: (performance) Function parameter 'str' should be passed by const reference.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (performance) Function parameter 'str' should be passed by const reference.\n", errout_str()); check("void f(std::string str) {\n" " std::cout << str;\n" "}"); - ASSERT_EQUALS("[test.cpp:1]: (performance) Function parameter 'str' should be passed by const reference.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (performance) Function parameter 'str' should be passed by const reference.\n", errout_str()); check("void f(std::string str) {\n" " std::cin >> str;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(std::string str) {\n" " std::string s2 = str;\n" "}"); - ASSERT_EQUALS("[test.cpp:1]: (performance) Function parameter 'str' should be passed by const reference.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (performance) Function parameter 'str' should be passed by const reference.\n", errout_str()); check("void f(std::string str) {\n" " std::string& s2 = str;\n" "}"); ASSERT_EQUALS("[test.cpp:1]: (performance) Function parameter 'str' should be passed by const reference.\n" "[test.cpp:2]: (style) Variable 's2' can be declared as reference to const\n", - errout.str()); + errout_str()); check("void f(std::string str) {\n" " const std::string& s2 = str;\n" "}"); - ASSERT_EQUALS("[test.cpp:1]: (performance) Function parameter 'str' should be passed by const reference.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (performance) Function parameter 'str' should be passed by const reference.\n", errout_str()); check("void f(std::string str) {\n" " str = \"\";\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(std::string str) {\n" " foo(str);\n" // It could be that foo takes str as non-const-reference "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(const std::string& str);\n" "void f(std::string str) {\n" " foo(str);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (performance) Function parameter 'str' should be passed by const reference.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (performance) Function parameter 'str' should be passed by const reference.\n", errout_str()); check("void foo(std::string str);\n" "void f(std::string str) {\n" " foo(str);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (performance) Function parameter 'str' should be passed by const reference.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (performance) Function parameter 'str' should be passed by const reference.\n", errout_str()); check("void foo(std::string& str);\n" "void f(std::string str) {\n" " foo(str);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(std::string* str);\n" "void f(std::string str) {\n" " foo(&str);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(int& i1, const std::string& str, int& i2);\n" "void f(std::string str) {\n" " foo((a+b)*c, str, x);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (performance) Function parameter 'str' should be passed by const reference.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (performance) Function parameter 'str' should be passed by const reference.\n", errout_str()); check("std::string f(std::string str) {\n" " str += x;\n" " return str;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class X {\n" " std::string s;\n" @@ -2359,7 +2347,7 @@ class TestOther : public TestFixture { "Y f(X x) {\n" " x.func();\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (performance) Function parameter 'x' should be passed by const reference.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (performance) Function parameter 'x' should be passed by const reference.\n", errout_str()); check("class X {\n" " void func();\n" @@ -2367,17 +2355,17 @@ class TestOther : public TestFixture { "Y f(X x) {\n" " x.func();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class X {\n" " void func(std::string str) {}\n" "};"); - ASSERT_EQUALS("[test.cpp:2]: (performance) Function parameter 'str' should be passed by const reference.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (performance) Function parameter 'str' should be passed by const reference.\n", errout_str()); check("class X {\n" " virtual void func(std::string str) {}\n" // Do not warn about virtual functions, if 'str' is not declared as const "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class X {\n" " char a[1024];\n" @@ -2387,7 +2375,7 @@ class TestOther : public TestFixture { "};\n" "void f(Y y) {\n" "}"); - ASSERT_EQUALS("[test.cpp:7]: (performance) Function parameter 'y' should be passed by const reference.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (performance) Function parameter 'y' should be passed by const reference.\n", errout_str()); check("class X {\n" " void* a;\n" @@ -2400,7 +2388,7 @@ class TestOther : public TestFixture { "};\n" "void f(X x, Y y) {\n" "}"); - ASSERT_EQUALS("[test.cpp:10]: (performance) Function parameter 'y' should be passed by const reference.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:10]: (performance) Function parameter 'y' should be passed by const reference.\n", errout_str()); { // 8-byte data should be passed by const reference on 32-bit platform but not on 64-bit platform @@ -2412,11 +2400,11 @@ class TestOther : public TestFixture { /*const*/ Settings s32 = settingsBuilder(_settings).platform(Platform::Type::Unix32).build(); check(code, &s32); - ASSERT_EQUALS("[test.cpp:5]: (performance) Function parameter 'x' should be passed by const reference.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (performance) Function parameter 'x' should be passed by const reference.\n", errout_str()); /*const*/ Settings s64 = settingsBuilder(_settings).platform(Platform::Type::Unix64).build(); check(code, &s64); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } check("Writer* getWriter();\n" @@ -2424,27 +2412,27 @@ class TestOther : public TestFixture { "void foo(Buffer& buffer) {\n" " getWriter()->operator<<(buffer);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void passedByValue_externC() { check("struct X { int a[5]; }; void f(X v) { }"); - ASSERT_EQUALS("[test.cpp:1]: (performance) Function parameter 'v' should be passed by const reference.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (performance) Function parameter 'v' should be passed by const reference.\n", errout_str()); check("extern \"C\" { struct X { int a[5]; }; void f(X v) { } }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct X { int a[5]; }; extern \"C\" void f(X v) { }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct X { int a[5]; }; void f(const X v);"); - ASSERT_EQUALS("[test.cpp:1]: (performance) Function parameter 'v' should be passed by const reference.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (performance) Function parameter 'v' should be passed by const reference.\n", errout_str()); check("extern \"C\" { struct X { int a[5]; }; void f(const X v); }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct X { int a[5]; }; extern \"C\" void f(const X v) { }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void constVariable() { @@ -2454,138 +2442,138 @@ class TestOther : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:1]: (performance) Function parameter 'x' should be passed by const reference.\n" "[test.cpp:2]: (style) Variable 'i' can be declared as reference to const\n", - errout.str()); + errout_str()); check("int f(std::vector& x) {\n" " return x[0];\n" "}"); - ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'x' can be declared as reference to const\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'x' can be declared as reference to const\n", errout_str()); check("int f(std::vector x) {\n" " const int& i = x[0];\n" " return i;\n" "}"); - ASSERT_EQUALS("[test.cpp:1]: (performance) Function parameter 'x' should be passed by const reference.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (performance) Function parameter 'x' should be passed by const reference.\n", errout_str()); check("int f(std::vector x) {\n" " static int& i = x[0];\n" " return i;\n" "}"); - ASSERT_EQUALS("[test.cpp:1]: (performance) Function parameter 'x' should be passed by const reference.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (performance) Function parameter 'x' should be passed by const reference.\n", errout_str()); check("int f(std::vector x) {\n" " int& i = x[0];\n" " i++;\n" " return i;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int& f(std::vector& x) {\n" " x.push_back(1);\n" " int& i = x[0];\n" " return i;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f(const std::vector& x) {\n" " return x[0];\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int& f(std::vector& x) {\n" " return x[0];\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("const int& f(std::vector& x) {\n" " return x[0];\n" "}"); - ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'x' can be declared as reference to const\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'x' can be declared as reference to const\n", errout_str()); check("int f(std::vector& x) {\n" " x[0]++;\n" " return x[0];\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A { int a; };\n" "A f(std::vector& x) {\n" " x[0].a = 1;\n" " return x[0];\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A { int a(); };\n" "A f(std::vector& x) {\n" " x[0].a();\n" " return x[0];\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int g(int& x);\n" "int f(std::vector& x) {\n" " g(x[0]);\n" " return x[0];\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("template\n" "T f(T& x) {\n" " return x[0];\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("template\n" "T f(T&& x) {\n" " return x[0];\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("template\n" "T f(T& x) {\n" " return x[0];\n" "}\n" "void h() { std::vector v; h(v); }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f(int& x) {\n" " return std::move(x);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(std::ostream& os) {\n" " os << \"Hello\";\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void g(int*);\n" "void f(int& x) {\n" " g(&x);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A { A(int*); };\n" "A f(int& x) {\n" " return A(&x);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A { A(int*); };\n" "A f(int& x) {\n" " return A{&x};\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int& x, int& y) {\n" " y++;\n" "}"); - ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'x' can be declared as reference to const\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'x' can be declared as reference to const\n", errout_str()); check("struct A {\n" " explicit A(int& y) : x(&y) {}\n" " int * x = nullptr;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A {\n" " std::vector v;\n" @@ -2593,7 +2581,7 @@ class TestOther : public TestFixture { " v.swap(a.v);\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A {\n" " template\n" @@ -2604,25 +2592,25 @@ class TestOther : public TestFixture { "void g(A& a) {\n" " a.f();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(std::vector& v) {\n" " for(auto&& x:v)\n" " x = 1;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(std::vector& v) {\n" " for(auto x:v)\n" " x = 1;\n" "}"); - ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'v' can be declared as reference to const\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'v' can be declared as reference to const\n", errout_str()); check("void f(std::vector& v) {\n" " for(auto& x:v) {}\n" "}"); ASSERT_EQUALS("[test.cpp:2]: (style) Variable 'x' can be declared as reference to const\n", - errout.str()); + errout_str()); check("void f(std::vector& v) {\n" // #10980 " for (int& i : v)\n" @@ -2637,37 +2625,37 @@ class TestOther : public TestFixture { "}\n"); ASSERT_EQUALS("[test.cpp:2]: (style) Variable 'i' can be declared as reference to const\n" "[test.cpp:6]: (style) Variable 'i' can be declared as reference to const\n", - errout.str()); + errout_str()); check("void f(std::vector& v) {\n" " for(const auto& x:v) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'v' can be declared as reference to const\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'v' can be declared as reference to const\n", errout_str()); check("void f(int& i) {\n" " int& j = i;\n" " j++;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(std::vector& v) {\n" " int& i = v[0];\n" " i++;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(std::map >& m, unsigned int i) {\n" " std::map& members = m[i];\n" " members.clear();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A {\n" " int& x;\n" " A(int& y) : x(y)\n" " {}\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A {\n" " A(int& x);\n" @@ -2676,14 +2664,14 @@ class TestOther : public TestFixture { " B(int& x) : A(x)\n" " {}\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(bool b, int& x, int& y) {\n" " auto& z = x;\n" " auto& w = b ? y : z;\n" " w = 1;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S {\n" " int i;\n" @@ -2691,7 +2679,7 @@ class TestOther : public TestFixture { "int& f(S& s) {\n" " return s.i;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int* f(std::list& x, unsigned int y) {\n" " for (int& m : x) {\n" @@ -2700,7 +2688,7 @@ class TestOther : public TestFixture { " }\n" " return nullptr;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int& f(std::list& x, int& y) {\n" " for (int& m : x) {\n" @@ -2709,13 +2697,13 @@ class TestOther : public TestFixture { " }\n" " return y;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool from_string(int& t, const std::string& s) {\n" " std::istringstream iss(s);\n" " return !(iss >> t).fail();\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #9710 check("class a {\n" @@ -2726,7 +2714,7 @@ class TestOther : public TestFixture { "void f(int& i) {\n" " a()(i);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class a {\n" " void operator()(int& i) const {\n" @@ -2737,7 +2725,7 @@ class TestOther : public TestFixture { " a x;\n" " x(i);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class a {\n" " void operator()(const int& i) const;\n" @@ -2746,14 +2734,14 @@ class TestOther : public TestFixture { " a x;\n" " x(i);\n" "}\n"); - ASSERT_EQUALS("[test.cpp:4]: (style) Parameter 'i' can be declared as reference to const\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Parameter 'i' can be declared as reference to const\n", errout_str()); //cast or assignment to a non-const reference should prevent the warning check("struct T { void dostuff() const {}};\n" "void a(T& x) {\n" " x.dostuff();\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Parameter 'x' can be declared as reference to const\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Parameter 'x' can be declared as reference to const\n", errout_str()); check("struct T : public U { void dostuff() const {}};\n" "void a(T& x) {\n" " x.dostuff();\n" @@ -2761,86 +2749,86 @@ class TestOther : public TestFixture { " T& y = x;\n" " y.mutate();\n" // to avoid warnings that y can be const "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct T : public U { void dostuff() const {}};\n" "void a(T& x) {\n" " x.dostuff();\n" " const U& y = x\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Parameter 'x' can be declared as reference to const\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Parameter 'x' can be declared as reference to const\n", errout_str()); check("struct T : public U { void dostuff() const {}};\n" "void a(T& x) {\n" " x.dostuff();\n" " U& y = x;\n" " y.mutate();\n" // to avoid warnings that y can be const "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct T : public U { void dostuff() const {}};\n" "void a(T& x) {\n" " x.dostuff();\n" " my::type& y = x;\n" // we don't know if y is const or not " y.mutate();\n" // to avoid warnings that y can be const "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct T : public U { void dostuff() const {}};\n" "void a(T& x) {\n" " x.dostuff();\n" " const U& y = static_cast(x);\n" " y.mutate();\n" // to avoid warnings that y can be const "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Parameter 'x' can be declared as reference to const\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Parameter 'x' can be declared as reference to const\n", errout_str()); check("struct T : public U { void dostuff() const {}};\n" "void a(T& x) {\n" " x.dostuff();\n" " U& y = static_cast(x);\n" " y.mutate();\n" // to avoid warnings that y can be const "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct T : public U { void dostuff() const {}};\n" "void a(T& x) {\n" " x.dostuff();\n" " const U& y = dynamic_cast(x)\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Parameter 'x' can be declared as reference to const\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Parameter 'x' can be declared as reference to const\n", errout_str()); check("struct T : public U { void dostuff() const {}};\n" "void a(T& x) {\n" " x.dostuff();\n" " const U& y = dynamic_cast(x);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Parameter 'x' can be declared as reference to const\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Parameter 'x' can be declared as reference to const\n", errout_str()); check("struct T : public U { void dostuff() const {}};\n" "void a(T& x) {\n" " x.dostuff();\n" " const U& y = dynamic_cast(x);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Parameter 'x' can be declared as reference to const\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Parameter 'x' can be declared as reference to const\n", errout_str()); check("struct T : public U { void dostuff() const {}};\n" "void a(T& x) {\n" " x.dostuff();\n" " U& y = dynamic_cast(x);\n" " y.mutate();\n" // to avoid warnings that y can be const "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct T : public U { void dostuff() const {}};\n" "void a(T& x) {\n" " x.dostuff();\n" " const U& y = dynamic_cast(x);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Parameter 'x' can be declared as reference to const\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Parameter 'x' can be declared as reference to const\n", errout_str()); check("struct T : public U { void dostuff() const {}};\n" "void a(T& x) {\n" " x.dostuff();\n" " U& y = dynamic_cast(x);\n" " y.mutate();\n" // to avoid warnings that y can be const "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct T : public U { void dostuff() const {}};\n" "void a(T& x) {\n" " x.dostuff();\n" " U* y = dynamic_cast(&x);\n" " y->mutate();\n" // to avoid warnings that y can be const "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct T : public U { void dostuff() const {}};\n" "void a(T& x) {\n" @@ -2848,42 +2836,42 @@ class TestOther : public TestFixture { " const U * y = dynamic_cast(&x);\n" " y->mutate();\n" // to avoid warnings that y can be const "}"); - TODO_ASSERT_EQUALS("can be const", errout.str(), ""); //Currently taking the address is treated as a non-const operation when it should depend on what we do with it + TODO_ASSERT_EQUALS("can be const", errout_str(), ""); //Currently taking the address is treated as a non-const operation when it should depend on what we do with it check("struct T : public U { void dostuff() const {}};\n" "void a(T& x) {\n" " x.dostuff();\n" " U const * y = dynamic_cast(&x);\n" " y->mutate();\n" // to avoid warnings that y can be const "}"); - TODO_ASSERT_EQUALS("can be const", errout.str(), ""); //Currently taking the address is treated as a non-const operation when it should depend on what we do with it + TODO_ASSERT_EQUALS("can be const", errout_str(), ""); //Currently taking the address is treated as a non-const operation when it should depend on what we do with it check("struct T : public U { void dostuff() const {}};\n" "void a(T& x) {\n" " x.dostuff();\n" " const U const * const * const * const y = dynamic_cast(&x);\n" " y->mutate();\n" // to avoid warnings that y can be const "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct T : public U { void dostuff() const {}};\n" "void a(T& x) {\n" " x.dostuff();\n" " const U const * const * const * const y = dynamic_cast(&x);\n" " y->mutate();\n" // to avoid warnings that y can be const "}"); - TODO_ASSERT_EQUALS("can be const", errout.str(), ""); //Currently taking the address is treated as a non-const operation when it should depend on what we do with it + TODO_ASSERT_EQUALS("can be const", errout_str(), ""); //Currently taking the address is treated as a non-const operation when it should depend on what we do with it check("struct T : public U { void dostuff() const {}};\n" "void a(T& x) {\n" " x.dostuff();\n" " const U const * const * * const y = dynamic_cast(&x);\n" " y->mutate();\n" // to avoid warnings that y can be const "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct T : public U { void dostuff() const {}};\n" "void a(T& x) {\n" " x.dostuff();\n" " my::fancy const * const * const y = dynamic_cast const * const * const>(&x);\n" " y->mutate();\n" // to avoid warnings that y can be const "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct T : public U { void dostuff() const {}};\n" "void a(T& x) {\n" @@ -2892,14 +2880,14 @@ class TestOther : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:4]: (style) C-style reference casting\n" "[test.cpp:2]: (style) Parameter 'x' can be declared as reference to const\n", - errout.str()); + errout_str()); check("struct T : public U { void dostuff() const {}};\n" "void a(T& x) {\n" " x.dostuff();\n" " U& y = (U&)(x);\n" " y.mutate();\n" // to avoid warnings that y can be const "}"); - ASSERT_EQUALS("[test.cpp:4]: (style) C-style reference casting\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) C-style reference casting\n", errout_str()); check("struct T : public U { void dostuff() const {}};\n" "void a(T& x) {\n" " x.dostuff();\n" @@ -2907,21 +2895,21 @@ class TestOther : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:4]: (style) C-style reference casting\n" "[test.cpp:2]: (style) Parameter 'x' can be declared as reference to const\n", - errout.str()); + errout_str()); check("struct T : public U { void dostuff() const {}};\n" "void a(T& x) {\n" " x.dostuff();\n" " U& y = (typename U&)(x);\n" " y.mutate();\n" // to avoid warnings that y can be const "}"); - ASSERT_EQUALS("[test.cpp:4]: (style) C-style reference casting\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) C-style reference casting\n", errout_str()); check("struct T : public U { void dostuff() const {}};\n" "void a(T& x) {\n" " x.dostuff();\n" " U* y = (U*)(&x);\n" " y->mutate();\n" // to avoid warnings that y can be const "}"); - ASSERT_EQUALS("[test.cpp:4]: (style) C-style pointer casting\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) C-style pointer casting\n", errout_str()); check("struct C { void f() const; };\n" // #9875 - crash "\n" @@ -2929,7 +2917,7 @@ class TestOther : public TestFixture { " x.f();\n" " foo( static_cast(0) );\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Parameter 'x' can be declared as reference to const\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Parameter 'x' can be declared as reference to const\n", errout_str()); check("class a {\n" " void foo(const int& i) const;\n" @@ -2938,7 +2926,7 @@ class TestOther : public TestFixture { "void f(int& i) {\n" " a()(i);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class a {\n" " void operator()(const int& i) const;\n" @@ -2946,7 +2934,7 @@ class TestOther : public TestFixture { "void f(int& i) {\n" " a()(i);\n" "}\n"); - ASSERT_EQUALS("[test.cpp:4]: (style) Parameter 'i' can be declared as reference to const\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Parameter 'i' can be declared as reference to const\n", errout_str()); // #9767 check("void fct1(MyClass& object) {\n" @@ -2955,7 +2943,7 @@ class TestOther : public TestFixture { "bool fct2(std::function lambdaExpression, MyClass& object) {\n" " object.modify();\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #9778 check("struct A {};\n" @@ -2963,14 +2951,14 @@ class TestOther : public TestFixture { "B& f(A& x) {\n" " return static_cast(x);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #10002 check("using A = int*;\n" "void f(const A& x) {\n" " ++(*x);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #10086 check("struct V {\n" @@ -2980,7 +2968,7 @@ class TestOther : public TestFixture { " }\n" " std::vector v;\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void e();\n" "void g(void);\n" @@ -3136,7 +3124,7 @@ class TestOther : public TestFixture { ASSERT_EQUALS("[test.cpp:131]: (style) Variable 'tm' can be declared as pointer to const\n" "[test.cpp:136]: (style) Variable 'af' can be declared as pointer to const\n" "[test.cpp:137]: (style) Variable 'ag' can be declared as pointer to const\n", - errout.str()); + errout_str()); check("class C\n" "{\n" @@ -3157,7 +3145,7 @@ class TestOther : public TestFixture { " : c(i)\n" "{\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class C\n" "{\n" @@ -3177,7 +3165,7 @@ class TestOther : public TestFixture { "D::D(int& i) noexcept\n" " : c(i)\n" "{}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class C\n" "{\n" @@ -3198,7 +3186,7 @@ class TestOther : public TestFixture { " : c(i)\n" "{\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:16]: (style) Parameter 'i' can be declared as reference to const\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:16]: (style) Parameter 'i' can be declared as reference to const\n", "", errout_str()); check("class C\n" "{\n" @@ -3219,7 +3207,7 @@ class TestOther : public TestFixture { " : c(i)\n" "{\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:16]: (style) Parameter 'i' can be declared as reference to const\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:16]: (style) Parameter 'i' can be declared as reference to const\n", "", errout_str()); check("class C\n" "{\n" @@ -3240,21 +3228,21 @@ class TestOther : public TestFixture { " : c(0, i)\n" "{\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:16]: (style) Parameter 'i' can be declared as reference to const\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:16]: (style) Parameter 'i' can be declared as reference to const\n", "", errout_str()); check("void f(std::map> &map) {\n" // #10266 " for (auto &[slave, panels] : map)\n" " panels.erase(it);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S { void f(); int i; };\n" "void call_f(S& s) { (s.*(&S::f))(); }\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S { int a[1]; };\n" "void f(S& s) { int* p = s.a; *p = 0; }\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct Foo {\n" // #9910 " int* p{};\n" @@ -3265,7 +3253,7 @@ class TestOther : public TestFixture { " int j{};\n" " void f(Foo& foo) const { int* q = foo.get(); *q = j; }\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S {\n" // #10679 " void g(long L, const C*& PC) const;\n" @@ -3275,25 +3263,25 @@ class TestOther : public TestFixture { " C* PC{};\n" " s.g(0, PC);\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #10785 check("template \n" "struct d {\n" " T& g(C& c, T C::*f) { return c.*f; }\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(std::map& m) {\n" " std::cout << m[0] << std::endl;\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(std::vector>& v) {\n" // #11607 " for (auto& m : v)\n" " std::cout << m[0];\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S { int i; };\n" // #11473 "void f(std::vector>&m, int*& p) {\n" @@ -3303,14 +3291,14 @@ class TestOther : public TestFixture { " return;\n" " }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int& g(int* p, int& r) {\n" // #11625 " if (p)\n" " return *p;\n" " return r;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("template void f(std::vector& d, const std::vector& s) {\n" // #11632 " for (const auto& e : s) {\n" @@ -3318,7 +3306,7 @@ class TestOther : public TestFixture { " d.push_back(newE);\n" " }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(std::array& a) {\n" " if (a[0]) {}\n" @@ -3326,7 +3314,7 @@ class TestOther : public TestFixture { "void g(std::array& a) {\n" " a.fill(0);\n" "}\n"); - ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'a' can be declared as const array\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'a' can be declared as const array\n", errout_str()); // #11682 check("struct b {\n" @@ -3341,7 +3329,7 @@ class TestOther : public TestFixture { " e.get().mutate();\n" " }\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct B { virtual void f() const {} };\n" // #11528 "struct D : B {};\n" @@ -3352,7 +3340,7 @@ class TestOther : public TestFixture { "}\n"); ASSERT_EQUALS( "[test.cpp:4]: (style) Variable 'd' can be declared as pointer to const\n", - errout.str()); + errout_str()); check("void g(const int*);\n" "void f(const std::vector&v) {\n" @@ -3361,7 +3349,7 @@ class TestOther : public TestFixture { "}\n"); ASSERT_EQUALS( "[test.cpp:3]: (style) Variable 'i' can be declared as pointer to const\n", - errout.str()); + errout_str()); check("struct A {\n" // #11225 " A();\n" @@ -3377,19 +3365,19 @@ class TestOther : public TestFixture { ASSERT_EQUALS("[test.cpp:10]: (style) C-style pointer casting\n" "[test.cpp:6]: (style) Parameter 'a' can be declared as pointer to const\n" "[test.cpp:9]: (style) Parameter 'a' can be declared as pointer to const\n", - errout.str()); + errout_str()); check("void g(int*);\n" "void f(std::vector& v) {\n" " g(v.data());\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void g(const int*);\n" "void f(std::vector& v) {\n" " g(v.data());\n" "}\n"); - ASSERT_EQUALS("[test.cpp:2]: (style) Parameter 'v' can be declared as reference to const\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Parameter 'v' can be declared as reference to const\n", errout_str()); check("struct a {\n" " template \n" @@ -3404,7 +3392,7 @@ class TestOther : public TestFixture { "void f(const b&)\n" "{}\n" "void g(a& c) { f(c); }\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S {\n" " template \n" @@ -3420,32 +3408,32 @@ class TestOther : public TestFixture { "void f(S& s) {\n" " const int* p = s.g();\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S { int x; };\n" // #11818 "std::istream& f(std::istream& is, S& s) {\n" " return is >> s.x;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool f(std::string& s1, std::string& s2) {\n" // #12203 " return &s1 == &s2;\n" "}\n"); ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 's1' can be declared as reference to const\n" "[test.cpp:1]: (style) Parameter 's2' can be declared as reference to const\n", - errout.str()); + errout_str()); check("void f(int& r) {\n" // #12214 " (void)(true);\n" " if (r) {}\n" "}\n"); - ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'r' can be declared as reference to const\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'r' can be declared as reference to const\n", errout_str()); check("struct S { void f(int&); };\n" // #12216 "void g(S& s, int& r, void (S::* p2m)(int&)) {\n" " (s.*p2m)(r);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S {\n" " void f(int& r) { p = &r; }\n" @@ -3454,7 +3442,7 @@ class TestOther : public TestFixture { "void g(std::vector& v1, std::vector& v2) {\n" " std::transform(v1.begin(), v1.end(), v2.begin(), [](auto& x) { return &x; });\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class T;\n" // #11869 "class E {\n" @@ -3467,7 +3455,7 @@ class TestOther : public TestFixture { "void f(T& t) {\n" " std::list c(1, E::F(&t));\n" "}\n"); - ASSERT_EQUALS("[test.cpp:9]: (style) Parameter 't' can be declared as reference to const\n", errout.str()); + ASSERT_EQUALS("[test.cpp:9]: (style) Parameter 't' can be declared as reference to const\n", errout_str()); check("struct T;\n" "struct U {\n" @@ -3477,7 +3465,7 @@ class TestOther : public TestFixture { "void f(T& t) {\n" " g(U::V(&t));\n" "}\n"); - ASSERT_EQUALS("[test.cpp:6]: (style) Parameter 't' can be declared as reference to const\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (style) Parameter 't' can be declared as reference to const\n", errout_str()); check("void f1(std::vector& v) {\n" // #11207 " auto it = v.cbegin();\n" @@ -3495,7 +3483,7 @@ class TestOther : public TestFixture { "}\n"); ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'v' can be declared as reference to const\n" "[test.cpp:8]: (style) Parameter 'v' can be declared as reference to const\n", - errout.str()); + errout_str()); check("void cb(const std::string&);\n" // #12349, #12350, #12351 "void f(std::string& s) {\n" @@ -3528,7 +3516,7 @@ class TestOther : public TestFixture { "[test.cpp:10]: (style) Parameter 's' can be declared as pointer to const\n" "[test.cpp:14]: (style) Parameter 's' can be declared as pointer to const\n" "[test.cpp:22]: (style) Parameter 's' can be declared as pointer to const\n", - errout.str()); + errout_str()); check("struct S {\n" " S(std::string& r);\n" @@ -3536,7 +3524,7 @@ class TestOther : public TestFixture { "void f(std::string& str) {\n" " const S& s(str);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct C {\n" // #10052 " int& operator()(int);\n" @@ -3544,25 +3532,25 @@ class TestOther : public TestFixture { "void f(std::vector& c) {\n" " c[0](5) = 12;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f(int& t) {\n" // #11713 " return 0;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 't' can be declared as reference to const\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 't' can be declared as reference to const\n", errout_str()); check("void f(std::list& v) {\n" // #12202 " v.remove_if([](std::string& s) {\n" " return true;\n" " });\n" "}\n"); - ASSERT_EQUALS("[test.cpp:2]: (style) Parameter 's' can be declared as reference to const\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Parameter 's' can be declared as reference to const\n", errout_str()); } void constParameterCallback() { check("int callback(std::vector& x) { return x[0]; }\n" "void f() { dostuff(callback); }"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:1]: (style) Parameter 'x' can be declared as reference to const. However it seems that 'callback' is a callback function, if 'x' is declared with const you might also need to cast function pointer(s).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:1]: (style) Parameter 'x' can be declared as reference to const. However it seems that 'callback' is a callback function, if 'x' is declared with const you might also need to cast function pointer(s).\n", errout_str()); // #9906 check("class EventEngine : public IEventEngine {\n" @@ -3580,165 +3568,165 @@ class TestOther : public TestFixture { "void EventEngine::signalEvent(ev::sig& signal, int revents) {\n" " switch (signal.signum) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:10] -> [test.cpp:13]: (style) Parameter 'signal' can be declared as reference to const. However it seems that 'signalEvent' is a callback function, if 'signal' is declared with const you might also need to cast function pointer(s).\n", errout.str()); + ASSERT_EQUALS("[test.cpp:10] -> [test.cpp:13]: (style) Parameter 'signal' can be declared as reference to const. However it seems that 'signalEvent' is a callback function, if 'signal' is declared with const you might also need to cast function pointer(s).\n", errout_str()); } void constPointer() { check("void foo(int *p) { return *p; }"); - ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'p' can be declared as pointer to const\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'p' can be declared as pointer to const\n", errout_str()); check("void foo(int *p) { x = *p; }"); - ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'p' can be declared as pointer to const\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'p' can be declared as pointer to const\n", errout_str()); check("void foo(int *p) { int &ref = *p; ref = 12; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(int *p) { x = *p + 10; }"); - ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'p' can be declared as pointer to const\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'p' can be declared as pointer to const\n", errout_str()); check("void foo(int *p) { return p[10]; }"); - ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'p' can be declared as pointer to const\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'p' can be declared as pointer to const\n", errout_str()); check("void foo(int *p) { int &ref = p[0]; ref = 12; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(int *p) { x[*p] = 12; }"); - ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'p' can be declared as pointer to const\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'p' can be declared as pointer to const\n", errout_str()); check("void foo(int *p) { if (p) {} }"); - ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'p' can be declared as pointer to const\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'p' can be declared as pointer to const\n", errout_str()); check("void foo(int *p) { if (p || x) {} }"); - ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'p' can be declared as pointer to const\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'p' can be declared as pointer to const\n", errout_str()); check("void foo(int *p) { if (p == 0) {} }"); - ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'p' can be declared as pointer to const\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'p' can be declared as pointer to const\n", errout_str()); check("void foo(int *p) { if (!p) {} }"); - ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'p' can be declared as pointer to const\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'p' can be declared as pointer to const\n", errout_str()); check("void foo(int *p) { if (*p > 123) {} }"); - ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'p' can be declared as pointer to const\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'p' can be declared as pointer to const\n", errout_str()); check("void foo(int *p) { return *p + 1; }"); - ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'p' can be declared as pointer to const\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'p' can be declared as pointer to const\n", errout_str()); check("void foo(int *p) { return *p > 1; }"); - ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'p' can be declared as pointer to const\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'p' can be declared as pointer to const\n", errout_str()); check("void foo(const int* c) { if (c == 0) {}; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct a { void b(); };\n" "struct c {\n" " a* d;\n" " a& g() { return *d; }\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct a { void b(); };\n" "struct c { a* d; };\n" "void e(c);\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct V {\n" " V& get(typename std::vector::size_type i, std::vector* arr) {\n" " return arr->at(i);\n" " }\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A {};\n" "struct B : A {};\n" "B* f(A* x) {\n" " return static_cast(x);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f(std::vector* x) {\n" " int& i = (*x)[0];\n" " i++;\n" " return i;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A { int a; };\n" "A f(std::vector* x) {\n" " x->front().a = 1;\n" " return x->front();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(std::vector* v) {\n" " for(auto&& x:*v)\n" " x = 1;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A {\n" " int* x;\n" " A(int* y) : x(y)\n" " {}\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(bool b, int* x, int* y) {\n" " int* z = x;\n" " int* w = b ? y : z;\n" " *w = 1;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(bool b, int* x, int* y) {\n" " int& z = *x;\n" " int& w = b ? *y : z;\n" " w = 1;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class Base { virtual void dostuff(int *p) = 0; };\n" // #10397 "class Derived: public Base { int x; void dostuff(int *p) override { x = *p; } };"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct Data { char buf[128]; };\n" // #10483 "void encrypt(Data& data) {\n" " const char a[] = \"asfasd\";\n" " memcpy(data.buf, &a, sizeof(a));\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #10547 check("void foo(std::istream &istr) {\n" " unsigned char x[2];\n" " istr >> x[0];\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #10744 check("S& f() {\n" " static S* p = new S();\n" " return *p;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f() {\n" " static int i[1] = {};\n" " return i[0];\n" "}\n"); - ASSERT_EQUALS("[test.cpp:2]: (style) Variable 'i' can be declared as const array\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Variable 'i' can be declared as const array\n", errout_str()); check("int f() {\n" " static int i[] = { 0 };\n" " int j = i[0] + 1;\n" " return j;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:2]: (style) Variable 'i' can be declared as const array\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Variable 'i' can be declared as const array\n", errout_str()); // #10471 check("void f(std::array const& i) {\n" " if (i[0] == 0) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #10466 check("typedef void* HWND;\n" @@ -3750,7 +3738,7 @@ class TestOther : public TestFixture { "}\n"); ASSERT_EQUALS( "[test.cpp:5]: (style) Variable 'h' can be declared as pointer to const\n", - errout.str()); + errout_str()); check("void f(const std::vector& v) {\n" " for (const auto& p : v)\n" @@ -3760,7 +3748,7 @@ class TestOther : public TestFixture { "}\n"); ASSERT_EQUALS( "[test.cpp:2]: (style) Variable 'p' can be declared as pointer to const\n", - errout.str()); + errout_str()); check("void f(std::vector& v) {\n" " for (const auto& p : v)\n" @@ -3774,7 +3762,7 @@ class TestOther : public TestFixture { "}\n"); ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'v' can be declared as reference to const\n" "[test.cpp:2]: (style) Variable 'p' can be declared as pointer to const\n", - errout.str()); + errout_str()); check("void f(std::vector& v) {\n" " for (const auto& p : v)\n" @@ -3782,7 +3770,7 @@ class TestOther : public TestFixture { " for (const auto* p : v)\n" " if (p == nullptr) {}\n" "}\n"); - ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'v' can be declared as reference to const\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'v' can be declared as reference to const\n", errout_str()); check("void f(const std::vector& v) {\n" " for (const auto& p : v)\n" @@ -3790,26 +3778,26 @@ class TestOther : public TestFixture { " for (const auto* p : v)\n" " if (p == nullptr) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(const int* const p) {\n" " if (p == nullptr) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void g(int*);\n" "void f(int* const* pp) {\n" " int* p = pp[0];\n" " g(p);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("template \n" "struct S {\n" " static bool f(const T& t) { return t != nullptr; }\n" "};\n" "S s;\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int i) {\n" " const char *tmp;\n" @@ -3822,37 +3810,37 @@ class TestOther : public TestFixture { "}\n"); ASSERT_EQUALS("[test.cpp:3]: (style) Variable 'a' can be declared as const array\n" "[test.cpp:4]: (style) Variable 'b' can be declared as const array\n", - errout.str()); + errout_str()); check("typedef void* HWND;\n" // #11084 "void f(const HWND h) {\n" " if (h == nullptr) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("using HWND = void*;\n" "void f(const HWND h) {\n" " if (h == nullptr) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("typedef int A;\n" "void f(A* x) {\n" " if (x == nullptr) {}\n" "}\n"); - ASSERT_EQUALS("[test.cpp:2]: (style) Parameter 'x' can be declared as pointer to const\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Parameter 'x' can be declared as pointer to const\n", errout_str()); check("using A = int;\n" "void f(A* x) {\n" " if (x == nullptr) {}\n" "}\n"); - ASSERT_EQUALS("[test.cpp:2]: (style) Parameter 'x' can be declared as pointer to const\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Parameter 'x' can be declared as pointer to const\n", errout_str()); check("struct S { void v(); };\n" // #11095 "void f(S* s) {\n" " (s - 1)->v();\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(std::vector& v) {\n" // #11085 " for (int* p : v) {\n" @@ -3865,7 +3853,7 @@ class TestOther : public TestFixture { "}\n"); ASSERT_EQUALS("[test.cpp:2]: (style) Variable 'p' can be declared as pointer to const\n" "[test.cpp:5]: (style) Variable 'p' can be declared as pointer to const\n", - errout.str()); + errout_str()); check("void f() {\n" " char a[1][1];\n" @@ -3873,21 +3861,21 @@ class TestOther : public TestFixture { " b[0] = a[0];\n" " **b = 0;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("ptrdiff_t f(int *p0, int *p1) {\n" // #11148 " return p0 - p1;\n" "}\n"); ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'p0' can be declared as pointer to const\n" "[test.cpp:1]: (style) Parameter 'p1' can be declared as pointer to const\n", - errout.str()); + errout_str()); check("void f() {\n" " std::array a{}, b{};\n" " const std::array& r = a;\n" " if (r == b) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S {};\n" // #11599 "void g(S);\n" @@ -3919,7 +3907,7 @@ class TestOther : public TestFixture { "[test.cpp:8]: (style) Parameter 's' can be declared as pointer to const\n" "[test.cpp:11]: (style) Parameter 's' can be declared as pointer to const\n" "[test.cpp:14]: (style) Parameter 's' can be declared as pointer to const\n", - errout.str()); + errout_str()); check("void g(int, const int*);\n" "void h(const int*);\n" @@ -3928,13 +3916,13 @@ class TestOther : public TestFixture { " h(p);\n" "}\n"); ASSERT_EQUALS("[test.cpp:3]: (style) Parameter 'p' can be declared as pointer to const\n", - errout.str()); + errout_str()); check("void f(int, const int*);\n" "void f(int i, int* p) {\n" " f(i, const_cast(p));\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S { int a; };\n" "void f(std::vector& v, int b) {\n" @@ -3945,25 +3933,25 @@ class TestOther : public TestFixture { " continue;\n" " }\n" "}\n"); - ASSERT_EQUALS("[test.cpp:5]: (style) Variable 's' can be declared as reference to const\n", errout.str()); // don't crash + ASSERT_EQUALS("[test.cpp:5]: (style) Variable 's' can be declared as reference to const\n", errout_str()); // don't crash check("void f(int& i) {\n" " new (&i) int();\n" "}\n"); - ASSERT_EQUALS("", errout.str()); // don't crash + ASSERT_EQUALS("", errout_str()); // don't crash check("void f(int& i) {\n" " int& r = i;\n" " if (!&r) {}\n" "}\n"); - ASSERT_EQUALS("[test.cpp:2]: (style) Variable 'r' can be declared as reference to const\n", errout.str()); // don't crash + ASSERT_EQUALS("[test.cpp:2]: (style) Variable 'r' can be declared as reference to const\n", errout_str()); // don't crash check("class C;\n" // #11646 "void g(const C* const p);\n" "void f(C* c) {\n" " g(c);\n" "}\n"); - ASSERT_EQUALS("[test.cpp:3]: (style) Parameter 'c' can be declared as pointer to const\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Parameter 'c' can be declared as pointer to const\n", errout_str()); check("typedef void (*cb_t)(int*);\n" // #11674 "void cb(int* p) {\n" @@ -3975,7 +3963,7 @@ class TestOther : public TestFixture { "}\n"); ASSERT_EQUALS("[test.cpp:7] -> [test.cpp:2]: (style) Parameter 'p' can be declared as pointer to const. " "However it seems that 'cb' is a callback function, if 'p' is declared with const you might also need to cast function pointer(s).\n", - errout.str()); + errout_str()); check("typedef void (*cb_t)(int*);\n" "void cb(int* p) {\n" @@ -3987,7 +3975,7 @@ class TestOther : public TestFixture { "}\n"); ASSERT_EQUALS("[test.cpp:7] -> [test.cpp:2]: (style) Parameter 'p' can be declared as pointer to const. " "However it seems that 'cb' is a callback function, if 'p' is declared with const you might also need to cast function pointer(s).\n", - errout.str()); + errout_str()); check("void f1(std::vector* p) {\n" // #11681 " if (p->empty()) {}\n" // warn @@ -4019,7 +4007,7 @@ class TestOther : public TestFixture { ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'p' can be declared as pointer to const\n" "[test.cpp:13]: (style) Parameter 's' can be declared as pointer to const\n" "[test.cpp:19]: (style) Parameter 's' can be declared as pointer to const\n", - errout.str()); + errout_str()); check("struct S {\n" // #11573 " const char* g() const {\n" @@ -4033,56 +4021,56 @@ class TestOther : public TestFixture { " if (strcmp(p->g(), n) == 0) {}\n" "}\n"); ASSERT_EQUALS("[test.cpp:8]: (style) Parameter 't' can be declared as pointer to const\n", - errout.str()); + errout_str()); check("void f(int*& p, int* q) {\n" " p = q;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S { int a[1]; };\n" "void f(S* s) {\n" " if (s->a[0]) {}\n" "}\n"); ASSERT_EQUALS("[test.cpp:2]: (style) Parameter 's' can be declared as pointer to const\n", - errout.str()); + errout_str()); check("size_t f(char* p) {\n" // #11842 " return strlen(p);\n" "}\n"); - ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'p' can be declared as pointer to const\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'p' can be declared as pointer to const\n", errout_str()); check("void f(int* p) {\n" // #11862 " long long j = *(p++);\n" "}\n"); ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'p' can be declared as pointer to const\n", - errout.str()); + errout_str()); check("void f(void *p, size_t nmemb, size_t size, int (*cmp)(const void *, const void *)) {\n" " qsort(p, nmemb, size, cmp);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void g(bool *r, std::size_t *b) {\n" // #12129 " if (*r && *b >= 5) {}\n" "}\n"); ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'r' can be declared as pointer to const\n" "[test.cpp:1]: (style) Parameter 'b' can be declared as pointer to const\n", - errout.str()); + errout_str()); check("void f(int i) {\n" // #12185 " void* p = &i;\n" " std::cout << p << '\\n';\n" "}\n"); ASSERT_EQUALS("[test.cpp:2]: (style) Variable 'p' can be declared as pointer to const\n", - errout.str()); + errout_str()); check("struct S { const T* t; };\n" // #12206 "void f(S* s) {\n" " if (s->t.i) {}\n" "}\n"); ASSERT_EQUALS("[test.cpp:2]: (style) Parameter 's' can be declared as pointer to const\n", - errout.str()); + errout_str()); check("void f(char *a1, char *a2) {\n" // #12252 " char* b = new char[strlen(a1) + strlen(a2) + 2];\n" @@ -4091,13 +4079,13 @@ class TestOther : public TestFixture { "}\n"); ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'a1' can be declared as pointer to const\n" "[test.cpp:1]: (style) Parameter 'a2' can be declared as pointer to const\n", - errout.str()); + errout_str()); check("int f(int* p) {\n" // #11713 " return 0;\n" "}\n"); ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'p' can be declared as pointer to const\n", - errout.str()); + errout_str()); } void switchRedundantAssignmentTest() { @@ -4113,7 +4101,7 @@ class TestOther : public TestFixture { " }\n" " bar(y);\n" "}"); - ASSERT_EQUALS("[test.cpp:7] -> [test.cpp:9]: (style) Variable 'y' is reassigned a value before the old one has been used. 'break;' missing?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7] -> [test.cpp:9]: (style) Variable 'y' is reassigned a value before the old one has been used. 'break;' missing?\n", errout_str()); check("void foo()\n" "{\n" @@ -4129,7 +4117,7 @@ class TestOther : public TestFixture { " }\n" " bar(y);\n" "}"); - ASSERT_EQUALS("[test.cpp:8] -> [test.cpp:11]: (style) Variable 'y' is reassigned a value before the old one has been used. 'break;' missing?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8] -> [test.cpp:11]: (style) Variable 'y' is reassigned a value before the old one has been used. 'break;' missing?\n", errout_str()); check("void foo()\n" "{\n" @@ -4146,7 +4134,7 @@ class TestOther : public TestFixture { " }\n" " bar(y);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo()\n" "{\n" @@ -4164,7 +4152,7 @@ class TestOther : public TestFixture { " }\n" " bar(y);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo()\n" "{\n" @@ -4179,7 +4167,7 @@ class TestOther : public TestFixture { " }\n" " bar(y);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo()\n" "{\n" @@ -4194,7 +4182,7 @@ class TestOther : public TestFixture { " }\n" " bar(y);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo()\n" "{\n" @@ -4211,7 +4199,7 @@ class TestOther : public TestFixture { " bar(y);\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo()\n" "{\n" @@ -4228,7 +4216,7 @@ class TestOther : public TestFixture { " bar(y);\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo()\n" "{\n" @@ -4243,7 +4231,7 @@ class TestOther : public TestFixture { " }\n" " bar(y);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo()\n" "{\n" @@ -4258,7 +4246,7 @@ class TestOther : public TestFixture { " }\n" " bar(y);\n" "}"); - ASSERT_EQUALS("[test.cpp:7] -> [test.cpp:10]: (style) Variable 'y' is reassigned a value before the old one has been used. 'break;' missing?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7] -> [test.cpp:10]: (style) Variable 'y' is reassigned a value before the old one has been used. 'break;' missing?\n", errout_str()); check("void bar() {}\n" // bar isn't noreturn "void foo()\n" @@ -4274,7 +4262,7 @@ class TestOther : public TestFixture { " }\n" " bar(y);\n" "}"); - ASSERT_EQUALS("[test.cpp:8] -> [test.cpp:11]: (style) Variable 'y' is reassigned a value before the old one has been used. 'break;' missing?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8] -> [test.cpp:11]: (style) Variable 'y' is reassigned a value before the old one has been used. 'break;' missing?\n", errout_str()); check("void foo(int a) {\n" " char str[10];\n" @@ -4288,7 +4276,7 @@ class TestOther : public TestFixture { "}", nullptr, false, false); TODO_ASSERT_EQUALS("[test.cpp:6] -> [test.cpp:8]: (style) Buffer 'str' is being written before its old content has been used. 'break;' missing?\n", "", - errout.str()); + errout_str()); check("void foo(int a) {\n" " char str[10];\n" @@ -4302,7 +4290,7 @@ class TestOther : public TestFixture { "}"); TODO_ASSERT_EQUALS("[test.cpp:6] -> [test.cpp:8]: (style) Buffer 'str' is being written before its old content has been used. 'break;' missing?\n", "", - errout.str()); + errout_str()); check("void foo(int a) {\n" " char str[10];\n" @@ -4319,7 +4307,7 @@ class TestOther : public TestFixture { "}", nullptr, false, false); TODO_ASSERT_EQUALS("[test.cpp:7] -> [test.cpp:10]: (style) Buffer 'str' is being written before its old content has been used. 'break;' missing?\n", "", - errout.str()); + errout_str()); check("void foo(int a) {\n" " char str[10];\n" @@ -4333,7 +4321,7 @@ class TestOther : public TestFixture { " break;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(int a) {\n" " char str[10];\n" @@ -4346,7 +4334,7 @@ class TestOther : public TestFixture { " strcpy(str, \"b'\");\n" " }\n" "}", nullptr, false, false); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Ticket #5158 "segmentation fault (valid code)" check("typedef struct ct_data_s {\n" @@ -4360,7 +4348,7 @@ class TestOther : public TestFixture { "void f(deflate_state *s) {\n" " s->dyn_ltree[0].fc.freq++;\n" "}\n", nullptr, false, false); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Ticket #6132 "crash: daca: kvirc CheckOther::checkRedundantAssignment()" check("void HttpFileTransfer :: transferTerminated ( bool bSuccess@1 ) {\n" @@ -4370,7 +4358,7 @@ class TestOther : public TestFixture { "KviKvsScript :: run ( m_szCompletionCallback , out ? out : ( g_pApp . activeConsole ( ) ) , & vParams ) ;\n" "}\n" "}\n", nullptr, false, true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " int x;\n" @@ -4379,7 +4367,7 @@ class TestOther : public TestFixture { " case 1: x = 6; goto a;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void switchRedundantOperationTest() { @@ -4395,7 +4383,7 @@ class TestOther : public TestFixture { " }\n" " bar(y);\n" "}"); - ASSERT_EQUALS("[test.cpp:7] -> [test.cpp:9]: (style) Variable 'y' is reassigned a value before the old one has been used. 'break;' missing?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7] -> [test.cpp:9]: (style) Variable 'y' is reassigned a value before the old one has been used. 'break;' missing?\n", errout_str()); check("void foo()\n" "{\n" " int y = 1;\n" @@ -4410,7 +4398,7 @@ class TestOther : public TestFixture { " }\n" " bar(y);\n" "}"); - ASSERT_EQUALS("[test.cpp:8] -> [test.cpp:11]: (style) Variable 'y' is reassigned a value before the old one has been used. 'break;' missing?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8] -> [test.cpp:11]: (style) Variable 'y' is reassigned a value before the old one has been used. 'break;' missing?\n", errout_str()); check("void foo()\n" "{\n" " int y = 1;\n" @@ -4423,7 +4411,7 @@ class TestOther : public TestFixture { " }\n" " bar(y);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo()\n" "{\n" " int y = 1;\n" @@ -4436,7 +4424,7 @@ class TestOther : public TestFixture { " }\n" " bar(y);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo()\n" "{\n" " int y = 1;\n" @@ -4449,7 +4437,7 @@ class TestOther : public TestFixture { " }\n" " bar(y);\n" "}"); - ASSERT_EQUALS("[test.cpp:7] -> [test.cpp:9]: (style) Variable 'y' is reassigned a value before the old one has been used. 'break;' missing?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7] -> [test.cpp:9]: (style) Variable 'y' is reassigned a value before the old one has been used. 'break;' missing?\n", errout_str()); check("void foo()\n" "{\n" " int y = 1;\n" @@ -4464,7 +4452,7 @@ class TestOther : public TestFixture { " }\n" " bar(y);\n" "}"); - ASSERT_EQUALS("[test.cpp:8] -> [test.cpp:11]: (style) Variable 'y' is reassigned a value before the old one has been used. 'break;' missing?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8] -> [test.cpp:11]: (style) Variable 'y' is reassigned a value before the old one has been used. 'break;' missing?\n", errout_str()); check("void foo()\n" "{\n" " int y = 1;\n" @@ -4477,7 +4465,7 @@ class TestOther : public TestFixture { " }\n" " bar(y);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo()\n" "{\n" " int y = 1;\n" @@ -4490,7 +4478,7 @@ class TestOther : public TestFixture { " }\n" " bar(y);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo()\n" "{\n" " int y = 1;\n" @@ -4503,7 +4491,7 @@ class TestOther : public TestFixture { " }\n" " bar(y);\n" "}"); - ASSERT_EQUALS("[test.cpp:7] -> [test.cpp:9]: (style) Variable 'y' is reassigned a value before the old one has been used. 'break;' missing?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7] -> [test.cpp:9]: (style) Variable 'y' is reassigned a value before the old one has been used. 'break;' missing?\n", errout_str()); check("void foo()\n" "{\n" " int y = 1;\n" @@ -4518,7 +4506,7 @@ class TestOther : public TestFixture { " }\n" " bar(y);\n" "}"); - ASSERT_EQUALS("[test.cpp:8] -> [test.cpp:11]: (style) Variable 'y' is reassigned a value before the old one has been used. 'break;' missing?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8] -> [test.cpp:11]: (style) Variable 'y' is reassigned a value before the old one has been used. 'break;' missing?\n", errout_str()); check("void foo()\n" "{\n" " int y = 1;\n" @@ -4531,7 +4519,7 @@ class TestOther : public TestFixture { " }\n" " bar(y);\n" "}", nullptr, false, false); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo()\n" "{\n" " int y = 1;\n" @@ -4544,7 +4532,7 @@ class TestOther : public TestFixture { " }\n" " bar(y);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo()\n" "{\n" " int y = 1;\n" @@ -4557,7 +4545,7 @@ class TestOther : public TestFixture { " }\n" " bar(y);\n" "}"); - ASSERT_EQUALS("[test.cpp:7] -> [test.cpp:9]: (style) Variable 'y' is reassigned a value before the old one has been used. 'break;' missing?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7] -> [test.cpp:9]: (style) Variable 'y' is reassigned a value before the old one has been used. 'break;' missing?\n", errout_str()); check("void foo()\n" "{\n" " int y = 1;\n" @@ -4572,7 +4560,7 @@ class TestOther : public TestFixture { " }\n" " bar(y);\n" "}"); - ASSERT_EQUALS("[test.cpp:8] -> [test.cpp:11]: (style) Variable 'y' is reassigned a value before the old one has been used. 'break;' missing?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8] -> [test.cpp:11]: (style) Variable 'y' is reassigned a value before the old one has been used. 'break;' missing?\n", errout_str()); check("void foo()\n" "{\n" " int y = 1;\n" @@ -4585,7 +4573,7 @@ class TestOther : public TestFixture { " }\n" " bar(y);\n" "}", nullptr, false, false); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo()\n" "{\n" " int y = 1;\n" @@ -4598,7 +4586,7 @@ class TestOther : public TestFixture { " }\n" " bar(y);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo()\n" "{\n" " int y = 1;\n" @@ -4614,7 +4602,7 @@ class TestOther : public TestFixture { " }\n" " bar(y);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo()\n" "{\n" " int y = 1;\n" @@ -4631,7 +4619,7 @@ class TestOther : public TestFixture { " }\n" " bar(y);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo()\n" "{\n" " int x = a;\n" @@ -4645,7 +4633,7 @@ class TestOther : public TestFixture { " }\n" " bar(y);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo()\n" "{\n" " int y = 1;\n" @@ -4659,7 +4647,7 @@ class TestOther : public TestFixture { " }\n" " bar(y);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo()\n" "{\n" " int y = 1;\n" @@ -4675,7 +4663,7 @@ class TestOther : public TestFixture { " bar(y);\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo()\n" "{\n" " int y = 1;\n" @@ -4691,7 +4679,7 @@ class TestOther : public TestFixture { " bar(y);\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo()\n" "{\n" " int y = 1;\n" @@ -4705,7 +4693,7 @@ class TestOther : public TestFixture { " }\n" " bar(y);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo()\n" "{\n" " int y = 1;\n" @@ -4719,7 +4707,7 @@ class TestOther : public TestFixture { " }\n" " bar(y);\n" "}"); - ASSERT_EQUALS("[test.cpp:7] -> [test.cpp:10]: (style) Variable 'y' is reassigned a value before the old one has been used. 'break;' missing?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7] -> [test.cpp:10]: (style) Variable 'y' is reassigned a value before the old one has been used. 'break;' missing?\n", errout_str()); check("bool f() {\n" " bool ret = false;\n" @@ -4740,7 +4728,7 @@ class TestOther : public TestFixture { ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:14]: (style) Variable 'ret' is reassigned a value before the old one has been used.\n" "[test.cpp:8] -> [test.cpp:14]: (style) Variable 'ret' is reassigned a value before the old one has been used.\n" "[test.cpp:11] -> [test.cpp:14]: (style) Variable 'ret' is reassigned a value before the old one has been used.\n", - errout.str()); + errout_str()); } void switchRedundantBitwiseOperationTest() { @@ -4756,7 +4744,7 @@ class TestOther : public TestFixture { " break;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:7]: (style) Redundant bitwise operation on 'y' in 'switch' statement. 'break;' missing?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (style) Redundant bitwise operation on 'y' in 'switch' statement. 'break;' missing?\n", errout_str()); check("void foo(int a)\n" "{\n" @@ -4770,7 +4758,7 @@ class TestOther : public TestFixture { " break;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:7]: (style) Redundant bitwise operation on 'y' in 'switch' statement. 'break;' missing?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (style) Redundant bitwise operation on 'y' in 'switch' statement. 'break;' missing?\n", errout_str()); check("void foo(int a)\n" "{\n" @@ -4784,7 +4772,7 @@ class TestOther : public TestFixture { " break;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:7]: (style) Redundant bitwise operation on 'y' in 'switch' statement. 'break;' missing?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (style) Redundant bitwise operation on 'y' in 'switch' statement. 'break;' missing?\n", errout_str()); check("void foo(int a)\n" "{\n" @@ -4799,7 +4787,7 @@ class TestOther : public TestFixture { " break;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(int a)\n" "{\n" @@ -4814,7 +4802,7 @@ class TestOther : public TestFixture { " break;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(int a)\n" "{\n" @@ -4829,7 +4817,7 @@ class TestOther : public TestFixture { " break;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(int a)\n" "{\n" @@ -4844,7 +4832,7 @@ class TestOther : public TestFixture { " break;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:7] -> [test.cpp:8]: (style) Variable 'y' is reassigned a value before the old one has been used.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7] -> [test.cpp:8]: (style) Variable 'y' is reassigned a value before the old one has been used.\n", errout_str()); check("void foo(int a)\n" "{\n" @@ -4858,7 +4846,7 @@ class TestOther : public TestFixture { " break;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:7]: (style) Redundant bitwise operation on 'y' in 'switch' statement. 'break;' missing?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (style) Redundant bitwise operation on 'y' in 'switch' statement. 'break;' missing?\n", errout_str()); check("void foo(int a)\n" "{\n" @@ -4873,7 +4861,7 @@ class TestOther : public TestFixture { " break;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(int a)\n" "{\n" @@ -4887,7 +4875,7 @@ class TestOther : public TestFixture { " break;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(int a)\n" "{\n" @@ -4901,7 +4889,7 @@ class TestOther : public TestFixture { " break;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(int a)\n" "{\n" @@ -4915,7 +4903,7 @@ class TestOther : public TestFixture { " break;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(int a)\n" "{\n" @@ -4929,7 +4917,7 @@ class TestOther : public TestFixture { " break;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void unreachableCode() { @@ -4941,20 +4929,20 @@ class TestOther : public TestFixture { " }\n" " }\n" "}", nullptr, false, false); - ASSERT_EQUALS("[test.cpp:5]: (style) Consecutive return, break, continue, goto or throw statements are unnecessary.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (style) Consecutive return, break, continue, goto or throw statements are unnecessary.\n", errout_str()); check("int foo(int a) {\n" " return 0;\n" " return(a-1);\n" "}", nullptr, false, false); - ASSERT_EQUALS("[test.cpp:3]: (style) Consecutive return, break, continue, goto or throw statements are unnecessary.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Consecutive return, break, continue, goto or throw statements are unnecessary.\n", errout_str()); check("int foo(int a) {\n" " A:" " return(0);\n" " goto A;\n" "}", nullptr, false, false); - ASSERT_EQUALS("[test.cpp:3]: (style) Consecutive return, break, continue, goto or throw statements are unnecessary.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Consecutive return, break, continue, goto or throw statements are unnecessary.\n", errout_str()); constexpr char xmldata[] = "\n" "\n" @@ -4969,7 +4957,7 @@ class TestOther : public TestFixture { " exit(0);\n" " break;\n" "}", nullptr, false, false, false, &settings); - ASSERT_EQUALS("[test.cpp:3]: (style) Consecutive return, break, continue, goto or throw statements are unnecessary.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Consecutive return, break, continue, goto or throw statements are unnecessary.\n", errout_str()); check("class NeonSession {\n" " void exit();\n" @@ -4978,16 +4966,16 @@ class TestOther : public TestFixture { "{\n" " SAL_INFO(\"ucb.ucp.webdav\", \"neon commands cannot be aborted\");\n" "}", nullptr, false, false, false, &settings); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void NeonSession::exit()\n" "{\n" " SAL_INFO(\"ucb.ucp.webdav\", \"neon commands cannot be aborted\");\n" "}", nullptr, false, false, false, &settings); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() { xResAccess->exit(); }", nullptr, false, false, false, &settings); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(int a)\n" "{\n" @@ -5001,7 +4989,7 @@ class TestOther : public TestFixture { " break;\n" " }\n" "}", nullptr, false, false); - ASSERT_EQUALS("[test.cpp:7]: (style) Consecutive return, break, continue, goto or throw statements are unnecessary.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (style) Consecutive return, break, continue, goto or throw statements are unnecessary.\n", errout_str()); check("void foo(int a)\n" "{\n" @@ -5014,7 +5002,7 @@ class TestOther : public TestFixture { " break;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(int a)\n" "{\n" @@ -5025,7 +5013,7 @@ class TestOther : public TestFixture { " }\n" " }\n" "}", nullptr, false, false); - ASSERT_EQUALS("[test.cpp:6]: (style) Consecutive return, break, continue, goto or throw statements are unnecessary.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (style) Consecutive return, break, continue, goto or throw statements are unnecessary.\n", errout_str()); check("void foo(int a)\n" "{\n" @@ -5037,7 +5025,7 @@ class TestOther : public TestFixture { " a+=2;\n" " }\n" "}", nullptr, false, false); - ASSERT_EQUALS("[test.cpp:6]: (style) Consecutive return, break, continue, goto or throw statements are unnecessary.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (style) Consecutive return, break, continue, goto or throw statements are unnecessary.\n", errout_str()); check("void foo(int a)\n" "{\n" @@ -5048,50 +5036,50 @@ class TestOther : public TestFixture { " a+=2;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int foo() {\n" " throw 0;\n" " return 1;\n" "}", nullptr, false, false); - ASSERT_EQUALS("[test.cpp:3]: (style) Consecutive return, break, continue, goto or throw statements are unnecessary.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Consecutive return, break, continue, goto or throw statements are unnecessary.\n", errout_str()); check("void foo() {\n" " throw 0;\n" " return;\n" "}", nullptr, false, false); - ASSERT_EQUALS("[test.cpp:3]: (style) Consecutive return, break, continue, goto or throw statements are unnecessary.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Consecutive return, break, continue, goto or throw statements are unnecessary.\n", errout_str()); check("int foo() {\n" " throw = 0;\n" " return 1;\n" "}", "test.c", false, false); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int foo() {\n" " return 0;\n" " return 1;\n" "}", nullptr, false, false, false); - ASSERT_EQUALS("[test.cpp:3]: (style) Consecutive return, break, continue, goto or throw statements are unnecessary.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Consecutive return, break, continue, goto or throw statements are unnecessary.\n", errout_str()); check("int foo() {\n" " return 0;\n" " foo();\n" "}", nullptr, false, false); - ASSERT_EQUALS("[test.cpp:3]: (style) Statements following 'return' will never be executed.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Statements following 'return' will never be executed.\n", errout_str()); check("int foo(int unused) {\n" " return 0;\n" " (void)unused;\n" "}", nullptr, false, false); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int foo(int unused1, int unused2) {\n" " return 0;\n" " (void)unused1;\n" " (void)unused2;\n" "}", nullptr, false, false); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int foo(int unused1, int unused2) {\n" " return 0;\n" @@ -5099,14 +5087,14 @@ class TestOther : public TestFixture { " (void)unused2;\n" " foo();\n" "}", nullptr, false, false); - ASSERT_EQUALS("[test.cpp:5]: (style) Statements following 'return' will never be executed.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (style) Statements following 'return' will never be executed.\n", errout_str()); check("int foo() {\n" " if(bar)\n" " return 0;\n" " return 124;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int foo() {\n" " while(bar) {\n" @@ -5117,7 +5105,7 @@ class TestOther : public TestFixture { " }\n" " return 124;\n" "}", nullptr, false, false); - ASSERT_EQUALS("[test.cpp:4]: (style) Consecutive return, break, continue, goto or throw statements are unnecessary.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Consecutive return, break, continue, goto or throw statements are unnecessary.\n", errout_str()); check("void foo() {\n" " while(bar) {\n" @@ -5125,7 +5113,7 @@ class TestOther : public TestFixture { " break;\n" " }\n" "}", nullptr, false, false); - ASSERT_EQUALS("[test.cpp:4]: (style) Consecutive return, break, continue, goto or throw statements are unnecessary.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Consecutive return, break, continue, goto or throw statements are unnecessary.\n", errout_str()); // #5707 check("extern int i,j;\n" @@ -5136,20 +5124,20 @@ class TestOther : public TestFixture { " return 0;\n" " j=2;\n" "}", nullptr, false, false); - ASSERT_EQUALS("[test.cpp:7]: (style) Statements following 'return' will never be executed.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (style) Statements following 'return' will never be executed.\n", errout_str()); check("int foo() {\n" " return 0;\n" " label:\n" " throw 0;\n" "}", nullptr, false, false); - ASSERT_EQUALS("[test.cpp:3]: (style) Label 'label' is not used.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Label 'label' is not used.\n", errout_str()); check("struct A {\n" " virtual void foo (P & Val) throw ();\n" " virtual void foo1 (P & Val) throw ();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int foo() {\n" " goto label;\n" @@ -5158,7 +5146,7 @@ class TestOther : public TestFixture { " label:\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); // #3457 + ASSERT_EQUALS("", errout_str()); // #3457 check("int foo() {\n" " goto label;\n" @@ -5167,7 +5155,7 @@ class TestOther : public TestFixture { " label:\n" " } while (true);\n" "}"); - ASSERT_EQUALS("", errout.str()); // #3457 + ASSERT_EQUALS("", errout_str()); // #3457 check("int foo() {\n" " goto label;\n" @@ -5176,7 +5164,7 @@ class TestOther : public TestFixture { " label:\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); // #3457 + ASSERT_EQUALS("", errout_str()); // #3457 // #3383. TODO: Use preprocessor check("int foo() {\n" @@ -5185,14 +5173,14 @@ class TestOther : public TestFixture { "\n" // #endif " return 1;\n" "}", nullptr, false, false); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int foo() {\n" "\n" // #ifdef A " return 0;\n" "\n" // #endif " return 1;\n" "}", nullptr, true, false); - ASSERT_EQUALS("[test.cpp:5]: (style, inconclusive) Consecutive return, break, continue, goto or throw statements are unnecessary.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (style, inconclusive) Consecutive return, break, continue, goto or throw statements are unnecessary.\n", errout_str()); // #4711 lambda functions check("int f() {\n" @@ -5201,7 +5189,7 @@ class TestOther : public TestFixture { nullptr, false, false); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #4756 check("template <>\n" @@ -5215,7 +5203,7 @@ class TestOther : public TestFixture { " (void)__v;\n" " }));\n" "}", nullptr, false, false); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #6008 check("static std::function< int ( int, int ) > GetFunctor() {\n" @@ -5224,7 +5212,7 @@ class TestOther : public TestFixture { " return sum;\n" " };\n" "}", nullptr, false, false); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #5789 check("struct per_state_info {\n" @@ -5232,20 +5220,20 @@ class TestOther : public TestFixture { " uint64_t events;\n" " per_state_info() : enter(0), exit(0), events(0) {}\n" "};", nullptr, false, false); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #6664 check("void foo() {\n" " (beat < 100) ? (void)0 : exit(0);\n" " bar();\n" "}", nullptr, false, false, false, &settings); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() {\n" " (beat < 100) ? exit(0) : (void)0;\n" " bar();\n" "}", nullptr, false, false, false, &settings); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #8261 // TODO Do not throw AST validation exception @@ -5253,18 +5241,18 @@ class TestOther : public TestFixture { " (beat < 100) ? (void)0 : throw(0);\n" " bar();\n" "}", nullptr, false, false, false, &settings), InternalError); - //ASSERT_EQUALS("", errout.str()); + //ASSERT_EQUALS("", errout_str()); check("int foo() {\n" " exit(0);\n" " return 1;\n" // <- clarify for tools that function does not continue.. "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " enum : uint8_t { A, B } var = A;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkP("#define INB(x) __extension__ ({ u_int tmp = (x); inb(tmp); })\n" // #4739 "static unsigned char cmos_hal_read(unsigned index) {\n" @@ -5281,20 +5269,20 @@ class TestOther : public TestFixture { " OUTB(index, port_0);\n" " return INB(port_1);\n" "}\n", "test.c"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("[[noreturn]] void n();\n" "void f() {\n" " n();\n" " g();\n" "}\n"); - ASSERT_EQUALS("[test.cpp:4]: (style) Statements following noreturn function 'n()' will never be executed.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Statements following noreturn function 'n()' will never be executed.\n", errout_str()); check("void f() {\n" " exit(1);\n" " g();\n" "}\n"); - ASSERT_EQUALS("[test.cpp:3]: (style) Statements following noreturn function 'exit()' will never be executed.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Statements following noreturn function 'exit()' will never be executed.\n", errout_str()); check("void f() {\n" " do {\n" @@ -5302,7 +5290,7 @@ class TestOther : public TestFixture { " g();\n" " } while (0);\n" "}\n"); - ASSERT_EQUALS("[test.cpp:4]: (style) Statements following 'break' will never be executed.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Statements following 'break' will never be executed.\n", errout_str()); } void redundantContinue() { @@ -5312,7 +5300,7 @@ class TestOther : public TestFixture { " continue;\n" " }\n" "}\n"); - ASSERT_EQUALS("[test.cpp:4]: (style) 'continue' is redundant since it is the last statement in a loop.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) 'continue' is redundant since it is the last statement in a loop.\n", errout_str()); check("void f() {\n" " int i = 0;" @@ -5322,7 +5310,7 @@ class TestOther : public TestFixture { " continue;\n" " } while (i < 10);\n" "}\n"); - ASSERT_EQUALS("[test.cpp:5]: (style) 'continue' is redundant since it is the last statement in a loop.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (style) 'continue' is redundant since it is the last statement in a loop.\n", errout_str()); } @@ -5339,7 +5327,7 @@ class TestOther : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:3]: (warning, inconclusive) Found suspicious case label in switch(). Operator '&&' probably doesn't work as intended.\n" "[test.cpp:5]: (warning, inconclusive) Found suspicious case label in switch(). Operator '||' probably doesn't work as intended.\n" - "[test.cpp:7]: (warning, inconclusive) Found suspicious case label in switch(). Operator '||' probably doesn't work as intended.\n", errout.str()); + "[test.cpp:7]: (warning, inconclusive) Found suspicious case label in switch(). Operator '||' probably doesn't work as intended.\n", errout_str()); check("void foo() {\n" " switch(a) {\n" @@ -5347,7 +5335,7 @@ class TestOther : public TestFixture { " a=A&&B;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // TODO Do not throw AST validation exception TODO_ASSERT_THROW(check("void foo() {\n" @@ -5356,19 +5344,19 @@ class TestOther : public TestFixture { " foo();\n" " }\n" "}"), InternalError); - //ASSERT_EQUALS("", errout.str()); + //ASSERT_EQUALS("", errout_str()); } void suspiciousEqualityComparison() { check("void foo(int c) {\n" " if (x) c == 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Found suspicious equality comparison. Did you intend to assign a value instead?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Found suspicious equality comparison. Did you intend to assign a value instead?\n", errout_str()); check("void foo(const int* c) {\n" " if (x) *c == 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Found suspicious equality comparison. Did you intend to assign a value instead?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Found suspicious equality comparison. Did you intend to assign a value instead?\n", errout_str()); check("void foo(int c) {\n" @@ -5376,90 +5364,90 @@ class TestOther : public TestFixture { " c = 0;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(int c) {\n" " c == 1;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Found suspicious equality comparison. Did you intend to assign a value instead?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Found suspicious equality comparison. Did you intend to assign a value instead?\n", errout_str()); check("void foo(int c) {\n" " for (int i = 0; i == 10; i ++) {\n" " a ++;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(int c) {\n" " for (i == 0; i < 10; i ++) {\n" " c ++;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Found suspicious equality comparison. Did you intend to assign a value instead?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Found suspicious equality comparison. Did you intend to assign a value instead?\n", errout_str()); check("void foo(int c) {\n" " for (i == 1; i < 10; i ++) {\n" " c ++;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Found suspicious equality comparison. Did you intend to assign a value instead?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Found suspicious equality comparison. Did you intend to assign a value instead?\n", errout_str()); check("void foo(int c) {\n" " for (i == 2; i < 10; i ++) {\n" " c ++;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Found suspicious equality comparison. Did you intend to assign a value instead?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Found suspicious equality comparison. Did you intend to assign a value instead?\n", errout_str()); check("void foo(int c) {\n" " for (int i = 0; i < 10; i == c) {\n" " c ++;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Found suspicious equality comparison. Did you intend to assign a value instead?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Found suspicious equality comparison. Did you intend to assign a value instead?\n", errout_str()); check("void foo(int c) {\n" " for (; running == 1;) {\n" " c ++;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(int c) {\n" " printf(\"%i\", ({x==0;}));\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(int arg) {\n" " printf(\"%i\", ({int x = do_something(); x == 0;}));\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(int x) {\n" " printf(\"%i\", ({x == 0; x > 0 ? 10 : 20}));\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Found suspicious equality comparison. Did you intend to assign a value instead?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Found suspicious equality comparison. Did you intend to assign a value instead?\n", errout_str()); check("void foo(int x) {\n" " for (const Token* end = tok->link(); tok != end; tok = (tok == end) ? end : tok->next()) {\n" " x++;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(int x) {\n" " for (int i = (x == 0) ? 0 : 5; i < 10; i ++) {\n" " x++;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(int x) {\n" " for (int i = 0; i < 10; i += (x == 5) ? 1 : 2) {\n" " x++;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void suspiciousUnaryPlusMinus() { // #8004 @@ -5470,7 +5458,7 @@ class TestOther : public TestFixture { "}\n"); ASSERT_EQUALS("[test.cpp:3]: (warning, inconclusive) Found suspicious operator '+', result is not used.\n" "[test.cpp:4]: (warning, inconclusive) Found suspicious operator '-', result is not used.\n", - errout.str()); + errout_str()); check("void f(int i) {\n" " +i;\n" @@ -5478,7 +5466,7 @@ class TestOther : public TestFixture { "}\n"); ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Found suspicious operator '+', result is not used.\n" "[test.cpp:3]: (warning, inconclusive) Found suspicious operator '-', result is not used.\n", - errout.str()); + errout_str()); } void selfAssignment() { @@ -5488,26 +5476,26 @@ class TestOther : public TestFixture { " x = x;\n" " return 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (style) Redundant assignment of 'x' to itself.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Redundant assignment of 'x' to itself.\n", errout_str()); check("void foo()\n" "{\n" " int x = x;\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Redundant assignment of 'x' to itself.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Redundant assignment of 'x' to itself.\n", errout_str()); check("struct A { int b; };\n" "void foo(A* a1, A* a2) {\n" " a1->b = a1->b;\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Redundant assignment of 'a1->b' to itself.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Redundant assignment of 'a1->b' to itself.\n", errout_str()); check("int x;\n" "void f()\n" "{\n" " x = x = 3;\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (style) Redundant assignment of 'x' to itself.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Redundant assignment of 'x' to itself.\n", errout_str()); // #4073 (segmentation fault) check("void Foo::myFunc( int a )\n" @@ -5522,52 +5510,52 @@ class TestOther : public TestFixture { " x = x + 1;\n" " return 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo()\n" "{\n" " int *x = getx();\n" " *x = x;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() {\n" " BAR *x = getx();\n" " x = x;\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Redundant assignment of 'x' to itself.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Redundant assignment of 'x' to itself.\n", errout_str()); // #2502 - non-primitive type -> there might be some side effects check("void foo()\n" "{\n" " Fred fred; fred = fred;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x) {\n" " x = (x == 0);" " func(x);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x) {\n" " x = (x != 0);" " func(x);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // ticket #3001 - false positive check("void foo(int x) {\n" " x = x ? x : 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #3800 - false negative when variable is extern check("extern int i;\n" "void f() {\n" " i = i;\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Redundant assignment of 'i' to itself.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Redundant assignment of 'i' to itself.\n", errout_str()); // #4291 - id for variables accessed through 'this' check("class Foo {\n" @@ -5577,7 +5565,7 @@ class TestOther : public TestFixture { "void Foo::func() {\n" " this->var = var;\n" "}"); - ASSERT_EQUALS("[test.cpp:6]: (style) Redundant assignment of 'this->var' to itself.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (style) Redundant assignment of 'this->var' to itself.\n", errout_str()); check("class Foo {\n" " int var;\n" @@ -5586,7 +5574,7 @@ class TestOther : public TestFixture { "void Foo::func(int var) {\n" " this->var = var;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #6406 - designated initializer doing bogus self assignment check("struct callbacks {\n" @@ -5596,7 +5584,7 @@ class TestOther : public TestFixture { "void f() {\n" " struct callbacks ops = { .s = ops.s };\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:6]: (style) Redundant assignment of 'something' to itself.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:6]: (style) Redundant assignment of 'something' to itself.\n", "", errout_str()); check("class V\n" "{\n" @@ -5613,17 +5601,17 @@ class TestOther : public TestFixture { "};"); ASSERT_EQUALS("[test.cpp:10]: (style) Redundant assignment of 'x' to itself.\n" "[test.cpp:10]: (style) Redundant assignment of 'y' to itself.\n" - "[test.cpp:10]: (style) Redundant assignment of 'z' to itself.\n", errout.str()); + "[test.cpp:10]: (style) Redundant assignment of 'z' to itself.\n", errout_str()); check("void f(int i) { i = !!i; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() {\n" " int x = 1;\n" " int &ref = x;\n" " ref = x;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:4]: (style) Redundant assignment of 'ref' to itself.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Redundant assignment of 'ref' to itself.\n", errout_str()); check("class Foo {\n" // #9850 " int i{};\n" @@ -5634,7 +5622,7 @@ class TestOther : public TestFixture { " *this = copy;\n" " }\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S {\n" // #11383 " void f() {\n" @@ -5643,7 +5631,7 @@ class TestOther : public TestFixture { " }\n" " int i;\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" // #10337 " int b[2] = { 1, 2 };\n" @@ -5652,7 +5640,7 @@ class TestOther : public TestFixture { " idx++;\n" " i = b[idx];\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void g(int*);\n" // #12390 "void f() {\n" @@ -5660,7 +5648,7 @@ class TestOther : public TestFixture { " g(&s.i);\n" " s.i = o;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void trac1132() { @@ -5682,7 +5670,7 @@ class TestOther : public TestFixture { " std::cout << \"hello\" << std::endl;\n" " return 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:15]: (style) Instance of 'Lock' object is destroyed immediately.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:15]: (style) Instance of 'Lock' object is destroyed immediately.\n", errout_str()); } void trac3693() { @@ -5692,7 +5680,7 @@ class TestOther : public TestFixture { " };\n" "};\n" "const int DFLT_TIMEOUT = A::b % 1000000 ;\n", nullptr, false, false); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void testMisusedScopeObjectDoesNotPickFunction1() { @@ -5701,7 +5689,7 @@ class TestOther : public TestFixture { " CouldBeFunction ( 123 ) ;\n" " return 0 ;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void testMisusedScopeObjectDoesNotPickFunction2() { @@ -5718,7 +5706,7 @@ class TestOther : public TestFixture { " do_something();\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void testMisusedScopeObjectPicksClass() { @@ -5728,7 +5716,7 @@ class TestOther : public TestFixture { " NotAFunction ( 123 );\n" " return 0 ;\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (style) Instance of 'NotAFunction' object is destroyed immediately.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Instance of 'NotAFunction' object is destroyed immediately.\n", errout_str()); } void testMisusedScopeObjectPicksStruct() { @@ -5738,7 +5726,7 @@ class TestOther : public TestFixture { " NotAClass ( 123 ) ;\n" " return true ;\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (style) Instance of 'NotAClass' object is destroyed immediately.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Instance of 'NotAClass' object is destroyed immediately.\n", errout_str()); } void testMisusedScopeObjectDoesNotPickIf() { @@ -5747,7 +5735,7 @@ class TestOther : public TestFixture { " if ( a > b ) return c == a ;\n" " return b == a ;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void testMisusedScopeObjectDoesNotPickConstructorDeclaration() { @@ -5757,7 +5745,7 @@ class TestOther : public TestFixture { "~Something ( ) ;\n" "Something ( ) ;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void testMisusedScopeObjectDoesNotPickFunctor() { @@ -5776,7 +5764,7 @@ class TestOther : public TestFixture { " IncrementFunctor()(a);\n" " return a;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void testMisusedScopeObjectDoesNotPickLocalClassConstructors() { @@ -5789,7 +5777,7 @@ class TestOther : public TestFixture { " Foo();\n" " do_something();\n" "}"); - ASSERT_EQUALS("[test.cpp:7]: (style) Instance of 'Foo' object is destroyed immediately.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (style) Instance of 'Foo' object is destroyed immediately.\n", errout_str()); } void testMisusedScopeObjectDoesNotPickUsedObject() { @@ -5801,7 +5789,7 @@ class TestOther : public TestFixture { "void fn() {\n" " Foo().bar();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void testMisusedScopeObjectDoesNotPickPureC() { @@ -5817,10 +5805,10 @@ class TestOther : public TestFixture { "}\n"; check(code, "test.cpp"); - ASSERT_EQUALS("[test.cpp:7]: (style) Instance of 'cb_watch_bool' object is destroyed immediately.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (style) Instance of 'cb_watch_bool' object is destroyed immediately.\n", errout_str()); check(code, "test.c"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Ticket #2639 check("struct stat { int a; int b; };\n" @@ -5830,7 +5818,7 @@ class TestOther : public TestFixture { " stat(\"file.txt\", &st);\n" " do_something();\n" "}"); - ASSERT_EQUALS("",errout.str()); + ASSERT_EQUALS("",errout_str()); check("struct AMethodObject {\n" // #4336 " AMethodObject(double, double, double);\n" @@ -5841,7 +5829,7 @@ class TestOther : public TestFixture { "void S::A(double const a1, double const a2, double const a3) {\n" " AMethodObject(a1, a2, a3);\n" "}\n"); - ASSERT_EQUALS("",errout.str()); + ASSERT_EQUALS("",errout_str()); } void testMisusedScopeObjectDoesNotPickNestedClass() { @@ -5862,7 +5850,7 @@ class TestOther : public TestFixture { "}\n"; check(code, "test.cpp"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void testMisusedScopeObjectInConstructor() { @@ -5875,7 +5863,7 @@ class TestOther : public TestFixture { " Foo(char x, int y) { }\n" "};\n"; check(code, "test.cpp"); - ASSERT_EQUALS("[test.cpp:4]: (style) Instance of 'Foo' object is destroyed immediately.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Instance of 'Foo' object is destroyed immediately.\n", errout_str()); } void testMisusedScopeObjectStandardType() { @@ -5895,24 +5883,24 @@ class TestOther : public TestFixture { "[test.cpp:6]: (style) Instance of 'int' object is destroyed immediately.\n" "[test.cpp:7]: (style) Instance of 'int' object is destroyed immediately.\n" "[test.cpp:8]: (style) Instance of 'int' object is destroyed immediately.\n", - errout.str()); + errout_str()); check("void f(int j) {\n" " for (; bool(j); ) {}\n" "}\n", "test.cpp"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void g() {\n" " float (f);\n" " float (*p);\n" "}\n", "test.cpp"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f(int i) {\n" " void();\n" " return i;\n" "}\n", "test.cpp"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void testMisusedScopeObjectNamespace() { @@ -5925,7 +5913,7 @@ class TestOther : public TestFixture { " M::N::S();\n" " return 0;\n" "}\n", "test.cpp"); - ASSERT_EQUALS("[test.cpp:7]: (style) Instance of 'M::N::S' object is destroyed immediately.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (style) Instance of 'M::N::S' object is destroyed immediately.\n", errout_str()); check("void f() {\n" // #10057 " std::string(\"abc\");\n" @@ -5936,7 +5924,7 @@ class TestOther : public TestFixture { ASSERT_EQUALS("[test.cpp:2]: (style) Instance of 'std::string' object is destroyed immediately.\n" "[test.cpp:3]: (style) Instance of 'std::string' object is destroyed immediately.\n" "[test.cpp:4]: (style) Instance of 'std::pair' object is destroyed immediately.\n", - errout.str()); + errout_str()); check("struct S {\n" // #10083 " void f() {\n" @@ -5953,13 +5941,13 @@ class TestOther : public TestFixture { ASSERT_EQUALS("[test.cpp:3]: (style) Instance of 'std::lock_guard' object is destroyed immediately.\n" "[test.cpp:6]: (style) Instance of 'std::scoped_lock' object is destroyed immediately.\n" "[test.cpp:9]: (style) Instance of 'std::scoped_lock' object is destroyed immediately.\n", - errout.str()); + errout_str()); check("struct S { int i; };\n" "namespace {\n" " S s() { return ::S{42}; }\n" "}\n", "test.cpp"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void testMisusedScopeObjectAssignment() { // #11371 @@ -5972,7 +5960,7 @@ class TestOther : public TestFixture { "void t1() { g() = {}; }\n" "void t2() { h() = {}; }\n" "void t3() { *i() = {}; }\n", "test.cpp"); - ASSERT_EQUALS("[test.cpp:6]: (style) Instance of 'S' object is destroyed immediately, assignment has no effect.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (style) Instance of 'S' object is destroyed immediately, assignment has no effect.\n", errout_str()); } void trac2084() { @@ -5983,7 +5971,7 @@ class TestOther : public TestFixture { " { sigaction(SIGHUP, &sa, 0); };\n" " { sigaction(SIGINT, &sa, 0); };\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void trac2071() { @@ -5994,76 +5982,76 @@ class TestOther : public TestFixture { "\n" " const AB ab[3] = { AB(0), AB(1), AB(2) };\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void clarifyCalculation() { check("int f(char c) {\n" " return 10 * (c == 0) ? 1 : 2;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Clarify calculation precedence for '*' and '?'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Clarify calculation precedence for '*' and '?'.\n", errout_str()); check("void f(char c) {\n" " printf(\"%i\", 10 * (c == 0) ? 1 : 2);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Clarify calculation precedence for '*' and '?'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Clarify calculation precedence for '*' and '?'.\n", errout_str()); check("void f() {\n" " return (2*a)?b:c;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(char c) {\n" " printf(\"%i\", a + b ? 1 : 2);\n" "}",nullptr,false,false); - ASSERT_EQUALS("[test.cpp:2]: (style) Clarify calculation precedence for '+' and '?'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Clarify calculation precedence for '+' and '?'.\n", errout_str()); check("void f() {\n" " std::cout << x << y ? 2 : 3;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Clarify calculation precedence for '<<' and '?'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Clarify calculation precedence for '<<' and '?'.\n", errout_str()); check("void f() {\n" " int ab = a - b ? 2 : 3;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Clarify calculation precedence for '-' and '?'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Clarify calculation precedence for '-' and '?'.\n", errout_str()); check("void f() {\n" " int ab = a | b ? 2 : 3;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Clarify calculation precedence for '|' and '?'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Clarify calculation precedence for '|' and '?'.\n", errout_str()); // ticket #195 check("int f(int x, int y) {\n" " return x >> ! y ? 8 : 2;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Clarify calculation precedence for '>>' and '?'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Clarify calculation precedence for '>>' and '?'.\n", errout_str()); check("int f() {\n" " return shift < sizeof(int64_t)*8 ? 1 : 2;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() { a = *p ? 1 : 2; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x) { const char *p = x & 1 ? \"1\" : \"0\"; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() { x = a % b ? \"1\" : \"0\"; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x) { return x & 1 ? '1' : '0'; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x) { return x & 16 ? 1 : 0; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x) { return x % 16 ? 1 : 0; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("enum {X,Y}; void f(int x) { return x & Y ? 1 : 0; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void clarifyStatement() { @@ -6074,7 +6062,7 @@ class TestOther : public TestFixture { ASSERT_EQUALS( "[test.cpp:2]: (warning, inconclusive) Found suspicious operator '*', result is not used.\n" "[test.cpp:2]: (warning) In expression like '*A++' the result of '*' is unused. Did you intend to write '(*A)++;'?\n", - errout.str()); + errout_str()); check("char* f(char** c) {\n" " *c[5]--;\n" @@ -6083,7 +6071,7 @@ class TestOther : public TestFixture { ASSERT_EQUALS( "[test.cpp:2]: (warning, inconclusive) Found suspicious operator '*', result is not used.\n" "[test.cpp:2]: (warning) In expression like '*A++' the result of '*' is unused. Did you intend to write '(*A)++;'?\n", - errout.str()); + errout_str()); check("void f(Foo f) {\n" " *f.a++;\n" @@ -6091,7 +6079,7 @@ class TestOther : public TestFixture { ASSERT_EQUALS( "[test.cpp:2]: (warning, inconclusive) Found suspicious operator '*', result is not used.\n" "[test.cpp:2]: (warning) In expression like '*A++' the result of '*' is unused. Did you intend to write '(*A)++;'?\n", - errout.str()); + errout_str()); check("void f(Foo f) {\n" " *f.a[5].v[3]++;\n" @@ -6099,7 +6087,7 @@ class TestOther : public TestFixture { ASSERT_EQUALS( "[test.cpp:2]: (warning, inconclusive) Found suspicious operator '*', result is not used.\n" "[test.cpp:2]: (warning) In expression like '*A++' the result of '*' is unused. Did you intend to write '(*A)++;'?\n", - errout.str()); + errout_str()); check("void f(Foo f) {\n" " *f.a(1, 5).v[x + y]++;\n" @@ -6107,18 +6095,18 @@ class TestOther : public TestFixture { ASSERT_EQUALS( "[test.cpp:2]: (warning, inconclusive) Found suspicious operator '*', result is not used.\n" "[test.cpp:2]: (warning) In expression like '*A++' the result of '*' is unused. Did you intend to write '(*A)++;'?\n", - errout.str()); + errout_str()); check("char* f(char* c) {\n" " (*c)++;\n" " return c;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(char* c) {\n" " bar(*c++);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("char*** f(char*** c) {\n" " ***c++;\n" @@ -6127,7 +6115,7 @@ class TestOther : public TestFixture { ASSERT_EQUALS( "[test.cpp:2]: (warning, inconclusive) Found suspicious operator '*', result is not used.\n" "[test.cpp:2]: (warning) In expression like '*A++' the result of '*' is unused. Did you intend to write '(*A)++;'?\n", - errout.str()); + errout_str()); check("char** f(char*** c) {\n" " **c[5]--;\n" @@ -6136,38 +6124,38 @@ class TestOther : public TestFixture { ASSERT_EQUALS( "[test.cpp:2]: (warning, inconclusive) Found suspicious operator '*', result is not used.\n" "[test.cpp:2]: (warning) In expression like '*A++' the result of '*' is unused. Did you intend to write '(*A)++;'?\n", - errout.str()); + errout_str()); check("char*** f(char*** c) {\n" " (***c)++;\n" " return c;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(const int*** p) {\n" // #10923 " delete[] **p;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void *f(char** c) {\n" " bar(**c++);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void *f(char* p) {\n" " for (p = path; *p++;) ;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " std::array,3> array;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(const std::vector& v) {\n" // #12088 " for (auto it = v.begin(); it != v.end(); delete *it++);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void duplicateBranch() { @@ -6177,7 +6165,7 @@ class TestOther : public TestFixture { " else\n" " b = 1;\n" "}"); - ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:2]: (style, inconclusive) Found duplicate branches for 'if' and 'else'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:2]: (style, inconclusive) Found duplicate branches for 'if' and 'else'.\n", errout_str()); check("void f(int a, int &b) {\n" " if (a) {\n" @@ -6188,7 +6176,7 @@ class TestOther : public TestFixture { " } else\n" " b = 1;\n" "}"); - ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:3]: (style, inconclusive) Found duplicate branches for 'if' and 'else'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:3]: (style, inconclusive) Found duplicate branches for 'if' and 'else'.\n", errout_str()); check("void f(int a, int &b) {\n" " if (a == 1)\n" @@ -6200,7 +6188,7 @@ class TestOther : public TestFixture { " b = 2;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:7] -> [test.cpp:5]: (style, inconclusive) Found duplicate branches for 'if' and 'else'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7] -> [test.cpp:5]: (style, inconclusive) Found duplicate branches for 'if' and 'else'.\n", errout_str()); check("int f(int signed, unsigned char value) {\n" " int ret;\n" @@ -6210,7 +6198,7 @@ class TestOther : public TestFixture { " ret = (unsigned char)value;\n" " return ret;\n" "}", nullptr, false, false); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " if (b)\n" @@ -6218,7 +6206,7 @@ class TestOther : public TestFixture { " else\n" " __asm__(\"mov bx, bx\");\n" "}"); - ASSERT_EQUALS("", errout.str()); // #3407 + ASSERT_EQUALS("", errout_str()); // #3407 check("void f() {\n" " if (b)\n" @@ -6226,7 +6214,7 @@ class TestOther : public TestFixture { " else\n" " __asm__(\"mov ax, bx\");\n" "}"); - ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:2]: (style, inconclusive) Found duplicate branches for 'if' and 'else'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:2]: (style, inconclusive) Found duplicate branches for 'if' and 'else'.\n", errout_str()); } void duplicateBranch1() { @@ -6240,7 +6228,7 @@ class TestOther : public TestFixture { " else\n" " frac = front/(front-back);\n" "}"); - ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:3]: (style, inconclusive) Found duplicate branches for 'if' and 'else'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:3]: (style, inconclusive) Found duplicate branches for 'if' and 'else'.\n", errout_str()); check("void f()\n" "{\n" @@ -6249,7 +6237,7 @@ class TestOther : public TestFixture { " else\n" " frac = front/((front-back));\n" "}"); - ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:3]: (style, inconclusive) Found duplicate branches for 'if' and 'else'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:3]: (style, inconclusive) Found duplicate branches for 'if' and 'else'.\n", errout_str()); // No message about empty branches (#5354) check("void f()\n" @@ -6259,7 +6247,7 @@ class TestOther : public TestFixture { " else\n" " {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void duplicateBranch2() { @@ -6271,7 +6259,7 @@ class TestOther : public TestFixture { " else\n" " DOSTUFF2\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void duplicateBranch3() { @@ -6285,7 +6273,7 @@ class TestOther : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:5] -> [test.cpp:3]: (style, inconclusive) Found duplicate branches for 'if' and 'else'.\n" "[test.cpp:2]: (style) The scope of the variable 'j' can be reduced.\n", - errout.str()); + errout_str()); check("void f(bool b, int i) {\n" " int j = i;\n" @@ -6296,7 +6284,7 @@ class TestOther : public TestFixture { " x = j;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void duplicateBranch4() { @@ -6307,7 +6295,7 @@ class TestOther : public TestFixture { " return new A::Z(true);\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void duplicateBranch5() { @@ -6321,7 +6309,7 @@ class TestOther : public TestFixture { " j = i;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:6] -> [test.cpp:3]: (style, inconclusive) Found duplicate branches for 'if' and 'else'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6] -> [test.cpp:3]: (style, inconclusive) Found duplicate branches for 'if' and 'else'.\n", errout_str()); check("void f(bool b) {\n" " int j;\n" @@ -6333,7 +6321,7 @@ class TestOther : public TestFixture { " j = 1;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(bool b) {\n" " int j;\n" @@ -6343,7 +6331,7 @@ class TestOther : public TestFixture { " int i = 0;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(bool b) {\n" " int j;\n" @@ -6355,7 +6343,7 @@ class TestOther : public TestFixture { " j = i;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void duplicateBranch6() { @@ -6365,7 +6353,7 @@ class TestOther : public TestFixture { " int i = 0;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(bool b) {\n" " if (b) {\n" @@ -6373,14 +6361,14 @@ class TestOther : public TestFixture { " } else {\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void duplicateExpression1() { check("void foo(int a) {\n" " if (a == a) { }\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '=='.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '=='.\n", errout_str()); check("void fun(int b) {\n" " return a && a ||\n" @@ -6392,87 +6380,87 @@ class TestOther : public TestFixture { ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '&&'.\n" "[test.cpp:3]: (style) Same expression on both sides of '=='.\n" "[test.cpp:4]: (style) Same expression on both sides of '>'.\n" - "[test.cpp:5]: (style) Same expression on both sides of '<'.\n", errout.str()); + "[test.cpp:5]: (style) Same expression on both sides of '<'.\n", errout_str()); check("void foo() {\n" " return a && a;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '&&'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '&&'.\n", errout_str()); check("void foo() {\n" " a = b && b;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '&&'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '&&'.\n", errout_str()); check("void foo(int b) {\n" " f(a,b == b);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '=='.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '=='.\n", errout_str()); check("void foo(int b) {\n" " f(b == b, a);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '=='.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '=='.\n", errout_str()); check("void foo() {\n" " if (x!=2 || x!=2) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '||'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '||'.\n", errout_str()); check("void foo(int a, int b) {\n" " if ((a < b) && (b > a)) { }\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '&&' because 'aa' represent the same value.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '&&' because 'aa' represent the same value.\n", errout_str()); check("void foo(int a, int b) {\n" " if ((a <= b) && (b >= a)) { }\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '&&' because 'a<=b' and 'b>=a' represent the same value.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '&&' because 'a<=b' and 'b>=a' represent the same value.\n", errout_str()); check("void foo() {\n" " if (x!=2 || y!=3 || x!=2) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Same expression 'x!=2' found multiple times in chain of '||' operators.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Same expression 'x!=2' found multiple times in chain of '||' operators.\n", errout_str()); check("void foo() {\n" " if (x!=2 && (x=y) && x!=2) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() {\n" " if (a && b || a && b) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '||'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '||'.\n", errout_str()); check("void foo() {\n" " if (a && b || b && c) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() {\n" " if (a && b | b && c) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '|'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '|'.\n", errout_str()); check("void foo() {\n" " if ((a + b) | (a + b)) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '|'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '|'.\n", errout_str()); check("void foo() {\n" " if ((a | b) & (a | b)) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '&'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '&'.\n", errout_str()); check("void foo(int a, int b) {\n" " if ((a | b) == (a | b)) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '=='.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '=='.\n", errout_str()); check("void foo() {\n" " if (a1[a2[c & 0xff] & 0xff]) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void d(const char f, int o, int v)\n" "{\n" @@ -6480,41 +6468,41 @@ class TestOther : public TestFixture { " ((f=='R') && (o == 2) && ((v < 2) || (v > 99))) ||\n" " ((f=='T') && (o == 2) && ((v < 200) || (v > 9999)))) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f(int x) { return x+x; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x) { while (x+=x) ; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() {\n" " if (a && b && b) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '&&'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '&&'.\n", errout_str()); check("void foo() {\n" " if (a || b || b) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '||'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '||'.\n", errout_str()); check("void foo() {\n" " if (a / 1000 / 1000) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int foo(int i) {\n" " return i/i;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '/'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '/'.\n", errout_str()); check("void foo() {\n" " if (a << 1 << 1) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f() { return !!y; }"); // No FP - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // make sure there are not "same expression" fp when there are different casts check("void f(long x) { if ((int32_t)x == (int64_t)x) {} }", @@ -6524,74 +6512,74 @@ class TestOther : public TestFixture { false, // verbose nullptr // settings ); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // make sure there are not "same expression" fp when there are different ({}) expressions check("void f(long x) { if (({ 1+2; }) == ({3+4;})) {} }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #5535: Reference named like its type check("void foo() { UMSConfig& UMSConfig = GetUMSConfiguration(); }"); - ASSERT_EQUALS("[test.cpp:1]: (style) Variable 'UMSConfig' can be declared as reference to const\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (style) Variable 'UMSConfig' can be declared as reference to const\n", errout_str()); // #3868 - false positive (same expression on both sides of |) check("void f(int x) {\n" " a = x ? A | B | C\n" " : A | B;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(const Bar &bar) {\n" " bool a = bar.isSet() && bar->isSet();\n" " bool b = bar.isSet() && bar.isSet();\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Same expression on both sides of '&&'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Same expression on both sides of '&&'.\n", errout_str()); check("void foo(int a, int b) {\n" " if ((b + a) | (a + b)) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '|' because 'b+a' and 'a+b' represent the same value.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '|' because 'b+a' and 'a+b' represent the same value.\n", errout_str()); check("void foo(const std::string& a, const std::string& b) {\n" " return a.find(b+\"&\") || a.find(\"&\"+b);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(int a, int b) {\n" " if ((b > a) | (a > b)) {}\n" // > is not commutative "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(double a, double b) {\n" " if ((b + a) > (a + b)) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) The comparison 'b+a > a+b' is always false because 'b+a' and 'a+b' represent the same value.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) The comparison 'b+a > a+b' is always false because 'b+a' and 'a+b' represent the same value.\n", errout_str()); check("void f(int x) {\n" " if ((x == 1) && (x == 0x00000001))\n" " a++;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '&&' because 'x==1' and 'x==0x00000001' represent the same value.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '&&' because 'x==1' and 'x==0x00000001' represent the same value.\n", errout_str()); check("void f() {\n" " enum { Four = 4 };\n" " if (Four == 4) {}" "}", nullptr, true, false); ASSERT_EQUALS("[test.cpp:3]: (style) The comparison 'Four == 4' is always true.\n", - errout.str()); + errout_str()); check("void f() {\n" " enum { Four = 4 };\n" " static_assert(Four == 4, \"\");\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " enum { Four = 4 };\n" " static_assert(4 == Four, \"\");\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " enum { FourInEnumOne = 4 };\n" @@ -6599,20 +6587,20 @@ class TestOther : public TestFixture { " if (FourInEnumOne == FourInEnumTwo) {}\n" "}", nullptr, true, false); ASSERT_EQUALS("[test.cpp:4]: (style) The comparison 'FourInEnumOne == FourInEnumTwo' is always true because 'FourInEnumOne' and 'FourInEnumTwo' represent the same value.\n", - errout.str()); + errout_str()); check("void f() {\n" " enum { FourInEnumOne = 4 };\n" " enum { FourInEnumTwo = 4 };\n" " static_assert(FourInEnumOne == FourInEnumTwo, \"\");\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(int a, int b) {\n" " if (sizeof(a) == sizeof(a)) { }\n" " if (sizeof(a) == sizeof(b)) { }\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '=='.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '=='.\n", errout_str()); check("float bar(int) __attribute__((pure));\n" "char foo(int) __attribute__((pure));\n" @@ -6621,7 +6609,7 @@ class TestOther : public TestFixture { " if (unknown(a) == unknown(a)) { }\n" " if (foo(a) == foo(a)) { }\n" "}"); - ASSERT_EQUALS("[test.cpp:6]: (style) Same expression on both sides of '=='.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (style) Same expression on both sides of '=='.\n", errout_str()); } void duplicateExpression2() { // check if float is NaN or Inf @@ -6631,25 +6619,25 @@ class TestOther : public TestFixture { " if (flt != flt) have_nan = 1;\n" " return have_nan;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("float f(float x) { return x-x; }"); // ticket #4485 (Inf) - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("float f(float x) { return (X double)x == (X double)x; }", nullptr, false, false); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct X { float f; };\n" "float f(struct X x) { return x.f == x.f; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct X { int i; };\n" "int f(struct X x) { return x.i == x.i; }"); - ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '=='.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '=='.\n", errout_str()); // #5284 - when type is unknown, assume it's float check("int f() { return x==x; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void duplicateExpression3() { @@ -6666,7 +6654,7 @@ class TestOther : public TestFixture { check("void foo() {\n" " if (x() || x()) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A {\n" " void foo() const;\n" @@ -6675,7 +6663,7 @@ class TestOther : public TestFixture { "void A::foo() const {\n" " if (bar() && bar()) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:6]: (style) Same expression on both sides of '&&'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (style) Same expression on both sides of '&&'.\n", errout_str()); check("struct A {\n" " void foo();\n" @@ -6685,7 +6673,7 @@ class TestOther : public TestFixture { "void A::foo() {\n" " if (bar() && bar()) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class B {\n" " void bar(int i);\n" @@ -6699,66 +6687,66 @@ class TestOther : public TestFixture { " if (b.bar(1) && b.bar(1)) {}\n" " if (a.bar(1) && a.bar(1)) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:11]: (style) Same expression on both sides of '&&'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:11]: (style) Same expression on both sides of '&&'.\n", errout_str()); check("class D { void strcmp(); };\n" "void foo() {\n" " D d;\n" " if (d.strcmp() && d.strcmp()) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() {\n" " if ((mystrcmp(a, b) == 0) || (mystrcmp(a, b) == 0)) {}\n" "}", "test.cpp", false, true, false, &settings); - ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '||'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '||'.\n", errout_str()); check("void GetValue() { return rand(); }\n" "void foo() {\n" " if ((GetValue() == 0) || (GetValue() == 0)) { dostuff(); }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void __attribute__((const)) GetValue() { return X; }\n" "void foo() {\n" " if ((GetValue() == 0) || (GetValue() == 0)) { dostuff(); }\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Same expression on both sides of '||'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Same expression on both sides of '||'.\n", errout_str()); check("void GetValue() __attribute__((const));\n" "void GetValue() { return X; }\n" "void foo() {\n" " if ((GetValue() == 0) || (GetValue() == 0)) { dostuff(); }\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (style) Same expression on both sides of '||'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Same expression on both sides of '||'.\n", errout_str()); check("void foo() {\n" " if (str == \"(\" || str == \"(\") {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '||'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '||'.\n", errout_str()); check("void foo() {\n" " if (bar(a) && !strcmp(a, b) && bar(a) && !strcmp(a, b)) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #5334 check("void f(C *src) {\n" " if (x(src) || x(src))\n" " a++;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(A *src) {\n" " if (dynamic_cast(src) || dynamic_cast(src)) {}\n" "}\n", "test.cpp", false, false); // don't run simplifications - ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '||'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '||'.\n", errout_str()); // #5819 check("Vector func(Vector vec1) {\n" " return fabs(vec1 & vec1 & vec1);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("Vector func(int vec1) {\n" " return fabs(vec1 & vec1 & vec1);\n" @@ -6766,7 +6754,7 @@ class TestOther : public TestFixture { ASSERT_EQUALS( "[test.cpp:2]: (style) Same expression on both sides of '&'.\n" "[test.cpp:2]: (style) Same expression on both sides of '&'.\n", // duplicate - errout.str()); + errout_str()); } @@ -6774,32 +6762,32 @@ class TestOther : public TestFixture { check("void foo() {\n" " if (*a++ != b || *a++ != b) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() {\n" " if (*a-- != b || *a-- != b) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // assignment check("void f() {\n" " while (*(a+=2)==*(b+=2) && *(a+=2)==*(b+=2)) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void duplicateExpression5() { // #3749 - macros with same values check("void f() {\n" " if ($a == $a) { }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void duplicateExpression6() { // #4639 check("float IsNan(float value) { return !(value == value); }\n" "double IsNan(double value) { return !(value == value); }\n" "long double IsNan(long double value) { return !(value == value); }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void duplicateExpression7() { @@ -6807,36 +6795,36 @@ class TestOther : public TestFixture { " const int i = sizeof(int);\n" " if ( i != sizeof (int)){}\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) The comparison 'i != sizeof(int)' is always false because 'i' and 'sizeof(int)' represent the same value.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) The comparison 'i != sizeof(int)' is always false because 'i' and 'sizeof(int)' represent the same value.\n", errout_str()); check("void f() {\n" " const int i = sizeof(int);\n" " if ( sizeof (int) != i){}\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) The comparison 'sizeof(int) != i' is always false because 'sizeof(int)' and 'i' represent the same value.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) The comparison 'sizeof(int) != i' is always false because 'sizeof(int)' and 'i' represent the same value.\n", errout_str()); check("void f(int a = 1) { if ( a != 1){}}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " int a = 1;\n" " if ( a != 1){}\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) The comparison 'a != 1' is always false.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) The comparison 'a != 1' is always false.\n", errout_str()); check("void f() {\n" " int a = 1;\n" " int b = 1;\n" " if ( a != b){}\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3] -> [test.cpp:4]: (style) The comparison 'a != b' is always false because 'a' and 'b' represent the same value.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3] -> [test.cpp:4]: (style) The comparison 'a != b' is always false because 'a' and 'b' represent the same value.\n", errout_str()); check("void f() {\n" " int a = 1;\n" " int b = a;\n" " if ( a != b){}\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (style) The comparison 'a != b' is always false because 'a' and 'b' represent the same value.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (style) The comparison 'a != b' is always false because 'a' and 'b' represent the same value.\n", errout_str()); check("void use(int);\n" "void f() {\n" @@ -6845,7 +6833,7 @@ class TestOther : public TestFixture { " use(b);\n" " if ( a != 1){}\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:6]: (style) The comparison 'a != 1' is always false.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:6]: (style) The comparison 'a != 1' is always false.\n", errout_str()); check("void use(int);\n" "void f() {\n" @@ -6854,7 +6842,7 @@ class TestOther : public TestFixture { " a = 2;\n" " if ( a != 1){}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void use(int);\n" "void f() {\n" @@ -6863,38 +6851,38 @@ class TestOther : public TestFixture { " a = 1;\n" " if ( a != 1){}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("const int a = 1;\n" "void f() {\n" " if ( a != 1){}\n" "}"); - ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:3]: (style) The comparison 'a != 1' is always false.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:3]: (style) The comparison 'a != 1' is always false.\n", errout_str()); check("int a = 1;\n" " void f() {\n" " if ( a != 1){}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " static const int a = 1;\n" " if ( a != 1){}\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) The comparison 'a != 1' is always false.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) The comparison 'a != 1' is always false.\n", errout_str()); check("void f() {\n" " static int a = 1;\n" " if ( a != 1){}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " int a = 1;\n" " if ( a != 1){\n" " a++;\n" " }}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) The comparison 'a != 1' is always false.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) The comparison 'a != 1' is always false.\n", errout_str()); check("void f(int b) {\n" " int a = 1;\n" @@ -6903,27 +6891,27 @@ class TestOther : public TestFixture { " a++;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool f(bool a, bool b) {\n" " const bool c = a;\n" " return a && b && c;\n" "}"); ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) Same expression 'a' found multiple times in chain of '&&' operators because 'a' and 'c' represent the same value.\n", - errout.str()); + errout_str()); // 6906 check("void f(const bool b) {\n" " const bool b1 = !b;\n" " if(!b && b1){}\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) Same expression on both sides of '&&' because '!b' and 'b1' represent the same value.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) Same expression on both sides of '&&' because '!b' and 'b1' represent the same value.\n", errout_str()); // 7284 check("void f(void) {\n" " if (a || !!a) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '||' because 'a' and '!!a' represent the same value.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '||' because 'a' and '!!a' represent the same value.\n", errout_str()); // 8205 check("void f(int x) {\n" @@ -6934,7 +6922,7 @@ class TestOther : public TestFixture { " break;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:5]: (style) The comparison 'Diag == 0' is always true.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:5]: (style) The comparison 'Diag == 0' is always true.\n", errout_str()); // #9744 check("void f(const std::vector& ints) {\n" @@ -6943,7 +6931,7 @@ class TestOther : public TestFixture { " if (p == 0) {}\n" " }\n" "}\n"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (style) The comparison 'p == 0' is always true.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (style) The comparison 'p == 0' is always true.\n", errout_str()); // #11820 check("unsigned f(unsigned x) {\n" @@ -6952,7 +6940,7 @@ class TestOther : public TestFixture { "unsigned g(unsigned x) {\n" " return !!x - x;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void duplicateExpression8() { @@ -6962,13 +6950,13 @@ class TestOther : public TestFixture { " a = 2;\n" " if ( b != a){}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int * a, int i) { int b = a[i]; a[i] = 2; if ( b != a[i]){}}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int * a, int i) { int b = *a; *a = 2; if ( b != *a){}}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A { int f() const; };\n" "A g();\n" @@ -6979,7 +6967,7 @@ class TestOther : public TestFixture { " if (x.f() == a) break;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f(int i);\n" "struct A {\n" @@ -6992,14 +6980,14 @@ class TestOther : public TestFixture { " const bool y = a.f(A::C);\n" " if(!x && !y) return;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() {\n" " const bool x = a.f(A::B);\n" " const bool y = a.f(A::C);\n" " if (!x && !y) return;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(bool * const b);\n" "void foo() {\n" @@ -7008,17 +6996,17 @@ class TestOther : public TestFixture { " f(&x);\n" " if (!x && !y) return;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " const int a = {};\n" " if(a == 1) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("volatile const int var = 42;\n" "void f() { if(var == 42) {} }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " int a = 0;\n" @@ -7027,7 +7015,7 @@ class TestOther : public TestFixture { " g(&c);\n" " if (a == 0) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void duplicateExpression9() { @@ -7037,7 +7025,7 @@ class TestOther : public TestFixture { " uint8_t y = x;\n" " if (x != y) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void duplicateExpression10() { @@ -7048,7 +7036,7 @@ class TestOther : public TestFixture { " const int c = a+1;\n" " return c;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void duplicateExpression11() { @@ -7069,7 +7057,7 @@ class TestOther : public TestFixture { " double scale_ratio = getScale() / old_scale;\n" // <- FP " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void duplicateExpression12() { //#10026 @@ -7078,14 +7066,14 @@ class TestOther : public TestFixture { " int var = buffer[index - 1];\n" " return buffer[index - 1] - var;\n" // << "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (style) Same expression on both sides of '-' because 'buffer[index-1]' and 'var' represent the same value.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (style) Same expression on both sides of '-' because 'buffer[index-1]' and 'var' represent the same value.\n", errout_str()); } void duplicateExpression13() { //#7899 check("void f() {\n" " if (sizeof(long) == sizeof(long long)) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void duplicateExpression14() { //#9871 @@ -7095,7 +7083,7 @@ class TestOther : public TestFixture { " int* g = &k;\n" " return (f + 4 != g + 4);\n" "}\n"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4] -> [test.cpp:5]: (style) The comparison 'f+4 != g+4' is always false because 'f+4' and 'g+4' represent the same value.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4] -> [test.cpp:5]: (style) The comparison 'f+4 != g+4' is always false because 'f+4' and 'g+4' represent the same value.\n", errout_str()); } void duplicateExpression15() { //#10650 @@ -7109,7 +7097,7 @@ class TestOther : public TestFixture { "}\n"); ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) The comparison 'i == 0' is always true.\n" "[test.cpp:6] -> [test.cpp:7]: (style) The comparison 'i == 0' is always true.\n", - errout.str()); + errout_str()); } void duplicateExpression16() { @@ -7134,7 +7122,7 @@ class TestOther : public TestFixture { ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:4]: (style) Same expression 'a==\"42\"' found multiple times in chain of '||' operators.\n" "[test.cpp:7] -> [test.cpp:9]: (style) Same expression 'a==\"42\"' found multiple times in chain of '||' operators.\n" "[test.cpp:13] -> [test.cpp:16]: (style) Same expression 'a==\"42\"' found multiple times in chain of '||' operators.\n", - errout.str()); + errout_str()); check("void f(const char* s) {\n" // #6371 " if (*s == '\x0F') {\n" @@ -7142,7 +7130,7 @@ class TestOther : public TestFixture { " break;\n" " }\n" "}\n"); - ASSERT_EQUALS("[test.cpp:3]: (style) Same expression '!s[1]' found multiple times in chain of '||' operators.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Same expression '!s[1]' found multiple times in chain of '||' operators.\n", errout_str()); } void duplicateExpression17() { @@ -7155,7 +7143,7 @@ class TestOther : public TestFixture { ASSERT_EQUALS("[test.cpp:3]: (style) The comparison '0 > E0' is always false.\n" "[test.cpp:4]: (style) The comparison 'E0 > 0' is always false.\n" "[test.cpp:5]: (style) The comparison 'E0 == 0' is always true.\n", - errout.str()); + errout_str()); check("struct S {\n" // #12040, #12044 " static const int I = 0;\n" @@ -7180,13 +7168,13 @@ class TestOther : public TestFixture { "[test.cpp:2] -> [test.cpp:13]: (style) The comparison '0 > S::I' is always false.\n" "[test.cpp:14]: (style) The comparison '0 > S::E0' is always false.\n" "[test.cpp:15]: (style) The comparison '0 > S::F::F0' is always false.\n", - errout.str()); + errout_str()); check("template\n" // #12122 "void f() {\n" " static_assert(std::is_same::value || std::is_integral::value);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void duplicateExpressionLoop() { @@ -7194,23 +7182,23 @@ class TestOther : public TestFixture { " int a = 1;\n" " while ( a != 1){}\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) The comparison 'a != 1' is always false.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) The comparison 'a != 1' is always false.\n", errout_str()); check("void f() { int a = 1; while ( a != 1){ a++; }}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() { int a = 1; for ( int i=0; i < 3 && a != 1; i++){ a++; }}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int b) { int a = 1; while (b) { if ( a != 1){} b++; } a++; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " for(int i = 0; i < 10;) {\n" " if( i != 0 ) {}\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) The comparison 'i != 0' is always false.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) The comparison 'i != 0' is always false.\n", errout_str()); check("void f() {\n" " for(int i = 0; i < 10;) {\n" @@ -7218,7 +7206,7 @@ class TestOther : public TestFixture { " i++;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " for(int i = 0; i < 10;) {\n" @@ -7226,14 +7214,14 @@ class TestOther : public TestFixture { " i++;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " for(int i = 0; i < 10;) {\n" " if( i != 0 ) { i++; }\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " int i = 0;\n" @@ -7242,7 +7230,7 @@ class TestOther : public TestFixture { " i++;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int b) {\n" " while (b) {\n" @@ -7251,7 +7239,7 @@ class TestOther : public TestFixture { " b++;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (style) The comparison 'a != 1' is always false.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (style) The comparison 'a != 1' is always false.\n", errout_str()); check("struct T {\n" // #11083 " std::string m;\n" @@ -7267,35 +7255,35 @@ class TestOther : public TestFixture { " } while (t && t->str() == s);\n" " for (; t && t->str() == s; t = t->next());\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void duplicateExpressionTernary() { // #6391 check("void f() {\n" " return A ? x : x;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Same expression in both branches of ternary operator.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Same expression in both branches of ternary operator.\n", errout_str()); check("int f(bool b, int a) {\n" " const int c = a;\n" " return b ? a : c;\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) Same expression in both branches of ternary operator.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) Same expression in both branches of ternary operator.\n", errout_str()); check("void f() {\n" " return A ? x : z;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(unsigned char c) {\n" " x = y ? (signed char)c : (unsigned char)c;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("std::string stringMerge(std::string const& x, std::string const& y) {\n" // #7938 " return ((x > y) ? (y + x) : (x + y));\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #6426 { @@ -7309,12 +7297,12 @@ class TestOther : public TestFixture { settings.platform.sizeof_long = 4; settings.platform.long_bit = 32; check(code, &settings); - ASSERT_EQUALS("[test.cpp:2]: (style) Same value in both branches of ternary operator.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Same value in both branches of ternary operator.\n", errout_str()); settings.platform.sizeof_long = 8; settings.platform.long_bit = 64; check(code, &settings); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } } @@ -7322,31 +7310,31 @@ class TestOther : public TestFixture { check("void f() {\n" " if( a ? (b ? false:false): false ) ;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Same value in both branches of ternary operator.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Same value in both branches of ternary operator.\n", errout_str()); check("int f1(int a) {return (a == 1) ? (int)1 : 1; }"); - ASSERT_EQUALS("[test.cpp:1]: (style) Same value in both branches of ternary operator.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (style) Same value in both branches of ternary operator.\n", errout_str()); check("int f2(int a) {return (a == 1) ? (int)1 : (int)1; }"); - ASSERT_EQUALS("[test.cpp:1]: (style) Same value in both branches of ternary operator.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (style) Same value in both branches of ternary operator.\n", errout_str()); check("int f3(int a) {return (a == 1) ? 1 : (int)1; }"); - ASSERT_EQUALS("[test.cpp:1]: (style) Same value in both branches of ternary operator.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (style) Same value in both branches of ternary operator.\n", errout_str()); check("int f4(int a) {return (a == 1) ? 1 : 1; }"); - ASSERT_EQUALS("[test.cpp:1]: (style) Same value in both branches of ternary operator.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (style) Same value in both branches of ternary operator.\n", errout_str()); check("int f5(int a) {return (a == (int)1) ? (int)1 : 1; }"); - ASSERT_EQUALS("[test.cpp:1]: (style) Same value in both branches of ternary operator.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (style) Same value in both branches of ternary operator.\n", errout_str()); check("int f6(int a) {return (a == (int)1) ? (int)1 : (int)1; }"); - ASSERT_EQUALS("[test.cpp:1]: (style) Same value in both branches of ternary operator.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (style) Same value in both branches of ternary operator.\n", errout_str()); check("int f7(int a) {return (a == (int)1) ? 1 : (int)1; }"); - ASSERT_EQUALS("[test.cpp:1]: (style) Same value in both branches of ternary operator.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (style) Same value in both branches of ternary operator.\n", errout_str()); check("int f8(int a) {return (a == (int)1) ? 1 : 1; }"); - ASSERT_EQUALS("[test.cpp:1]: (style) Same value in both branches of ternary operator.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (style) Same value in both branches of ternary operator.\n", errout_str()); check("struct Foo {\n" " std::vector bar{1,2,3};\n" @@ -7356,14 +7344,14 @@ class TestOther : public TestFixture { " Foo foo;\n" " it = true ? foo.bar.begin() : foo.baz.begin();\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(bool b) {\n" " std::vector bar{1,2,3};\n" " std::vector baz{4,5,6};\n" " std::vector v = b ? bar : baz;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(bool q) {\n" // #9570 " static int a = 0;\n" @@ -7371,19 +7359,19 @@ class TestOther : public TestFixture { " int& x = q ? a : b;\n" " ++x;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S { int a, b; };\n" // #10107 "S f(bool x, S s) {\n" " (x) ? f.a = 42 : f.b = 42;\n" " return f;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("float f(float x) {\n" // # 11368 " return (x >= 0.0) ? 0.0 : -0.0;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void duplicateExpressionTemplate() { @@ -7392,27 +7380,27 @@ class TestOther : public TestFixture { "}\n" "\n" "static auto a = f<0>();"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("template\n" // #7754 "void f() {\n" " if (std::is_same_v || std::is_same_v) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("typedef long long int64_t;" "template\n" "void f() {\n" " if (std::is_same_v || std::is_same_v) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkP("#define int32_t int" "template\n" "void f() {\n" " if (std::is_same_v || std::is_same_v) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkP("#define F(v) (v) != 0\n" // #12392 "template\n" @@ -7422,39 +7410,39 @@ class TestOther : public TestFixture { "void g() {\n" " f();\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void duplicateExpressionCompareWithZero() { check("void f(const int* x, bool b) {\n" " if ((x && b) || (x != 0 && b)) {}\n" "}\n"); - ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '||' because 'x&&b' and 'x!=0&&b' represent the same value.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '||' because 'x&&b' and 'x!=0&&b' represent the same value.\n", errout_str()); check("void f(const int* x, bool b) {\n" " if ((x != 0 && b) || (x && b)) {}\n" "}\n"); - ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '||' because 'x!=0&&b' and 'x&&b' represent the same value.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '||' because 'x!=0&&b' and 'x&&b' represent the same value.\n", errout_str()); check("void f(const int* x, bool b) {\n" " if ((x && b) || (b && x != 0)) {}\n" "}\n"); - ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '||' because 'x&&b' and 'b&&x!=0' represent the same value.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '||' because 'x&&b' and 'b&&x!=0' represent the same value.\n", errout_str()); check("void f(const int* x, bool b) {\n" " if ((!x && b) || (x == 0 && b)) {}\n" "}\n"); - ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '||' because '!x&&b' and 'x==0&&b' represent the same value.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '||' because '!x&&b' and 'x==0&&b' represent the same value.\n", errout_str()); check("void f(const int* x, bool b) {\n" " if ((x == 0 && b) || (!x && b)) {}\n" "}\n"); - ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '||' because 'x==0&&b' and '!x&&b' represent the same value.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '||' because 'x==0&&b' and '!x&&b' represent the same value.\n", errout_str()); check("void f(const int* x, bool b) {\n" " if ((!x && b) || (b && x == 0)) {}\n" "}\n"); - ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '||' because '!x&&b' and 'b&&x==0' represent the same value.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Same expression on both sides of '||' because '!x&&b' and 'b&&x==0' represent the same value.\n", errout_str()); check("struct A {\n" " int* getX() const;\n" @@ -7463,43 +7451,43 @@ class TestOther : public TestFixture { " if ((getX() && getB()) || (getX() != 0 && getB())) {}\n" " }\n" "};\n"); - ASSERT_EQUALS("[test.cpp:5]: (style) Same expression on both sides of '||' because 'getX()&&getB()' and 'getX()!=0&&getB()' represent the same value.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (style) Same expression on both sides of '||' because 'getX()&&getB()' and 'getX()!=0&&getB()' represent the same value.\n", errout_str()); check("void f(const int* x, bool b) {\n" " if ((x && b) || (x == 0 && b)) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(const int* x, bool b) {\n" " if ((!x && b) || (x != 0 && b)) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void oppositeExpression() { check("void f(bool a) { if(a && !a) {} }"); - ASSERT_EQUALS("[test.cpp:1]: (style) Opposite expression on both sides of '&&'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (style) Opposite expression on both sides of '&&'.\n", errout_str()); check("void f(bool a) { if(a != !a) {} }"); - ASSERT_EQUALS("[test.cpp:1]: (style) Opposite expression on both sides of '!='.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (style) Opposite expression on both sides of '!='.\n", errout_str()); check("void f(bool a) { if( a == !(a) ) {}}"); - ASSERT_EQUALS("[test.cpp:1]: (style) Opposite expression on both sides of '=='.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (style) Opposite expression on both sides of '=='.\n", errout_str()); check("void f(bool a) { if( a != !(a) ) {}}"); - ASSERT_EQUALS("[test.cpp:1]: (style) Opposite expression on both sides of '!='.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (style) Opposite expression on both sides of '!='.\n", errout_str()); check("void f(bool a) { if( !(a) == a ) {}}"); - ASSERT_EQUALS("[test.cpp:1]: (style) Opposite expression on both sides of '=='.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (style) Opposite expression on both sides of '=='.\n", errout_str()); check("void f(bool a) { if( !(a) != a ) {}}"); - ASSERT_EQUALS("[test.cpp:1]: (style) Opposite expression on both sides of '!='.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (style) Opposite expression on both sides of '!='.\n", errout_str()); check("void f(bool a) { if( !(!a) == !(a) ) {}}"); - ASSERT_EQUALS("[test.cpp:1]: (style) Opposite expression on both sides of '=='.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (style) Opposite expression on both sides of '=='.\n", errout_str()); check("void f(bool a) { if( !(!a) != !(a) ) {}}"); - ASSERT_EQUALS("[test.cpp:1]: (style) Opposite expression on both sides of '!='.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (style) Opposite expression on both sides of '!='.\n", errout_str()); check("void f1(bool a) {\n" " const bool b = a;\n" @@ -7507,7 +7495,7 @@ class TestOther : public TestFixture { " if( b == !(a) ) {}\n" "}"); ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) Opposite expression on both sides of '=='.\n" - "[test.cpp:2] -> [test.cpp:4]: (style) Opposite expression on both sides of '=='.\n", errout.str()); + "[test.cpp:2] -> [test.cpp:4]: (style) Opposite expression on both sides of '=='.\n", errout_str()); check("void f2(const bool *a) {\n" " const bool b = *a;\n" @@ -7515,25 +7503,25 @@ class TestOther : public TestFixture { " if( b == !(*a) ) {}\n" "}"); ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) Opposite expression on both sides of '=='.\n" - "[test.cpp:2] -> [test.cpp:4]: (style) Opposite expression on both sides of '=='.\n", errout.str()); + "[test.cpp:2] -> [test.cpp:4]: (style) Opposite expression on both sides of '=='.\n", errout_str()); check("void f(bool a) { a = !a; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int a) { if( a < -a ) {}}"); - ASSERT_EQUALS("[test.cpp:1]: (style) Opposite expression on both sides of '<'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (style) Opposite expression on both sides of '<'.\n", errout_str()); check("void f(int a) { a -= -a; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int a) { a = a / (-a); }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool f(int i){ return !((i - 1) & i); }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool f(unsigned i){ return (x > 0) && (x & (x-1)) == 0; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void A::f(bool a, bool c)\n" "{\n" @@ -7541,51 +7529,51 @@ class TestOther : public TestFixture { " if(c) { a = false; }\n" " if(b && !a) { }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(bool c) {\n" " const bool b = a;\n" " if(c) { a = false; }\n" " if(b && !a) { }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " bool x = a;\n" " dostuff();\n" " if (x && a) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " const bool b = g();\n" " if (!b && g()) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(const bool *a) {\n" " const bool b = a[42];\n" " if( b == !(a[42]) ) {}\n" "}\n"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) Opposite expression on both sides of '=='.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) Opposite expression on both sides of '=='.\n", errout_str()); check("void f(const bool *a) {\n" " const bool b = a[42];\n" " if( a[42] == !(b) ) {}\n" "}\n"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) Opposite expression on both sides of '=='.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) Opposite expression on both sides of '=='.\n", errout_str()); check("void f(const bool *a) {\n" " const bool b = *a;\n" " if( b == !(*a) ) {}\n" "}\n"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) Opposite expression on both sides of '=='.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) Opposite expression on both sides of '=='.\n", errout_str()); check("void f(const bool *a) {\n" " const bool b = *a;\n" " if( *a == !(b) ) {}\n" "}\n"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) Opposite expression on both sides of '=='.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) Opposite expression on both sides of '=='.\n", errout_str()); check("void f(uint16_t u) {\n" // #9342 " if (u != (u & -u))\n" @@ -7594,7 +7582,7 @@ class TestOther : public TestFixture { " return false;\n" " return true;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void duplicateVarExpression() { @@ -7604,7 +7592,7 @@ class TestOther : public TestFixture { " int i = f();\n" " int j = f();\n" "}"); - ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:4]: (style) Same expression used in consecutive assignments of 'i' and 'j'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:4]: (style) Same expression used in consecutive assignments of 'i' and 'j'.\n", errout_str()); check("struct Foo { int f() const; int g() const; };\n" "void test() {\n" @@ -7612,7 +7600,7 @@ class TestOther : public TestFixture { " int i = f.f();\n" " int j = f.f();\n" "}"); - ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:4]: (style) Same expression used in consecutive assignments of 'i' and 'j'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:4]: (style) Same expression used in consecutive assignments of 'i' and 'j'.\n", errout_str()); check("struct Foo { int f() const; int g() const; };\n" "void test() {\n" @@ -7621,7 +7609,7 @@ class TestOther : public TestFixture { " int i = f.f();\n" " int j = f.f();\n" "}"); - ASSERT_EQUALS("[test.cpp:6] -> [test.cpp:5]: (style) Same expression used in consecutive assignments of 'i' and 'j'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6] -> [test.cpp:5]: (style) Same expression used in consecutive assignments of 'i' and 'j'.\n", errout_str()); check("int f() __attribute__((pure));\n" "int g() __attribute__((pure));\n" @@ -7629,7 +7617,7 @@ class TestOther : public TestFixture { " int i = 1 + f();\n" " int j = 1 + f();\n" "}"); - ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:4]: (style) Same expression used in consecutive assignments of 'i' and 'j'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:4]: (style) Same expression used in consecutive assignments of 'i' and 'j'.\n", errout_str()); check("int f() __attribute__((pure));\n" "int g() __attribute__((pure));\n" @@ -7637,7 +7625,7 @@ class TestOther : public TestFixture { " int i = f() + 1;\n" " int j = 1 + f();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f() __attribute__((pure));\n" "int g() __attribute__((pure));\n" @@ -7646,7 +7634,7 @@ class TestOther : public TestFixture { " int i = x + 1;\n" " int j = f() + 1;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f() __attribute__((pure));\n" "int g() __attribute__((pure));\n" @@ -7654,7 +7642,7 @@ class TestOther : public TestFixture { " int i = f() + f();\n" " int j = f() + f();\n" "}"); - ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:4]: (style) Same expression used in consecutive assignments of 'i' and 'j'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:4]: (style) Same expression used in consecutive assignments of 'i' and 'j'.\n", errout_str()); check("int f(int) __attribute__((pure));\n" "int g(int) __attribute__((pure));\n" @@ -7662,7 +7650,7 @@ class TestOther : public TestFixture { " int i = f(0);\n" " int j = f(0);\n" "}"); - ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:4]: (style) Same expression used in consecutive assignments of 'i' and 'j'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:4]: (style) Same expression used in consecutive assignments of 'i' and 'j'.\n", errout_str()); check("int f(int) __attribute__((pure));\n" "int g(int) __attribute__((pure));\n" @@ -7671,39 +7659,39 @@ class TestOther : public TestFixture { " int i = f(0);\n" " int j = f(x);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void test(const int * p, const int * q) {\n" " int i = *p;\n" " int j = *p;\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2]: (style) Same expression used in consecutive assignments of 'i' and 'j'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2]: (style) Same expression used in consecutive assignments of 'i' and 'j'.\n", errout_str()); check("struct A { int x; int y; };" "void test(A a) {\n" " int i = a.x;\n" " int j = a.x;\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2]: (style) Same expression used in consecutive assignments of 'i' and 'j'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2]: (style) Same expression used in consecutive assignments of 'i' and 'j'.\n", errout_str()); check("void test() {\n" " int i = 0;\n" " int j = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void test() {\n" " int i = -1;\n" " int j = -1;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f(int);\n" "void test() {\n" " int i = f(0);\n" " int j = f(1);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f();\n" "int g();\n" @@ -7711,21 +7699,21 @@ class TestOther : public TestFixture { " int i = f() || f();\n" " int j = f() && f();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct Foo {};\n" "void test() {\n" " Foo i = Foo();\n" " Foo j = Foo();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct Foo {};\n" "void test() {\n" " Foo i = Foo{};\n" " Foo j = Foo{};\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct Foo { int f() const; float g() const; };\n" "void test() {\n" @@ -7733,7 +7721,7 @@ class TestOther : public TestFixture { " int i = f.f();\n" " int j = f.f();\n" "}"); - ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:4]: (style, inconclusive) Same expression used in consecutive assignments of 'i' and 'j'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:4]: (style, inconclusive) Same expression used in consecutive assignments of 'i' and 'j'.\n", errout_str()); check("struct Foo { int f(); int g(); };\n" "void test() {\n" @@ -7741,43 +7729,43 @@ class TestOther : public TestFixture { " int i = f.f();\n" " int j = f.f();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void test() {\n" " int i = f();\n" " int j = f();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void test(int x) {\n" " int i = ++x;\n" " int j = ++x;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void test(int x) {\n" " int i = x++;\n" " int j = x++;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void test(int x) {\n" " int i = --x;\n" " int j = --x;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void test(int x) {\n" " int i = x--;\n" " int j = x--;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void test(int x) {\n" " int i = x + 1;\n" " int j = 1 + x;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void duplicateVarExpressionUnique() { @@ -7788,7 +7776,7 @@ class TestOther : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:3]: (style, inconclusive) Same expression used in consecutive assignments of 'start' and 'end'.\n" "[test.cpp:2]: (style) Parameter 'x' can be declared as pointer to const\n", - errout.str()); + errout_str()); check("struct SW { int first; };\n" "void foo(SW* x, int i, int j) {\n" @@ -7797,7 +7785,7 @@ class TestOther : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:3]: (style, inconclusive) Same expression used in consecutive assignments of 'start' and 'end'.\n" "[test.cpp:2]: (style) Parameter 'x' can be declared as pointer to const\n", - errout.str()); + errout_str()); check("struct Foo { int f() const; };\n" "void test() {\n" @@ -7805,13 +7793,13 @@ class TestOther : public TestFixture { " int i = f.f();\n" " int j = f.f();\n" "}"); - ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:4]: (style, inconclusive) Same expression used in consecutive assignments of 'i' and 'j'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:4]: (style, inconclusive) Same expression used in consecutive assignments of 'i' and 'j'.\n", errout_str()); check("void test(const int * p) {\n" " int i = *p;\n" " int j = *p;\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2]: (style, inconclusive) Same expression used in consecutive assignments of 'i' and 'j'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2]: (style, inconclusive) Same expression used in consecutive assignments of 'i' and 'j'.\n", errout_str()); check("struct Foo { int f() const; int g(int) const; };\n" "void test() {\n" @@ -7819,7 +7807,7 @@ class TestOther : public TestFixture { " int i = f.f();\n" " int j = f.f();\n" "}"); - ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:4]: (style, inconclusive) Same expression used in consecutive assignments of 'i' and 'j'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:4]: (style, inconclusive) Same expression used in consecutive assignments of 'i' and 'j'.\n", errout_str()); check("struct Foo { int f() const; };\n" "void test() {\n" @@ -7827,7 +7815,7 @@ class TestOther : public TestFixture { " int i = f.f();\n" " int j = f.f();\n" "}"); - ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:4]: (style, inconclusive) Same expression used in consecutive assignments of 'i' and 'j'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:4]: (style, inconclusive) Same expression used in consecutive assignments of 'i' and 'j'.\n", errout_str()); } void duplicateVarExpressionAssign() { @@ -7839,7 +7827,7 @@ class TestOther : public TestFixture { " use(i);\n" " i = j;\n" "}"); - ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:3]: (style, inconclusive) Same expression used in consecutive assignments of 'i' and 'j'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:3]: (style, inconclusive) Same expression used in consecutive assignments of 'i' and 'j'.\n", errout_str()); check("struct A { int x; int y; };" "void use(int);\n" @@ -7849,7 +7837,7 @@ class TestOther : public TestFixture { " use(j);\n" " j = i;\n" "}"); - ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:3]: (style, inconclusive) Same expression used in consecutive assignments of 'i' and 'j'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:3]: (style, inconclusive) Same expression used in consecutive assignments of 'i' and 'j'.\n", errout_str()); check("struct A { int x; int y; };" "void use(int);\n" @@ -7862,7 +7850,7 @@ class TestOther : public TestFixture { ASSERT_EQUALS( "[test.cpp:4] -> [test.cpp:3]: (style, inconclusive) Same expression used in consecutive assignments of 'i' and 'j'.\n" "[test.cpp:3] -> [test.cpp:4] -> [test.cpp:6]: (style) The comparison 'i == j' is always true because 'i' and 'j' represent the same value.\n", - errout.str()); + errout_str()); check("struct A { int x; int y; };" "void use(int);\n" @@ -7875,7 +7863,7 @@ class TestOther : public TestFixture { ASSERT_EQUALS( "[test.cpp:4] -> [test.cpp:3]: (style, inconclusive) Same expression used in consecutive assignments of 'i' and 'j'.\n" "[test.cpp:3] -> [test.cpp:6]: (style) The comparison 'i == a.x' is always true because 'i' and 'a.x' represent the same value.\n", - errout.str()); + errout_str()); check("struct A { int x; int y; };" "void use(int);\n" @@ -7888,7 +7876,7 @@ class TestOther : public TestFixture { ASSERT_EQUALS( "[test.cpp:4] -> [test.cpp:3]: (style, inconclusive) Same expression used in consecutive assignments of 'i' and 'j'.\n" "[test.cpp:4] -> [test.cpp:6]: (style) The comparison 'j == a.x' is always true because 'j' and 'a.x' represent the same value.\n", - errout.str()); + errout_str()); // Issue #8612 check("struct P\n" @@ -7917,7 +7905,7 @@ class TestOther : public TestFixture { " previous = current;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:16] -> [test.cpp:15]: (style, inconclusive) Same expression used in consecutive assignments of 'current' and 'previous'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:16] -> [test.cpp:15]: (style, inconclusive) Same expression used in consecutive assignments of 'current' and 'previous'.\n", errout_str()); } void duplicateVarExpressionCrash() { @@ -7933,21 +7921,21 @@ class TestOther : public TestFixture { " (void)a;\n" " (void)b;\n" "}"); - ASSERT_EQUALS("[test.cpp:8] -> [test.cpp:7]: (style, inconclusive) Same expression used in consecutive assignments of 'a' and 'b'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8] -> [test.cpp:7]: (style, inconclusive) Same expression used in consecutive assignments of 'a' and 'b'.\n", errout_str()); // Issue #8712 check("void f() {\n" " unsigned char d;\n" " d = d % 5;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("template \n" "T f() {\n" " T x = T();\n" "}\n" "int &a = f();"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Issue #8713 check("class A {\n" @@ -7959,7 +7947,7 @@ class TestOther : public TestFixture { " uint32_t b = uint32_t(A ::B / 1024);\n" " int32_t c = int32_t(a / b);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Issue #8709 check("a b;\n" @@ -7968,7 +7956,7 @@ class TestOther : public TestFixture { " double e(b);\n" " if(e <= 0) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #10718 // Should probably not be inconclusive @@ -7980,7 +7968,7 @@ class TestOther : public TestFixture { " return e + f;\n" " }\n" "};\n"); - ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:5]: (style, inconclusive) Same expression used in consecutive assignments of 'e' and 'f'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:5]: (style, inconclusive) Same expression used in consecutive assignments of 'e' and 'f'.\n", errout_str()); } void multiConditionSameExpression() { @@ -7990,7 +7978,7 @@ class TestOther : public TestFixture { " if ((val > 0)) {}\n" "}"); ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) The comparison 'val < 0' is always false.\n" - "[test.cpp:2] -> [test.cpp:4]: (style) The comparison 'val > 0' is always false.\n", errout.str()); + "[test.cpp:2] -> [test.cpp:4]: (style) The comparison 'val > 0' is always false.\n", errout_str()); check("void f() {\n" " int val = 0;\n" @@ -8001,7 +7989,7 @@ class TestOther : public TestFixture { "}\n"); ASSERT_EQUALS( "[test.cpp:3]: (style) Variable 'p' can be declared as pointer to const\n", - errout.str()); + errout_str()); check("void f() {\n" " int val = 0;\n" @@ -8012,7 +8000,7 @@ class TestOther : public TestFixture { TODO_ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) The comparison '*p < 0' is always false.\n" "[test.cpp:2] -> [test.cpp:4]: (style) The comparison '*p > 0' is always false.\n", "[test.cpp:3]: (style) Variable 'p' can be declared as pointer to const\n", - errout.str()); + errout_str()); check("void f() {\n" " int val = 0;\n" @@ -8021,7 +8009,7 @@ class TestOther : public TestFixture { " }\n" "}"); ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) The comparison 'val < 0' is always false.\n" - "[test.cpp:2] -> [test.cpp:4]: (style) The comparison 'val > 0' is always false.\n", errout.str()); + "[test.cpp:2] -> [test.cpp:4]: (style) The comparison 'val > 0' is always false.\n", errout_str()); check("void f() {\n" " int val = 0;\n" @@ -8030,7 +8018,7 @@ class TestOther : public TestFixture { " }\n" "}"); ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) The comparison 'val < 0' is always false.\n" - "[test.cpp:2] -> [test.cpp:4]: (style) The comparison 'val < 0' is always false.\n", errout.str()); + "[test.cpp:2] -> [test.cpp:4]: (style) The comparison 'val < 0' is always false.\n", errout_str()); check("void f() {\n" " int activate = 0;\n" @@ -8038,39 +8026,39 @@ class TestOther : public TestFixture { " if (activate) {}\n" " else if (foo) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void checkSignOfUnsignedVariable() { check("void foo() {\n" " for(unsigned char i = 10; i >= 0; i--) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Unsigned expression 'i' can't be negative so it is unnecessary to test it.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Unsigned expression 'i' can't be negative so it is unnecessary to test it.\n", errout_str()); check("void foo(bool b) {\n" " for(unsigned int i = 10; b || i >= 0; i--) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Unsigned expression 'i' can't be negative so it is unnecessary to test it.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Unsigned expression 'i' can't be negative so it is unnecessary to test it.\n", errout_str()); { const char code[] = "void foo(unsigned int x) {\n" " if (x < 0) {}\n" "}"; check(code, nullptr, false, true, false); - ASSERT_EQUALS("[test.cpp:2]: (style) Checking if unsigned expression 'x' is less than zero.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Checking if unsigned expression 'x' is less than zero.\n", errout_str()); check(code, nullptr, false, true, true); - ASSERT_EQUALS("[test.cpp:2]: (style) Checking if unsigned expression 'x' is less than zero.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Checking if unsigned expression 'x' is less than zero.\n", errout_str()); } check("void foo(unsigned int x) {\n" " if (x < 0u) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Checking if unsigned expression 'x' is less than zero.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Checking if unsigned expression 'x' is less than zero.\n", errout_str()); check("void foo(int x) {\n" " if (x < 0) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); { const char code[] = "void foo(unsigned x) {\n" @@ -8078,9 +8066,9 @@ class TestOther : public TestFixture { " if (x < y) {}\n" "}"; check(code, nullptr, false, true, false); - ASSERT_EQUALS("[test.cpp:3]: (style) Checking if unsigned expression 'x' is less than zero.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Checking if unsigned expression 'x' is less than zero.\n", errout_str()); check(code, nullptr, false, true, true); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) Checking if unsigned expression 'x' is less than zero.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) Checking if unsigned expression 'x' is less than zero.\n", errout_str()); } check("void foo(unsigned x) {\n" " int y = 0;\n" @@ -8088,149 +8076,149 @@ class TestOther : public TestFixture { " y = 1;\n" " if (x < y) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(unsigned int x) {\n" " if (0 > x) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Checking if unsigned expression 'x' is less than zero.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Checking if unsigned expression 'x' is less than zero.\n", errout_str()); check("void foo(unsigned int x) {\n" " if (0UL > x) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Checking if unsigned expression 'x' is less than zero.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Checking if unsigned expression 'x' is less than zero.\n", errout_str()); check("void foo(int x) {\n" " if (0 > x) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(unsigned int x) {\n" " if (x >= 0) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Unsigned expression 'x' can't be negative so it is unnecessary to test it.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Unsigned expression 'x' can't be negative so it is unnecessary to test it.\n", errout_str()); check("void foo(unsigned int x, unsigned y) {\n" " if (x - y >= 0) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Unsigned expression 'x-y' can't be negative so it is unnecessary to test it.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Unsigned expression 'x-y' can't be negative so it is unnecessary to test it.\n", errout_str()); check("void foo(unsigned int x) {\n" " if (x >= 0ull) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Unsigned expression 'x' can't be negative so it is unnecessary to test it.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Unsigned expression 'x' can't be negative so it is unnecessary to test it.\n", errout_str()); check("void foo(int x) {\n" " if (x >= 0) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(unsigned int x) {\n" " if (0 <= x) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Unsigned expression 'x' can't be negative so it is unnecessary to test it.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Unsigned expression 'x' can't be negative so it is unnecessary to test it.\n", errout_str()); check("void foo(unsigned int x) {\n" " if (0ll <= x) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Unsigned expression 'x' can't be negative so it is unnecessary to test it.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Unsigned expression 'x' can't be negative so it is unnecessary to test it.\n", errout_str()); check("void foo(int x) {\n" " if (0 <= x) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(unsigned int x, bool y) {\n" " if (x < 0 && y) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Checking if unsigned expression 'x' is less than zero.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Checking if unsigned expression 'x' is less than zero.\n", errout_str()); check("void foo(int x, bool y) {\n" " if (x < 0 && y) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(unsigned int x, bool y) {\n" " if (0 > x && y) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Checking if unsigned expression 'x' is less than zero.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Checking if unsigned expression 'x' is less than zero.\n", errout_str()); check("void foo(int x, bool y) {\n" " if (0 > x && y) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(unsigned int x, bool y) {\n" " if (x >= 0 && y) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Unsigned expression 'x' can't be negative so it is unnecessary to test it.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Unsigned expression 'x' can't be negative so it is unnecessary to test it.\n", errout_str()); check("void foo(int x, bool y) {\n" " if (x >= 0 && y) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(unsigned int x, bool y) {\n" " if (y && x < 0) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Checking if unsigned expression 'x' is less than zero.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Checking if unsigned expression 'x' is less than zero.\n", errout_str()); check("void foo(int x, bool y) {\n" " if (y && x < 0) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(unsigned int x, bool y) {\n" " if (y && 0 > x) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Checking if unsigned expression 'x' is less than zero.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Checking if unsigned expression 'x' is less than zero.\n", errout_str()); check("void foo(int x, bool y) {\n" " if (y && 0 > x) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(unsigned int x, bool y) {\n" " if (y && x >= 0) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Unsigned expression 'x' can't be negative so it is unnecessary to test it.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Unsigned expression 'x' can't be negative so it is unnecessary to test it.\n", errout_str()); check("void foo(int x, bool y) {\n" " if (y && x >= 0) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(unsigned int x, bool y) {\n" " if (x < 0 || y) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Checking if unsigned expression 'x' is less than zero.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Checking if unsigned expression 'x' is less than zero.\n", errout_str()); check("void foo(int x, bool y) {\n" " if (x < 0 || y) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(unsigned int x, bool y) {\n" " if (0 > x || y) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Checking if unsigned expression 'x' is less than zero.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Checking if unsigned expression 'x' is less than zero.\n", errout_str()); check("void foo(int x, bool y) {\n" " if (0 > x || y) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(unsigned int x, bool y) {\n" " if (x >= 0 || y) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Unsigned expression 'x' can't be negative so it is unnecessary to test it.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Unsigned expression 'x' can't be negative so it is unnecessary to test it.\n", errout_str()); check("void foo(int x, bool y) {\n" " if (x >= 0 || y) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #3233 - FP when template is used (template parameter is numeric constant) { @@ -8239,16 +8227,16 @@ class TestOther : public TestFixture { "}\n" "foo<0>();"; check(code, nullptr, false); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check(code, nullptr, true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { check("template void foo(unsigned int x) {\n" "if (x <= 0);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Checking if unsigned expression 'x' is less than zero.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Checking if unsigned expression 'x' is less than zero.\n", errout_str()); } // #8836 @@ -8259,7 +8247,7 @@ class TestOther : public TestFixture { " value = 0u;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Checking if unsigned expression 'value' is less than zero.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Checking if unsigned expression 'value' is less than zero.\n", errout_str()); // #9040 /*const*/ Settings settings1 = settingsBuilder().platform(Platform::Type::Win64).build(); @@ -8268,7 +8256,7 @@ class TestOther : public TestFixture { "bool f() {\n" " return i >= 0;\n" "}\n", &settings1); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #10612 check("void f(void) {\n" @@ -8276,7 +8264,7 @@ class TestOther : public TestFixture { " constexpr const auto y = 0xFFFFU;\n" " if (y < x) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (style) Checking if unsigned expression 'y' is less than zero.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Checking if unsigned expression 'y' is less than zero.\n", errout_str()); // #12387 check("template\n" @@ -8288,14 +8276,14 @@ class TestOther : public TestFixture { "void g() {\n" " f(0);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void checkSignOfPointer() { check("void foo(const int* x) {\n" " if (x >= 0) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) A pointer can not be negative so it is either pointless or an error to check if it is not.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) A pointer can not be negative so it is either pointless or an error to check if it is not.\n", errout_str()); { const char code[] = "void foo(const int* x) {\n" @@ -8303,19 +8291,19 @@ class TestOther : public TestFixture { " if (x >= y) {}\n" "}"; check(code, nullptr, false, true, false); - ASSERT_EQUALS("[test.cpp:3]: (style) A pointer can not be negative so it is either pointless or an error to check if it is not.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) A pointer can not be negative so it is either pointless or an error to check if it is not.\n", errout_str()); check(code, nullptr, false, true, true); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) A pointer can not be negative so it is either pointless or an error to check if it is not.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) A pointer can not be negative so it is either pointless or an error to check if it is not.\n", errout_str()); } check("void foo(const int* x) {\n" " if (*x >= 0) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(const int* x) {\n" " if (x < 0) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) A pointer can not be negative so it is either pointless or an error to check if it is.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) A pointer can not be negative so it is either pointless or an error to check if it is.\n", errout_str()); { const char code[] = "void foo(const int* x) {\n" @@ -8324,40 +8312,40 @@ class TestOther : public TestFixture { "}"; check(code, nullptr, false, true, false); - ASSERT_EQUALS("[test.cpp:3]: (style) A pointer can not be negative so it is either pointless or an error to check if it is.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) A pointer can not be negative so it is either pointless or an error to check if it is.\n", errout_str()); check(code, nullptr, false, true, true); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) A pointer can not be negative so it is either pointless or an error to check if it is.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) A pointer can not be negative so it is either pointless or an error to check if it is.\n", errout_str()); } check("void foo(const int* x) {\n" " if (*x < 0) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(const int* x, const int* y) {\n" " if (x - y < 0) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(const int* x, const int* y) {\n" " if (x - y <= 0) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(const int* x, const int* y) {\n" " if (x - y > 0) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(const int* x, const int* y) {\n" " if (x - y >= 0) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(const Bar* x) {\n" " if (0 <= x) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) A pointer can not be negative so it is either pointless or an error to check if it is not.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) A pointer can not be negative so it is either pointless or an error to check if it is not.\n", errout_str()); check("struct S {\n" " int* ptr;\n" @@ -8367,7 +8355,7 @@ class TestOther : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:5]: (style) A pointer can not be negative so it is either pointless or an error to check if it is not.\n" "[test.cpp:4]: (style) Parameter 'first' can be declared as pointer to const\n", - errout.str()); + errout_str()); check("struct S {\n" " int* ptr;\n" @@ -8377,7 +8365,7 @@ class TestOther : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:4]: (style) Parameter 'first' can be declared as pointer to const\n" "[test.cpp:4]: (style) Parameter 'second' can be declared as pointer to const\n", - errout.str()); + errout_str()); check("struct S {\n" " int* ptr;\n" @@ -8387,7 +8375,7 @@ class TestOther : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:5]: (style) A pointer can not be negative so it is either pointless or an error to check if it is not.\n" "[test.cpp:4]: (style) Parameter 'first' can be declared as pointer to const\n", - errout.str()); + errout_str()); check("struct S {\n" " int* ptr;\n" @@ -8397,7 +8385,7 @@ class TestOther : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:4]: (style) Parameter 'first' can be declared as pointer to const\n" "[test.cpp:4]: (style) Parameter 'second' can be declared as pointer to const\n", - errout.str()); + errout_str()); check("struct S {\n" " int* ptr;\n" @@ -8407,7 +8395,7 @@ class TestOther : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:4]: (style) Parameter 'first' can be declared as pointer to const\n" "[test.cpp:4]: (style) Parameter 'second' can be declared as pointer to const\n", - errout.str()); + errout_str()); check("struct S {\n" " int* ptr;\n" @@ -8417,7 +8405,7 @@ class TestOther : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:4]: (style) Parameter 'first' can be declared as pointer to const\n" "[test.cpp:4]: (style) Parameter 'second' can be declared as pointer to const\n", - errout.str()); + errout_str()); check("struct S {\n" " int* ptr;\n" @@ -8427,7 +8415,7 @@ class TestOther : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:4]: (style) Parameter 'first' can be declared as pointer to const\n" "[test.cpp:4]: (style) Parameter 'second' can be declared as pointer to const\n", - errout.str()); + errout_str()); check("struct S {\n" " int* ptr;\n" @@ -8437,7 +8425,7 @@ class TestOther : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:4]: (style) Parameter 'first' can be declared as pointer to const\n" "[test.cpp:4]: (style) Parameter 'second' can be declared as pointer to const\n", - errout.str()); + errout_str()); check("struct S {\n" " int* ptr;\n" @@ -8447,61 +8435,61 @@ class TestOther : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:4]: (style) Parameter 'first' can be declared as pointer to const\n" "[test.cpp:4]: (style) Parameter 'second' can be declared as pointer to const\n", - errout.str()); + errout_str()); check("void foo(const int* x) {\n" " if (0 <= x[0]) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(Bar* x) {\n" " if (0 <= x.y) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'x' can be declared as pointer to const\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'x' can be declared as pointer to const\n", errout_str()); check("void foo(Bar* x) {\n" " if (0 <= x->y) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'x' can be declared as pointer to const\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'x' can be declared as pointer to const\n", errout_str()); check("void foo(Bar* x, Bar* y) {\n" " if (0 <= x->y - y->y ) {}\n" "}"); ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'x' can be declared as pointer to const\n" "[test.cpp:1]: (style) Parameter 'y' can be declared as pointer to const\n", - errout.str()); + errout_str()); check("void foo(const Bar* x) {\n" " if (0 > x) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) A pointer can not be negative so it is either pointless or an error to check if it is.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) A pointer can not be negative so it is either pointless or an error to check if it is.\n", errout_str()); check("void foo(const int* x) {\n" " if (0 > x[0]) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(Bar* x) {\n" " if (0 > x.y) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'x' can be declared as pointer to const\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'x' can be declared as pointer to const\n", errout_str()); check("void foo(Bar* x) {\n" " if (0 > x->y) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'x' can be declared as pointer to const\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'x' can be declared as pointer to const\n", errout_str()); check("void foo() {\n" " int (*t)(void *a, void *b);\n" " if (t(a, b) < 0) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() {\n" " int (*t)(void *a, void *b);\n" " if (0 > t(a, b)) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct object_info { int *typep; };\n" "void packed_object_info(struct object_info *oi) {\n" @@ -8509,7 +8497,7 @@ class TestOther : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:3]: (style) A pointer can not be negative so it is either pointless or an error to check if it is.\n" "[test.cpp:2]: (style) Parameter 'oi' can be declared as pointer to const\n", - errout.str()); + errout_str()); check("struct object_info { int typep[10]; };\n" "void packed_object_info(struct object_info *oi) {\n" @@ -8517,34 +8505,34 @@ class TestOther : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:3]: (style) A pointer can not be negative so it is either pointless or an error to check if it is.\n" "[test.cpp:2]: (style) Parameter 'oi' can be declared as pointer to const\n", - errout.str()); + errout_str()); check("struct object_info { int *typep; };\n" "void packed_object_info(struct object_info *oi) {\n" " if (*oi->typep < 0);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Parameter 'oi' can be declared as pointer to const\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Parameter 'oi' can be declared as pointer to const\n", errout_str()); } void checkSuspiciousSemicolon1() { check("void foo() {\n" " for(int i = 0; i < 10; ++i);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Empty block check("void foo() {\n" " for(int i = 0; i < 10; ++i); {\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Suspicious use of ; at the end of 'for' statement.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Suspicious use of ; at the end of 'for' statement.\n", errout_str()); check("void foo() {\n" " while (!quit); {\n" " do_something();\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Suspicious use of ; at the end of 'while' statement.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Suspicious use of ; at the end of 'while' statement.\n", errout_str()); } void checkSuspiciousSemicolon2() { @@ -8553,21 +8541,21 @@ class TestOther : public TestFixture { " do_something();\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Suspicious use of ; at the end of 'if' statement.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Suspicious use of ; at the end of 'if' statement.\n", errout_str()); // Seen this in the wild check("void foo() {\n" " if (Match());\n" " do_something();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() {\n" " if (Match());\n" " else\n" " do_something();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() {\n" " if (i == 1)\n" @@ -8576,7 +8564,7 @@ class TestOther : public TestFixture { " do_something();\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() {\n" " if (i == 1);\n" @@ -8585,7 +8573,7 @@ class TestOther : public TestFixture { " do_something();\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void checkSuspiciousSemicolon3() { @@ -8594,20 +8582,20 @@ class TestOther : public TestFixture { " if (x == 123);\n" " REQUIRE(y=z);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void checkSuspiciousComparison() { checkP("void f(int a, int b) {\n" " a > b;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Found suspicious operator '>', result is not used.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Found suspicious operator '>', result is not used.\n", errout_str()); checkP("void f() {\n" // #10607 " for (auto p : m)\n" " std::vector> k;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void checkInvalidFree() { @@ -8615,19 +8603,19 @@ class TestOther : public TestFixture { " char *a; a = malloc(1024);\n" " free(a + 10);\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Mismatching address is freed. The address you get from malloc() must be freed without offset.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Mismatching address is freed. The address you get from malloc() must be freed without offset.\n", errout_str()); check("void foo(char *p) {\n" " char *a; a = malloc(1024);\n" " free(a - 10);\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Mismatching address is freed. The address you get from malloc() must be freed without offset.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Mismatching address is freed. The address you get from malloc() must be freed without offset.\n", errout_str()); check("void foo(char *p) {\n" " char *a; a = malloc(1024);\n" " free(10 + a);\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Mismatching address is freed. The address you get from malloc() must be freed without offset.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Mismatching address is freed. The address you get from malloc() must be freed without offset.\n", errout_str()); check("void foo(char *p) {\n" " char *a; a = new char[1024];\n" @@ -8635,7 +8623,7 @@ class TestOther : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'p' can be declared as pointer to const\n" "[test.cpp:3]: (error) Mismatching address is deleted. The address you get from new must be deleted without offset.\n", - errout.str()); + errout_str()); check("void foo(char *p) {\n" " char *a; a = new char;\n" @@ -8643,14 +8631,14 @@ class TestOther : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'p' can be declared as pointer to const\n" "[test.cpp:3]: (error) Mismatching address is deleted. The address you get from new must be deleted without offset.\n", - errout.str()); + errout_str()); check("void foo(char *p) {\n" " char *a; a = new char;\n" " bar(a);\n" " delete a + 10;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(char *p) {\n" " char *a; a = new char;\n" @@ -8659,7 +8647,7 @@ class TestOther : public TestFixture { " delete a + 10;\n" " delete b + 10;\n" "}"); - ASSERT_EQUALS("[test.cpp:6]: (error) Mismatching address is deleted. The address you get from new must be deleted without offset.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (error) Mismatching address is deleted. The address you get from new must be deleted without offset.\n", errout_str()); check("void foo(char *p) {\n" " char *a; a = new char;\n" @@ -8668,7 +8656,7 @@ class TestOther : public TestFixture { " delete a + 10;\n" " delete b + 10;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(char *p) {\n" " char *a; a = new char;\n" @@ -8677,14 +8665,14 @@ class TestOther : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:1]: (style) Parameter 'p' can be declared as pointer to const\n" "[test.cpp:4]: (error) Mismatching address is deleted. The address you get from new must be deleted without offset.\n", - errout.str()); + errout_str()); check("void foo(size_t xx) {\n" " char *ptr; ptr = malloc(42);\n" " ptr += xx;\n" " free(ptr + 1 - xx);\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Mismatching address is freed. The address you get from malloc() must be freed without offset.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Mismatching address is freed. The address you get from malloc() must be freed without offset.\n", errout_str()); check("void foo(size_t xx) {\n" " char *ptr; ptr = malloc(42);\n" @@ -8694,7 +8682,7 @@ class TestOther : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:2]: (style) Variable 'ptr' can be declared as pointer to const\n", - errout.str()); + errout_str()); } void checkRedundantCopy() { @@ -8702,7 +8690,7 @@ class TestOther : public TestFixture { "void foo() {\n" " const std::string a = getA();\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Use const reference for 'a' to avoid unnecessary data copying.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (performance, inconclusive) Use const reference for 'a' to avoid unnecessary data copying.\n", errout_str()); check("class A { public: A() {} char x[100]; };\n" "const A& getA(){static A a;return a;}\n" @@ -8711,7 +8699,7 @@ class TestOther : public TestFixture { " const A a = getA();\n" " return 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (performance, inconclusive) Use const reference for 'a' to avoid unnecessary data copying.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (performance, inconclusive) Use const reference for 'a' to avoid unnecessary data copying.\n", errout_str()); check("const int& getA(){static int a;return a;}\n" "int main()\n" @@ -8719,7 +8707,7 @@ class TestOther : public TestFixture { " const int a = getA();\n" " return 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("const int& getA(){static int a;return a;}\n" "int main()\n" @@ -8728,7 +8716,7 @@ class TestOther : public TestFixture { " const int a = getA + 3;\n" " return 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:4]: (style) Local variable \'getA\' shadows outer function\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:4]: (style) Local variable \'getA\' shadows outer function\n", errout_str()); check("class A { public: A() {} char x[100]; };\n" "const A& getA(){static A a;return a;}\n" @@ -8737,7 +8725,7 @@ class TestOther : public TestFixture { " const A a(getA());\n" " return 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (performance, inconclusive) Use const reference for 'a' to avoid unnecessary data copying.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (performance, inconclusive) Use const reference for 'a' to avoid unnecessary data copying.\n", errout_str()); check("const int& getA(){static int a;return a;}\n" "int main()\n" @@ -8745,7 +8733,7 @@ class TestOther : public TestFixture { " const int a(getA());\n" " return 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class A{\n" "public:A(int a=0){_a = a;}\n" @@ -8757,7 +8745,7 @@ class TestOther : public TestFixture { " const A a = getA() + 1;\n" " return 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class A{\n" "public:A(int a=0){_a = a;}\n" @@ -8769,7 +8757,7 @@ class TestOther : public TestFixture { " const A a(getA()+1);\n" " return 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #5190 - FP when creating object with constructor that takes a reference check("class A {};\n" @@ -8778,7 +8766,7 @@ class TestOther : public TestFixture { "void f() {\n" " const B b(getA());\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class A {};\n" "class B { B(const A& a); };\n" @@ -8786,7 +8774,7 @@ class TestOther : public TestFixture { "void f() {\n" " const B b{ getA() };\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #5618 const char* code5618 = "class Token {\n" @@ -8800,9 +8788,9 @@ class TestOther : public TestFixture { " }\n" "}"; check(code5618, nullptr, true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check(code5618, nullptr, false); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #5890 - crash: wesnoth desktop_util.cpp / unicode.hpp check("typedef std::vector X;\n" @@ -8810,7 +8798,7 @@ class TestOther : public TestFixture { " const X s = f(in);\n" " return f(s);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #7981 - False positive redundantCopyLocalConst - const ref argument to ctor check("class CD {\n" @@ -8822,7 +8810,7 @@ class TestOther : public TestFixture { "void foo() {\n" " const CD cd(CD::getOne());\n" "}", nullptr, true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S {\n" // #10545 " int modify();\n" @@ -8835,7 +8823,7 @@ class TestOther : public TestFixture { " return old;\n" " return {};\n" "}", nullptr, /*inconclusive*/ true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct X { int x; };\n" // #10191 "struct S {\n" @@ -8853,7 +8841,7 @@ class TestOther : public TestFixture { " return x.x;\n" " }\n" "};\n", nullptr, /*inconclusive*/ true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #10704 check("struct C {\n" @@ -8867,7 +8855,7 @@ class TestOther : public TestFixture { " return s.empty();\n" " }\n" "};\n"); - ASSERT_EQUALS("[test.cpp:8]: (performance, inconclusive) Use const reference for 's' to avoid unnecessary data copying.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8]: (performance, inconclusive) Use const reference for 's' to avoid unnecessary data copying.\n", errout_str()); check("struct C {\n" " const std::string & get() const { return m; }\n" @@ -8880,7 +8868,7 @@ class TestOther : public TestFixture { "void g() {\n" " std::string s = getC().get();\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S {\n" // #12139 " int x, y;\n" @@ -8893,7 +8881,7 @@ class TestOther : public TestFixture { " const S a = t.get();\n" " if (a.x > a.y) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void checkNegativeShift() { @@ -8902,55 +8890,55 @@ class TestOther : public TestFixture { " int a; a = 123;\n" " (void)(a << -1);\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Shifting by a negative value is undefined behaviour\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Shifting by a negative value is undefined behaviour\n", errout_str()); check("void foo()\n" "{\n" " int a; a = 123;\n" " (void)(a >> -1);\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Shifting by a negative value is undefined behaviour\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Shifting by a negative value is undefined behaviour\n", errout_str()); check("void foo()\n" "{\n" " int a; a = 123;\n" " a <<= -1;\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Shifting by a negative value is undefined behaviour\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Shifting by a negative value is undefined behaviour\n", errout_str()); check("void foo()\n" "{\n" " int a; a = 123;\n" " a >>= -1;\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Shifting by a negative value is undefined behaviour\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Shifting by a negative value is undefined behaviour\n", errout_str()); check("void foo()\n" "{\n" " std::cout << -1;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo()\n" "{\n" " std::cout << a << -1 ;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo()\n" "{\n" " std::cout << 3 << -1 ;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() {\n" " x = (-10+2) << 3;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (portability) Shifting a negative value is technically undefined behaviour\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (portability) Shifting a negative value is technically undefined behaviour\n", errout_str()); check("x = y ? z << $-1 : 0;"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Negative LHS check("const int x = -1 >> 2;"); - ASSERT_EQUALS("[test.cpp:1]: (portability) Shifting a negative value is technically undefined behaviour\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (portability) Shifting a negative value is technically undefined behaviour\n", errout_str()); // #6383 - unsigned type check("const int x = (unsigned int)(-1) >> 2;"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #7814 - UB happening in valueflowcode when it tried to compute shifts. check("int shift1() { return 1 >> -1 ;}\n" @@ -8960,7 +8948,7 @@ class TestOther : public TestFixture { ASSERT_EQUALS("[test.cpp:1]: (error) Shifting by a negative value is undefined behaviour\n" "[test.cpp:2]: (error) Shifting by a negative value is undefined behaviour\n" "[test.cpp:3]: (portability) Shifting a negative value is technically undefined behaviour\n" - "[test.cpp:4]: (portability) Shifting a negative value is technically undefined behaviour\n", errout.str()); + "[test.cpp:4]: (portability) Shifting a negative value is technically undefined behaviour\n", errout_str()); } void incompleteArrayFill() { @@ -8973,7 +8961,7 @@ class TestOther : public TestFixture { ASSERT_EQUALS(// TODO "[test.cpp:4] -> [test.cpp:5]: (performance) Buffer 'a' is being written before its old content has been used.\n" "[test.cpp:3]: (warning, inconclusive) Array 'a' is filled incompletely. Did you forget to multiply the size given to 'memset()' with 'sizeof(*a)'?\n" "[test.cpp:4]: (warning, inconclusive) Array 'a' is filled incompletely. Did you forget to multiply the size given to 'memcpy()' with 'sizeof(*a)'?\n" - "[test.cpp:5]: (warning, inconclusive) Array 'a' is filled incompletely. Did you forget to multiply the size given to 'memmove()' with 'sizeof(*a)'?\n", errout.str()); + "[test.cpp:5]: (warning, inconclusive) Array 'a' is filled incompletely. Did you forget to multiply the size given to 'memmove()' with 'sizeof(*a)'?\n", errout_str()); check("int a[5];\n" "namespace Z { struct B { int a[5]; } b; }\n" @@ -8983,44 +8971,44 @@ class TestOther : public TestFixture { "}"); TODO_ASSERT_EQUALS("[test.cpp:4]: (warning, inconclusive) Array '::a' is filled incompletely. Did you forget to multiply the size given to 'memset()' with 'sizeof(*::a)'?\n" "[test.cpp:5]: (warning, inconclusive) Array 'Z::b.a' is filled incompletely. Did you forget to multiply the size given to 'memset()' with 'sizeof(*Z::b.a)'?\n", - "[test.cpp:4]: (warning, inconclusive) Array '::a' is filled incompletely. Did you forget to multiply the size given to 'memset()' with 'sizeof(*::a)'?\n", errout.str()); + "[test.cpp:4]: (warning, inconclusive) Array '::a' is filled incompletely. Did you forget to multiply the size given to 'memset()' with 'sizeof(*::a)'?\n", errout_str()); check("void f() {\n" " Foo* a[5];\n" " memset(a, 'a', 5);\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning, inconclusive) Array 'a' is filled incompletely. Did you forget to multiply the size given to 'memset()' with 'sizeof(*a)'?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning, inconclusive) Array 'a' is filled incompletely. Did you forget to multiply the size given to 'memset()' with 'sizeof(*a)'?\n", errout_str()); check("class Foo {int a; int b;};\n" "void f() {\n" " Foo a[5];\n" " memset(a, 'a', 5);\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (warning, inconclusive) Array 'a' is filled incompletely. Did you forget to multiply the size given to 'memset()' with 'sizeof(*a)'?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (warning, inconclusive) Array 'a' is filled incompletely. Did you forget to multiply the size given to 'memset()' with 'sizeof(*a)'?\n", errout_str()); check("void f() {\n" " Foo a[5];\n" // Size of foo is unknown " memset(a, 'a', 5);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " char a[5];\n" " memset(a, 'a', 5);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " int a[5];\n" " memset(a+15, 'a', 5);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " bool a[5];\n" " memset(a, false, 5);\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (portability, inconclusive) Array 'a' might be filled incompletely. Did you forget to multiply the size given to 'memset()' with 'sizeof(*a)'?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (portability, inconclusive) Array 'a' might be filled incompletely. Did you forget to multiply the size given to 'memset()' with 'sizeof(*a)'?\n", errout_str()); } void redundantVarAssignment() { @@ -9033,7 +9021,7 @@ class TestOther : public TestFixture { "}"); ASSERT_EQUALS("test.cpp:3:style:Variable 'i' is reassigned a value before the old one has been used.\n" "test.cpp:2:note:i is assigned\n" - "test.cpp:3:note:i is overwritten\n", errout.str()); + "test.cpp:3:note:i is overwritten\n", errout_str()); // non-local variable => only show warning when inconclusive is used check("int i;\n" @@ -9043,7 +9031,7 @@ class TestOther : public TestFixture { "}"); ASSERT_EQUALS("test.cpp:4:style:Variable 'i' is reassigned a value before the old one has been used.\n" "test.cpp:3:note:i is assigned\n" - "test.cpp:4:note:i is overwritten\n", errout.str()); + "test.cpp:4:note:i is overwritten\n", errout_str()); check("void f() {\n" " int i;\n" @@ -9052,14 +9040,14 @@ class TestOther : public TestFixture { "}"); ASSERT_EQUALS("test.cpp:4:style:Variable 'i' is reassigned a value before the old one has been used.\n" "test.cpp:3:note:i is assigned\n" - "test.cpp:4:note:i is overwritten\n", errout.str()); + "test.cpp:4:note:i is overwritten\n", errout_str()); check("void f() {\n" " static int i;\n" " i = 1;\n" " i = 1;\n" "}"); - TODO_ASSERT_EQUALS("error", "", errout.str()); + TODO_ASSERT_EQUALS("error", "", errout_str()); check("void f() {\n" " int i[10];\n" @@ -9068,7 +9056,7 @@ class TestOther : public TestFixture { "}"); ASSERT_EQUALS("test.cpp:4:style:Variable 'i[2]' is reassigned a value before the old one has been used.\n" "test.cpp:3:note:i[2] is assigned\n" - "test.cpp:4:note:i[2] is overwritten\n", errout.str()); + "test.cpp:4:note:i[2] is overwritten\n", errout_str()); check("void f(int x) {\n" " int i[10];\n" @@ -9076,7 +9064,7 @@ class TestOther : public TestFixture { " x=1;\n" " i[x] = 1;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(const int x) {\n" " int i[10];\n" @@ -9085,21 +9073,21 @@ class TestOther : public TestFixture { "}"); ASSERT_EQUALS("test.cpp:4:style:Variable 'i[x]' is reassigned a value before the old one has been used.\n" "test.cpp:3:note:i[x] is assigned\n" - "test.cpp:4:note:i[x] is overwritten\n", errout.str()); + "test.cpp:4:note:i[x] is overwritten\n", errout_str()); // Testing different types check("void f() {\n" " Foo& bar = foo();\n" " bar = x;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " Foo& bar = foo();\n" " bar = x;\n" " bar = y;\n" "}"); - TODO_ASSERT_EQUALS("error", "", errout.str()); + TODO_ASSERT_EQUALS("error", "", errout_str()); check("void f() {\n" " Foo& bar = foo();\n" // #4425. bar might refer to something global, etc. @@ -9107,7 +9095,7 @@ class TestOther : public TestFixture { " foo();\n" " bar = y();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Tests with function call between assignment check("void f(int i) {\n" @@ -9117,7 +9105,7 @@ class TestOther : public TestFixture { "}"); ASSERT_EQUALS("test.cpp:4:style:Variable 'i' is reassigned a value before the old one has been used.\n" "test.cpp:2:note:i is assigned\n" - "test.cpp:4:note:i is overwritten\n", errout.str()); + "test.cpp:4:note:i is overwritten\n", errout_str()); check("int i;\n" "void f() {\n" @@ -9125,7 +9113,7 @@ class TestOther : public TestFixture { " bar();\n" // Global variable might be accessed in bar() " i = 1;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " static int i;\n" @@ -9133,7 +9121,7 @@ class TestOther : public TestFixture { " bar();\n" // bar() might call f() recursively. This could be a false positive in more complex examples (when value of i is used somewhere. See #4229) " i = 2;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " int i;\n" @@ -9143,7 +9131,7 @@ class TestOther : public TestFixture { "}"); ASSERT_EQUALS("test.cpp:5:style:Variable 'i' is reassigned a value before the old one has been used.\n" "test.cpp:3:note:i is assigned\n" - "test.cpp:5:note:i is overwritten\n", errout.str()); + "test.cpp:5:note:i is overwritten\n", errout_str()); check("void bar(int i) {}\n" "void f(int i) {\n" @@ -9151,14 +9139,14 @@ class TestOther : public TestFixture { " bar(i);\n" // Passed as argument " i = 1;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " Foo bar = foo();\n" " bar();\n" // #5568. operator() called " bar = y();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Branch tests check("void f(int i) {\n" @@ -9166,7 +9154,7 @@ class TestOther : public TestFixture { " if(x)\n" " i = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int i) {\n" " if(x)\n" @@ -9176,7 +9164,7 @@ class TestOther : public TestFixture { "}"); ASSERT_EQUALS("test.cpp:5:style:Variable 'i' is reassigned a value before the old one has been used.\n" "test.cpp:4:note:i is assigned\n" - "test.cpp:5:note:i is overwritten\n", errout.str()); + "test.cpp:5:note:i is overwritten\n", errout_str()); // #4513 check("int x;\n" @@ -9187,7 +9175,7 @@ class TestOther : public TestFixture { " x = 2;\n" " x = g();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int g() {\n" " return x*x;\n" @@ -9198,14 +9186,14 @@ class TestOther : public TestFixture { "}"); ASSERT_EQUALS("test.cpp:6:style:Variable 'x' is reassigned a value before the old one has been used.\n" "test.cpp:5:note:x is assigned\n" - "test.cpp:6:note:x is overwritten\n", errout.str()); + "test.cpp:6:note:x is overwritten\n", errout_str()); check("void f() {\n" " Foo& bar = foo();\n" " bar = x;\n" " bar = y();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class C {\n" " int x;\n" @@ -9217,7 +9205,7 @@ class TestOther : public TestFixture { " x = 2;\n" " x = g();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class C {\n" " int x;\n" @@ -9229,7 +9217,7 @@ class TestOther : public TestFixture { " x = 2;\n" " x = z.g();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // ({ }) check("void f() {\n" @@ -9237,7 +9225,7 @@ class TestOther : public TestFixture { " x = 321;\n" " x = ({ asm(123); })\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // from #3103 (avoid a false negative) check("int foo(){\n" @@ -9248,7 +9236,7 @@ class TestOther : public TestFixture { "}"); ASSERT_EQUALS("test.cpp:4:style:Variable 'x' is reassigned a value before the old one has been used.\n" "test.cpp:3:note:x is assigned\n" - "test.cpp:4:note:x is overwritten\n", errout.str()); + "test.cpp:4:note:x is overwritten\n", errout_str()); // from #3103 (avoid a false positive) check("int foo(){\n" @@ -9258,14 +9246,14 @@ class TestOther : public TestFixture { " x = 2;\n" " return x + 1;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // initialization, assignment with 0 check("void f() {\n" // Ticket #4356 " int x = 0;\n" // <- ignore initialization with 0 " x = 3;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " state_t *x = NULL;\n" @@ -9273,7 +9261,7 @@ class TestOther : public TestFixture { "}"); ASSERT_EQUALS( "test.cpp:2:style:Variable 'x' can be declared as pointer to const\n", - errout.str()); + errout_str()); check("void f() {\n" " state_t *x;\n" @@ -9282,7 +9270,7 @@ class TestOther : public TestFixture { "}"); ASSERT_EQUALS( "test.cpp:2:style:Variable 'x' can be declared as pointer to const\n", - errout.str()); + errout_str()); check("int foo() {\n" // #4420 " int x;\n" @@ -9290,7 +9278,7 @@ class TestOther : public TestFixture { " x = 5;\n" " return bar(x);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // struct member.. check("struct AB { int a; int b; };\n" @@ -9303,7 +9291,7 @@ class TestOther : public TestFixture { "}"); ASSERT_EQUALS("test.cpp:6:style:Variable 'ab.a' is reassigned a value before the old one has been used.\n" "test.cpp:5:note:ab.a is assigned\n" - "test.cpp:6:note:ab.a is overwritten\n", errout.str()); + "test.cpp:6:note:ab.a is overwritten\n", errout_str()); check("struct AB { int a; int b; };\n" "\n" @@ -9313,7 +9301,7 @@ class TestOther : public TestFixture { " ab = do_something();\n" " return ab.a;\n" "}"); - TODO_ASSERT_EQUALS("error", "", errout.str()); + TODO_ASSERT_EQUALS("error", "", errout_str()); check("struct AB { int a; int b; };\n" "\n" @@ -9324,7 +9312,7 @@ class TestOther : public TestFixture { " ab.a = 2;\n" " return ab.a;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct AB { int a; int b; };\n" "\n" @@ -9335,7 +9323,7 @@ class TestOther : public TestFixture { " ab.a = 2;\n" " return ab.a;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct AB { int a; int b; };\n" "\n" @@ -9346,7 +9334,7 @@ class TestOther : public TestFixture { " ab->a = 1;\n" " ab->b = 2;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct AB { int a; int b; };\n" "\n" @@ -9357,20 +9345,20 @@ class TestOther : public TestFixture { " ab->a = 1;\n" " ab->b = 2;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(struct AB *ab) {\n" // # " ab->data->x = 1;\n" " ab = &ab1;\n" " ab->data->x = 2;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #5964 check("void func(char *buffer, const char *format, int precision, unsigned value) {\n" " (precision < 0) ? sprintf(buffer, format, value) : sprintf(buffer, format, precision, value);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // don't crash check("struct data {\n" @@ -9390,7 +9378,7 @@ class TestOther : public TestFixture { " asm(\"foo\");\n" " i = 1;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #6555 check("void foo() {\n" @@ -9403,7 +9391,7 @@ class TestOther : public TestFixture { " barney(p);\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() {\n" " char *p = 0;\n" @@ -9417,7 +9405,7 @@ class TestOther : public TestFixture { "}"); ASSERT_EQUALS("test.cpp:2:style:The scope of the variable 'p' can be reduced.\n" "test.cpp:2:style:Variable 'p' can be declared as pointer to const\n", - errout.str()); + errout_str()); check("void foo() {\n" " char *p = 0;\n" @@ -9431,7 +9419,7 @@ class TestOther : public TestFixture { " barney(p);\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Member variable pointers check("void podMemPtrs() {\n" @@ -9443,7 +9431,7 @@ class TestOther : public TestFixture { "}"); ASSERT_EQUALS("test.cpp:4:style:Variable 'memptr' is reassigned a value before the old one has been used.\n" "test.cpp:3:note:memptr is assigned\n" - "test.cpp:4:note:memptr is overwritten\n", errout.str()); + "test.cpp:4:note:memptr is overwritten\n", errout_str()); // Pointer function argument (#3857) check("void f(float * var)\n" @@ -9453,7 +9441,7 @@ class TestOther : public TestFixture { "}"); ASSERT_EQUALS("test.cpp:4:style:Variable 'var[0]' is reassigned a value before the old one has been used.\n" "test.cpp:3:note:var[0] is assigned\n" - "test.cpp:4:note:var[0] is overwritten\n", errout.str()); + "test.cpp:4:note:var[0] is overwritten\n", errout_str()); check("void f(float * var)\n" "{\n" @@ -9462,7 +9450,7 @@ class TestOther : public TestFixture { "}"); ASSERT_EQUALS("test.cpp:4:style:Variable '*var' is reassigned a value before the old one has been used.\n" "test.cpp:3:note:*var is assigned\n" - "test.cpp:4:note:*var is overwritten\n", errout.str()); + "test.cpp:4:note:*var is overwritten\n", errout_str()); // Volatile variables check("void f() {\n" @@ -9470,7 +9458,7 @@ class TestOther : public TestFixture { " *reg = 12;\n" " *reg = 34;\n" "}"); - ASSERT_EQUALS("test.cpp:2:style:C-style pointer casting\n", errout.str()); + ASSERT_EQUALS("test.cpp:2:style:C-style pointer casting\n", errout_str()); check("void f(std::map& m, int key, int value) {\n" // #6379 " m[key] = value;\n" @@ -9479,7 +9467,7 @@ class TestOther : public TestFixture { ASSERT_EQUALS("test.cpp:3:style:Variable 'm[key]' is reassigned a value before the old one has been used.\n" "test.cpp:2:note:m[key] is assigned\n" "test.cpp:3:note:m[key] is overwritten\n", - errout.str()); + errout_str()); } void redundantVarAssignment_trivial() { @@ -9487,21 +9475,21 @@ class TestOther : public TestFixture { " int a = 0;\n" " a = 4;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " int a;\n" " a = 0;\n" " a = 4;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " unsigned a;\n" " a = 0u;\n" " a = 2u;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " void* a;\n" @@ -9510,7 +9498,7 @@ class TestOther : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:2]: (style) Variable 'a' can be declared as pointer to const\n", - errout.str()); + errout_str()); check("void f() {\n" " void* a;\n" @@ -9519,7 +9507,7 @@ class TestOther : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:2]: (style) Variable 'a' can be declared as pointer to const\n", - errout.str()); + errout_str()); } void redundantVarAssignment_struct() { @@ -9532,7 +9520,7 @@ class TestOther : public TestFixture { " x.a = _mm_set1_ps(1.0);\n" " x.a = _mm_set1_ps(2.0);\n" "}"); - ASSERT_EQUALS("[test.cpp:7] -> [test.cpp:8]: (style) Variable 'x.a' is reassigned a value before the old one has been used.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7] -> [test.cpp:8]: (style) Variable 'x.a' is reassigned a value before the old one has been used.\n", errout_str()); check("void f() {\n" " struct AB ab;\n" @@ -9540,13 +9528,13 @@ class TestOther : public TestFixture { " ab.y = 41;\n" " ab.x = 1;\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:5]: (style) Variable 'ab.x' is reassigned a value before the old one has been used.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:5]: (style) Variable 'ab.x' is reassigned a value before the old one has been used.\n", errout_str()); check("void f() {\n" " struct AB ab = {0};\n" " ab = foo();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void redundantVarAssignment_7133() { @@ -9569,7 +9557,7 @@ class TestOther : public TestFixture { " catch (const uno::Exception&) {\n" " }\n" "}", "test.cpp", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void ConvertBitmapData(sal_uInt16 nDestBits) {\n" " BitmapBuffer aSrcBuf;\n" @@ -9578,7 +9566,7 @@ class TestOther : public TestFixture { " aSrcBuf.mnBitCount = nDestBits;\n" " bConverted = ::ImplFastBitmapConversion( aDstBuf, aSrcBuf, aTwoRects );\n" "}", "test.c"); - ASSERT_EQUALS("[test.c:3] -> [test.c:5]: (style) Variable 'aSrcBuf.mnBitCount' is reassigned a value before the old one has been used.\n", errout.str()); + ASSERT_EQUALS("[test.c:3] -> [test.c:5]: (style) Variable 'aSrcBuf.mnBitCount' is reassigned a value before the old one has been used.\n", errout_str()); check("void ConvertBitmapData(sal_uInt16 nDestBits) {\n" " BitmapBuffer aSrcBuf;\n" " aSrcBuf.mnBitCount = nSrcBits;\n" @@ -9587,7 +9575,7 @@ class TestOther : public TestFixture { " bConverted = ::ImplFastBitmapConversion( aDstBuf, aSrcBuf, aTwoRects );\n" "}"); ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:5]: (style) Variable 'aSrcBuf.mnBitCount' is reassigned a value before the old one has been used.\n", - errout.str()); + errout_str()); check("class C { void operator=(int x); };\n" // #8368 - assignment operator might have side effects => inconclusive "void f() {\n" @@ -9595,7 +9583,7 @@ class TestOther : public TestFixture { " c = x;\n" " c = x;\n" "}"); - ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:5]: (style, inconclusive) Variable 'c' is reassigned a value before the old one has been used if variable is no semaphore variable.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:5]: (style, inconclusive) Variable 'c' is reassigned a value before the old one has been used if variable is no semaphore variable.\n", errout_str()); } void redundantVarAssignment_stackoverflow() { @@ -9609,7 +9597,7 @@ class TestOther : public TestFixture { " m->next->prev = m->prev;\n" " return m->next;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void redundantVarAssignment_lambda() { @@ -9623,7 +9611,7 @@ class TestOther : public TestFixture { " f();\n" " return y;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #10228 check("std::tuple g();\n" @@ -9632,7 +9620,7 @@ class TestOther : public TestFixture { " auto [a, b] = g();\n" " auto l = [a = a]() { h(i); };\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void redundantVarAssignment_loop() { @@ -9643,7 +9631,7 @@ class TestOther : public TestFixture { " buf[i] = 131;\n" " buf[i] = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void bar() {\n" // #9262 do-while with break " int x = 0;\n" @@ -9653,20 +9641,20 @@ class TestOther : public TestFixture { " x = 1;\n" " } while (false);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(int num) {\n" // #9420 FP " int a = num;\n" " for (int b = 0; b < num; a = b++)\n" " dostuff(a);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(int num) {\n" // #9420 FN " int a = num;\n" " for (int b = 0; b < num; a = b++);\n" "}"); - TODO_ASSERT_EQUALS("error", "", errout.str()); + TODO_ASSERT_EQUALS("error", "", errout_str()); } void redundantVarAssignment_after_switch() { @@ -9679,7 +9667,7 @@ class TestOther : public TestFixture { " }\n" " ret = 3;\n" "}"); - ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:8]: (style) Variable 'ret' is reassigned a value before the old one has been used.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:8]: (style) Variable 'ret' is reassigned a value before the old one has been used.\n", errout_str()); } void redundantVarAssignment_pointer() { @@ -9689,7 +9677,7 @@ class TestOther : public TestFixture { " foo(ptr);\n" " *x = 32;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #8997 check("void f() {\n" @@ -9699,7 +9687,7 @@ class TestOther : public TestFixture { " p += 1;\n" " *p = 1;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void redundantVarAssignment_pointer_parameter() { @@ -9708,7 +9696,7 @@ class TestOther : public TestFixture { " if (condition) return;\n" " *p = 2;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void redundantVarAssignment_array() { @@ -9720,7 +9708,7 @@ class TestOther : public TestFixture { " arr[i] = 3;\n" " dostuff(arr);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void redundantVarAssignment_switch_break() { @@ -9736,7 +9724,7 @@ class TestOther : public TestFixture { " }" " return ret;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int a, int b) {\n" " int ret = 0;\n" @@ -9748,7 +9736,7 @@ class TestOther : public TestFixture { " break;\n" " }" "}"); - ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:7]: (style) Variable 'ret' is reassigned a value before the old one has been used.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:7]: (style) Variable 'ret' is reassigned a value before the old one has been used.\n", errout_str()); } void redundantInitialization() { @@ -9761,7 +9749,7 @@ class TestOther : public TestFixture { ASSERT_EQUALS("test.cpp:3:style:Redundant initialization for 'err'. The initialized value is overwritten before it is read.\n" "test.cpp:2:note:err is initialized\n" "test.cpp:3:note:err is overwritten\n", - errout.str()); + errout_str()); check("void f() {\n" " struct S s = {1,2,3};\n" @@ -9770,7 +9758,7 @@ class TestOther : public TestFixture { ASSERT_EQUALS("test.cpp:3:style:Redundant initialization for 's'. The initialized value is overwritten before it is read.\n" "test.cpp:2:note:s is initialized\n" "test.cpp:3:note:s is overwritten\n", - errout.str()); + errout_str()); check("void f() {\n" " int *p = NULL;\n" @@ -9778,35 +9766,35 @@ class TestOther : public TestFixture { "}"); ASSERT_EQUALS( "test.cpp:2:style:Variable 'p' can be declared as pointer to const\n", - errout.str()); + errout_str()); // "trivial" initialization => do not warn check("void f() {\n" " struct S s = {0};\n" " s = dostuff();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("namespace N { enum E {e0,e1}; }\n" "void f() {\n" " N::E e = N::e0;\n" // #9261 " e = dostuff();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" // #10143 " std::shared_ptr i = g();\n" " h();\n" " i = nullptr;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f(const std::vector& v) {\n" // #9815 " int i = g();\n" " i = std::distance(v.begin(), std::find_if(v.begin(), v.end(), [=](int j) { return i == j; }));\n" " return i;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void redundantMemWrite() { @@ -9819,21 +9807,21 @@ class TestOther : public TestFixture { " memcpy(a, foo, bar);\n" " memset(a, 0, bar);\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (performance) Buffer 'a' is being written before its old content has been used.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (performance) Buffer 'a' is being written before its old content has been used.\n", errout_str()); check("void f() {\n" " char a[10];\n" " strcpy(a, foo);\n" " strncpy(a, 0, bar);\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (performance) Buffer 'a' is being written before its old content has been used.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (performance) Buffer 'a' is being written before its old content has been used.\n", errout_str()); check("void f() {\n" " char a[10];\n" " sprintf(a, \"foo\");\n" " memmove(a, 0, bar);\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (performance) Buffer 'a' is being written before its old content has been used.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (performance) Buffer 'a' is being written before its old content has been used.\n", errout_str()); check("void f(char *filename) {\n" " char *p = strrchr(filename,'.');\n" @@ -9841,14 +9829,14 @@ class TestOther : public TestFixture { " dostuff(filename);\n" " strcpy(p, \"foo\");\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Writing to different parts of a buffer check("void f(void* a) {\n" " memcpy(a, foo, bar);\n" " memset(a+5, 0, bar);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Use variable as second argument check("void f(void* a, void* b) {\n" @@ -9856,7 +9844,7 @@ class TestOther : public TestFixture { " memcpy(b, a, 5);\n" " memset(a, 1, 5);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // strcat is special check("void f() {\n" @@ -9865,7 +9853,7 @@ class TestOther : public TestFixture { " strcat(a, bar);\n" // Not redundant " strcpy(a, x);\n" // Redundant "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:5]: (performance) Buffer 'a' is being written before its old content has been used.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:5]: (performance) Buffer 'a' is being written before its old content has been used.\n", errout_str()); // Tests with function call between copy check("void f() {\n" @@ -9874,7 +9862,7 @@ class TestOther : public TestFixture { " bar();\n" " memset(a, 0, size);\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:5]: (performance) Buffer 'a' is being written before its old content has been used.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:5]: (performance) Buffer 'a' is being written before its old content has been used.\n", errout_str()); check("void* a;\n" "void f() {\n" @@ -9882,7 +9870,7 @@ class TestOther : public TestFixture { " bar();\n" // Global variable might be accessed in bar() " memset(a, 0, size);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " char a[10];\n" @@ -9890,7 +9878,7 @@ class TestOther : public TestFixture { " bar();\n" " memset(a, 0, size);\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:5]: (performance) Buffer 'a' is being written before its old content has been used.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:5]: (performance) Buffer 'a' is being written before its old content has been used.\n", "", errout_str()); check("void bar(void* a) {}\n" "void f(void* a) {\n" @@ -9898,7 +9886,7 @@ class TestOther : public TestFixture { " bar(a);\n" // Passed as argument " memset(a, 0, size);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Branch tests check("void f(void* a) {\n" @@ -9906,7 +9894,7 @@ class TestOther : public TestFixture { " if(x)\n" " memset(a, 0, size);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #4455 - initialization of local buffer check("void f(void) {" @@ -9914,14 +9902,14 @@ class TestOther : public TestFixture { " memset(buf, 0, 10);\n" " strcpy(buf, string);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(void) {\n" " char buf[10] = {0};\n" " memset(buf, 0, 10);\n" " strcpy(buf, string);\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (performance) Buffer 'buf' is being written before its old content has been used.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (performance) Buffer 'buf' is being written before its old content has been used.\n", errout_str()); // #5689 - use return value of strcpy check("int f(void* a) {\n" @@ -9929,7 +9917,7 @@ class TestOther : public TestFixture { " strncpy(a, 0, bar);\n" " return i;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #7175 - read+write check("void f() {\n" @@ -9938,7 +9926,7 @@ class TestOther : public TestFixture { " strcpy(buf, dostuff(buf));\n" // <- read + write " strcpy(buf, x);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " char buf[100];\n" @@ -9946,17 +9934,17 @@ class TestOther : public TestFixture { " strcpy(buf, dostuff(buf));\n" " strcpy(buf, x);\n" "}"); - TODO_ASSERT_EQUALS("error", "", errout.str()); + TODO_ASSERT_EQUALS("error", "", errout_str()); } void varFuncNullUB() { // #4482 check("void a(...);\n" "void b() { a(NULL); }"); - ASSERT_EQUALS("[test.cpp:2]: (portability) Passing NULL after the last typed argument to a variadic function leads to undefined behaviour.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (portability) Passing NULL after the last typed argument to a variadic function leads to undefined behaviour.\n", errout_str()); check("void a(char *p, ...);\n" "void b() { a(NULL, 2); }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void checkCastIntToCharAndBack() { // #160 @@ -9970,7 +9958,7 @@ class TestOther : public TestFixture { " c = getchar();\n" " } ;\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Storing getchar() return value in char variable and then comparing with EOF.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Storing getchar() return value in char variable and then comparing with EOF.\n", errout_str()); check("void f() {\n" "unsigned char c = getchar();\n" @@ -9979,7 +9967,7 @@ class TestOther : public TestFixture { " bar(c);\n" " } ;\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Storing getchar() return value in char variable and then comparing with EOF.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Storing getchar() return value in char variable and then comparing with EOF.\n", errout_str()); check("void f() {\n" " unsigned char c; c = getchar();\n" @@ -9989,7 +9977,7 @@ class TestOther : public TestFixture { " c = getchar();\n" " } ;\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Storing getchar() return value in char variable and then comparing with EOF.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Storing getchar() return value in char variable and then comparing with EOF.\n", errout_str()); check("void f() {\n" " unsigned char c;\n" @@ -9997,7 +9985,7 @@ class TestOther : public TestFixture { " {\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Storing getchar() return value in char variable and then comparing with EOF.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Storing getchar() return value in char variable and then comparing with EOF.\n", errout_str()); check("void f() {\n" " int i; i = getchar();\n" @@ -10007,7 +9995,7 @@ class TestOther : public TestFixture { " i = getchar();\n" " } ;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " int i; i = getchar();\n" @@ -10017,7 +10005,7 @@ class TestOther : public TestFixture { " i = getchar();\n" " } ;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // check getc @@ -10027,7 +10015,7 @@ class TestOther : public TestFixture { " c = getc (pFile);\n" "} while (c != EOF)" "}"); - ASSERT_EQUALS("[test.cpp:5]: (warning) Storing getc() return value in char variable and then comparing with EOF.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (warning) Storing getc() return value in char variable and then comparing with EOF.\n", errout_str()); check("void f (FILE * pFile){\n" "unsigned char c;\n" @@ -10035,7 +10023,7 @@ class TestOther : public TestFixture { " c = getc (pFile);\n" "} while (EOF != c)" "}"); - ASSERT_EQUALS("[test.cpp:5]: (warning) Storing getc() return value in char variable and then comparing with EOF.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (warning) Storing getc() return value in char variable and then comparing with EOF.\n", errout_str()); check("void f (FILE * pFile){\n" "int i;\n" @@ -10043,7 +10031,7 @@ class TestOther : public TestFixture { " i = getc (pFile);\n" "} while (i != EOF)" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f (FILE * pFile){\n" "int i;\n" @@ -10051,7 +10039,7 @@ class TestOther : public TestFixture { " i = getc (pFile);\n" "} while (EOF != i)" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // check fgetc @@ -10061,7 +10049,7 @@ class TestOther : public TestFixture { " c = fgetc (pFile);\n" "} while (c != EOF)" "}"); - ASSERT_EQUALS("[test.cpp:5]: (warning) Storing fgetc() return value in char variable and then comparing with EOF.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (warning) Storing fgetc() return value in char variable and then comparing with EOF.\n", errout_str()); check("void f (FILE * pFile){\n" "char c;\n" @@ -10069,7 +10057,7 @@ class TestOther : public TestFixture { " c = fgetc (pFile);\n" "} while (EOF != c)" "}"); - ASSERT_EQUALS("[test.cpp:5]: (warning) Storing fgetc() return value in char variable and then comparing with EOF.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (warning) Storing fgetc() return value in char variable and then comparing with EOF.\n", errout_str()); check("void f (FILE * pFile){\n" "signed char c;\n" @@ -10077,7 +10065,7 @@ class TestOther : public TestFixture { " c = fgetc (pFile);\n" "} while (EOF != c)" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f (FILE * pFile){\n" "int i;\n" @@ -10085,7 +10073,7 @@ class TestOther : public TestFixture { " i = fgetc (pFile);\n" "} while (i != EOF)" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f (FILE * pFile){\n" "int i;\n" @@ -10093,7 +10081,7 @@ class TestOther : public TestFixture { " i = fgetc (pFile);\n" "} while (EOF != i)" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // cin.get() check("void f(){\n" @@ -10103,7 +10091,7 @@ class TestOther : public TestFixture { " ch = std::cin.get();\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Storing cin.get() return value in char variable and then comparing with EOF.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Storing cin.get() return value in char variable and then comparing with EOF.\n", errout_str()); check("void f(){\n" " char ch; ch = std::cin.get();\n" @@ -10112,7 +10100,7 @@ class TestOther : public TestFixture { " ch = std::cin.get();\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Storing cin.get() return value in char variable and then comparing with EOF.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Storing cin.get() return value in char variable and then comparing with EOF.\n", errout_str()); check("void f(){\n" " int i; i = std::cin.get();\n" @@ -10121,7 +10109,7 @@ class TestOther : public TestFixture { " i = std::cin.get();\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(){\n" " int i; i = std::cin.get();\n" @@ -10130,7 +10118,7 @@ class TestOther : public TestFixture { " i = std::cin.get();\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void checkCommaSeparatedReturn() { @@ -10139,32 +10127,32 @@ class TestOther : public TestFixture { " return a++,\n" " do_something();\n" "}", nullptr, false, false); - TODO_ASSERT_EQUALS("[test.cpp:3]: (style) Comma is used in return statement. The comma can easily be misread as a ';'.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:3]: (style) Comma is used in return statement. The comma can easily be misread as a ';'.\n", "", errout_str()); check("int fun(int a) {\n" " if (a < 0)\n" " return a++, do_something();\n" "}", nullptr, false, false); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int fun(int a) {\n" " if (a < 0)\n" " return a+5,\n" " do_something();\n" "}", nullptr, false, false); - TODO_ASSERT_EQUALS("[test.cpp:3]: (style) Comma is used in return statement. The comma can easily be misread as a ';'.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:3]: (style) Comma is used in return statement. The comma can easily be misread as a ';'.\n", "", errout_str()); check("int fun(int a) {\n" " if (a < 0)\n" " return a+5, do_something();\n" "}", nullptr, false, false); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int fun(int a) {\n" " if (a < 0)\n" " return c::b;\n" "}", nullptr, false, false); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #4943 take care of C++11 initializer lists check("std::vector Bar() {\n" @@ -10175,7 +10163,7 @@ class TestOther : public TestFixture { " { \"3\" }\n" " };\n" "}", nullptr, false, false); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void checkPassByReference() { @@ -10191,7 +10179,7 @@ class TestOther : public TestFixture { " void Init(A _a) { a = std::move(_a); }\n" " A a;" "};", nullptr, false, true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A\n" "{\n" @@ -10204,7 +10192,7 @@ class TestOther : public TestFixture { " void Init(A _a) { a = std::move(_a); }\n" " A a;" "};", nullptr, false, true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A\n" "{\n" @@ -10218,7 +10206,7 @@ class TestOther : public TestFixture { " A a;" " A a2;" "};", nullptr, false, true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A\n" "{\n" @@ -10232,7 +10220,7 @@ class TestOther : public TestFixture { " A a;" " A a2;" "};", nullptr, false, true); - ASSERT_EQUALS("[test.cpp:8]: (performance) Function parameter 'a2' should be passed by const reference.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8]: (performance) Function parameter 'a2' should be passed by const reference.\n", errout_str()); check("struct A\n" "{\n" @@ -10246,11 +10234,11 @@ class TestOther : public TestFixture { " A a;" " A a2;" "};", nullptr, false, true); - ASSERT_EQUALS("[test.cpp:8]: (performance) Function parameter 'a2' should be passed by const reference.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8]: (performance) Function parameter 'a2' should be passed by const reference.\n", errout_str()); check("std::map m;\n" // #10817 "void f(const decltype(m)::const_iterator i) {}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int (*pf) (std::vector) = nullptr;\n" // #12118 "int f(std::vector v) {\n" @@ -10260,7 +10248,7 @@ class TestOther : public TestFixture { " pf = f;\n" "}\n"); ASSERT_EQUALS("[test.cpp:6] -> [test.cpp:2]: (performance) Function parameter 'v' should be passed by const reference. However it seems that 'f' is a callback function.\n", - errout.str()); + errout_str()); } void checkComparisonFunctionIsAlwaysTrueOrFalse() { @@ -10268,33 +10256,33 @@ class TestOther : public TestFixture { check("bool f(int x){\n" " return isless(x,x);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of two identical variables with isless(x,x) always evaluates to false.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of two identical variables with isless(x,x) always evaluates to false.\n", errout_str()); check("bool f(int x){\n" " return isgreater(x,x);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of two identical variables with isgreater(x,x) always evaluates to false.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of two identical variables with isgreater(x,x) always evaluates to false.\n", errout_str()); check("bool f(int x){\n" " return islessgreater(x,x);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of two identical variables with islessgreater(x,x) always evaluates to false.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of two identical variables with islessgreater(x,x) always evaluates to false.\n", errout_str()); check("bool f(int x){\n" " return islessequal(x,x);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of two identical variables with islessequal(x,x) always evaluates to true.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of two identical variables with islessequal(x,x) always evaluates to true.\n", errout_str()); check("bool f(int x){\n" " return isgreaterequal(x,x);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of two identical variables with isgreaterequal(x,x) always evaluates to true.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Comparison of two identical variables with isgreaterequal(x,x) always evaluates to true.\n", errout_str()); // no warning should be reported for check("bool f(int x, int y){\n" " return isgreaterequal(x,y) && islessequal(x,y) && islessgreater(x,y) && isgreater(x,y) && isless(x,y);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void integerOverflow() { // 5895 @@ -10302,19 +10290,19 @@ class TestOther : public TestFixture { check("void f(unsigned long long ull) {\n" " if (ull == 0x89504e470d0a1a0a || ull == 0x8a4d4e470d0a1a0a) ;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void redundantPointerOp() { check("int *f(int *x) {\n" " return &*x;\n" "}\n", nullptr, true); - ASSERT_EQUALS("[test.cpp:2]: (style) Redundant pointer operation on 'x' - it's already a pointer.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Redundant pointer operation on 'x' - it's already a pointer.\n", errout_str()); check("int *f(int *y) {\n" " return &(*y);\n" "}\n", nullptr, true); - ASSERT_EQUALS("[test.cpp:2]: (style) Redundant pointer operation on 'y' - it's already a pointer.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Redundant pointer operation on 'y' - it's already a pointer.\n", errout_str()); check("int f() {\n" // #10991 " int value = 4;\n" @@ -10324,80 +10312,80 @@ class TestOther : public TestFixture { "}\n", nullptr, true); ASSERT_EQUALS("[test.cpp:3]: (style) Redundant pointer operation on 'value' - it's already a variable.\n" "[test.cpp:4]: (style) Redundant pointer operation on 'value' - it's already a variable.\n", - errout.str()); + errout_str()); check("void f(int& a, int b) {\n" " *(&a) = b;\n" "}\n", nullptr, true); ASSERT_EQUALS("[test.cpp:2]: (style) Redundant pointer operation on 'a' - it's already a variable.\n", - errout.str()); + errout_str()); check("void f(int**& p) {}\n", nullptr, true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkP("#define RESTORE(ORIG, COPY) { *ORIG = *COPY; }\n" "void f(int* p, int i) {\n" " RESTORE(p, &i);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // no warning for bitwise AND check("void f(const int *b) {\n" " int x = 0x20 & *b;\n" "}\n", nullptr, true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // No message for double pointers to structs check("void f(struct foo **my_struct) {\n" " char **pass_to_func = &(*my_struct)->buf;\n" "}\n", nullptr, true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // another double pointer to struct - with an array check("void f(struct foo **my_struct) {\n" " char **pass_to_func = &(*my_struct)->buf[10];\n" "}\n", nullptr, true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // double pointer to array check("void f(char **ptr) {\n" " int *x = &(*ptr)[10];\n" "}\n", nullptr, true); - ASSERT_EQUALS("[test.cpp:2]: (style) Variable 'x' can be declared as pointer to const\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Variable 'x' can be declared as pointer to const\n", errout_str()); // function calls check("void f(Mutex *mut) {\n" " pthread_mutex_lock(&*mut);\n" "}\n", nullptr, false); - ASSERT_EQUALS("[test.cpp:2]: (style) Redundant pointer operation on 'mut' - it's already a pointer.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Redundant pointer operation on 'mut' - it's already a pointer.\n", errout_str()); // make sure we got the AST match for "(" right check("void f(char *ptr) {\n" " if (&*ptr == NULL)\n" " return;\n" "}\n", nullptr, true); - ASSERT_EQUALS("[test.cpp:2]: (style) Redundant pointer operation on 'ptr' - it's already a pointer.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Redundant pointer operation on 'ptr' - it's already a pointer.\n", errout_str()); // no warning for macros checkP("#define MUTEX_LOCK(m) pthread_mutex_lock(&(m))\n" "void f(struct mutex *mut) {\n" " MUTEX_LOCK(*mut);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkP("#define B(op) bar(op)\n" "#define C(orf) B(&orf)\n" "void foo(const int * pkey) {\n" " C(*pkey);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void test_isSameExpression() { // see #5738 check("bool isInUnoIncludeFile(StringRef name) {" " return name.startswith(SRCDIR \"/com/\") || name.startswith(SRCDIR \"/uno/\");\n" "};", "test.cpp", false); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void raceAfterInterlockedDecrement() { @@ -10406,7 +10394,7 @@ class TestOther : public TestFixture { " InterlockedDecrement(&counter);\n" " whatever();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkInterlockedDecrement("void f() {\n" " int counter = 0;\n" @@ -10415,7 +10403,7 @@ class TestOther : public TestFixture { " return;\n" " destroy();\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Race condition: non-interlocked access after InterlockedDecrement(). Use InterlockedDecrement() return value instead.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Race condition: non-interlocked access after InterlockedDecrement(). Use InterlockedDecrement() return value instead.\n", errout_str()); checkInterlockedDecrement("void f() {\n" " int counter = 0;\n" @@ -10423,7 +10411,7 @@ class TestOther : public TestFixture { " if (!counter)\n" " destroy();\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Race condition: non-interlocked access after InterlockedDecrement(). Use InterlockedDecrement() return value instead.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Race condition: non-interlocked access after InterlockedDecrement(). Use InterlockedDecrement() return value instead.\n", errout_str()); checkInterlockedDecrement("void f() {\n" " int counter = 0;\n" @@ -10432,7 +10420,7 @@ class TestOther : public TestFixture { " return;\n" " destroy();\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Race condition: non-interlocked access after InterlockedDecrement(). Use InterlockedDecrement() return value instead.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Race condition: non-interlocked access after InterlockedDecrement(). Use InterlockedDecrement() return value instead.\n", errout_str()); checkInterlockedDecrement("void f() {\n" " int counter = 0;\n" @@ -10441,7 +10429,7 @@ class TestOther : public TestFixture { " return;\n" " destroy();\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Race condition: non-interlocked access after InterlockedDecrement(). Use InterlockedDecrement() return value instead.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Race condition: non-interlocked access after InterlockedDecrement(). Use InterlockedDecrement() return value instead.\n", errout_str()); checkInterlockedDecrement("void f() {\n" " int counter = 0;\n" @@ -10449,7 +10437,7 @@ class TestOther : public TestFixture { " if (counter == 0)\n" " destroy();\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Race condition: non-interlocked access after InterlockedDecrement(). Use InterlockedDecrement() return value instead.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Race condition: non-interlocked access after InterlockedDecrement(). Use InterlockedDecrement() return value instead.\n", errout_str()); checkInterlockedDecrement("void f() {\n" " int counter = 0;\n" @@ -10457,7 +10445,7 @@ class TestOther : public TestFixture { " if (0 == counter)\n" " destroy();\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Race condition: non-interlocked access after InterlockedDecrement(). Use InterlockedDecrement() return value instead.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Race condition: non-interlocked access after InterlockedDecrement(). Use InterlockedDecrement() return value instead.\n", errout_str()); checkInterlockedDecrement("void f() {\n" " int counter = 0;\n" @@ -10466,7 +10454,7 @@ class TestOther : public TestFixture { " return;\n" " destroy()\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Race condition: non-interlocked access after InterlockedDecrement(). Use InterlockedDecrement() return value instead.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Race condition: non-interlocked access after InterlockedDecrement(). Use InterlockedDecrement() return value instead.\n", errout_str()); checkInterlockedDecrement("void f() {\n" " int counter = 0;\n" @@ -10475,7 +10463,7 @@ class TestOther : public TestFixture { " return;\n" " destroy()\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Race condition: non-interlocked access after InterlockedDecrement(). Use InterlockedDecrement() return value instead.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Race condition: non-interlocked access after InterlockedDecrement(). Use InterlockedDecrement() return value instead.\n", errout_str()); checkInterlockedDecrement("void f() {\n" " int counter = 0;\n" @@ -10483,7 +10471,7 @@ class TestOther : public TestFixture { " if (counter <= 0)\n" " destroy();\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Race condition: non-interlocked access after InterlockedDecrement(). Use InterlockedDecrement() return value instead.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Race condition: non-interlocked access after InterlockedDecrement(). Use InterlockedDecrement() return value instead.\n", errout_str()); checkInterlockedDecrement("void f() {\n" " int counter = 0;\n" @@ -10491,7 +10479,7 @@ class TestOther : public TestFixture { " if (0 >= counter)\n" " destroy();\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Race condition: non-interlocked access after InterlockedDecrement(). Use InterlockedDecrement() return value instead.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Race condition: non-interlocked access after InterlockedDecrement(). Use InterlockedDecrement() return value instead.\n", errout_str()); checkInterlockedDecrement("void f() {\n" " int counter = 0;\n" @@ -10500,7 +10488,7 @@ class TestOther : public TestFixture { " return;\n" " destroy();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkInterlockedDecrement("void f() {\n" " int counter = 0;\n" @@ -10508,7 +10496,7 @@ class TestOther : public TestFixture { " if (!newCount)\n" " destroy();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkInterlockedDecrement("void f() {\n" " int counter = 0;\n" @@ -10517,7 +10505,7 @@ class TestOther : public TestFixture { " return;\n" " destroy();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkInterlockedDecrement("void f() {\n" " int counter = 0;\n" @@ -10526,7 +10514,7 @@ class TestOther : public TestFixture { " return;\n" " destroy();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkInterlockedDecrement("void f() {\n" " int counter = 0;\n" @@ -10534,7 +10522,7 @@ class TestOther : public TestFixture { " if (newCount == 0)\n" " destroy();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkInterlockedDecrement("void f() {\n" " int counter = 0;\n" @@ -10542,7 +10530,7 @@ class TestOther : public TestFixture { " if (0 == newCount)\n" " destroy();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkInterlockedDecrement("void f() {\n" " int counter = 0;\n" @@ -10551,7 +10539,7 @@ class TestOther : public TestFixture { " return;\n" " destroy()\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkInterlockedDecrement("void f() {\n" " int counter = 0;\n" @@ -10560,7 +10548,7 @@ class TestOther : public TestFixture { " return;\n" " destroy()\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkInterlockedDecrement("void f() {\n" " int counter = 0;\n" @@ -10568,7 +10556,7 @@ class TestOther : public TestFixture { " if (newCount <= 0)\n" " destroy();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkInterlockedDecrement("void f() {\n" " int counter = 0;\n" @@ -10576,7 +10564,7 @@ class TestOther : public TestFixture { " if (0 >= newCount)\n" " destroy;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkInterlockedDecrement("int f() {\n" " int counter = 0;\n" @@ -10587,7 +10575,7 @@ class TestOther : public TestFixture { " return counter;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:7]: (error) Race condition: non-interlocked access after InterlockedDecrement(). Use InterlockedDecrement() return value instead.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (error) Race condition: non-interlocked access after InterlockedDecrement(). Use InterlockedDecrement() return value instead.\n", errout_str()); checkInterlockedDecrement("int f() {\n" " int counter = 0;\n" @@ -10598,7 +10586,7 @@ class TestOther : public TestFixture { " return counter;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:7]: (error) Race condition: non-interlocked access after InterlockedDecrement(). Use InterlockedDecrement() return value instead.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (error) Race condition: non-interlocked access after InterlockedDecrement(). Use InterlockedDecrement() return value instead.\n", errout_str()); checkInterlockedDecrement("int f() {\n" @@ -10609,7 +10597,7 @@ class TestOther : public TestFixture { " }\n" " return counter;\n" "}"); - ASSERT_EQUALS("[test.cpp:7]: (error) Race condition: non-interlocked access after InterlockedDecrement(). Use InterlockedDecrement() return value instead.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (error) Race condition: non-interlocked access after InterlockedDecrement(). Use InterlockedDecrement() return value instead.\n", errout_str()); checkInterlockedDecrement("int f() {\n" " int counter = 0;\n" @@ -10619,7 +10607,7 @@ class TestOther : public TestFixture { " }\n" " return counter;\n" "}"); - ASSERT_EQUALS("[test.cpp:7]: (error) Race condition: non-interlocked access after InterlockedDecrement(). Use InterlockedDecrement() return value instead.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (error) Race condition: non-interlocked access after InterlockedDecrement(). Use InterlockedDecrement() return value instead.\n", errout_str()); checkInterlockedDecrement("int f() {\n" " int counter = 0;\n" @@ -10630,7 +10618,7 @@ class TestOther : public TestFixture { " return counter;\n" " \n" "}"); - ASSERT_EQUALS("[test.cpp:7]: (error) Race condition: non-interlocked access after InterlockedDecrement(). Use InterlockedDecrement() return value instead.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (error) Race condition: non-interlocked access after InterlockedDecrement(). Use InterlockedDecrement() return value instead.\n", errout_str()); checkInterlockedDecrement("int f() {\n" " int counter = 0;\n" @@ -10641,21 +10629,21 @@ class TestOther : public TestFixture { " return counter;\n" " \n" "}"); - ASSERT_EQUALS("[test.cpp:7]: (error) Race condition: non-interlocked access after InterlockedDecrement(). Use InterlockedDecrement() return value instead.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (error) Race condition: non-interlocked access after InterlockedDecrement(). Use InterlockedDecrement() return value instead.\n", errout_str()); } void testUnusedLabel() { check("void f() {\n" " label:\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Label 'label' is not used.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Label 'label' is not used.\n", errout_str()); check("void f() {\n" " label:\n" " foo();\n" " goto label;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " label:\n" @@ -10665,28 +10653,28 @@ class TestOther : public TestFixture { "void g() {\n" " label:\n" "}"); - ASSERT_EQUALS("[test.cpp:7]: (style) Label 'label' is not used.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (style) Label 'label' is not used.\n", errout_str()); check("void f() {\n" " switch(a) {\n" " default:\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " class X {\n" " protected:\n" " };\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " class X {\n" " my_protected:\n" " };\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int test(char art) {\n" " switch (art) {\n" @@ -10699,7 +10687,7 @@ class TestOther : public TestFixture { " }\n" "}"); ASSERT_EQUALS("[test.cpp:3]: (warning) Label 'caseZERO' is not used. Should this be a 'case' of the enclosing switch()?\n" - "[test.cpp:5]: (warning) Label 'case1' is not used. Should this be a 'case' of the enclosing switch()?\n", errout.str()); + "[test.cpp:5]: (warning) Label 'case1' is not used. Should this be a 'case' of the enclosing switch()?\n", errout_str()); check("int test(char art) {\n" " switch (art) {\n" @@ -10708,7 +10696,7 @@ class TestOther : public TestFixture { " }\n" " label:\n" "}"); - ASSERT_EQUALS("[test.cpp:6]: (style) Label 'label' is not used.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (style) Label 'label' is not used.\n", errout_str()); } void testEvaluationOrder() { @@ -10716,24 +10704,24 @@ class TestOther : public TestFixture { " int x = dostuff();\n" " return x + x++;\n" "}", "test.c"); - ASSERT_EQUALS("[test.c:3]: (error) Expression 'x+x++' depends on order of evaluation of side effects\n", errout.str()); + ASSERT_EQUALS("[test.c:3]: (error) Expression 'x+x++' depends on order of evaluation of side effects\n", errout_str()); // #7226 check("long int f1(const char *exp) {\n" " return strtol(++exp, (char **)&exp, 10);\n" "}", "test.c"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("long int f1(const char *exp) {\n" " return dostuff(++exp, exp, 10);\n" "}", "test.c"); - ASSERT_EQUALS("[test.c:2]: (error) Expression '++exp,exp' depends on order of evaluation of side effects\n", errout.str()); + ASSERT_EQUALS("[test.c:2]: (error) Expression '++exp,exp' depends on order of evaluation of side effects\n", errout_str()); check("void f() {\n" " int a;\n" " while (a=x(), a==123) {}\n" "}", "test.c"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // # 8717 check("void f(int argc, char *const argv[]) {\n" @@ -10741,19 +10729,19 @@ class TestOther : public TestFixture { " int local_argc = 0;\n" " local_argv[local_argc++] = argv[0];\n" "}\n", "test.c"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " int x = 0;\n" " return 0 + x++;\n" "}\n", "test.c"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x, int y) {\n" " int a[10];\n" " a[x+y] = a[y+x]++;;\n" "}\n", "test.c"); - ASSERT_EQUALS("[test.c:3]: (error) Expression 'a[x+y]=a[y+x]++' depends on order of evaluation of side effects\n", errout.str()); + ASSERT_EQUALS("[test.c:3]: (error) Expression 'a[x+y]=a[y+x]++' depends on order of evaluation of side effects\n", errout_str()); } void testEvaluationOrderSelfAssignment() { @@ -10764,7 +10752,7 @@ class TestOther : public TestFixture { ASSERT_EQUALS( "[test.c:2]: (style) Redundant assignment of 'x' to itself.\n" "[test.c:2]: (style) Redundant assignment of 'x' to itself.\n", // duplicate - errout.str()); + errout_str()); } void testEvaluationOrderMacro() { @@ -10773,7 +10761,7 @@ class TestOther : public TestFixture { "void f(int x) {\n" " return x + X++;\n" "}", "test.c"); - ASSERT_EQUALS("[test.c:3]: (error) Expression 'x+x++' depends on order of evaluation of side effects\n", errout.str()); + ASSERT_EQUALS("[test.c:3]: (error) Expression 'x+x++' depends on order of evaluation of side effects\n", errout_str()); } void testEvaluationOrderSequencePointsFunctionCall() { @@ -10781,13 +10769,13 @@ class TestOther : public TestFixture { check("void f(int id) {\n" " id = dostuff(id += 42);\n" "}", "test.c"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // FN check("void f(int id) {\n" " id = id + dostuff(id += 42);\n" "}", "test.c"); - TODO_ASSERT_EQUALS("error", "", errout.str()); + TODO_ASSERT_EQUALS("error", "", errout_str()); } void testEvaluationOrderSequencePointsComma() { @@ -10795,19 +10783,19 @@ class TestOther : public TestFixture { " int t;\n" " return (unsigned char)(t=1,t^c);\n" "}", "test.c"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(void) {\n" " int t;\n" " dostuff(t=1,t^c);\n" "}", "test.c"); - ASSERT_EQUALS("[test.c:3]: (error) Expression 't=1,t^c' depends on order of evaluation of side effects\n", errout.str()); + ASSERT_EQUALS("[test.c:3]: (error) Expression 't=1,t^c' depends on order of evaluation of side effects\n", errout_str()); check("void f(void) {\n" " int t;\n" " dostuff((t=1,t),2);\n" "}", "test.c"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #8230 check("void hprf(const char* fp) {\n" @@ -10815,28 +10803,28 @@ class TestOther : public TestFixture { " ;\n" " while (++fp, (*fp) <= 0177);\n" "}\n", "test.c"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void hprf(const char* fp) {\n" " do\n" " ;\n" " while (i++, ++fp, (*fp) <= 0177);\n" "}\n", "test.c"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(const char* fp) {\n" " do\n" " ;\n" " while (f(++fp, (*fp) <= 7));\n" "}\n", "test.c"); - ASSERT_EQUALS("[test.c:4]: (error) Expression '++fp,(*fp)<=7' depends on order of evaluation of side effects\n", errout.str()); + ASSERT_EQUALS("[test.c:4]: (error) Expression '++fp,(*fp)<=7' depends on order of evaluation of side effects\n", errout_str()); } void testEvaluationOrderSizeof() { check("void f(char *buf) {\n" " dostuff(buf++, sizeof(*buf));" "}", "test.c"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void testUnsignedLessThanZero() { @@ -10857,7 +10845,7 @@ class TestOther : public TestFixture { "}", "test.c"); ASSERT_EQUALS("[test.c:8]: (style) Checking if unsigned expression 'd.n' is less than zero.\n" "[test.c:12]: (style) Checking if unsigned expression 'd.n' is less than zero.\n", - errout.str()); + errout_str()); } void doubleMove1() { @@ -10867,7 +10855,7 @@ class TestOther : public TestFixture { " g(std::move(a));\n" " g(std::move(a));\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (warning) Access of moved variable 'a'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (warning) Access of moved variable 'a'.\n", errout_str()); } void doubleMoveMemberInitialization1() { @@ -10881,7 +10869,7 @@ class TestOther : public TestFixture { " B b1;\n" " B b2;\n" "};"); - ASSERT_EQUALS("[test.cpp:6]: (warning) Access of moved variable 'b'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (warning) Access of moved variable 'b'.\n", errout_str()); } void doubleMoveMemberInitialization2() { @@ -10894,7 +10882,7 @@ class TestOther : public TestFixture { " B b1;\n" " B b2;\n" "};"); - ASSERT_EQUALS("[test.cpp:5]: (warning) Access of moved variable 'b'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (warning) Access of moved variable 'b'.\n", errout_str()); } void doubleMoveMemberInitialization3() { // #9974 @@ -10905,7 +10893,7 @@ class TestOther : public TestFixture { " A a2 = { 2 };\n" " return { .a1 = std::move(a1), .a2 = std::move(a2) };\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void doubleMoveMemberInitialization4() { // #11440 @@ -10915,7 +10903,7 @@ class TestOther : public TestFixture { " int c;\n" " S d;\n" "};\n"); - ASSERT_EQUALS("[test.cpp:3]: (warning, inconclusive) Access of moved variable 'd'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning, inconclusive) Access of moved variable 'd'.\n", errout_str()); } void moveAndAssign1() { @@ -10925,7 +10913,7 @@ class TestOther : public TestFixture { " a = g(std::move(a));\n" " a = g(std::move(a));\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void moveAndAssign2() { @@ -10935,7 +10923,7 @@ class TestOther : public TestFixture { " B b = g(std::move(a));\n" " C c = g(std::move(a));\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (warning) Access of moved variable 'a'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (warning) Access of moved variable 'a'.\n", errout_str()); } void moveAssignMoveAssign() { @@ -10952,7 +10940,7 @@ class TestOther : public TestFixture { " h(a);\n" "}"); ASSERT_EQUALS("[test.cpp:4]: (warning) Access of moved variable 'a'.\n" - "[test.cpp:8]: (warning) Access of moved variable 'a'.\n", errout.str()); + "[test.cpp:8]: (warning) Access of moved variable 'a'.\n", errout_str()); } void moveAndReset1() { @@ -10962,7 +10950,7 @@ class TestOther : public TestFixture { " a.reset(g(std::move(a)));\n" " a.reset(g(std::move(a)));\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void moveAndReset2() { @@ -10974,7 +10962,7 @@ class TestOther : public TestFixture { " b.reset(g(std::move(a)));\n" " c.reset(g(std::move(a)));\n" "}"); - ASSERT_EQUALS("[test.cpp:7]: (warning) Access of moved variable 'a'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (warning) Access of moved variable 'a'.\n", errout_str()); } void moveResetMoveReset() { @@ -10991,7 +10979,7 @@ class TestOther : public TestFixture { " h(a);\n" "}"); ASSERT_EQUALS("[test.cpp:4]: (warning) Access of moved variable 'a'.\n" - "[test.cpp:8]: (warning) Access of moved variable 'a'.\n", errout.str()); + "[test.cpp:8]: (warning) Access of moved variable 'a'.\n", errout_str()); } void moveAndFunctionParameter() { @@ -11003,7 +10991,7 @@ class TestOther : public TestFixture { " A c = a;\n" "}"); ASSERT_EQUALS("[test.cpp:5]: (warning) Access of moved variable 'a'.\n" - "[test.cpp:6]: (warning) Access of moved variable 'a'.\n", errout.str()); + "[test.cpp:6]: (warning) Access of moved variable 'a'.\n", errout_str()); } void moveAndFunctionParameterReference() { @@ -11014,7 +11002,7 @@ class TestOther : public TestFixture { " g(a);\n" " A c = a;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void moveAndFunctionParameterConstReference() { @@ -11026,7 +11014,7 @@ class TestOther : public TestFixture { " A c = a;\n" "}"); ASSERT_EQUALS("[test.cpp:5]: (warning) Access of moved variable 'a'.\n" - "[test.cpp:6]: (warning) Access of moved variable 'a'.\n", errout.str()); + "[test.cpp:6]: (warning) Access of moved variable 'a'.\n", errout_str()); } void moveAndFunctionParameterUnknown() { @@ -11037,7 +11025,7 @@ class TestOther : public TestFixture { " A c = a;\n" "}"); ASSERT_EQUALS("[test.cpp:4]: (warning, inconclusive) Access of moved variable 'a'.\n" - "[test.cpp:5]: (warning, inconclusive) Access of moved variable 'a'.\n", errout.str()); + "[test.cpp:5]: (warning, inconclusive) Access of moved variable 'a'.\n", errout_str()); } void moveAndReturn() { @@ -11049,7 +11037,7 @@ class TestOther : public TestFixture { " return g(std::move(b));\n" " return h(std::move(a),std::move(b));\n" "}"); - ASSERT_EQUALS("[test.cpp:7]: (warning) Access of moved variable 'a'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (warning) Access of moved variable 'a'.\n", errout_str()); } void moveAndClear() { @@ -11059,7 +11047,7 @@ class TestOther : public TestFixture { " v.clear();\n" " if (v.empty()) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void movedPointer() { @@ -11070,7 +11058,7 @@ class TestOther : public TestFixture { " y = p->y;\n" "}"); ASSERT_EQUALS("[test.cpp:4]: (warning) Access of moved variable 'p'.\n" - "[test.cpp:5]: (warning) Access of moved variable 'p'.\n", errout.str()); + "[test.cpp:5]: (warning) Access of moved variable 'p'.\n", errout_str()); } void moveAndAddressOf() { @@ -11079,7 +11067,7 @@ class TestOther : public TestFixture { " std::string s2 = std::move(s1);\n" " p = &s1;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void partiallyMoved() { @@ -11088,7 +11076,7 @@ class TestOther : public TestFixture { " gx(std::move(a).x());\n" " gy(std::move(a).y());\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void moveAndLambda() { @@ -11097,7 +11085,7 @@ class TestOther : public TestFixture { " auto h = [a=std::move(a)](){return g(std::move(a));};" " b = a;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void moveInLoop() @@ -11108,7 +11096,7 @@ class TestOther : public TestFixture { " while(true)\n" " g(std::move(p));\n" "}\n"); - ASSERT_EQUALS("[test.cpp:5]: (warning) Access of moved variable 'p'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (warning) Access of moved variable 'p'.\n", errout_str()); check("std::list g(std::list&&);\n" "void f(std::listl) {\n" @@ -11118,7 +11106,7 @@ class TestOther : public TestFixture { "}\n"); ASSERT_EQUALS("[test.cpp:4]: (style) Variable 'j' can be declared as reference to const\n" "[test.cpp:4]: (warning) Access of moved variable 'l'.\n", - errout.str()); + errout_str()); } void moveCallback() @@ -11128,7 +11116,7 @@ class TestOther : public TestFixture { " if(!f(std::move(callback)))\n" " callback();\n" "}\n"); - ASSERT_EQUALS("[test.cpp:4]: (warning) Access of moved variable 'callback'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (warning) Access of moved variable 'callback'.\n", errout_str()); } void moveClassVariable() @@ -11143,7 +11131,7 @@ class TestOther : public TestFixture { " D(std::unique_ptr c) : m(std::move(c)) {}\n" " std::unique_ptr m;\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void forwardAndUsed() { @@ -11152,7 +11140,7 @@ class TestOther : public TestFixture { " g(std::forward(t));\n" " T s = t;\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (warning) Access of forwarded variable 't'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (warning) Access of forwarded variable 't'.\n", errout_str()); } void moveAndReference() { // #9791 @@ -11164,7 +11152,7 @@ class TestOther : public TestFixture { " g(std::move(s));\n" " h(r);\n" "}\n"); - ASSERT_EQUALS("[test.cpp:7]: (warning) Access of moved variable 'r'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (warning) Access of moved variable 'r'.\n", errout_str()); } void moveForRange() @@ -11176,7 +11164,7 @@ class TestOther : public TestFixture { " cif::category mCategory;\n" " cif::condition mWhere;\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void moveTernary() @@ -11187,7 +11175,7 @@ class TestOther : public TestFixture { " std::string s = \"abc\";\n" " b ? gA(std::move(s)) : gB(std::move(s));\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int gA(std::string);\n" "int gB(std::string);\n" @@ -11196,7 +11184,7 @@ class TestOther : public TestFixture { " std::string s = \"abc\";\n" " h(b ? gA(std::move(s)) : gB(std::move(s)));\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int gA(int, std::string);\n" "int gB(int, std::string);\n" @@ -11205,7 +11193,7 @@ class TestOther : public TestFixture { " std::string s = \"abc\";\n" " h(b ? h(gA(5, std::move(s))) : h(gB(7, std::move(s))));\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void funcArgNamesDifferent() { @@ -11231,7 +11219,7 @@ class TestOther : public TestFixture { "[test.cpp:7] -> [test.cpp:12]: (style, inconclusive) Function 'func2' argument 3 names different: declaration 'c' definition 'C'.\n" "[test.cpp:9] -> [test.cpp:14]: (style, inconclusive) Function 'func4' argument 1 names different: declaration 'a' definition 'A'.\n" "[test.cpp:9] -> [test.cpp:14]: (style, inconclusive) Function 'func4' argument 2 names different: declaration 'b' definition 'B'.\n" - "[test.cpp:9] -> [test.cpp:14]: (style, inconclusive) Function 'func4' argument 3 names different: declaration 'c' definition 'C'.\n", errout.str()); + "[test.cpp:9] -> [test.cpp:14]: (style, inconclusive) Function 'func4' argument 3 names different: declaration 'c' definition 'C'.\n", errout_str()); } void funcArgOrderDifferent() { @@ -11256,7 +11244,7 @@ class TestOther : public TestFixture { "[test.cpp:5] -> [test.cpp:6]: (warning) Function 'func3' argument order different: declaration ', b, c' definition 'c, b, a'\n" "[test.cpp:9] -> [test.cpp:14]: (warning) Function 'func2' argument order different: declaration 'a, b, c' definition 'c, b, a'\n" "[test.cpp:10] -> [test.cpp:15]: (warning) Function 'func3' argument order different: declaration 'a, b, c' definition 'c, b, a'\n" - "[test.cpp:11] -> [test.cpp:16]: (warning) Function 'func4' argument order different: declaration ', b, c' definition 'c, b, a'\n", errout.str()); + "[test.cpp:11] -> [test.cpp:16]: (warning) Function 'func4' argument order different: declaration ', b, c' definition 'c, b, a'\n", errout_str()); } // #7846 - Syntax error when using C++11 braced-initializer in default argument @@ -11266,46 +11254,46 @@ class TestOther : public TestFixture { "\n for (int i = 0; i < 10; i++) {}\n" "\n }" "\n ")); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void shadowVariables() { check("int x;\n" "void f() { int x; }"); - ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:2]: (style) Local variable \'x\' shadows outer variable\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:2]: (style) Local variable \'x\' shadows outer variable\n", errout_str()); check("int x();\n" "void f() { int x; }"); - ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:2]: (style) Local variable \'x\' shadows outer function\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:2]: (style) Local variable \'x\' shadows outer function\n", errout_str()); check("struct C {\n" " C(int x) : x(x) {}\n" // <- we do not want a FP here " int x;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " if (cond) {int x;}\n" // <- not a shadow variable " int x;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int size() {\n" " int size;\n" // <- not a shadow variable "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" // #8954 - lambda " int x;\n" " auto f = [](){ int x; }" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x) { int x; }"); - ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:1]: (style) Local variable 'x' shadows outer argument\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:1]: (style) Local variable 'x' shadows outer argument\n", errout_str()); check("class C { C(); void foo() { static int C = 0; } }"); // #9195 - shadow constructor - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct C {\n" // #10091 - shadow destructor " ~C();\n" @@ -11314,7 +11302,7 @@ class TestOther : public TestFixture { " }\n" "};\n" "C::~C() = default;"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // 10752 - no check("struct S {\n" @@ -11325,20 +11313,20 @@ class TestOther : public TestFixture { " return i;\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S {\n" " int i{};\n" " void f() { int i; }\n" "};\n"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) Local variable 'i' shadows outer variable\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (style) Local variable 'i' shadows outer variable\n", errout_str()); check("struct S {\n" " int i{};\n" " std::vector v;\n" " void f() const { for (const int& i : v) {} }\n" "};\n"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:4]: (style) Local variable 'i' shadows outer variable\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:4]: (style) Local variable 'i' shadows outer variable\n", errout_str()); check("struct S {\n" // #10405 " F* f{};\n" @@ -11348,7 +11336,7 @@ class TestOther : public TestFixture { "void S::f() const {\n" " for (const F& f : fl) {}\n" "};\n"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:7]: (style) Local variable 'f' shadows outer variable\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:7]: (style) Local variable 'f' shadows outer variable\n", errout_str()); check("extern int a;\n" "int a;\n" @@ -11356,7 +11344,7 @@ class TestOther : public TestFixture { " int a;\n" " return 0;\n" "}\n", "test.c"); - ASSERT_EQUALS("[test.c:1] -> [test.c:4]: (style) Local variable 'a' shadows outer variable\n", errout.str()); + ASSERT_EQUALS("[test.c:1] -> [test.c:4]: (style) Local variable 'a' shadows outer variable\n", errout_str()); } void knownArgument() { @@ -11364,13 +11352,13 @@ class TestOther : public TestFixture { "void f(int x) {\n" " g((x & 0x01) >> 7);\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Argument '(x&0x01)>>7' to function g is always 0. It does not matter what value 'x' has.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Argument '(x&0x01)>>7' to function g is always 0. It does not matter what value 'x' has.\n", errout_str()); check("void g(int);\n" "void f(int x) {\n" " g((int)((x & 0x01) >> 7));\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Argument '(int)((x&0x01)>>7)' to function g is always 0. It does not matter what value 'x' has.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Argument '(int)((x&0x01)>>7)' to function g is always 0. It does not matter what value 'x' has.\n", errout_str()); check("void g(int, int);\n" "void f(int x) {\n" @@ -11378,71 +11366,71 @@ class TestOther : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:3]: (style) Argument '(x&0x01)>>7' to function g is always 0. It does not matter what value 'x' has.\n", - errout.str()); + errout_str()); check("void g(int);\n" "void f(int x) {\n" " g(0);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void g(int);\n" "void h() { return 1; }\n" "void f(int x) {\n" " g(h());\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void g(int);\n" "void f(int x) {\n" " g(std::strlen(\"a\"));\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void g(int);\n" "void f(int x) {\n" " g((int)0);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void g(Foo *);\n" "void f() {\n" " g(reinterpret_cast(0));\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void g(int);\n" "void f(int x) {\n" " x = 0;\n" " g(x);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void g(int);\n" "void f() {\n" " const int x = 0;\n" " g(x + 1);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void g(int);\n" "void f() {\n" " char i = 1;\n" " g(static_cast(i));\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("char *yytext;\n" "void re_init_scanner() {\n" " int size = 256;\n" " yytext = xmalloc(size * sizeof *yytext);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(const char *c) {\n" " if (*c == '+' && (operand || !isalnum(*c))) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #8986 check("void f(int);\n" @@ -11450,14 +11438,14 @@ class TestOther : public TestFixture { " const int x[] = { 10, 10 };\n" " f(x[0]);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int);\n" "void g() {\n" " int x[] = { 10, 10 };\n" " f(x[0]);\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Variable 'x' can be declared as const array\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Variable 'x' can be declared as const array\n", errout_str()); check("struct A { int x; };" "void g(int);\n" @@ -11466,21 +11454,21 @@ class TestOther : public TestFixture { " y.x = 1;\n" " g(y.x);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // allow known argument value in assert call check("void g(int);\n" "void f(int x) {\n" " ASSERT((int)((x & 0x01) >> 7));\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #9905 - expression that does not use integer calculation at all check("void foo() {\n" " const std::string heading = \"Interval\";\n" " std::cout << std::setw(heading.length());\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #9909 - struct member with known value check("struct LongStack {\n" @@ -11491,7 +11479,7 @@ class TestOther : public TestFixture { " self->maxsize = 32;\n" " dostuff(self->maxsize * sizeof(intptr_t));\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #11894 check("struct S {\n" @@ -11503,7 +11491,7 @@ class TestOther : public TestFixture { " s->p = static_cast(malloc(s->n * sizeof(int)));\n" " return s;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #11679 check("bool g(int);\n" @@ -11512,7 +11500,7 @@ class TestOther : public TestFixture { "void f(int i) {\n" " if (g(k(i))) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #11889 check("struct S {\n" @@ -11526,24 +11514,24 @@ class TestOther : public TestFixture { " g(a[i]);\n" " }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #11927 check("void f(func_t func, int i) {\n" " (func)(i, 0);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S { void operator()(int, int); };\n" "void f(int i) {\n" " S()(i, 1);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int& r) {\n" " g(static_cast(r = 42));\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S { int i; };\n" "void f(int i) {\n" @@ -11552,7 +11540,7 @@ class TestOther : public TestFixture { "}\n"); ASSERT_EQUALS("[test.cpp:3]: (style) Argument 'i-1*i' to init list { is always 0. It does not matter what value 'i' has.\n" "[test.cpp:4]: (style) Argument 'i-1*i' to constructor S is always 0. It does not matter what value 'i' has.\n", - errout.str()); + errout_str()); } void knownArgumentHiddenVariableExpression() { @@ -11568,7 +11556,7 @@ class TestOther : public TestFixture { ASSERT_EQUALS("[test.cpp:3]: (style) Argument 'false&&x' to function dostuff is always 0. Constant literal calculation disable/hide variable expression 'x'.\n" "[test.cpp:5]: (style) Argument 'true||x' to function dostuff is always 1. Constant literal calculation disable/hide variable expression 'x'.\n" "[test.cpp:6]: (style) Argument 'x*0' to function dostuff is always 0. Constant literal calculation disable/hide variable expression 'x'.\n" - "[test.cpp:7]: (style) Argument '0*x' to function dostuff is always 0. Constant literal calculation disable/hide variable expression 'x'.\n", errout.str()); + "[test.cpp:7]: (style) Argument '0*x' to function dostuff is always 0. Constant literal calculation disable/hide variable expression 'x'.\n", errout_str()); } void knownArgumentTernaryOperator() { // #10374 @@ -11580,7 +11568,7 @@ class TestOther : public TestFixture { " if (c ? a : b)\n" " baz(P, N); \n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void checkComparePointers() { @@ -11595,7 +11583,7 @@ class TestOther : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:2] -> [test.cpp:5] -> [test.cpp:3] -> [test.cpp:5] -> [test.cpp:5]: (error) Comparing pointers that point to different objects\n", - errout.str()); + errout_str()); check("bool f() {\n" " int x = 0;\n" @@ -11608,7 +11596,7 @@ class TestOther : public TestFixture { "[test.cpp:2] -> [test.cpp:4] -> [test.cpp:3] -> [test.cpp:5] -> [test.cpp:6]: (error) Comparing pointers that point to different objects\n" "[test.cpp:4]: (style) Variable 'xp' can be declared as pointer to const\n" "[test.cpp:5]: (style) Variable 'yp' can be declared as pointer to const\n", - errout.str()); + errout_str()); check("bool f() {\n" " int x = 0;\n" @@ -11617,7 +11605,7 @@ class TestOther : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:2] -> [test.cpp:4] -> [test.cpp:3] -> [test.cpp:4] -> [test.cpp:4]: (error) Comparing pointers that point to different objects\n", - errout.str()); + errout_str()); check("struct A {int data;};\n" "bool f() {\n" @@ -11631,7 +11619,7 @@ class TestOther : public TestFixture { "[test.cpp:3] -> [test.cpp:5] -> [test.cpp:4] -> [test.cpp:6] -> [test.cpp:7]: (error) Comparing pointers that point to different objects\n" "[test.cpp:5]: (style) Variable 'xp' can be declared as pointer to const\n" "[test.cpp:6]: (style) Variable 'yp' can be declared as pointer to const\n", - errout.str()); + errout_str()); check("struct A {int data;};\n" "bool f(A ix, A iy) {\n" @@ -11645,14 +11633,14 @@ class TestOther : public TestFixture { "[test.cpp:2] -> [test.cpp:3] -> [test.cpp:5] -> [test.cpp:2] -> [test.cpp:4] -> [test.cpp:6] -> [test.cpp:7]: (error) Comparing pointers that point to different objects\n" "[test.cpp:5]: (style) Variable 'xp' can be declared as pointer to const\n" "[test.cpp:6]: (style) Variable 'yp' can be declared as pointer to const\n", - errout.str()); + errout_str()); check("bool f(int * xp, int* yp) {\n" " return &xp > &yp;\n" "}"); ASSERT_EQUALS( "[test.cpp:1] -> [test.cpp:2] -> [test.cpp:1] -> [test.cpp:2] -> [test.cpp:2]: (error) Comparing pointers that point to different objects\n", - errout.str()); + errout_str()); check("int f() {\n" " int x = 0;\n" @@ -11661,7 +11649,7 @@ class TestOther : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:2] -> [test.cpp:4] -> [test.cpp:3] -> [test.cpp:4] -> [test.cpp:4]: (error) Subtracting pointers that point to different objects\n", - errout.str()); + errout_str()); check("bool f() {\n" " int x[2] = {1, 2}m;\n" @@ -11671,17 +11659,17 @@ class TestOther : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:3]: (style) Variable 'xp' can be declared as pointer to const\n" "[test.cpp:4]: (style) Variable 'yp' can be declared as pointer to const\n", - errout.str()); + errout_str()); check("bool f(const int * xp, const int* yp) {\n" " return xp > yp;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool f(const int & x, const int& y) {\n" " return &x > &y;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int& g();\n" "bool f() {\n" @@ -11691,7 +11679,7 @@ class TestOther : public TestFixture { " const int* yp = &y;\n" " return xp > yp;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A {int data;};\n" "bool f(A ix) {\n" @@ -11703,27 +11691,27 @@ class TestOther : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:5]: (style) Variable 'xp' can be declared as pointer to const\n" "[test.cpp:6]: (style) Variable 'yp' can be declared as pointer to const\n", - errout.str()); + errout_str()); check("struct S { int i; };\n" // #11576 "int f(S s) {\n" " return &s.i - (int*)&s;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:3]: (style) C-style pointer casting\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) C-style pointer casting\n", errout_str()); check("struct S { int i; };\n" "int f(S s1, S s2) {\n" " return &s1.i - reinterpret_cast(&s2);\n" "}\n"); ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3] -> [test.cpp:2] -> [test.cpp:3] -> [test.cpp:3]: (error) Subtracting pointers that point to different objects\n", - errout.str()); + errout_str()); check("struct S { int a; int b; };\n" // #12422 "int f() {\n" " S s;\n" " return &s.b - &s.a;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void unusedVariableValueTemplate() { @@ -11752,27 +11740,27 @@ class TestOther : public TestFixture { " }\n" " };\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void moduloOfOne() { check("void f(unsigned int x) {\n" " int y = x % 1;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Modulo of one is always equal to zero\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Modulo of one is always equal to zero\n", errout_str()); check("void f() {\n" " for (int x = 1; x < 10; x++) {\n" " int y = 100 % x;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int i, int j) {\n" // #11191 " const int c = pow(2, i);\n" " if (j % c) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void sameExpressionPointers() { @@ -11782,7 +11770,7 @@ class TestOther : public TestFixture { " f(a);\n" " if (b && c != *a) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void checkOverlappingWrite() { @@ -11792,69 +11780,69 @@ class TestOther : public TestFixture { " u.i = 0;\n" " u.i = u.f;\n" // <- error "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Overlapping read/write of union is undefined behavior\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Overlapping read/write of union is undefined behavior\n", errout_str()); check("void foo() {\n" // #11013 " union { struct { uint8_t a; uint8_t b; }; uint16_t c; } u;\n" " u.a = u.b = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // memcpy check("void foo() {\n" " char a[10];\n" " memcpy(&a[5], &a[4], 2u);\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Overlapping read/write in memcpy() is undefined behavior\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Overlapping read/write in memcpy() is undefined behavior\n", errout_str()); check("void foo() {\n" " char a[10];\n" " memcpy(a+5, a+4, 2u);\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Overlapping read/write in memcpy() is undefined behavior\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Overlapping read/write in memcpy() is undefined behavior\n", errout_str()); check("void foo() {\n" " char a[10];\n" " memcpy(a, a+1, 2u);\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Overlapping read/write in memcpy() is undefined behavior\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Overlapping read/write in memcpy() is undefined behavior\n", errout_str()); check("void foo() {\n" " char a[8];\n" " memcpy(&a[0], &a[4], 4u);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("_Bool a[10];\n" // #10350 "void foo() {\n" " memcpy(&a[5], &a[4], 2u * sizeof(a[0]));\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Overlapping read/write in memcpy() is undefined behavior\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Overlapping read/write in memcpy() is undefined behavior\n", errout_str()); // wmemcpy check("void foo() {\n" " wchar_t a[10];\n" " wmemcpy(&a[5], &a[4], 2u);\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Overlapping read/write in wmemcpy() is undefined behavior\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Overlapping read/write in wmemcpy() is undefined behavior\n", errout_str()); check("void foo() {\n" " wchar_t a[10];\n" " wmemcpy(a+5, a+4, 2u);\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Overlapping read/write in wmemcpy() is undefined behavior\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Overlapping read/write in wmemcpy() is undefined behavior\n", errout_str()); check("void foo() {\n" " wchar_t a[10];\n" " wmemcpy(a, a+1, 2u);\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Overlapping read/write in wmemcpy() is undefined behavior\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Overlapping read/write in wmemcpy() is undefined behavior\n", errout_str()); // strcpy check("void foo(char *ptr) {\n" " strcpy(ptr, ptr);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (error) Overlapping read/write in strcpy() is undefined behavior\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (error) Overlapping read/write in strcpy() is undefined behavior\n", errout_str()); } void constVariableArrayMember() { // #10371 @@ -11864,7 +11852,7 @@ class TestOther : public TestFixture { " int GetVal() const { return m_Arr[0]; }\n" " int m_Arr[1];\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void knownPointerToBool() @@ -11878,19 +11866,19 @@ class TestOther : public TestFixture { "}\n"); ASSERT_EQUALS("[test.cpp:5]: (style) Pointer expression 'p' converted to bool is always true.\n" "[test.cpp:6]: (style) Pointer expression '&i' converted to bool is always true.\n", - errout.str()); + errout_str()); check("void f() {\n" " const int* x = nullptr;\n" " std::empty(x);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " const int* x = nullptr;\n" " std::empty(const_cast(x));\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A { bool x; };\n" "bool f(A* a) {\n" @@ -11899,7 +11887,7 @@ class TestOther : public TestFixture { " }\n" " return false;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A { int* x; };\n" "bool f(A a) {\n" @@ -11908,36 +11896,36 @@ class TestOther : public TestFixture { " }\n" " return false;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:4]: (style) Pointer expression 'a.x' converted to bool is always true.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Pointer expression 'a.x' converted to bool is always true.\n", errout_str()); check("void f(bool* b) { if (b) *b = true; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool f() {\n" " int* x = nullptr;\n" " return bool(x);\n" "}\n"); - ASSERT_EQUALS("[test.cpp:3]: (style) Pointer expression 'x' converted to bool is always false.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Pointer expression 'x' converted to bool is always false.\n", errout_str()); check("bool f() {\n" " int* x = nullptr;\n" " return bool{x};\n" "}\n"); - ASSERT_EQUALS("[test.cpp:3]: (style) Pointer expression 'x' converted to bool is always false.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Pointer expression 'x' converted to bool is always false.\n", errout_str()); check("struct A { A(bool); };\n" "A f() {\n" " int* x = nullptr;\n" " return A(x);\n" "}\n"); - ASSERT_EQUALS("[test.cpp:4]: (style) Pointer expression 'x' converted to bool is always false.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Pointer expression 'x' converted to bool is always false.\n", errout_str()); check("struct A { A(bool); };\n" "A f() {\n" " int* x = nullptr;\n" " return A{x};\n" "}\n"); - ASSERT_EQUALS("[test.cpp:4]: (style) Pointer expression 'x' converted to bool is always false.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Pointer expression 'x' converted to bool is always false.\n", errout_str()); check("struct B { virtual void f() {} };\n" // #11929 "struct D : B {};\n" @@ -11946,13 +11934,13 @@ class TestOther : public TestFixture { " return;\n" " if (dynamic_cast(b)) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool (*ptr)();\n" // #12170 "void f() {\n" " if (!ptr || !ptr()) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void iterateByValue() { @@ -11962,7 +11950,7 @@ class TestOther : public TestFixture { " (void)s.size();\n" "}\n"); ASSERT_EQUALS("[test.cpp:3]: (performance) Range variable 's' should be declared as const reference.\n", - errout.str()); + errout_str()); } }; diff --git a/test/testpostfixoperator.cpp b/test/testpostfixoperator.cpp index 17459f0f120f..31588a31f81b 100644 --- a/test/testpostfixoperator.cpp +++ b/test/testpostfixoperator.cpp @@ -34,9 +34,6 @@ class TestPostfixOperator : public TestFixture { #define check(code) check_(code, __FILE__, __LINE__) void check_(const char code[], const char* file, int line) { - // Clear the error buffer.. - errout.str(""); - // Tokenize.. Tokenizer tokenizer(settings, this); std::istringstream istr(code); @@ -76,7 +73,7 @@ class TestPostfixOperator : public TestFixture { " std::cout << k << std::endl;\n" " return 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class K {};" "int main()\n" @@ -87,7 +84,7 @@ class TestPostfixOperator : public TestFixture { " std::cout << k << std::endl;\n" " return 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (performance) Prefer prefix ++/-- operators for non-primitive types.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (performance) Prefer prefix ++/-- operators for non-primitive types.\n", errout_str()); check("struct K {};" "void foo()\n" @@ -95,14 +92,14 @@ class TestPostfixOperator : public TestFixture { " K k(0);\n" " k++;\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (performance) Prefer prefix ++/-- operators for non-primitive types.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (performance) Prefer prefix ++/-- operators for non-primitive types.\n", errout_str()); check("struct K {};\n" "void foo(K& k)\n" "{\n" " k++;\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (performance) Prefer prefix ++/-- operators for non-primitive types.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (performance) Prefer prefix ++/-- operators for non-primitive types.\n", errout_str()); check("union K {};" "void foo()\n" @@ -110,7 +107,7 @@ class TestPostfixOperator : public TestFixture { " K k(0);\n" " k++;\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (performance) Prefer prefix ++/-- operators for non-primitive types.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (performance) Prefer prefix ++/-- operators for non-primitive types.\n", errout_str()); check("class K {};" "int main()\n" @@ -123,7 +120,7 @@ class TestPostfixOperator : public TestFixture { " std::cout << k << std::endl;\n" " return 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:6]: (performance) Prefer prefix ++/-- operators for non-primitive types.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (performance) Prefer prefix ++/-- operators for non-primitive types.\n", errout_str()); check("class K {};" "int main()\n" @@ -137,7 +134,7 @@ class TestPostfixOperator : public TestFixture { " std::cout << k << std::endl;\n" " return 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:8]: (performance) Prefer prefix ++/-- operators for non-primitive types.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8]: (performance) Prefer prefix ++/-- operators for non-primitive types.\n", errout_str()); check("class K {};" @@ -149,7 +146,7 @@ class TestPostfixOperator : public TestFixture { " std::cout << k << std::endl;\n" " return 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (performance) Prefer prefix ++/-- operators for non-primitive types.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (performance) Prefer prefix ++/-- operators for non-primitive types.\n", errout_str()); check("class K {};" "int main()\n" @@ -160,7 +157,7 @@ class TestPostfixOperator : public TestFixture { " std::cout << k << std::endl;\n" " return 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class K {};" "int main()\n" @@ -171,7 +168,7 @@ class TestPostfixOperator : public TestFixture { " std::cout << k << std::endl;\n" " return 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #9042 check("template \n" @@ -182,7 +179,7 @@ class TestPostfixOperator : public TestFixture { "template \n" "class s {};\n" "using BOOL = char;"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void testfor() { @@ -193,7 +190,7 @@ class TestPostfixOperator : public TestFixture { " }\n" " return 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class K {};\n" "int main()\n" @@ -203,7 +200,7 @@ class TestPostfixOperator : public TestFixture { " }\n" " return 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (performance) Prefer prefix ++/-- operators for non-primitive types.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (performance) Prefer prefix ++/-- operators for non-primitive types.\n", errout_str()); check("class K {};\n" "int main()\n" @@ -213,7 +210,7 @@ class TestPostfixOperator : public TestFixture { " }\n" " return 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class K {};\n" "int main()\n" @@ -223,7 +220,7 @@ class TestPostfixOperator : public TestFixture { " }\n" " return 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (performance) Prefer prefix ++/-- operators for non-primitive types.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (performance) Prefer prefix ++/-- operators for non-primitive types.\n", errout_str()); check("class K {};\n" "int main(int argc, char *argv[])\n" @@ -233,7 +230,7 @@ class TestPostfixOperator : public TestFixture { " }\n" " return 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } @@ -248,7 +245,7 @@ class TestPostfixOperator : public TestFixture { " std::cout << k << std::endl;\n" " return 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:6]: (performance) Prefer prefix ++/-- operators for non-primitive types.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (performance) Prefer prefix ++/-- operators for non-primitive types.\n", errout_str()); } void testiterator() { @@ -263,7 +260,7 @@ class TestPostfixOperator : public TestFixture { " v.clear();\n" " return 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:6]: (performance) Prefer prefix ++/-- operators for non-primitive types.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (performance) Prefer prefix ++/-- operators for non-primitive types.\n", errout_str()); check("int main() {\n" " std::vector v;\n" @@ -277,7 +274,7 @@ class TestPostfixOperator : public TestFixture { " }\n" " return 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:9]: (performance) Prefer prefix ++/-- operators for non-primitive types.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:9]: (performance) Prefer prefix ++/-- operators for non-primitive types.\n", errout_str()); check("int main() {\n" " std::vector v;\n" @@ -290,7 +287,7 @@ class TestPostfixOperator : public TestFixture { " }\n" " return 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:8]: (performance) Prefer prefix ++/-- operators for non-primitive types.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8]: (performance) Prefer prefix ++/-- operators for non-primitive types.\n", errout_str()); check("int main() {\n" " std::vector v;\n" @@ -304,14 +301,14 @@ class TestPostfixOperator : public TestFixture { " }\n" " return 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:9]: (performance) Prefer prefix ++/-- operators for non-primitive types.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:9]: (performance) Prefer prefix ++/-- operators for non-primitive types.\n", errout_str()); } void test2168() { check("--> declare allocator lock here\n" "int main(){}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void pointerSimplest() { @@ -319,7 +316,7 @@ class TestPostfixOperator : public TestFixture { " p++;\n" " std::cout << *p;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void pointer() { @@ -329,7 +326,7 @@ class TestPostfixOperator : public TestFixture { "void f() {\n" " p++;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void testtemplate() { @@ -337,7 +334,7 @@ class TestPostfixOperator : public TestFixture { " std::vector::iterator aIter(aImport.begin());\n" " aIter++;\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (performance) Prefer prefix ++/-- operators for non-primitive types.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (performance) Prefer prefix ++/-- operators for non-primitive types.\n", errout_str()); } void testmember() { @@ -346,14 +343,14 @@ class TestPostfixOperator : public TestFixture { " B b;\n" " b.a++;\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (performance) Prefer prefix ++/-- operators for non-primitive types.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (performance) Prefer prefix ++/-- operators for non-primitive types.\n", errout_str()); check("bool foo() {\n" " class A {}; class B {A a;};\n" " B b;\n" " foo(b.a++);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void testcomma() { @@ -362,7 +359,7 @@ class TestPostfixOperator : public TestFixture { " A a;\n" " i++, a++;\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (performance) Prefer prefix ++/-- operators for non-primitive types.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (performance) Prefer prefix ++/-- operators for non-primitive types.\n", errout_str()); check("bool foo(int i) {\n" " class A {};\n" @@ -370,7 +367,7 @@ class TestPostfixOperator : public TestFixture { " foo(i, a++);\n" " foo(a++, i);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void testauto() { // #8350 @@ -382,7 +379,7 @@ class TestPostfixOperator : public TestFixture { " }\n" " return a;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } }; diff --git a/test/testpreprocessor.cpp b/test/testpreprocessor.cpp index 764bbba71a32..a87dae8c2b3d 100644 --- a/test/testpreprocessor.cpp +++ b/test/testpreprocessor.cpp @@ -268,7 +268,6 @@ class TestPreprocessor : public TestFixture { // TODO: merge with `PreprocessorHelper::getcode()` void preprocess(const char* code, std::map& actual, const char filename[] = "file.c") { - errout.str(""); std::istringstream istr(code); simplecpp::OutputList outputList; std::vector files; @@ -367,39 +366,35 @@ class TestPreprocessor : public TestFixture { } void error3() { - errout.str(""); const auto settings = dinit(Settings, $.userDefines = "__cplusplus"); Preprocessor preprocessor(settings, this); const std::string code("#error hello world!\n"); PreprocessorHelper::getcode(preprocessor, code, "X", "test.c"); - ASSERT_EQUALS("[test.c:1]: (error) #error hello world!\n", errout.str()); + ASSERT_EQUALS("[test.c:1]: (error) #error hello world!\n", errout_str()); } // Ticket #2919 - wrong filename reported for #error void error4() { // In included file { - errout.str(""); const auto settings = dinit(Settings, $.userDefines = "TEST"); Preprocessor preprocessor(settings, this); const std::string code("#file \"ab.h\"\n#error hello world!\n#endfile"); PreprocessorHelper::getcode(preprocessor, code, "TEST", "test.c"); - ASSERT_EQUALS("[ab.h:1]: (error) #error hello world!\n", errout.str()); + ASSERT_EQUALS("[ab.h:1]: (error) #error hello world!\n", errout_str()); } // After including a file { - errout.str(""); const auto settings = dinit(Settings, $.userDefines = "TEST"); Preprocessor preprocessor(settings, this); const std::string code("#file \"ab.h\"\n\n#endfile\n#error aaa"); PreprocessorHelper::getcode(preprocessor, code, "TEST", "test.c"); - ASSERT_EQUALS("[test.c:2]: (error) #error aaa\n", errout.str()); + ASSERT_EQUALS("[test.c:2]: (error) #error aaa\n", errout_str()); } } void error5() { - errout.str(""); // No message if --force is given const auto settings = dinit(Settings, $.userDefines = "TEST", @@ -407,7 +402,7 @@ class TestPreprocessor : public TestFixture { Preprocessor preprocessor(settings, this); const std::string code("#error hello world!\n"); PreprocessorHelper::getcode(preprocessor, code, "X", "test.c"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void error6() { @@ -760,7 +755,7 @@ class TestPreprocessor : public TestFixture { "#endif\n"; std::map actual; preprocess(filedata, actual); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void if_cond12() { @@ -1486,7 +1481,7 @@ class TestPreprocessor : public TestFixture { preprocess(filedata, actual); ASSERT_EQUALS("", actual[""]); - ASSERT_EQUALS("[file.c:2]: (error) No pair for character ('). Can't process file. File is either invalid or unicode, which is currently not supported.\n", errout.str()); + ASSERT_EQUALS("[file.c:2]: (error) No pair for character ('). Can't process file. File is either invalid or unicode, which is currently not supported.\n", errout_str()); } } @@ -1498,11 +1493,10 @@ class TestPreprocessor : public TestFixture { "#endif\n"; // expand macros.. - errout.str(""); const std::string actual(OurPreprocessor::expandMacros(filedata, this)); ASSERT_EQUALS("", actual); - ASSERT_EQUALS("[file.cpp:3]: (error) No pair for character (\"). Can't process file. File is either invalid or unicode, which is currently not supported.\n", errout.str()); + ASSERT_EQUALS("[file.cpp:3]: (error) No pair for character (\"). Can't process file. File is either invalid or unicode, which is currently not supported.\n", errout_str()); } { @@ -1512,11 +1506,10 @@ class TestPreprocessor : public TestFixture { "#endfile\n"; // expand macros.. - errout.str(""); const std::string actual(OurPreprocessor::expandMacros(filedata, this)); ASSERT_EQUALS("", actual); - ASSERT_EQUALS("[abc.h:2]: (error) No pair for character (\"). Can't process file. File is either invalid or unicode, which is currently not supported.\n", errout.str()); + ASSERT_EQUALS("[abc.h:2]: (error) No pair for character (\"). Can't process file. File is either invalid or unicode, which is currently not supported.\n", errout_str()); } { @@ -1526,11 +1519,10 @@ class TestPreprocessor : public TestFixture { "\"\n"; // expand macros.. - errout.str(""); const std::string actual(OurPreprocessor::expandMacros(filedata, this)); ASSERT_EQUALS("", actual); - ASSERT_EQUALS("[file.cpp:2]: (error) No pair for character (\"). Can't process file. File is either invalid or unicode, which is currently not supported.\n", errout.str()); + ASSERT_EQUALS("[file.cpp:2]: (error) No pair for character (\"). Can't process file. File is either invalid or unicode, which is currently not supported.\n", errout_str()); } { @@ -1539,11 +1531,10 @@ class TestPreprocessor : public TestFixture { "int a = A;\n"; // expand macros.. - errout.str(""); const std::string actual(OurPreprocessor::expandMacros(filedata, this)); ASSERT_EQUALS("", actual); - ASSERT_EQUALS("[file.cpp:2]: (error) No pair for character (\"). Can't process file. File is either invalid or unicode, which is currently not supported.\n", errout.str()); + ASSERT_EQUALS("[file.cpp:2]: (error) No pair for character (\"). Can't process file. File is either invalid or unicode, which is currently not supported.\n", errout_str()); } { @@ -1557,10 +1548,9 @@ class TestPreprocessor : public TestFixture { "}\n"; // expand macros.. - errout.str(""); OurPreprocessor::expandMacros(filedata, this); - ASSERT_EQUALS("[file.cpp:7]: (error) No pair for character (\"). Can't process file. File is either invalid or unicode, which is currently not supported.\n", errout.str()); + ASSERT_EQUALS("[file.cpp:7]: (error) No pair for character (\"). Can't process file. File is either invalid or unicode, which is currently not supported.\n", errout_str()); } } @@ -1578,7 +1568,7 @@ class TestPreprocessor : public TestFixture { // Compare results.. ASSERT_EQUALS(1, actual.size()); ASSERT_EQUALS("\nvoid f ( ) {\n$g $( ) ;\n}", actual[""]); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void conditionalDefine() { @@ -1597,11 +1587,10 @@ class TestPreprocessor : public TestFixture { ASSERT_EQUALS(2, actual.size()); ASSERT_EQUALS("\n\n\n\n\n$20", actual[""]); ASSERT_EQUALS("\n\n\n\n\n$10", actual["A"]); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void macro_parameters() { - errout.str(""); const char filedata[] = "#define BC(a, b, c, arg...) \\\n" "AB(a, b, c, ## arg)\n" "\n" @@ -1617,7 +1606,7 @@ class TestPreprocessor : public TestFixture { // Compare results.. ASSERT_EQUALS(1, actual.size()); ASSERT_EQUALS("", actual[""]); - ASSERT_EQUALS("[file.c:6]: (error) failed to expand 'BC', Wrong number of parameters for macro 'BC'.\n", errout.str()); + ASSERT_EQUALS("[file.c:6]: (error) failed to expand 'BC', Wrong number of parameters for macro 'BC'.\n", errout_str()); } void newline_in_macro() { @@ -1634,7 +1623,7 @@ class TestPreprocessor : public TestFixture { // Compare results.. ASSERT_EQUALS(1, actual.size()); ASSERT_EQUALS("\nvoid f ( )\n{\n$printf $( \"\\n\" $) ;\n}", actual[""]); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void ifdef_ifdefined() { @@ -1947,16 +1936,16 @@ class TestPreprocessor : public TestFixture { void invalid_define_1() { std::map actual; preprocess("#define =\n", actual); // don't hang + ASSERT_EQUALS("[file.c:1]: (error) Failed to parse #define\n", errout_str()); } void invalid_define_2() { // #4036 std::map actual; preprocess("#define () {(int f(x) }\n", actual); // don't hang + ASSERT_EQUALS("[file.c:1]: (error) Failed to parse #define\n", errout_str()); } void inline_suppressions() { - errout.str(""); - /*const*/ Settings settings; settings.inlineSuppressions = true; settings.checks.enable(Checks::missingInclude); @@ -1987,6 +1976,8 @@ class TestPreprocessor : public TestFixture { ASSERT_EQUALS(4, suppr.lineNumber); ASSERT_EQUALS(false, suppr.checked); ASSERT_EQUALS(false, suppr.matched); + + (void)errout_str(); // we are not interested in the output } void predefine1() { @@ -2049,6 +2040,7 @@ class TestPreprocessor : public TestFixture { const char code[] = "#elif (){\n"; const std::string actual = PreprocessorHelper::getcode(preprocessor0, code, "TEST", "test.c"); ASSERT_EQUALS("", actual); + ASSERT_EQUALS("[test.c:1]: (error) #elif without #if\n", errout_str()); } void getConfigs1() { @@ -2298,6 +2290,9 @@ class TestPreprocessor : public TestFixture { // Preprocess => don't crash.. std::map actual; preprocess(filedata, actual); + ASSERT_EQUALS( + "[file.c:1]: (error) Syntax error in #ifdef\n" + "[file.c:1]: (error) Syntax error in #ifdef\n", errout_str()); } void garbage() { @@ -2311,12 +2306,11 @@ class TestPreprocessor : public TestFixture { } void wrongPathOnErrorDirective() { - errout.str(""); const auto settings = dinit(Settings, $.userDefines = "foo"); Preprocessor preprocessor(settings, this); const std::string code("#error hello world!\n"); PreprocessorHelper::getcode(preprocessor, code, "X", "./././test.c"); - ASSERT_EQUALS("[test.c:1]: (error) #error hello world!\n", errout.str()); + ASSERT_EQUALS("[test.c:1]: (error) #error hello world!\n", errout_str()); } void testDirectiveIncludeTypes() { @@ -2413,10 +2407,9 @@ class TestPreprocessor : public TestFixture { ScopedFile header("header.h", ""); std::string code("#include \"header.h\""); - errout.str(""); PreprocessorHelper::getcode(preprocessor, code, "", "test.c"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } // test for missing local include @@ -2429,10 +2422,9 @@ class TestPreprocessor : public TestFixture { Preprocessor preprocessor(settings, this); std::string code("#include \"header.h\""); - errout.str(""); PreprocessorHelper::getcode(preprocessor, code, "", "test.c"); - ASSERT_EQUALS("test.c:1:0: information: Include file: \"header.h\" not found. [missingInclude]\n", errout.str()); + ASSERT_EQUALS("test.c:1:0: information: Include file: \"header.h\" not found. [missingInclude]\n", errout_str()); } // test for missing local include - no include path given @@ -2447,10 +2439,9 @@ class TestPreprocessor : public TestFixture { ScopedFile header("header.h", "", "inc"); std::string code("#include \"header.h\""); - errout.str(""); PreprocessorHelper::getcode(preprocessor, code, "", "test.c"); - ASSERT_EQUALS("test.c:1:0: information: Include file: \"header.h\" not found. [missingInclude]\n", errout.str()); + ASSERT_EQUALS("test.c:1:0: information: Include file: \"header.h\" not found. [missingInclude]\n", errout_str()); } // test for existing local include - include path provided @@ -2466,10 +2457,9 @@ class TestPreprocessor : public TestFixture { ScopedFile header("header.h", "", "inc"); std::string code("#include \"inc/header.h\""); - errout.str(""); PreprocessorHelper::getcode(preprocessor, code, "", "test.c"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } // test for existing local include - absolute path @@ -2485,10 +2475,9 @@ class TestPreprocessor : public TestFixture { ScopedFile header("header.h", "", Path::getCurrentPath()); std::string code("#include \"" + header.path() + "\""); - errout.str(""); PreprocessorHelper::getcode(preprocessor, code, "", "test.c"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } // test for missing local include - absolute path @@ -2503,10 +2492,9 @@ class TestPreprocessor : public TestFixture { const std::string header = Path::join(Path::getCurrentPath(), "header.h"); std::string code("#include \"" + header + "\""); - errout.str(""); - PreprocessorHelper::getcode(preprocessor, code, "", "test.c"); + PreprocessorHelper::getcode(preprocessor, code, "", "test.c"); - ASSERT_EQUALS("test.c:1:0: information: Include file: \"" + header + "\" not found. [missingInclude]\n", errout.str()); + ASSERT_EQUALS("test.c:1:0: information: Include file: \"" + header + "\" not found. [missingInclude]\n", errout_str()); } // test for missing system include - system includes are not searched for in relative path @@ -2521,10 +2509,9 @@ class TestPreprocessor : public TestFixture { ScopedFile header("header.h", ""); std::string code("#include "); - errout.str(""); PreprocessorHelper::getcode(preprocessor, code, "", "test.c"); - ASSERT_EQUALS("test.c:1:0: information: Include file: not found. Please note: Cppcheck does not need standard library headers to get proper results. [missingIncludeSystem]\n", errout.str()); + ASSERT_EQUALS("test.c:1:0: information: Include file: not found. Please note: Cppcheck does not need standard library headers to get proper results. [missingIncludeSystem]\n", errout_str()); } // test for missing system include @@ -2537,10 +2524,9 @@ class TestPreprocessor : public TestFixture { Preprocessor preprocessor(settings, this); std::string code("#include "); - errout.str(""); PreprocessorHelper::getcode(preprocessor, code, "", "test.c"); - ASSERT_EQUALS("test.c:1:0: information: Include file: not found. Please note: Cppcheck does not need standard library headers to get proper results. [missingIncludeSystem]\n", errout.str()); + ASSERT_EQUALS("test.c:1:0: information: Include file: not found. Please note: Cppcheck does not need standard library headers to get proper results. [missingIncludeSystem]\n", errout_str()); } // test for existing system include in system include path @@ -2557,10 +2543,9 @@ class TestPreprocessor : public TestFixture { ScopedFile header("header.h", "", "system"); std::string code("#include "); - errout.str(""); PreprocessorHelper::getcode(preprocessor, code, "", "test.c"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } // test for existing system include - absolute path @@ -2576,10 +2561,9 @@ class TestPreprocessor : public TestFixture { ScopedFile header("header.h", "", Path::getCurrentPath()); std::string code("#include <" + header.path() + ">"); - errout.str(""); PreprocessorHelper::getcode(preprocessor, code, "", "test.c"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } // test for missing system include - absolute path @@ -2594,10 +2578,9 @@ class TestPreprocessor : public TestFixture { const std::string header = Path::join(Path::getCurrentPath(), "header.h"); std::string code("#include <" + header + ">"); - errout.str(""); PreprocessorHelper::getcode(preprocessor, code, "", "test.c"); - ASSERT_EQUALS("test.c:1:0: information: Include file: <" + header + "> not found. Please note: Cppcheck does not need standard library headers to get proper results. [missingIncludeSystem]\n", errout.str()); + ASSERT_EQUALS("test.c:1:0: information: Include file: <" + header + "> not found. Please note: Cppcheck does not need standard library headers to get proper results. [missingIncludeSystem]\n", errout_str()); } // test for missing local and system include @@ -2616,12 +2599,11 @@ class TestPreprocessor : public TestFixture { "#include \n" "#include \n" "#include \"header2.h\""); - errout.str(""); PreprocessorHelper::getcode(preprocessor, code, "", "test.c"); ASSERT_EQUALS("test.c:1:0: information: Include file: \"missing.h\" not found. [missingInclude]\n" "test.c:2:0: information: Include file: not found. Please note: Cppcheck does not need standard library headers to get proper results. [missingIncludeSystem]\n" - "test.c:3:0: information: Include file: not found. Please note: Cppcheck does not need standard library headers to get proper results. [missingIncludeSystem]\n", errout.str()); + "test.c:3:0: information: Include file: not found. Please note: Cppcheck does not need standard library headers to get proper results. [missingIncludeSystem]\n", errout_str()); } void testMissingIncludeCheckConfig() { @@ -2655,7 +2637,6 @@ class TestPreprocessor : public TestFixture { "#include \"" + missing3 + "\"\n" "#include <" + header6.path() + ">\n" "#include <" + missing4 + ">\n"); - errout.str(""); PreprocessorHelper::getcode(preprocessor, code, "", "test.c"); ASSERT_EQUALS("test.c:1:0: information: Include file: \"missing.h\" not found. [missingInclude]\n" @@ -2663,7 +2644,7 @@ class TestPreprocessor : public TestFixture { "test.c:3:0: information: Include file: not found. Please note: Cppcheck does not need standard library headers to get proper results. [missingIncludeSystem]\n" "test.c:6:0: information: Include file: \"header4.h\" not found. [missingInclude]\n" "test.c:9:0: information: Include file: \"" + missing3 + "\" not found. [missingInclude]\n" - "test.c:11:0: information: Include file: <" + missing4 + "> not found. Please note: Cppcheck does not need standard library headers to get proper results. [missingIncludeSystem]\n", errout.str()); + "test.c:11:0: information: Include file: <" + missing4 + "> not found. Please note: Cppcheck does not need standard library headers to get proper results. [missingIncludeSystem]\n", errout_str()); } void limitsDefines() { diff --git a/test/testprocessexecutor.cpp b/test/testprocessexecutor.cpp index 1331ee037ab7..6d38712d52d6 100644 --- a/test/testprocessexecutor.cpp +++ b/test/testprocessexecutor.cpp @@ -66,8 +66,6 @@ class TestProcessExecutorBase : public TestFixture { * identical data, given within data. */ void check(unsigned int jobs, int files, int result, const std::string &data, const CheckOptions& opt = make_default_obj{}) { - errout.str(""); - std::list fileSettings; std::list> filelist; @@ -157,22 +155,26 @@ class TestProcessExecutorBase : public TestFixture { std::ostringstream oss; oss << "int main()\n" << "{\n"; - for (int i = 0; i < 500; i++) + const int num_err = 1; + for (int i = 0; i < num_err; i++) { oss << " {int i = *((int*)0);}\n"; - + } oss << " return 0;\n" << "}\n"; - check(2, 3, 3, oss.str()); + const int num_files = 3; + check(2, num_files, num_files, oss.str()); + ASSERT_EQUALS(num_err * num_files, cppcheck::count_all_of(errout_str(), "(error) Null pointer dereference: (int*)0")); } - // TODO: check the output void many_threads() { - check(16, 100, 100, + const int num_files = 100; + check(16, num_files, num_files, "int main()\n" "{\n" " int i = *((int*)0);\n" " return 0;\n" "}"); + ASSERT_EQUALS(num_files, cppcheck::count_all_of(errout_str(), "(error) Null pointer dereference: (int*)0")); } // #11249 - reports TSAN errors @@ -184,6 +186,8 @@ class TestProcessExecutorBase : public TestFixture { " int i = *((int*)0);\n" " return 0;\n" "}", dinit(CheckOptions, $.showtime = SHOWTIME_MODES::SHOWTIME_SUMMARY)); + // we are not interested in the results - so just consume them + (void)errout_str(); } void many_threads_plist() { @@ -196,6 +200,8 @@ class TestProcessExecutorBase : public TestFixture { " int i = *((int*)0);\n" " return 0;\n" "}", dinit(CheckOptions, $.plistOutput = plistOutput.c_str())); + // we are not interested in the results - so just consume them + (void)errout_str(); } void no_errors_more_files() { @@ -229,15 +235,18 @@ class TestProcessExecutorBase : public TestFixture { " {int i = *((int*)0);}\n" " return 0;\n" "}"); + ASSERT_EQUALS("[" + fprefix() + "_1.cpp:3]: (error) Null pointer dereference: (int*)0\n", errout_str()); } void one_error_several_files() { - check(2, 20, 20, + const int num_files = 20; + check(2, num_files, num_files, "int main()\n" "{\n" " {int i = *((int*)0);}\n" " return 0;\n" "}"); + ASSERT_EQUALS(num_files, cppcheck::count_all_of(errout_str(), "(error) Null pointer dereference: (int*)0")); } void clangTidy() { @@ -341,7 +350,7 @@ class TestProcessExecutorBase : public TestFixture { " int i = *((int*)0);\n" " return 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); settings = settingsOld; } @@ -355,7 +364,7 @@ class TestProcessExecutorBase : public TestFixture { check(2, 2, 2, "#include \"" + inc_h.name() +"\""); // this is made unique by the executor - ASSERT_EQUALS("[" + inc_h.name() + ":3]: (error) Null pointer dereference: (int*)0\n", errout.str()); + ASSERT_EQUALS("[" + inc_h.name() + ":3]: (error) Null pointer dereference: (int*)0\n", errout_str()); } // TODO: test whole program analysis diff --git a/test/testsimplifytemplate.cpp b/test/testsimplifytemplate.cpp index 6a0415cc7dce..e7722dcf90c4 100644 --- a/test/testsimplifytemplate.cpp +++ b/test/testsimplifytemplate.cpp @@ -309,8 +309,6 @@ class TestSimplifyTemplate : public TestFixture { #define tok(...) tok_(__FILE__, __LINE__, __VA_ARGS__) std::string tok_(const char* file, int line, const char code[], bool debugwarnings = false, Platform::Type type = Platform::Type::Native) { - errout.str(""); - const Settings settings1 = settingsBuilder(settings).library("std.cfg").debugwarnings(debugwarnings).platform(type).build(); Tokenizer tokenizer(settings1, this); @@ -1206,7 +1204,7 @@ class TestSimplifyTemplate : public TestFixture { "static const int mult = sizeof ( int ) * Constants :: fourtytwo ; " "} ;"; ASSERT_EQUALS(expected, tok(code, true)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void template46() { // #5816 @@ -1214,29 +1212,29 @@ class TestSimplifyTemplate : public TestFixture { "template struct B { " " enum { value = A::value }; " "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); tok("template struct A {}; " "enum { e = sizeof(A) }; " "template struct B {};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); tok("template struct A { static const int value = 0; }; " "template struct B { typedef int type; }; " "template struct C { " " enum { value = A::type, int>::value }; " "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void template47() { // #6023 tok("template > class C1 {}; " "class C2 : public C1 {};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void template48() { // #6134 tok("template int f( { } ); " "int foo = f<1>(0);"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void template49() { // #6237 @@ -1334,7 +1332,7 @@ class TestSimplifyTemplate : public TestFixture { "enum Anonymous0 { value = 1 * Factorial<0> :: value } ; " "} ;"; ASSERT_EQUALS(expected, tok(code, true)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void template54() { // #6587 @@ -1394,7 +1392,7 @@ class TestSimplifyTemplate : public TestFixture { "std :: array < int , 1 > mfoo ; " "} ;"; ASSERT_EQUALS(expected, tok(code, true)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void template57() { // #7891 @@ -2496,7 +2494,7 @@ class TestSimplifyTemplate : public TestFixture { "} ;"; ASSERT_EQUALS(exp, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void template102() { // #9005 @@ -4871,8 +4869,8 @@ class TestSimplifyTemplate : public TestFixture { tok(code); - //ASSERT_EQUALS("[file1.cpp:15]: (error) Internal error: failed to instantiate template. The checking continues anyway.\n", errout.str()); - ASSERT_EQUALS("", errout.str()); + //ASSERT_EQUALS("[file1.cpp:15]: (error) Internal error: failed to instantiate template. The checking continues anyway.\n", errout_str()); + ASSERT_EQUALS("", errout_str()); } void template_typename() { @@ -4914,25 +4912,25 @@ class TestSimplifyTemplate : public TestFixture { void syntax_error_templates_1() { // ok code.. using ">" for a comparison tok("xz> xyz;"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // ok code tok("template operator<(T a, T b) { }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // ok code (ticket #1984) tok("void f(a) int a;\n" "{ ;x" ASSERT_THROW(tok("x xyz;\n"), InternalError); @@ -4955,7 +4953,7 @@ class TestSimplifyTemplate : public TestFixture { "private:\n" " A a;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); //both of these should work but in cppcheck 2.1 only the first option will work (ticket #9843) { @@ -4963,11 +4961,11 @@ class TestSimplifyTemplate : public TestFixture { ASSERT_EQUALS(expected, tok("template \n" "constexpr bool foo > = true;\n")); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); ASSERT_EQUALS(expected, tok("template \n" "constexpr bool foo> = true;\n")); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } } @@ -5873,7 +5871,7 @@ class TestSimplifyTemplate : public TestFixture { "void f ( bool n ) { ( void ) n ; }"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void templateTypeDeduction2() { diff --git a/test/testsimplifytokens.cpp b/test/testsimplifytokens.cpp index ea809ed6533b..2a7a85874d72 100644 --- a/test/testsimplifytokens.cpp +++ b/test/testsimplifytokens.cpp @@ -164,8 +164,6 @@ class TestSimplifyTokens : public TestFixture { #define tok(...) tok_(__FILE__, __LINE__, __VA_ARGS__) std::string tok_(const char* file, int line, const char code[], bool simplify = true, Platform::Type type = Platform::Type::Native) { - errout.str(""); - const Settings settings = settingsBuilder(settings0).platform(type).build(); Tokenizer tokenizer(settings, this); @@ -176,8 +174,6 @@ class TestSimplifyTokens : public TestFixture { } std::string tok_(const char* file, int line, const char code[], const char filename[], bool simplify = true) { - errout.str(""); - Tokenizer tokenizer(settings0, this); std::istringstream istr(code); @@ -190,8 +186,6 @@ class TestSimplifyTokens : public TestFixture { #define tokenizeAndStringify(...) tokenizeAndStringify_(__FILE__, __LINE__, __VA_ARGS__) std::string tokenizeAndStringify_(const char* file, int linenr, const char code[], bool simplify = false, bool expand = true, Platform::Type platform = Platform::Type::Native, const char* filename = "test.cpp", bool cpp11 = true) { - errout.str(""); - const Settings settings = settingsBuilder(settings1).debugwarnings().platform(platform).cpp(cpp11 ? Standards::CPP11 : Standards::CPP03).build(); // tokenize.. @@ -203,13 +197,12 @@ class TestSimplifyTokens : public TestFixture { // TODO: should be handled in a better way // filter out ValueFlow messages.. - const std::string debugwarnings = errout.str(); - errout.str(""); + const std::string debugwarnings = errout_str(); std::istringstream istr2(debugwarnings); std::string line; while (std::getline(istr2,line)) { if (line.find("bailout") == std::string::npos) - errout << line << "\n"; + {} // TODO mErrout << line << "\n"; } if (tokenizer.tokens()) @@ -219,8 +212,6 @@ class TestSimplifyTokens : public TestFixture { #define tokenizeDebugListing(...) tokenizeDebugListing_(__FILE__, __LINE__, __VA_ARGS__) std::string tokenizeDebugListing_(const char* file, int line, const char code[], bool simplify = false, const char filename[] = "test.cpp") { - errout.str(""); - Tokenizer tokenizer(settings0, this); std::istringstream istr(code); ASSERT_LOC(tokenizer.tokenize(istr, filename), file, line); @@ -1490,8 +1481,6 @@ class TestSimplifyTokens : public TestFixture { #define simplifyKnownVariables(code) simplifyKnownVariables_(code, __FILE__, __LINE__) std::string simplifyKnownVariables_(const char code[], const char* file, int line) { - errout.str(""); - Tokenizer tokenizer(settings0, this); std::istringstream istr(code); ASSERT_LOC(tokenizer.tokenize(istr, "test.cpp"), file, line); @@ -2283,7 +2272,7 @@ class TestSimplifyTokens : public TestFixture { " };\n" " enum { XX };\n" "};", /*simplify=*/ true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyKnownVariables62() { // #5666 @@ -2300,7 +2289,7 @@ class TestSimplifyTokens : public TestFixture { void simplifyKnownVariables63() { // #10798 tokenizeAndStringify("typedef void (*a)();\n" "enum class E { a };\n"); - ASSERT_EQUALS("", errout.str()); // don't throw + ASSERT_EQUALS("", errout_str()); // don't throw } void simplifyKnownVariablesBailOutAssign1() { @@ -2338,7 +2327,7 @@ class TestSimplifyTokens : public TestFixture { "for ( int i = 0 ; i < 10 ; ++ i ) { }\n" "}"; ASSERT_EQUALS(expected, tokenizeAndStringify(code, true)); - ASSERT_EQUALS("", errout.str()); // debug warnings + ASSERT_EQUALS("", errout_str()); // debug warnings } void simplifyKnownVariablesBailOutFor2() { @@ -2351,7 +2340,7 @@ class TestSimplifyTokens : public TestFixture { "while ( i < 10 ) { ++ i ; }\n" "}"; ASSERT_EQUALS(expected, tokenizeAndStringify(code, true)); - ASSERT_EQUALS("", errout.str()); // debug warnings + ASSERT_EQUALS("", errout_str()); // debug warnings } void simplifyKnownVariablesBailOutFor3() { @@ -2364,7 +2353,7 @@ class TestSimplifyTokens : public TestFixture { "{ }\n" "}"; ASSERT_EQUALS(expected, tokenizeAndStringify(code, true)); - ASSERT_EQUALS("", errout.str()); // debug warnings + ASSERT_EQUALS("", errout_str()); // debug warnings } void simplifyKnownVariablesBailOutMemberFunction() { @@ -2388,7 +2377,7 @@ class TestSimplifyTokens : public TestFixture { " return a;\n" "}\n"; tokenizeAndStringify(code,true); - ASSERT_EQUALS("", errout.str()); // no debug warnings + ASSERT_EQUALS("", errout_str()); // no debug warnings } void simplifyKnownVariablesBailOutSwitchBreak() { diff --git a/test/testsimplifytypedef.cpp b/test/testsimplifytypedef.cpp index 88109a1816d3..0b9391af1a50 100644 --- a/test/testsimplifytypedef.cpp +++ b/test/testsimplifytypedef.cpp @@ -237,8 +237,6 @@ class TestSimplifyTypedef : public TestFixture { #define tok(...) tok_(__FILE__, __LINE__, __VA_ARGS__) std::string tok_(const char* file, int line, const char code[], bool simplify = true, Platform::Type type = Platform::Type::Native, bool debugwarnings = true) { - errout.str(""); - // show warnings about unhandled typedef const Settings settings = settingsBuilder(settings0).exhaustive().certainty(Certainty::inconclusive).debugwarnings(debugwarnings).platform(type).build(); Tokenizer tokenizer(settings, this); @@ -250,8 +248,6 @@ class TestSimplifyTypedef : public TestFixture { } std::string simplifyTypedef(const char code[]) { - errout.str(""); - Tokenizer tokenizer(settings1, this); std::istringstream istr(code); @@ -265,9 +261,6 @@ class TestSimplifyTypedef : public TestFixture { std::string simplifyTypedefP(const char code[]) { - // Clear the error buffer.. - errout.str(""); - std::vector files(1, "test.cpp"); Tokenizer tokenizer(settings0, this); PreprocessorHelper::preprocess(code, files, tokenizer); @@ -281,7 +274,6 @@ class TestSimplifyTypedef : public TestFixture { #define checkSimplifyTypedef(code) checkSimplifyTypedef_(code, __FILE__, __LINE__) void checkSimplifyTypedef_(const char code[], const char* file, int line) { - errout.str(""); // Tokenize.. // show warnings about unhandled typedef const Settings settings = settingsBuilder(settings0).certainty(Certainty::inconclusive).debugwarnings().build(); @@ -292,8 +284,6 @@ class TestSimplifyTypedef : public TestFixture { std::string simplifyTypedefC(const char code[]) { - errout.str(""); - Tokenizer tokenizer(settings1, this); std::istringstream istr(code); @@ -419,7 +409,7 @@ class TestSimplifyTypedef : public TestFixture { const char code[] = "typedef int f(int);\n" "typedef const f cf;\n"; simplifyTypedefC(code); - ASSERT_EQUALS("[file.c:2]: (portability) It is unspecified behavior to const qualify a function type.\n", errout.str()); + ASSERT_EQUALS("[file.c:2]: (portability) It is unspecified behavior to const qualify a function type.\n", errout_str()); } void cfp1() { @@ -786,7 +776,7 @@ class TestSimplifyTypedef : public TestFixture { // Tokenize and check output.. tok(code); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyTypedef14() { @@ -805,7 +795,7 @@ class TestSimplifyTypedef : public TestFixture { // Tokenize and check output.. TODO_ASSERT_THROW(tok(code, true, Platform::Type::Native, false), InternalError); // TODO: Do not throw exception - //ASSERT_EQUALS("", errout.str()); + //ASSERT_EQUALS("", errout_str()); } void simplifyTypedef15() { @@ -838,7 +828,7 @@ class TestSimplifyTypedef : public TestFixture { // Tokenize and check output.. tok(code); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyTypedef17() { @@ -1130,6 +1120,7 @@ class TestSimplifyTypedef : public TestFixture { "}"; ASSERT_EQUALS(expected, tok(code, false)); + ASSERT_EQUALS("[test.cpp:4]: (debug) valueFlowConditionExpressions bailout: Skipping function due to incomplete variable value\n", errout_str()); } void simplifyTypedef28() { @@ -1452,7 +1443,7 @@ class TestSimplifyTypedef : public TestFixture { "}"; ASSERT_EQUALS(expected, tok(code, false)); - ASSERT_EQUALS_WITHOUT_LINENUMBERS("", errout.str()); + ASSERT_EQUALS_WITHOUT_LINENUMBERS("", errout_str()); } void simplifyTypedef36() { @@ -1487,7 +1478,7 @@ class TestSimplifyTypedef : public TestFixture { "struct AB : public A, public B { };"; const char expected[] = "struct AB : public C , public B { } ;"; ASSERT_EQUALS(expected, tok(code, false)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyTypedef43() { @@ -1505,7 +1496,7 @@ class TestSimplifyTypedef : public TestFixture { "int alloclen ; " "} ;"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { @@ -1521,7 +1512,7 @@ class TestSimplifyTypedef : public TestFixture { "int alloclen ; " "} ;"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { @@ -1537,7 +1528,7 @@ class TestSimplifyTypedef : public TestFixture { "int alloclen ; " "} ;"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } } @@ -1553,7 +1544,7 @@ class TestSimplifyTypedef : public TestFixture { "{ " "} ;"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { @@ -1567,7 +1558,7 @@ class TestSimplifyTypedef : public TestFixture { "{ " "} ;"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { @@ -1581,7 +1572,7 @@ class TestSimplifyTypedef : public TestFixture { "{ " "} ;"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { @@ -1596,7 +1587,7 @@ class TestSimplifyTypedef : public TestFixture { "{ " "} ;"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { @@ -1611,7 +1602,7 @@ class TestSimplifyTypedef : public TestFixture { "{ " "} ;"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { @@ -1623,7 +1614,7 @@ class TestSimplifyTypedef : public TestFixture { const char expected[] = "struct B { } ; namespace N { struct D : public B { } ; }"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { @@ -1636,7 +1627,7 @@ class TestSimplifyTypedef : public TestFixture { const char expected[] = "struct B { } ; namespace N { struct D : public B { } ; } const struct B cb ;"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } } @@ -1651,7 +1642,7 @@ class TestSimplifyTypedef : public TestFixture { ASSERT_EQUALS_WITHOUT_LINENUMBERS( "[test.cpp:3]: (debug) valueflow.cpp:6541:(valueFlow) bailout: valueFlowAfterCondition: bailing in conditional block\n" "[test.cpp:3]: (debug) valueflow.cpp:6541:(valueFlow) bailout: valueFlowAfterCondition: bailing in conditional block\n", // duplicate - errout.str()); + errout_str()); } void simplifyTypedef46() { @@ -1755,7 +1746,7 @@ class TestSimplifyTypedef : public TestFixture { // The expected result.. const char expected[] = "char ( * foo ( ) ) [ 10 ] { }"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { @@ -1782,7 +1773,7 @@ class TestSimplifyTypedef : public TestFixture { "}"; checkSimplifyTypedef(code); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyTypedef55() { @@ -1801,7 +1792,7 @@ class TestSimplifyTypedef : public TestFixture { // Check for output.. checkSimplifyTypedef(code); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyTypedef56() { // ticket #1829 @@ -1818,7 +1809,7 @@ class TestSimplifyTypedef : public TestFixture { "operatorconstvoid(*)()& ( ) { return pr ; } " "} ;"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyTypedef57() { // ticket #1846 @@ -1833,7 +1824,7 @@ class TestSimplifyTypedef : public TestFixture { "int a ; a = int ( 1 ) * int ( 2 ) ; " "} ;"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyTypedef58() { // ticket #1963 @@ -1844,7 +1835,7 @@ class TestSimplifyTypedef : public TestFixture { // The expected result.. const char expected[] = "int coords [ 4 ] [ 2 ] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 } ;"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { @@ -1854,7 +1845,7 @@ class TestSimplifyTypedef : public TestFixture { // The expected result.. const char expected[] = "int coords [ 4 ] [ 5 ] [ 6 + 1 ] [ 2 ] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 } ;"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } } @@ -1865,7 +1856,7 @@ class TestSimplifyTypedef : public TestFixture { // The expected result.. const char expected[] = "template < typename DISPATCHER > class SomeTemplateClass { } ;"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyTypedef60() { // ticket #2035 @@ -1879,7 +1870,7 @@ class TestSimplifyTypedef : public TestFixture { // The expected result.. const char expected[] = "enum qboolean { qfalse , qtrue } ; void f ( ) { enum qboolean b ; enum qboolean ( * f ) ( struct le_s * , entity_t * ) ; }"; ASSERT_EQUALS(expected, tok(code, false)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyTypedef61() { // ticket #2074 and 2075 @@ -1888,14 +1879,14 @@ class TestSimplifyTypedef : public TestFixture { // Check for output.. checkSimplifyTypedef(code1); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const char code2[] = "typedef unsigned long uint32_t;\n" "typedef uint32_t (*write_type_t) (uint32_t);"; // Check for output.. checkSimplifyTypedef(code2); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyTypedef62() { // ticket #2082 @@ -1908,7 +1899,7 @@ class TestSimplifyTypedef : public TestFixture { // The expected tokens.. const char expected1[] = "void f ( ) { char a [ 256 ] ; char b [ 256 ] ; }"; ASSERT_EQUALS(expected1, tok(code1, false)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const char code2[] = "typedef char TString[256];\n" "void f()\n" @@ -1919,7 +1910,7 @@ class TestSimplifyTypedef : public TestFixture { // The expected tokens.. const char expected2[] = "void f ( ) { char a [ 256 ] = { 0 } ; char b [ 256 ] = { 0 } ; }"; ASSERT_EQUALS(expected2, tok(code2, false, Platform::Type::Native, false)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const char code3[] = "typedef char TString[256];\n" "void f()\n" @@ -1930,7 +1921,7 @@ class TestSimplifyTypedef : public TestFixture { // The expected tokens.. const char expected3[] = "void f ( ) { char a [ 256 ] ; a = \"\" ; char b [ 256 ] ; b = \"\" ; }"; ASSERT_EQUALS(expected3, tok(code3, false, Platform::Type::Native, false)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const char code4[] = "typedef char TString[256];\n" "void f()\n" @@ -1941,7 +1932,7 @@ class TestSimplifyTypedef : public TestFixture { // The expected tokens.. const char expected4[] = "void f ( ) { char a [ 256 ] ; a = \"1234\" ; char b [ 256 ] ; b = \"5678\" ; }"; ASSERT_EQUALS(expected4, tok(code4, false, Platform::Type::Native, false)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyTypedef63() { // ticket #2175 'typedef float x[3];' @@ -1949,7 +1940,7 @@ class TestSimplifyTypedef : public TestFixture { "x a,b,c;"; const std::string actual(tok(code)); ASSERT_EQUALS("float a [ 3 ] ; float b [ 3 ] ; float c [ 3 ] ;", actual); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyTypedef64() { @@ -1957,7 +1948,7 @@ class TestSimplifyTypedef : public TestFixture { "__type t;"; const std::string actual(tok(code)); ASSERT_EQUALS("typeof ( __type1 ( ) + __type2 ( ) ) t ;", actual); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyTypedef65() { // ticket #2314 @@ -1968,14 +1959,14 @@ class TestSimplifyTypedef : public TestFixture { "}"; const std::string actual(tok(code, true, Platform::Type::Native, false)); ASSERT_EQUALS("int main ( ) { BAR < int > b ( 0 ) ; return b > BAR < int > ( 10 ) ; }", actual); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyTypedef66() { // ticket #2341 const char code[] = "typedef long* GEN;\n" "extern GEN (*foo)(long);"; tok(code); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyTypedef67() { // ticket #2354 @@ -1989,7 +1980,7 @@ class TestSimplifyTypedef : public TestFixture { "( ( int * * * ) global [ 6 ] ) ( \"assoc\" , \"eggdrop\" , 106 , 0 ) ; " "}"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("[test.cpp:3]: (debug) valueFlowConditionExpressions bailout: Skipping function due to incomplete variable global\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (debug) valueFlowConditionExpressions bailout: Skipping function due to incomplete variable global\n", errout_str()); } void simplifyTypedef68() { // ticket #2355 @@ -1997,7 +1988,7 @@ class TestSimplifyTypedef : public TestFixture { "void *(*b) ();"; const std::string actual(tok(code)); ASSERT_EQUALS("void * ( * b ) ( ) ;", actual); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyTypedef69() { // ticket #2348 @@ -2011,7 +2002,7 @@ class TestSimplifyTypedef : public TestFixture { "int ( * * ( * compilerHookVector ) ( void ) ) ( ) ; " "} ;"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyTypedef70() { // ticket #2348 @@ -2019,7 +2010,7 @@ class TestSimplifyTypedef : public TestFixture { "pread_f *(*test_func)(char *filename);"; const char expected[] = "int ( * ( * test_func ) ( char * filename ) ) ( int ) ;"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyTypedef71() { // ticket #2348 @@ -2028,14 +2019,14 @@ class TestSimplifyTypedef : public TestFixture { "RexxFunctionHandler *(efuncs[1]);"; const char expected[] = "int ( * ( efuncs [ 1 ] ) ) ( ) ;"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { const char code[] = "typedef int RexxFunctionHandler();\n" "RexxFunctionHandler *(efuncs[]) = { NULL, NULL };"; const char expected[] = "int ( * ( efuncs [ ] ) ) ( ) = { NULL , NULL } ;"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } } @@ -2051,7 +2042,7 @@ class TestSimplifyTypedef : public TestFixture { "operatorint** ( ) const { } " "} ;"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } // inline local variable { @@ -2064,7 +2055,7 @@ class TestSimplifyTypedef : public TestFixture { "void f1 ( ) const { int i ; } " "} ;"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } // out of line member variable { @@ -2079,7 +2070,7 @@ class TestSimplifyTypedef : public TestFixture { "} ; " "void Fred :: f1 ( ) const { int i ; f ( i ) ; }"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } // out of line operator { @@ -2094,7 +2085,7 @@ class TestSimplifyTypedef : public TestFixture { "} ; " "Fred :: operatorint** ( ) const { }"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } } @@ -2108,7 +2099,7 @@ class TestSimplifyTypedef : public TestFixture { "void f ( ) ; " "} ;"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyTypedef74() { // ticket #2414 @@ -2119,13 +2110,13 @@ class TestSimplifyTypedef : public TestFixture { const char expected[] = "long ( * ( * current_state ) ( void ) ) ( void ) ; current_state = death ; " "static char get_runlevel ( long ( * ( * const ) ( void ) ) ( void ) ) ;"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyTypedef75() { // ticket #2426 const char code[] = "typedef _Packed struct S { long l; };"; ASSERT_EQUALS(";", tok(code, true, Platform::Type::Native, false)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyTypedef76() { // ticket #2453 segmentation fault @@ -2170,7 +2161,7 @@ class TestSimplifyTypedef : public TestFixture { "sizeof ( struct s ) ; " "} ;"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyTypedef81() { // ticket #2603 segmentation fault @@ -2193,7 +2184,7 @@ class TestSimplifyTypedef : public TestFixture { " B * b = new B;\n" " b->f = new A::F * [ 10 ];\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyTypedef83() { // ticket #2620 @@ -2221,7 +2212,7 @@ class TestSimplifyTypedef : public TestFixture { const char code[] = "typedef FOO ((BAR)(void, int, const int, int*));"; const char expected[] = ";"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyTypedef86() { // ticket #2581 @@ -2238,21 +2229,21 @@ class TestSimplifyTypedef : public TestFixture { "safe_bool operator! ( ) const ; " "} ;"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyTypedef87() { // ticket #2651 const char code[] = "typedef FOO (*(*BAR)(void, int, const int, int*));"; const char expected[] = ";"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyTypedef88() { // ticket #2675 const char code[] = "typedef short int (*x)(...);"; const char expected[] = ";"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyTypedef89() { // ticket #2717 @@ -2262,7 +2253,7 @@ class TestSimplifyTypedef : public TestFixture { "};"; const char expected[] = "class Fred { void func ( int ) const ; } ;"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyTypedef90() { // ticket #2718 @@ -2270,7 +2261,7 @@ class TestSimplifyTypedef : public TestFixture { "void f(const IA&) {};"; const char expected[] = "void f ( const int ( & ) [ 2 ] ) { } ;"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyTypedef91() { // ticket #2716 @@ -2293,7 +2284,7 @@ class TestSimplifyTypedef : public TestFixture { "int * A :: f ( ) { } " "}"; ASSERT_EQUALS(expected1, tok(code1)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const char code2[] = "namespace NS {\n" " typedef int (*T)();\n" @@ -2310,7 +2301,7 @@ class TestSimplifyTypedef : public TestFixture { "} " "int * NS :: A :: f ( ) { }"; ASSERT_EQUALS(expected2, tok(code2)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const char code3[] = "namespace NS1 {\n" " namespace NS2 {\n" @@ -2339,7 +2330,7 @@ class TestSimplifyTypedef : public TestFixture { "} " "}"; ASSERT_EQUALS(expected3, tok(code3)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const char code4[] = "namespace NS1 {\n" " namespace NS2 {\n" @@ -2364,7 +2355,7 @@ class TestSimplifyTypedef : public TestFixture { "int * NS2 :: A :: f ( ) { } " "}"; ASSERT_EQUALS(expected4, tok(code4)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyTypedef92() { // ticket #2736 (segmentation fault) @@ -2372,7 +2363,7 @@ class TestSimplifyTypedef : public TestFixture { "namespace NS {\n" "}"; ASSERT_EQUALS(";", tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyTypedef93() { // ticket #2738 (syntax error) @@ -2380,7 +2371,7 @@ class TestSimplifyTypedef : public TestFixture { "typedef struct s (*binop) (struct s, struct s);"; const char expected[] = "struct s { double x ; } ;"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyTypedef94() { // ticket #1982 @@ -2399,7 +2390,7 @@ class TestSimplifyTypedef : public TestFixture { "} ; " "struct A :: data d ;"; ASSERT_EQUALS(expected1, tok(code1)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const char code2[] = "class A {\n" "public:\n" @@ -2416,7 +2407,7 @@ class TestSimplifyTypedef : public TestFixture { "} ; " "struct :: A :: data d ;"; ASSERT_EQUALS(expected2, tok(code2)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const char code3[] = "class A {\n" "public:\n" @@ -2433,7 +2424,7 @@ class TestSimplifyTypedef : public TestFixture { "} ; " "class B : public :: A :: data { } ;"; ASSERT_EQUALS(expected3, tok(code3)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyTypedef95() { // ticket #2844 @@ -2447,7 +2438,7 @@ class TestSimplifyTypedef : public TestFixture { "expression_error :: error_code ( * f ) ( void * , const char * , expression_space ) ; " "} ;"; ASSERT_EQUALS(expected, tok(code, true, Platform::Type::Native, false)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyTypedef96() { // ticket #2886 (segmentation fault) @@ -2459,19 +2450,19 @@ class TestSimplifyTypedef : public TestFixture { const char code[] = "typedef x y\n" "(A); y"; tok(code); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyTypedef99() { // ticket #2999 const char code[] = "typedef struct Fred Fred;\n" "struct Fred { };"; tok(code); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const char code1[] = "struct Fred { };\n" "typedef struct Fred Fred;"; tok(code1); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyTypedef100() { // ticket #3000 @@ -2482,7 +2473,7 @@ class TestSimplifyTypedef : public TestFixture { " return fred;\n" "}"; tok(code); - ASSERT_EQUALS_WITHOUT_LINENUMBERS("", errout.str()); + ASSERT_EQUALS_WITHOUT_LINENUMBERS("", errout_str()); } void simplifyTypedef101() { // ticket #3003 (segmentation fault) @@ -2498,7 +2489,7 @@ class TestSimplifyTypedef : public TestFixture { " Fred * Fred;\n" "}"; tok(code); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyTypedef103() { // ticket #3007 @@ -2508,19 +2499,19 @@ class TestSimplifyTypedef : public TestFixture { " Fred Fred;\n" "}"; tok(code); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyTypedef104() { // ticket #3070 const char code[] = "typedef int (*in_func) (void FAR *, unsigned char FAR * FAR *);"; ASSERT_EQUALS(";", tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyTypedef105() { // ticket #3616 (segmentation fault) const char code[] = "( int typedef char x; ){}"; tok(code); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyTypedef106() { // ticket #3619 (segmentation fault) @@ -2531,6 +2522,7 @@ class TestSimplifyTypedef : public TestFixture { void simplifyTypedef107() { // ticket #3963 (bad code => segmentation fault) const char code[] = "typedef int x[]; int main() { return x }"; ASSERT_EQUALS("int main ( ) { return x }", tok(code)); + (void)errout_str(); // we do not care about the output } void simplifyTypedef108() { // ticket #4777 @@ -2551,7 +2543,7 @@ class TestSimplifyTypedef : public TestFixture { "rref var = 0;"; const char expected[] = "int && var = 0 ;"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyTypedef110() { @@ -2611,7 +2603,7 @@ class TestSimplifyTypedef : public TestFixture { "} " "}"; ASSERT_EQUALS(expected, tok(code, true, Platform::Type::Native, false)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyTypedef111() { // ticket #6345 @@ -2675,7 +2667,7 @@ class TestSimplifyTypedef : public TestFixture { "domain_dim = SpaceType :: TrafoType :: Evaluator < SpaceType :: TrafoType :: ShapeType , DataType > :: Type :: domain_dim , " "} ; } ;"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyTypedef113() { // ticket #7030 @@ -2699,7 +2691,7 @@ class TestSimplifyTypedef : public TestFixture { const char expected[] = "unsigned int t1 ; " "unsigned int t2 ;"; ASSERT_EQUALS(expected, tok(code, false)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyTypedef116() { // #5624 @@ -2715,7 +2707,7 @@ class TestSimplifyTypedef : public TestFixture { "std :: vector < CharacterConversion > ( ) . swap ( c2c ) ; " "}"; ASSERT_EQUALS(expected, tok(code, false)); - ASSERT_EQUALS_WITHOUT_LINENUMBERS("", errout.str()); + ASSERT_EQUALS_WITHOUT_LINENUMBERS("", errout_str()); } void simplifyTypedef117() { // #6507 @@ -2728,7 +2720,7 @@ class TestSimplifyTypedef : public TestFixture { "return ( struct bstr ) { ( unsigned char * ) s , s ? strlen ( s ) : 0 } ; " "}"; ASSERT_EQUALS(expected, tok(code, false)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyTypedef118() { // #5749 @@ -2744,7 +2736,7 @@ class TestSimplifyTypedef : public TestFixture { "return & ClassyClass :: id ; " "} }"; ASSERT_EQUALS(expected, tok(code, false)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyTypedef119() { // #7541 @@ -2756,7 +2748,7 @@ class TestSimplifyTypedef : public TestFixture { "enum Bar { XX = 1 };"; const char exp[] = "enum Bar { XX = 1 } ;"; ASSERT_EQUALS(exp, tok(code, false)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyTypedef120() { // #8357 @@ -2766,7 +2758,7 @@ class TestSimplifyTypedef : public TestFixture { const char exp[] = "static const char bad_chars [ ] [ 5 ] = { } ; " "static void report_good ( bool passed , const char c [ 5 ] ) { } ;"; ASSERT_EQUALS(exp, tok(code, false)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyTypedef121() { // #5766 @@ -2803,13 +2795,13 @@ class TestSimplifyTypedef : public TestFixture { "const float * & Fred :: vc ( ) const { return v3 ; } " "const float * * & Fred :: mc ( ) const { return m3x3 ; }"; ASSERT_EQUALS(exp, tok(code, false)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyTypedef122() { // segmentation fault const char code[] = "int result = [] { return git_run_cmd(\"update-index\",\"update-index -q --refresh\"); }();"; tok(code); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyTypedef123() { // ticket #7406 @@ -2817,7 +2809,7 @@ class TestSimplifyTypedef : public TestFixture { "Dummy y;"; const char exp[] = "Dummy < int [ 1 ] > y ;"; ASSERT_EQUALS(exp, tok(code, false)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyTypedef124() { // ticket #7792 @@ -2827,14 +2819,14 @@ class TestSimplifyTypedef : public TestFixture { const char exp[] = "long f ( long s ) ;"; ASSERT_EQUALS(exp, tok(code, /*simplify*/ true)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const char code1[] = "typedef long unsigned int uint32_t;\n" "typedef uint32_t (my_func)(char *, uint32_t, uint32_t, void *);"; // Check for output.. checkSimplifyTypedef(code1); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } @@ -2985,6 +2977,7 @@ class TestSimplifyTypedef : public TestFixture { "using array_p = const array_t *;\n" "array_p x;\n"; ASSERT_EQUALS("using array_p = const unsigned char ( * ) [ 16 ] ; array_p x ;", tok(code, false)); + ASSERT_EQUALS("[test.cpp:2]: (debug) Failed to parse 'using array_p = const unsigned char ( * ) [ 16 ] ;'. The checking continues anyway.\n", errout_str()); } void simplifyTypedef134() { @@ -3089,7 +3082,7 @@ class TestSimplifyTypedef : public TestFixture { "} " "struct external :: ns1 :: B<1> { } ;"; ASSERT_EQUALS(exp, tok(code, true, Platform::Type::Native, true)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { // no using "namespace external::ns1;" @@ -3122,7 +3115,7 @@ class TestSimplifyTypedef : public TestFixture { "} " "struct external :: ns1 :: B<1> { } ;"; ASSERT_EQUALS(exp, tok(code, true, Platform::Type::Native, true)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { // using "namespace external::ns1;" without redundant qualification @@ -3172,7 +3165,7 @@ class TestSimplifyTypedef : public TestFixture { "} " "struct external :: ns1 :: B<1> { } ;"; TODO_ASSERT_EQUALS(exp, act, tok(code, true, Platform::Type::Native, true)); - TODO_ASSERT_EQUALS("", "[test.cpp:14]: (debug) Executable scope 'f' with unknown function.\n", errout.str()); + TODO_ASSERT_EQUALS("", "[test.cpp:14]: (debug) Executable scope 'f' with unknown function.\n", errout_str()); } { // using "namespace external::ns1;" without redundant qualification on declaration and definition @@ -3221,7 +3214,7 @@ class TestSimplifyTypedef : public TestFixture { "void A :: f ( V ) { } " "}"; TODO_ASSERT_EQUALS(exp, act, tok(code, true, Platform::Type::Native, true)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { const char code[] = "namespace external {\n" @@ -3251,7 +3244,7 @@ class TestSimplifyTypedef : public TestFixture { "} " "struct external :: B<1> { } ;"; ASSERT_EQUALS(exp, tok(code, true, Platform::Type::Native, true)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { const char code[] = "template struct B { };\n" @@ -3279,7 +3272,7 @@ class TestSimplifyTypedef : public TestFixture { "} " "struct B<1> { } ;"; ASSERT_EQUALS(exp, tok(code, true, Platform::Type::Native, true)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } } @@ -3305,6 +3298,10 @@ class TestSimplifyTypedef : public TestFixture { ASSERT_EQUALS( "struct Anonymous0 { struct c * b ; } ; struct Anonymous0 * d ; void e ( struct c * a ) { if ( a < d [ 0 ] . b ) { } }", tok(code)); + ASSERT_EQUALS_WITHOUT_LINENUMBERS( + "[test.cpp:6]: (debug) valueflow.cpp:6730:(valueFlow) bailout: valueFlowAfterCondition: bailing in conditional block\n" + "[test.cpp:6]: (debug) valueflow.cpp:6730:(valueFlow) bailout: valueFlowAfterCondition: bailing in conditional block\n", // duplicate + errout_str()); } void simplifyTypedef140() { @@ -3406,12 +3403,14 @@ class TestSimplifyTypedef : public TestFixture { " sizeof(t);\n" "}\n"; ASSERT_EQUALS("void g ( ) { sizeof ( t ) ; }", tok(code)); // TODO: handle implicit int + (void)errout_str(); // we do not care about the output code = "typedef t[3];\n" "void g() {\n" " sizeof(t);\n" "}\n"; ASSERT_EQUALS("void g ( ) { sizeof ( t ) ; }", tok(code)); // TODO: handle implicit int + (void)errout_str(); // we do not care about the output } void simplifyTypedef146() { @@ -3522,7 +3521,7 @@ class TestSimplifyTypedef : public TestFixture { // The expected result.. const char expected[] = "std :: queue < void ( * ) ( ) > func_queue ;"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { @@ -3532,7 +3531,7 @@ class TestSimplifyTypedef : public TestFixture { // The expected result.. const char expected[] = "std :: queue < void ( * ) ( void ) > func_queue ;"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { @@ -3542,7 +3541,7 @@ class TestSimplifyTypedef : public TestFixture { // The expected result.. const char expected[] = "std :: queue < void ( * ) ( int ) > func_queue ;"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { @@ -3552,7 +3551,7 @@ class TestSimplifyTypedef : public TestFixture { // The expected result.. const char expected[] = "std :: queue < void ( * ) ( int * ) > func_queue ;"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { @@ -3563,7 +3562,7 @@ class TestSimplifyTypedef : public TestFixture { // The expected result.. const char expected[] = "std :: queue < void ( * ) ( arg_class * ) > func_queue ;"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } @@ -3574,7 +3573,7 @@ class TestSimplifyTypedef : public TestFixture { // The expected result.. const char expected[] = "std :: queue < void ( * ) ( ) > func_queue ;"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { @@ -3584,7 +3583,7 @@ class TestSimplifyTypedef : public TestFixture { // The expected result.. const char expected[] = "std :: queue < void ( * ) ( void ) > func_queue ;"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { @@ -3594,7 +3593,7 @@ class TestSimplifyTypedef : public TestFixture { // The expected result.. const char expected[] = "std :: queue < void ( * ) ( int ) > func_queue ;"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { @@ -3604,7 +3603,7 @@ class TestSimplifyTypedef : public TestFixture { // The expected result.. const char expected[] = "std :: queue < void ( * ) ( int * ) > func_queue ;"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { @@ -3614,7 +3613,7 @@ class TestSimplifyTypedef : public TestFixture { // The expected result.. const char expected[] = "std :: queue < void ( * ) ( arg_class * ) > func_queue ;"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } @@ -3625,7 +3624,7 @@ class TestSimplifyTypedef : public TestFixture { // The expected result.. const char expected[] = "std :: queue < void ( * ) ( ) > func_queue ;"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { @@ -3635,7 +3634,7 @@ class TestSimplifyTypedef : public TestFixture { // The expected result.. const char expected[] = "std :: queue < void ( * ) ( void ) > func_queue ;"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { @@ -3645,7 +3644,7 @@ class TestSimplifyTypedef : public TestFixture { // The expected result.. const char expected[] = "std :: queue < void ( * ) ( int ) > func_queue ;"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { @@ -3655,7 +3654,7 @@ class TestSimplifyTypedef : public TestFixture { // The expected result.. const char expected[] = "std :: queue < void ( * ) ( int * ) > func_queue ;"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { @@ -3665,7 +3664,7 @@ class TestSimplifyTypedef : public TestFixture { // The expected result.. const char expected[] = "std :: queue < void ( * ) ( arg_class * ) > func_queue ;"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } @@ -3676,7 +3675,7 @@ class TestSimplifyTypedef : public TestFixture { // The expected result.. const char expected[] = "std :: queue < void ( * ) ( ) > func_queue ;"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { @@ -3686,7 +3685,7 @@ class TestSimplifyTypedef : public TestFixture { // The expected result.. const char expected[] = "std :: queue < void ( * ) ( void ) > func_queue ;"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { @@ -3696,7 +3695,7 @@ class TestSimplifyTypedef : public TestFixture { // The expected result.. const char expected[] = "std :: queue < void ( * ) ( int ) > func_queue ;"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { @@ -3706,7 +3705,7 @@ class TestSimplifyTypedef : public TestFixture { // The expected result.. const char expected[] = "std :: queue < void ( * ) ( int * ) > func_queue ;"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { @@ -3716,7 +3715,7 @@ class TestSimplifyTypedef : public TestFixture { // The expected result.. const char expected[] = "std :: queue < void ( * ) ( arg_class * ) > func_queue ;"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } } @@ -3755,7 +3754,7 @@ class TestSimplifyTypedef : public TestFixture { "C ( * f6 ) ( ) ; " "C ( * f7 ) ( ) ;"; ASSERT_EQUALS(expected, tok(code, true, Platform::Type::Native, false)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { @@ -3784,7 +3783,7 @@ class TestSimplifyTypedef : public TestFixture { "const C ( * f6 ) ( ) ; " "const C ( * f7 ) ( ) ;"; ASSERT_EQUALS(expected, tok(code, true, Platform::Type::Native, false)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { @@ -3812,7 +3811,7 @@ class TestSimplifyTypedef : public TestFixture { "const C ( * f6 ) ( ) ; " "const C ( * f7 ) ( ) ;"; ASSERT_EQUALS(expected, tok(code, true, Platform::Type::Native, false)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { @@ -3840,7 +3839,7 @@ class TestSimplifyTypedef : public TestFixture { "C * ( * f6 ) ( ) ; " "C * ( * f7 ) ( ) ;"; ASSERT_EQUALS(expected, tok(code, true, Platform::Type::Native, false)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { @@ -3868,7 +3867,7 @@ class TestSimplifyTypedef : public TestFixture { "const C * ( * f6 ) ( ) ; " "const C * ( * f7 ) ( ) ;"; ASSERT_EQUALS(expected, tok(code, true, Platform::Type::Native, false)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { @@ -3897,7 +3896,7 @@ class TestSimplifyTypedef : public TestFixture { "const C * ( * f6 ) ( ) ; " "const C * ( * f7 ) ( ) ;"; ASSERT_EQUALS(expected, tok(code, true, Platform::Type::Native, false)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } } @@ -3914,7 +3913,7 @@ class TestSimplifyTypedef : public TestFixture { "int * t2 ( bool ) ; " "int * t3 ( bool ) ;"; ASSERT_EQUALS(expected, tok(code, false)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyTypedefFunction5() { @@ -3957,7 +3956,7 @@ class TestSimplifyTypedef : public TestFixture { "int ( :: C :: * volatile t11 ) ( float ) ; " "int ( :: C :: * const volatile t12 ) ( float ) ;"; ASSERT_EQUALS(expected, tok(code, false)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyTypedefFunction6() { @@ -3984,7 +3983,7 @@ class TestSimplifyTypedef : public TestFixture { "void * Fred :: get4 ( ) { return 0 ; }"; ASSERT_EQUALS(expected, tok(code, false)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyTypedefFunction7() { @@ -3995,7 +3994,7 @@ class TestSimplifyTypedef : public TestFixture { const char expected[] = "void ( __gnu_cxx :: _SGIAssignableConcept < _Tp > :: * X ) ( ) ;"; ASSERT_EQUALS(expected, tok(code, false)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyTypedefFunction8() { @@ -4003,7 +4002,7 @@ class TestSimplifyTypedef : public TestFixture { const char code[] = "typedef int f_expand(const nrv_byte *);\n" "void f(f_expand *(*get_fexp(int))){}"; checkSimplifyTypedef(code); - TODO_ASSERT_EQUALS("", "[test.cpp:2]: (debug) Function::addArguments found argument 'int' with varid 0.\n", errout.str()); // make sure that there is no internal error + TODO_ASSERT_EQUALS("", "[test.cpp:2]: (debug) Function::addArguments found argument 'int' with varid 0.\n", errout_str()); // make sure that there is no internal error } void simplifyTypedefFunction9() { @@ -4023,7 +4022,7 @@ class TestSimplifyTypedef : public TestFixture { ":: C ( :: C :: * f3 ) ( ) volatile ; " ":: C ( :: C :: * f4 ) ( ) const volatile ;"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { @@ -4042,7 +4041,7 @@ class TestSimplifyTypedef : public TestFixture { "B :: C ( * f3 ) ( ) ; " "B :: C ( * f4 ) ( ) ;"; ASSERT_EQUALS(expected, tok(code, true, Platform::Type::Native, false)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { @@ -4061,7 +4060,7 @@ class TestSimplifyTypedef : public TestFixture { ":: B :: C ( :: B :: C :: * f3 ) ( ) volatile ; " ":: B :: C ( :: B :: C :: * f4 ) ( ) const volatile ;"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { @@ -4080,7 +4079,7 @@ class TestSimplifyTypedef : public TestFixture { "A :: B :: C ( * f3 ) ( ) ; " "A :: B :: C ( * f4 ) ( ) ;"; ASSERT_EQUALS(expected, tok(code, true, Platform::Type::Native, false)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } } diff --git a/test/testsimplifyusing.cpp b/test/testsimplifyusing.cpp index 806e874fc4e7..2ae94df58af8 100644 --- a/test/testsimplifyusing.cpp +++ b/test/testsimplifyusing.cpp @@ -96,8 +96,6 @@ class TestSimplifyUsing : public TestFixture { #define tok(...) tok_(__FILE__, __LINE__, __VA_ARGS__) std::string tok_(const char* file, int line, const char code[], Platform::Type type = Platform::Type::Native, bool debugwarnings = true, bool preprocess = false) { - errout.str(""); - const Settings settings = settingsBuilder(settings0).certainty(Certainty::inconclusive).debugwarnings(debugwarnings).platform(type).build(); Tokenizer tokenizer(settings, this); @@ -391,7 +389,7 @@ class TestSimplifyUsing : public TestFixture { "}"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyUsing14() { @@ -408,7 +406,7 @@ class TestSimplifyUsing : public TestFixture { "};"; TODO_ASSERT_THROW(tok(code, Platform::Type::Native, false), InternalError); // TODO: Do not throw AST validation exception - //ASSERT_EQUALS("", errout.str()); + //ASSERT_EQUALS("", errout_str()); } void simplifyUsing15() { @@ -445,7 +443,7 @@ class TestSimplifyUsing : public TestFixture { "struct STRFOO s ;"; ASSERT_EQUALS(expected, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyUsing17() { @@ -487,6 +485,7 @@ class TestSimplifyUsing : public TestFixture { "}\n" "}"; tok(code); // don't hang + (void)errout_str(); // we are not interested in the output } void simplifyUsing20() { @@ -531,6 +530,7 @@ class TestSimplifyUsing : public TestFixture { "}\n" "}}}}}}}"; tok(code); // don't hang + (void)errout_str(); // we do not care about the output } void simplifyUsing21() { @@ -562,6 +562,7 @@ class TestSimplifyUsing : public TestFixture { "} " "} } } } }"; ASSERT_EQUALS(expected, tok(code)); // don't hang + (void)errout_str(); // we do not care about the output } void simplifyUsing23() { @@ -672,7 +673,7 @@ class TestSimplifyUsing : public TestFixture { "}\n"; const char expected[] = "void f ( ) { int * p { new int } ; }"; ASSERT_EQUALS(expected, tok(code, Platform::Type::Native, /*debugwarnings*/ true)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyUsing29() { // #11981 @@ -680,7 +681,7 @@ class TestSimplifyUsing : public TestFixture { "void f(T = T()) {}\n"; const char expected[] = "void f ( int * = ( int * ) 0 ) { }"; ASSERT_EQUALS(expected, tok(code, Platform::Type::Native, /*debugwarnings*/ true)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyUsing30() { @@ -691,20 +692,20 @@ class TestSimplifyUsing : public TestFixture { "}\n"; const char expected[] = "void f ( ) { std :: string str ; str = std :: to_string ( 1 ) ; }"; ASSERT_EQUALS(expected, tok(code, Platform::Type::Native, /*debugwarnings*/ true)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { const char code[] = "using std::cout, std::endl, std::cerr, std::ostringstream;\n" "cerr << \"abc\";\n"; const char expected[] = "std :: cerr << \"abc\" ;"; ASSERT_EQUALS(expected, tok(code, Platform::Type::Native, /*debugwarnings*/ true)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { const char code[] = "using std::string_view_literals::operator\"\"sv;\n"; const char expected[] = "using std :: string_view_literals :: operator\"\"sv ;"; ASSERT_EQUALS(expected, tok(code, Platform::Type::Native, /*debugwarnings*/ true)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { const char code[] = "template \n" @@ -722,7 +723,7 @@ class TestSimplifyUsing : public TestFixture { "vector ( ) { } " "} ;"; ASSERT_EQUALS(expected, tok(code, Platform::Type::Native, /*debugwarnings*/ true)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { const char code[] = "using namespace ::std;\n" @@ -734,7 +735,7 @@ class TestSimplifyUsing : public TestFixture { "cout << std :: string ( c ) << \"abc\" ; " "}"; ASSERT_EQUALS(expected, tok(code, Platform::Type::Native, /*debugwarnings*/ true)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } } @@ -1009,7 +1010,7 @@ class TestSimplifyUsing : public TestFixture { "} " "struct external :: ns1 :: B<1> { } ;"; ASSERT_EQUALS(exp, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { // no using "namespace external::ns1;" @@ -1042,7 +1043,7 @@ class TestSimplifyUsing : public TestFixture { "} " "struct external :: ns1 :: B<1> { } ;"; ASSERT_EQUALS(exp, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { // using "namespace external::ns1;" without redundant qualification @@ -1077,7 +1078,7 @@ class TestSimplifyUsing : public TestFixture { "} " "struct external :: ns1 :: B<1> { } ;"; ASSERT_EQUALS(exp, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { // using "namespace external::ns1;" without redundant qualification on declaration and definition @@ -1112,7 +1113,7 @@ class TestSimplifyUsing : public TestFixture { "} " "struct external :: ns1 :: B<1> { } ;"; ASSERT_EQUALS(exp, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { const char code[] = "namespace external {\n" @@ -1142,7 +1143,7 @@ class TestSimplifyUsing : public TestFixture { "} " "struct external :: B<1> { } ;"; ASSERT_EQUALS(exp, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { const char code[] = "template struct B { };\n" @@ -1170,7 +1171,7 @@ class TestSimplifyUsing : public TestFixture { "} " "struct B<1> { } ;"; ASSERT_EQUALS(exp, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } } @@ -1196,7 +1197,7 @@ class TestSimplifyUsing : public TestFixture { "} ; " "void A :: f ( const std :: vector < char > & ) const { }"; ASSERT_EQUALS(exp, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { const char code[] = "namespace NS1 {\n" @@ -1255,7 +1256,7 @@ class TestSimplifyUsing : public TestFixture { "c . f ( v ) ; " "}"; ASSERT_EQUALS(exp, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { const char code[] = "foo::ResultCodes_e\n" @@ -1283,6 +1284,7 @@ class TestSimplifyUsing : public TestFixture { " return ret;\n" "}"; tok(code); // don't crash + (void)errout_str(); // we do not care about the output } } @@ -1315,7 +1317,7 @@ class TestSimplifyUsing : public TestFixture { "void B :: f ( const std :: vector < unsigned char > & ) const { } " "}"; ASSERT_EQUALS(exp, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyUsing10172() { @@ -1344,7 +1346,7 @@ class TestSimplifyUsing : public TestFixture { "void B :: f ( std :: function < void ( ) > ) { } " "}"; ASSERT_EQUALS(exp, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { const char code[] = "namespace ns {\n" @@ -1379,7 +1381,7 @@ class TestSimplifyUsing : public TestFixture { "} " "}"; ASSERT_EQUALS(exp, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } } @@ -1405,7 +1407,7 @@ class TestSimplifyUsing : public TestFixture { "Pr < st > p ; " "}"; ASSERT_EQUALS(exp, tok(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { const char code[] = "namespace defsa {\n" @@ -1428,6 +1430,7 @@ class TestSimplifyUsing : public TestFixture { "} " "}"; ASSERT_EQUALS(exp, tok(code)); + (void)errout_str(); // we do not care about the output } } @@ -1446,7 +1449,7 @@ class TestSimplifyUsing : public TestFixture { "STAMP(B, A);\n" "STAMP(C, B);\n"; tok(code, Platform::Type::Native, /*debugwarnings*/ true, /*preprocess*/ true); - ASSERT(startsWith(errout.str(), "[test.cpp:6]: (debug) Failed to parse 'using C = S < S < S < int")); + ASSERT(startsWith(errout_str(), "[test.cpp:6]: (debug) Failed to parse 'using C = S < S < S < int")); } void scopeInfo1() { @@ -1457,7 +1460,7 @@ class TestSimplifyUsing : public TestFixture { "namespace spdlog { class logger; }\n" "using LoggerPtr = std::shared_ptr;"; tok(code); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void scopeInfo2() { @@ -1469,7 +1472,7 @@ class TestSimplifyUsing : public TestFixture { "static void getInitialProgramState(const A::Map& vars = A::Map {})\n" "{}\n"; tok(code); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } }; diff --git a/test/testsingleexecutor.cpp b/test/testsingleexecutor.cpp index b858a98cfe9c..4db0307257ff 100644 --- a/test/testsingleexecutor.cpp +++ b/test/testsingleexecutor.cpp @@ -71,8 +71,6 @@ class TestSingleExecutorBase : public TestFixture { }; void check(int files, int result, const std::string &data, const CheckOptions& opt = make_default_obj{}) { - errout.str(""); - std::list fileSettings; std::list> filelist; @@ -158,19 +156,29 @@ class TestSingleExecutorBase : public TestFixture { } void many_files() { - check(100, 100, + const int num_files = 100; + check(num_files, num_files, "int main()\n" "{\n" " int i = *((int*)0);\n" " return 0;\n" "}", dinit(CheckOptions, $.quiet = false)); - std::string expected; - for (int i = 1; i <= 100; ++i) { - expected += "Checking " + fprefix() + "_" + zpad3(i) + ".cpp ...\n"; - expected += std::to_string(i) + "/100 files checked " + std::to_string(i) + "% done\n"; + { + std::string expected; + for (int i = 1; i <= num_files; ++i) { + expected += "Checking " + fprefix() + "_" + zpad3(i) + ".cpp ...\n"; + expected += std::to_string(i) + "/100 files checked " + std::to_string(i) + "% done\n"; + } + ASSERT_EQUALS(expected, output_str()); + } + { + std::string expected; + for (int i = 1; i <= num_files; ++i) { + expected += "[" + fprefix() + "_" + zpad3(i) + ".cpp:3]: (error) Null pointer dereference: (int*)0\n"; + } + ASSERT_EQUALS(expected, errout_str()); } - ASSERT_EQUALS(expected, output_str()); } void many_files_showtime() { @@ -181,6 +189,8 @@ class TestSingleExecutorBase : public TestFixture { " int i = *((int*)0);\n" " return 0;\n" "}", dinit(CheckOptions, $.showtime = SHOWTIME_MODES::SHOWTIME_SUMMARY)); + // we are not interested in the results - so just consume them + (void)errout_str(); } void many_files_plist() { @@ -193,6 +203,8 @@ class TestSingleExecutorBase : public TestFixture { " int i = *((int*)0);\n" " return 0;\n" "}", dinit(CheckOptions, $.plistOutput = plistOutput.c_str())); + // we are not interested in the results - so just consume them + (void)errout_str(); } void no_errors_more_files() { @@ -226,15 +238,24 @@ class TestSingleExecutorBase : public TestFixture { " {int i = *((int*)0);}\n" " return 0;\n" "}"); + ASSERT_EQUALS("[" + fprefix() + "_" + zpad3(1) + ".cpp:3]: (error) Null pointer dereference: (int*)0\n", errout_str()); } void one_error_several_files() { - check(20, 20, + const int num_files = 20; + check(num_files, num_files, "int main()\n" "{\n" " {int i = *((int*)0);}\n" " return 0;\n" "}"); + { + std::string expected; + for (int i = 1; i <= num_files; ++i) { + expected += "[" + fprefix() + "_" + zpad3(i) + ".cpp:3]: (error) Null pointer dereference: (int*)0\n"; + } + ASSERT_EQUALS(expected, errout_str()); + } } void clangTidy() { @@ -334,7 +355,7 @@ class TestSingleExecutorBase : public TestFixture { " int i = *((int*)0);\n" " return 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); settings = settingsOld; } @@ -351,7 +372,7 @@ class TestSingleExecutorBase : public TestFixture { ASSERT_EQUALS( "[" + inc_h.name() + ":3]: (error) Null pointer dereference: (int*)0\n" "[" + inc_h.name() + ":3]: (error) Null pointer dereference: (int*)0\n", - errout.str()); + errout_str()); } // TODO: test whole program analysis diff --git a/test/testsizeof.cpp b/test/testsizeof.cpp index 3276788d6933..9a2d4366269c 100644 --- a/test/testsizeof.cpp +++ b/test/testsizeof.cpp @@ -50,9 +50,6 @@ class TestSizeof : public TestFixture { #define check(code) check_(code, __FILE__, __LINE__) void check_(const char code[], const char* file, int line) { - // Clear the error buffer.. - errout.str(""); - // Tokenize.. Tokenizer tokenizer(settings, this); std::istringstream istr(code); @@ -64,9 +61,6 @@ class TestSizeof : public TestFixture { #define checkP(...) checkP_(__FILE__, __LINE__, __VA_ARGS__) void checkP_(const char* file, int line, const char code[]) { - // Clear the error buffer.. - errout.str(""); - std::vector files(1, "test.cpp"); Tokenizer tokenizer(settings, this); PreprocessorHelper::preprocess(code, files, tokenizer); @@ -83,48 +77,48 @@ class TestSizeof : public TestFixture { "{\n" " int i = sizeof sizeof char;\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Calling 'sizeof' on 'sizeof'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Calling 'sizeof' on 'sizeof'.\n", errout_str()); check("void foo()\n" "{\n" " int i = sizeof (sizeof long);\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Calling 'sizeof' on 'sizeof'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Calling 'sizeof' on 'sizeof'.\n", errout_str()); check("void foo(long *p)\n" "{\n" " int i = sizeof (sizeof (p));\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Calling 'sizeof' on 'sizeof'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Calling 'sizeof' on 'sizeof'.\n", errout_str()); } void sizeofCalculation() { check("int a, b; int a,sizeof(a+b)"); - ASSERT_EQUALS("[test.cpp:1]: (warning) Found calculation inside sizeof().\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (warning) Found calculation inside sizeof().\n", errout_str()); check("int a, b; sizeof(a*b)"); - ASSERT_EQUALS("[test.cpp:1]: (warning) Found calculation inside sizeof().\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (warning) Found calculation inside sizeof().\n", errout_str()); check("int a, b; sizeof(-a)"); - ASSERT_EQUALS("[test.cpp:1]: (warning) Found calculation inside sizeof().\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (warning) Found calculation inside sizeof().\n", errout_str()); check("int a, b; sizeof(*a)"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("sizeof(void * const)"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("sizeof(int*[2])"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("sizeof(Fred**)"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("sizeof(foo++)"); - ASSERT_EQUALS("[test.cpp:1]: (warning) Found calculation inside sizeof().\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (warning) Found calculation inside sizeof().\n", errout_str()); check("sizeof(--foo)"); - ASSERT_EQUALS("[test.cpp:1]: (warning) Found calculation inside sizeof().\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (warning) Found calculation inside sizeof().\n", errout_str()); // #6888 checkP("#define SIZEOF1 sizeof(i != 2)\n" @@ -138,7 +132,7 @@ class TestSizeof : public TestFixture { " VOIDCAST2(SIZEOF2);\n" " return i + foo(1);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkP("#define SIZEOF1 sizeof(i != 2)\n" "#define SIZEOF2 ((sizeof(i != 2)))\n" @@ -148,11 +142,11 @@ class TestSizeof : public TestFixture { " return i + foo(1);\n" "}"); ASSERT_EQUALS("[test.cpp:4]: (warning, inconclusive) Found calculation inside sizeof().\n" - "[test.cpp:5]: (warning, inconclusive) Found calculation inside sizeof().\n", errout.str()); + "[test.cpp:5]: (warning, inconclusive) Found calculation inside sizeof().\n", errout_str()); checkP("#define MACRO(data) f(data, sizeof(data))\n" "x = MACRO((unsigned int *)data + 4);"); - ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Found calculation inside sizeof().\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Found calculation inside sizeof().\n", errout_str()); } void sizeofFunction() { @@ -161,7 +155,7 @@ class TestSizeof : public TestFixture { " int bar() { return 1; };\n" "}\n" "Foo f;int a=sizeof(f.bar());"); - ASSERT_EQUALS("[test.cpp:5]: (warning) Found function call inside sizeof().\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (warning) Found function call inside sizeof().\n", errout_str()); check("class Foo\n" "{\n" @@ -169,35 +163,35 @@ class TestSizeof : public TestFixture { " int bar() const { return 1; };\n" "}\n" "Foo f;int a=sizeof(f.bar());"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class Foo\n" "{\n" " int bar() { return 1; };\n" "}\n" "Foo * fp;int a=sizeof(fp->bar());"); - ASSERT_EQUALS("[test.cpp:5]: (warning) Found function call inside sizeof().\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (warning) Found function call inside sizeof().\n", errout_str()); check("int a=sizeof(foo());"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int foo() { return 1; }; int a=sizeof(foo());"); - ASSERT_EQUALS("[test.cpp:1]: (warning) Found function call inside sizeof().\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (warning) Found function call inside sizeof().\n", errout_str()); check("int foo() { return 1; }; sizeof(decltype(foo()));"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int foo(int) { return 1; }; int a=sizeof(foo(0))"); - ASSERT_EQUALS("[test.cpp:1]: (warning) Found function call inside sizeof().\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (warning) Found function call inside sizeof().\n", errout_str()); check("char * buf; int a=sizeof(*buf);"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int a=sizeof(foo())"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int foo(int) { return 1; }; char buf[1024]; int a=sizeof(buf), foo(0)"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("template\n" "struct A\n" @@ -213,7 +207,7 @@ class TestSizeof : public TestFixture { " Z = X & Y\n" " };\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void sizeofForArrayParameter() { @@ -221,7 +215,7 @@ class TestSizeof : public TestFixture { " int a[10];\n" " std::cout << sizeof(a) / sizeof(int) << std::endl;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " unsigned int a = 2;\n" @@ -229,7 +223,7 @@ class TestSizeof : public TestFixture { " int c[(a+b)];\n" " std::cout << sizeof(c) / sizeof(int) << std::endl;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " unsigned int a = { 2 };\n" @@ -237,7 +231,7 @@ class TestSizeof : public TestFixture { " int c[a[b[0]]];\n" " std::cout << sizeof(c) / sizeof(int) << std::endl;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" @@ -246,56 +240,56 @@ class TestSizeof : public TestFixture { " int c[(a[0]+b)];\n" " std::cout << sizeof(c) / sizeof(int) << std::endl;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " int a[] = { 1, 2, 3 };\n" " std::cout << sizeof(a) / sizeof(int) << std::endl;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " int a[3] = { 1, 2, 3 };\n" " std::cout << sizeof(a) / sizeof(int) << std::endl;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f( int a[]) {\n" " std::cout << sizeof(a) / sizeof(int) << std::endl;\n" "}"); ASSERT_EQUALS("[test.cpp:2]: (warning) Using 'sizeof' on array given as " - "function argument returns size of a pointer.\n", errout.str()); + "function argument returns size of a pointer.\n", errout_str()); check("void f( int a[]) {\n" " std::cout << sizeof a / sizeof(int) << std::endl;\n" "}"); ASSERT_EQUALS("[test.cpp:2]: (warning) Using 'sizeof' on array given as " - "function argument returns size of a pointer.\n", errout.str()); + "function argument returns size of a pointer.\n", errout_str()); check("void f( int a[3] ) {\n" " std::cout << sizeof(a) / sizeof(int) << std::endl;\n" "}"); ASSERT_EQUALS("[test.cpp:2]: (warning) Using 'sizeof' on array given as " - "function argument returns size of a pointer.\n", errout.str()); + "function argument returns size of a pointer.\n", errout_str()); check("typedef char Fixname[1000];\n" "int f2(Fixname& f2v) {\n" " int i = sizeof(f2v);\n" " printf(\"sizeof f2v %d\", i);\n" " }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int *p) {\n" " p[0] = 0;\n" " int unused = sizeof(p);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " char p[] = \"test\";\n" " int unused = sizeof(p);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // ticket #2495 check("void f() {\n" @@ -309,33 +303,33 @@ class TestSizeof : public TestFixture { " };\n" " const int COL_MAX=sizeof(col)/sizeof(col[0]);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // ticket #155 check("void f() {\n" " char buff1[1024*64],buff2[sizeof(buff1)*2];\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // ticket #2510 check("void f( int a[], int b) {\n" " std::cout << sizeof(a) / sizeof(int) << std::endl;\n" "}"); ASSERT_EQUALS("[test.cpp:2]: (warning) Using 'sizeof' on array given as " - "function argument returns size of a pointer.\n", errout.str()); + "function argument returns size of a pointer.\n", errout_str()); // ticket #2510 check("void f( int a[3] , int b[2] ) {\n" " std::cout << sizeof(a) / sizeof(int) << std::endl;\n" "}"); ASSERT_EQUALS("[test.cpp:2]: (warning) Using 'sizeof' on array given as " - "function argument returns size of a pointer.\n", errout.str()); + "function argument returns size of a pointer.\n", errout_str()); // ticket #2510 check("void f() {\n" " char buff1[1024*64],buff2[sizeof(buff1)*(2+1)];\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } @@ -343,22 +337,22 @@ class TestSizeof : public TestFixture { check("void f() {\n" " std::cout << sizeof(10) << std::endl;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Suspicious usage of 'sizeof' with a numeric constant as parameter.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Suspicious usage of 'sizeof' with a numeric constant as parameter.\n", errout_str()); check("void f() {\n" " std::cout << sizeof(-10) << std::endl;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Suspicious usage of 'sizeof' with a numeric constant as parameter.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Suspicious usage of 'sizeof' with a numeric constant as parameter.\n", errout_str()); check("void f() {\n" " std::cout << sizeof 10 << std::endl;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Suspicious usage of 'sizeof' with a numeric constant as parameter.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Suspicious usage of 'sizeof' with a numeric constant as parameter.\n", errout_str()); check("void f() {\n" " std::cout << sizeof -10 << std::endl;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Suspicious usage of 'sizeof' with a numeric constant as parameter.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Suspicious usage of 'sizeof' with a numeric constant as parameter.\n", errout_str()); } void suspiciousSizeofCalculation() { @@ -366,68 +360,68 @@ class TestSizeof : public TestFixture { " int* p;\n" " return sizeof(p)/5;\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning, inconclusive) Division of result of sizeof() on pointer type.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning, inconclusive) Division of result of sizeof() on pointer type.\n", errout_str()); check("void f() {\n" " unknown p;\n" " return sizeof(p)/5;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " return sizeof(unknown)/5;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " int p;\n" " return sizeof(p)/5;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " int* p[5];\n" " return sizeof(p)/5;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " return sizeof(foo)*sizeof(bar);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Multiplying sizeof() with sizeof() indicates a logic error.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Multiplying sizeof() with sizeof() indicates a logic error.\n", errout_str()); check("void f() {\n" " return (foo)*sizeof(bar);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " return sizeof(foo)*bar;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " return (end - source) / sizeof(encode_block_type) * sizeof(encode_block_type);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S { T* t; };\n" // #10179 "int f(S* s) {\n" " return g(sizeof(*s->t) / 4);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " const char* a[N];\n" " for (int i = 0; i < (int)(sizeof(a) / sizeof(char*)); i++) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f(int** p) {\n" " return sizeof(p[0]) / 4;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Division of result of sizeof() on pointer type.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Division of result of sizeof() on pointer type.\n", errout_str()); check("struct S {\n" " unsigned char* s;\n" @@ -438,7 +432,7 @@ class TestSizeof : public TestFixture { "void f(T* t) {\n" " for (size_t i = 0; i < sizeof(t->s) / sizeof(t->s[0]); i++) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S {\n" " struct T {\n" @@ -448,18 +442,18 @@ class TestSizeof : public TestFixture { "void f(S* s) {\n" " for (int i = 0; i != sizeof(s->t[0].c) / sizeof(char*); i++) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int32_t* buf, size_t len) {\n" " for (int i = 0; i < len / sizeof(buf[0]); i++) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int32_t*** buf, size_t len) {\n" " for (int i = 0; i < len / sizeof(**buf[0]); i++) {}\n" " for (int i = 0; i < len / sizeof(*buf[0][0]); i++) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void checkPointerSizeof() { @@ -467,49 +461,49 @@ class TestSizeof : public TestFixture { " char *x = malloc(10);\n" " free(x);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " int *x = malloc(sizeof(*x));\n" " free(x);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " int *x = malloc(sizeof(int));\n" " free(x);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " int *x = malloc(sizeof(x));\n" " free(x);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Size of pointer 'x' used instead of size of its data.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Size of pointer 'x' used instead of size of its data.\n", errout_str()); check("void f() {\n" " int *x = (int*)malloc(sizeof(x));\n" " free(x);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Size of pointer 'x' used instead of size of its data.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Size of pointer 'x' used instead of size of its data.\n", errout_str()); check("void f() {\n" " int *x = static_cast(malloc(sizeof(x)));\n" " free(x);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Size of pointer 'x' used instead of size of its data.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Size of pointer 'x' used instead of size of its data.\n", errout_str()); check("void f() {\n" " int *x = malloc(sizeof(&x));\n" " free(x);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Size of pointer 'x' used instead of size of its data.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Size of pointer 'x' used instead of size of its data.\n", errout_str()); check("void f() {\n" " int *x = malloc(sizeof(int*));\n" " free(x);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Size of pointer 'x' used instead of size of its data.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Size of pointer 'x' used instead of size of its data.\n", errout_str()); check("void f() {\n" " int *x = malloc(sizeof(int));\n" @@ -517,155 +511,155 @@ class TestSizeof : public TestFixture { " int **y = malloc(sizeof(int*));\n" " free(y);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " int *x = malloc(100 * sizeof(x));\n" " free(x);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Size of pointer 'x' used instead of size of its data.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Size of pointer 'x' used instead of size of its data.\n", errout_str()); check("void f() {\n" " int *x = malloc(sizeof(x) * 100);\n" " free(x);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Size of pointer 'x' used instead of size of its data.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Size of pointer 'x' used instead of size of its data.\n", errout_str()); check("void f() {\n" " int *x = malloc(sizeof *x);\n" " free(x);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " int *x = malloc(sizeof x);\n" " free(x);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Size of pointer 'x' used instead of size of its data.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Size of pointer 'x' used instead of size of its data.\n", errout_str()); check("void f() {\n" " int *x = malloc(100 * sizeof x);\n" " free(x);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Size of pointer 'x' used instead of size of its data.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Size of pointer 'x' used instead of size of its data.\n", errout_str()); check("void f() {\n" " int *x = calloc(1, sizeof(*x));\n" " free(x);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " int *x = calloc(1, sizeof *x);\n" " free(x);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " int *x = calloc(1, sizeof(x));\n" " free(x);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Size of pointer 'x' used instead of size of its data.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Size of pointer 'x' used instead of size of its data.\n", errout_str()); check("void f() {\n" " int *x = calloc(1, sizeof x);\n" " free(x);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Size of pointer 'x' used instead of size of its data.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Size of pointer 'x' used instead of size of its data.\n", errout_str()); check("void f() {\n" " int *x = calloc(1, sizeof(int));\n" " free(x);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " char x[10];\n" " memset(x, 0, sizeof(x));\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " char* x[10];\n" " memset(x, 0, sizeof(x));\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " char x[10];\n" " memset(x, 0, sizeof x);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " int *x = malloc(sizeof(int));\n" " memset(x, 0, sizeof(int));\n" " free(x);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " int *x = malloc(sizeof(int));\n" " memset(x, 0, sizeof(*x));\n" " free(x);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " int *x = malloc(sizeof(int));\n" " memset(x, 0, sizeof *x);\n" " free(x);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " int *x = malloc(sizeof(int));\n" " memset(x, 0, sizeof x);\n" " free(x);\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Size of pointer 'x' used instead of size of its data.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Size of pointer 'x' used instead of size of its data.\n", errout_str()); check("void f() {\n" " int *x = malloc(sizeof(int));\n" " memset(x, 0, sizeof(x));\n" " free(x);\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Size of pointer 'x' used instead of size of its data.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Size of pointer 'x' used instead of size of its data.\n", errout_str()); check("void f() {\n" " int *x = malloc(sizeof(int) * 10);\n" " memset(x, 0, sizeof(x) * 10);\n" " free(x);\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Size of pointer 'x' used instead of size of its data.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Size of pointer 'x' used instead of size of its data.\n", errout_str()); check("void f() {\n" " int *x = malloc(sizeof(int) * 10);\n" " memset(x, 0, sizeof x * 10);\n" " free(x);\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Size of pointer 'x' used instead of size of its data.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Size of pointer 'x' used instead of size of its data.\n", errout_str()); check("void f() {\n" " int *x = malloc(sizeof(int) * 10);\n" " memset(x, 0, sizeof(*x) * 10);\n" " free(x);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " int *x = malloc(sizeof(int) * 10);\n" " memset(x, 0, sizeof *x * 10);\n" " free(x);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " int *x = malloc(sizeof(int) * 10);\n" " memset(x, 0, sizeof(int) * 10);\n" " free(x);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check( "int fun(const char *buf1)\n" @@ -673,18 +667,18 @@ class TestSizeof : public TestFixture { " const char *buf1_ex = \"foobarbaz\";\n" " return strncmp(buf1, buf1_ex, sizeof(buf1_ex)) == 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (warning) Size of pointer 'buf1_ex' used instead of size of its data.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (warning) Size of pointer 'buf1_ex' used instead of size of its data.\n", errout_str()); check( "int fun(const char *buf1) {\n" " return strncmp(buf1, foo(buf2), sizeof(buf1)) == 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Size of pointer 'buf1' used instead of size of its data.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Size of pointer 'buf1' used instead of size of its data.\n", errout_str()); check("int fun(const char *buf2) {\n" " return strncmp(buf1, buf2, sizeof(char*)) == 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Size of pointer 'buf2' used instead of size of its data.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Size of pointer 'buf2' used instead of size of its data.\n", errout_str()); // #ticket 3874 check("void f()\n" @@ -692,25 +686,25 @@ class TestSizeof : public TestFixture { " int * pIntArray[10];\n" " memset(pIntArray, 0, sizeof(pIntArray));\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void FreeFileName(const char *s) {\n" " CxString tbuf;\n" " const char *p;\n" " memcpy(s, siezof(s));\n" // non-standard memcpy "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f() {\n" " module_config_t *tab = module;\n" " memset(tab + confsize, 0, sizeof(tab[confsize]));\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f(char* aug) {\n" " memmove(aug + extra_string, aug, buf - (bfd_byte *)aug);\n" // #7100 "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #7518 check("bool create_iso_definition(cpp_reader *pfile, cpp_macro *macro) {\n" @@ -718,13 +712,13 @@ class TestSizeof : public TestFixture { " cpp_hashnode **params = malloc(sizeof(cpp_hashnode *) * macro->paramc);\n" " memcpy(params, macro->params, sizeof(cpp_hashnode *) * macro->paramc);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void* foo() {\n" " void* AtomName = malloc(sizeof(char *) * 34);\n" " return AtomName;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void checkPointerSizeofStruct() { @@ -732,7 +726,7 @@ class TestSizeof : public TestFixture { " struct foo *ptr;\n" " memset( ptr->bar, 0, sizeof ptr->bar );\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " struct foo {\n" @@ -740,7 +734,7 @@ class TestSizeof : public TestFixture { " }* ptr;\n" " memset( ptr->bar, 0, sizeof ptr->bar );\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " struct foo {\n" @@ -748,7 +742,7 @@ class TestSizeof : public TestFixture { " }* ptr;\n" " memset( ptr->bar, 0, sizeof ptr->bar );\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (warning) Size of pointer 'bar' used instead of size of its data.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (warning) Size of pointer 'bar' used instead of size of its data.\n", errout_str()); } void sizeofDivisionMemset() { @@ -757,18 +751,18 @@ class TestSizeof : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Division of result of sizeof() on pointer type.\n" "[test.cpp:2]: (warning) Division by result of sizeof(). memmove() expects a size in bytes, did you intend to multiply instead?\n", - errout.str()); + errout_str()); check("Foo* allocFoo(int num) {\n" " return malloc(num / sizeof(Foo));\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Division by result of sizeof(). malloc() expects a size in bytes, did you intend to multiply instead?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Division by result of sizeof(). malloc() expects a size in bytes, did you intend to multiply instead?\n", errout_str()); check("void f() {\n" " char str[100];\n" " strncpy(str, xyz, sizeof(str)/sizeof(str[0]));\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" // #9648 " int a[5] = { 0 };\n" @@ -776,20 +770,20 @@ class TestSizeof : public TestFixture { " memcpy(b, a, ((sizeof(a) / sizeof(a[0])) - 1) * sizeof(a[0]));\n" " memcpy(b, a, sizeof(a[0]) * ((sizeof(a) / sizeof(a[0])) - 1));\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void sizeofVoid() { check("void f() {\n" " int size = sizeof(void);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (portability) Behaviour of 'sizeof(void)' is not covered by the ISO C standard.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (portability) Behaviour of 'sizeof(void)' is not covered by the ISO C standard.\n", errout_str()); check("void f() {\n" " void* p;\n" " int size = sizeof(*p);\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (portability) '*p' is of type 'void', the behaviour of 'sizeof(void)' is not covered by the ISO C standard.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (portability) '*p' is of type 'void', the behaviour of 'sizeof(void)' is not covered by the ISO C standard.\n", errout_str()); check("void f() {\n" " void* p = malloc(10);\n" @@ -799,7 +793,7 @@ class TestSizeof : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:3]: (portability) 'p' is of type 'void *'. When using void pointers in calculations, the behaviour is undefined.\n" "[test.cpp:4]: (portability) 'p' is of type 'void *'. When using void pointers in calculations, the behaviour is undefined.\n" - "[test.cpp:5]: (portability) 'p' is of type 'void *'. When using void pointers in calculations, the behaviour is undefined.\n", errout.str()); + "[test.cpp:5]: (portability) 'p' is of type 'void *'. When using void pointers in calculations, the behaviour is undefined.\n", errout_str()); check("void f() {\n" " void* p1 = malloc(10);\n" @@ -808,7 +802,7 @@ class TestSizeof : public TestFixture { " p2++;\n" "}"); ASSERT_EQUALS("[test.cpp:4]: (portability) 'p1' is of type 'void *'. When using void pointers in calculations, the behaviour is undefined.\n" - "[test.cpp:5]: (portability) 'p2' is of type 'void *'. When using void pointers in calculations, the behaviour is undefined.\n", errout.str()); + "[test.cpp:5]: (portability) 'p2' is of type 'void *'. When using void pointers in calculations, the behaviour is undefined.\n", errout_str()); check("void f() {\n" " void* p1 = malloc(10);\n" @@ -817,61 +811,61 @@ class TestSizeof : public TestFixture { " p2+=4;\n" "}"); ASSERT_EQUALS("[test.cpp:4]: (portability) 'p1' is of type 'void *'. When using void pointers in calculations, the behaviour is undefined.\n" - "[test.cpp:5]: (portability) 'p2' is of type 'void *'. When using void pointers in calculations, the behaviour is undefined.\n", errout.str()); + "[test.cpp:5]: (portability) 'p2' is of type 'void *'. When using void pointers in calculations, the behaviour is undefined.\n", errout_str()); check("void f() {\n" " void* p = malloc(10);\n" " int* p2 = &p + 4;\n" " int* p3 = &p - 1;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " void** p1 = malloc(10);\n" " p1--;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " void** p1;\n" " int j = sizeof(*p1);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " void* p1[5];\n" " int j = sizeof(*p1);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Calculations on void* with casts check("void f(void *data) {\n" " *((unsigned char *)data + 1) = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(void *data) {\n" " *((unsigned char *)(data) + 1) = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(void *data) {\n" " unsigned char* c = (unsigned char *)(data + 1);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (portability) 'data' is of type 'void *'. When using void pointers in calculations, the behaviour is undefined.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (portability) 'data' is of type 'void *'. When using void pointers in calculations, the behaviour is undefined.\n", errout_str()); check("void f(void *data) {\n" " unsigned char* c = (unsigned char *)data++;\n" " unsigned char* c2 = (unsigned char *)++data;\n" "}"); ASSERT_EQUALS("[test.cpp:2]: (portability) 'data' is of type 'void *'. When using void pointers in calculations, the behaviour is undefined.\n" - "[test.cpp:3]: (portability) 'data' is of type 'void *'. When using void pointers in calculations, the behaviour is undefined.\n", errout.str()); + "[test.cpp:3]: (portability) 'data' is of type 'void *'. When using void pointers in calculations, the behaviour is undefined.\n", errout_str()); check("void f(void *data) {\n" " void* data2 = data + 1;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (portability) 'data' is of type 'void *'. When using void pointers in calculations, the behaviour is undefined.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (portability) 'data' is of type 'void *'. When using void pointers in calculations, the behaviour is undefined.\n", errout_str()); // #4908 (void pointer as a member of a struct/class) check("struct FOO {\n" @@ -883,7 +877,7 @@ class TestSizeof : public TestFixture { " return x;\n" "}"); ASSERT_EQUALS("[test.cpp:5]: (portability) 'foo.data' is of type 'void *'. When using void pointers in calculations, the behaviour is undefined.\n" - "[test.cpp:6]: (portability) 'foo.data' is of type 'void *'. When using void pointers in calculations, the behaviour is undefined.\n", errout.str()); + "[test.cpp:6]: (portability) 'foo.data' is of type 'void *'. When using void pointers in calculations, the behaviour is undefined.\n", errout_str()); check("struct FOO {\n" " void *data;\n" @@ -906,7 +900,7 @@ class TestSizeof : public TestFixture { "void f4(struct BOO* boo) {\n" " char c = *((char*)boo->data.data + 1);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct FOO {\n" " void *data;\n" @@ -914,7 +908,7 @@ class TestSizeof : public TestFixture { "char f(struct FOO* foo) {\n" " *(foo[1].data + 1) = 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (portability) 'foo[1].data' is of type 'void *'. When using void pointers in calculations, the behaviour is undefined.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (portability) 'foo[1].data' is of type 'void *'. When using void pointers in calculations, the behaviour is undefined.\n", errout_str()); check("struct FOO {\n" " void *data;\n" @@ -922,12 +916,12 @@ class TestSizeof : public TestFixture { "void f2(struct FOO* foo) {\n" " (foo[0]).data++;\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (portability) '(foo[0]).data' is of type 'void *'. When using void pointers in calculations, the behaviour is undefined.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (portability) '(foo[0]).data' is of type 'void *'. When using void pointers in calculations, the behaviour is undefined.\n", errout_str()); // #6050 arithmetic on void** check("void* array[10];\n" "void** b = array + 3;"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void customStrncat() { diff --git a/test/teststl.cpp b/test/teststl.cpp index 5c9a7c60d070..eeb3058e2210 100644 --- a/test/teststl.cpp +++ b/test/teststl.cpp @@ -179,9 +179,6 @@ class TestStl : public TestFixture { #define check(...) check_(__FILE__, __LINE__, __VA_ARGS__) void check_(const char* file, int line, const char code[], const bool inconclusive = false, const Standards::cppstd_t cppstandard = Standards::CPPLatest) { - // Clear the error buffer.. - errout.str(""); - const Settings settings1 = settingsBuilder(settings).certainty(Certainty::inconclusive, inconclusive).cpp(cppstandard).build(); // Tokenize.. @@ -199,9 +196,6 @@ class TestStl : public TestFixture { #define checkNormal(code) checkNormal_(code, __FILE__, __LINE__) void checkNormal_(const char code[], const char* file, int line) { - // Clear the error buffer.. - errout.str(""); - // Tokenize.. Tokenizer tokenizer(settings, this); std::istringstream istr(code); @@ -230,19 +224,19 @@ class TestStl : public TestFixture { "test.cpp:9:note:Access out of bounds\n" "test.cpp:9:warning:Either the condition 'v.size()>=2' is redundant or size of 'v' can be 2. Expression 'v[3]' causes access out of bounds.\n" "test.cpp:8:note:condition 'v.size()>=2'\n" - "test.cpp:9:note:Access out of bounds\n", errout.str()); + "test.cpp:9:note:Access out of bounds\n", errout_str()); checkNormal("void f() {\n" " std::string s;\n" " s[10] = 1;\n" "}"); - ASSERT_EQUALS("test.cpp:3:error:Out of bounds access in expression 's[10]' because 's' is empty.\n", errout.str()); + ASSERT_EQUALS("test.cpp:3:error:Out of bounds access in expression 's[10]' because 's' is empty.\n", errout_str()); checkNormal("void f() {\n" " std::string s = \"abcd\";\n" " s[10] = 1;\n" "}"); - ASSERT_EQUALS("test.cpp:3:error:Out of bounds access in 's[10]', if 's' size is 4 and '10' is 10\n", errout.str()); + ASSERT_EQUALS("test.cpp:3:error:Out of bounds access in 's[10]', if 's' size is 4 and '10' is 10\n", errout_str()); checkNormal("void f(std::vector v) {\n" " v.front();\n" @@ -250,7 +244,7 @@ class TestStl : public TestFixture { "}"); ASSERT_EQUALS("test.cpp:2:warning:Either the condition 'v.empty()' is redundant or expression 'v.front()' causes access out of bounds.\n" "test.cpp:3:note:condition 'v.empty()'\n" - "test.cpp:2:note:Access out of bounds\n", errout.str()); + "test.cpp:2:note:Access out of bounds\n", errout_str()); checkNormal("void f(std::vector v) {\n" " if (v.size() == 3) {}\n" @@ -258,7 +252,7 @@ class TestStl : public TestFixture { "}"); ASSERT_EQUALS("test.cpp:3:warning:Either the condition 'v.size()==3' is redundant or size of 'v' can be 3. Expression 'v[16]' causes access out of bounds.\n" "test.cpp:2:note:condition 'v.size()==3'\n" - "test.cpp:3:note:Access out of bounds\n", errout.str()); + "test.cpp:3:note:Access out of bounds\n", errout_str()); checkNormal("void f(std::vector v) {\n" " int i = 16;\n" @@ -268,18 +262,18 @@ class TestStl : public TestFixture { "}"); ASSERT_EQUALS("test.cpp:4:warning:Either the condition 'v.size()==3' is redundant or size of 'v' can be 3. Expression 'v[i]' causes access out of bounds.\n" "test.cpp:3:note:condition 'v.size()==3'\n" - "test.cpp:4:note:Access out of bounds\n", errout.str()); + "test.cpp:4:note:Access out of bounds\n", errout_str()); checkNormal("void f(std::vector v, int i) {\n" " if (v.size() == 3 || i == 16) {}\n" " v[i] = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkNormal("void f(std::map x) {\n" " if (x.empty()) { x[1] = 2; }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkNormal("void f(std::string s) {\n" " if (s.size() == 1) {\n" @@ -288,7 +282,7 @@ class TestStl : public TestFixture { "}"); ASSERT_EQUALS("test.cpp:3:warning:Either the condition 's.size()==1' is redundant or size of 's' can be 1. Expression 's[2]' causes access out of bounds.\n" "test.cpp:2:note:condition 's.size()==1'\n" - "test.cpp:3:note:Access out of bounds\n", errout.str()); + "test.cpp:3:note:Access out of bounds\n", errout_str()); // Do not crash checkNormal("void a() {\n" @@ -296,19 +290,19 @@ class TestStl : public TestFixture { " for (auto c : b)\n" " c.data();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkNormal("std::string f(std::string x) {\n" " if (x.empty()) return {};\n" " x[0];\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkNormal("std::string f(std::string x) {\n" " if (x.empty()) return std::string{};\n" " x[0];\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkNormal("void f() {\n" " std::string s;\n" @@ -317,35 +311,35 @@ class TestStl : public TestFixture { ASSERT_EQUALS( "test.cpp:3:error:Out of bounds access in expression 's.begin()+1' because 's' is empty.\n" "test.cpp:3:error:Out of bounds access in expression 's.begin()+1' because 's' is empty.\n", // duplicate - errout.str()); + errout_str()); checkNormal("void f(int x) {\n" " std::string s;\n" " auto it = s.begin() + x;\n" "}"); - ASSERT_EQUALS("test.cpp:3:error:Out of bounds access in expression 's.begin()+x' because 's' is empty and 'x' may be non-zero.\n", errout.str()); + ASSERT_EQUALS("test.cpp:3:error:Out of bounds access in expression 's.begin()+x' because 's' is empty and 'x' may be non-zero.\n", errout_str()); checkNormal("char fstr1(){const std::string s = \"\"; return s[42]; }\n" "wchar_t fwstr1(){const std::wstring s = L\"\"; return s[42]; }"); ASSERT_EQUALS("test.cpp:1:error:Out of bounds access in 's[42]', if 's' size is 6 and '42' is 42\n" - "test.cpp:2:error:Out of bounds access in 's[42]', if 's' size is 6 and '42' is 42\n", errout.str()); + "test.cpp:2:error:Out of bounds access in 's[42]', if 's' size is 6 and '42' is 42\n", errout_str()); checkNormal("char fstr1(){const std::string s = \"\"; return s[1]; }\n" "wchar_t fwstr1(){const std::wstring s = L\"\"; return s[1]; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkNormal("int f() {\n" " std::vector v;\n" " std::vector * pv = &v;\n" " return (*pv)[42];\n" "}"); - ASSERT_EQUALS("test.cpp:4:error:Out of bounds access in expression '(*pv)[42]' because '*pv' is empty.\n", errout.str()); + ASSERT_EQUALS("test.cpp:4:error:Out of bounds access in expression '(*pv)[42]' because '*pv' is empty.\n", errout_str()); checkNormal("void f() {\n" " std::string s;\n" " ++abc[s];\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // # 9274 checkNormal("char f(bool b) {\n" @@ -354,14 +348,14 @@ class TestStl : public TestFixture { " if(b) ++x;\n" " return s[x];\n" "}"); - ASSERT_EQUALS("test.cpp:5:error:Out of bounds access in 's[x]', if 's' size is 6 and 'x' is 6\n", errout.str()); + ASSERT_EQUALS("test.cpp:5:error:Out of bounds access in 's[x]', if 's' size is 6 and 'x' is 6\n", errout_str()); checkNormal("void f() {\n" " static const int N = 4;\n" " std::array x;\n" " x[0] = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkNormal("void f(bool b) {\n" " std::vector x;\n" @@ -371,7 +365,7 @@ class TestStl : public TestFixture { " return;\n" " x[0] = 2;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkNormal("void f(bool b) {\n" " std::vector v;\n" @@ -379,7 +373,7 @@ class TestStl : public TestFixture { "}\n"); ASSERT_EQUALS( "test.cpp:3:error:Out of bounds access in expression 'v.at(b?42:0)' because 'v' is empty.\n", - errout.str()); + errout_str()); checkNormal("void f(std::vector v, bool b){\n" " if (v.size() == 1)\n" @@ -389,7 +383,7 @@ class TestStl : public TestFixture { "test.cpp:3:warning:Either the condition 'v.size()==1' is redundant or size of 'v' can be 1. Expression 'v.at(b?42:0)' causes access out of bounds.\n" "test.cpp:2:note:condition 'v.size()==1'\n" "test.cpp:3:note:Access out of bounds\n", - errout.str()); + errout_str()); check("struct T {\n" " std::vector* v;\n" @@ -404,7 +398,7 @@ class TestStl : public TestFixture { " g(s);\n" " return ArrS[0];\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct T {\n" " std::vector* v;\n" @@ -420,7 +414,7 @@ class TestStl : public TestFixture { " return ArrS[0];\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct T {\n" " std::vector* v;\n" @@ -436,7 +430,7 @@ class TestStl : public TestFixture { " return ArrS[0];\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct T {\n" " std::vector* v;\n" @@ -452,7 +446,7 @@ class TestStl : public TestFixture { " return ArrS[0];\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct T {\n" " std::vector* v;\n" @@ -468,7 +462,7 @@ class TestStl : public TestFixture { " return ArrS[0];\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct T {\n" " std::vector* v;\n" @@ -484,7 +478,7 @@ class TestStl : public TestFixture { " return ArrS[0];\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkNormal("extern void Bar(const double, const double);\n" "void f(std::vector &r, const double ) {\n" @@ -500,7 +494,7 @@ class TestStl : public TestFixture { " Bar(0.0, result[0]);\n" " Bar(0.34, result[1]);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkNormal("void f(size_t entries) {\n" " std::vector v;\n" @@ -508,7 +502,7 @@ class TestStl : public TestFixture { " v.resize(entries + 2);\n" " v[0] = 1;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkNormal("void f(size_t entries) {\n" " std::vector v;\n" @@ -516,7 +510,7 @@ class TestStl : public TestFixture { " v.resize(entries);\n" " v[0] = 1;\n" "}\n"); - ASSERT_EQUALS("test.cpp:5:error:Out of bounds access in expression 'v[0]' because 'v' is empty.\n", errout.str()); + ASSERT_EQUALS("test.cpp:5:error:Out of bounds access in expression 'v[0]' because 'v' is empty.\n", errout_str()); checkNormal("void f(size_t entries) {\n" " if (entries < 2) return;\n" @@ -525,7 +519,7 @@ class TestStl : public TestFixture { " v.resize(entries);\n" " v[0] = 1;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkNormal("void f(size_t entries) {\n" " if (entries == 0) return;\n" @@ -534,7 +528,7 @@ class TestStl : public TestFixture { " v.resize(entries);\n" " v[0] = 1;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkNormal("void foo(std::vector* PArr, int n) {\n" " std::vector Arr;\n" @@ -544,7 +538,7 @@ class TestStl : public TestFixture { " for (int i = 0; i < n; ++i)\n" " (*PArr)[i] = 1;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkNormal("int f() {\n" " std::vector v;\n" @@ -552,7 +546,7 @@ class TestStl : public TestFixture { " return (*pv).at(42);\n" "}\n"); ASSERT_EQUALS("test.cpp:4:error:Out of bounds access in expression '(*pv).at(42)' because '*pv' is empty.\n", - errout.str()); + errout_str()); checkNormal("std::string f(const char* DirName) {\n" " if (DirName == nullptr)\n" @@ -562,7 +556,7 @@ class TestStl : public TestFixture { " Name += '\\\\';\n" " return Name;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkNormal("bool f(bool b) {\n" " std::vector v;\n" @@ -573,7 +567,7 @@ class TestStl : public TestFixture { " return true;\n" " return false;\n" "}\n"); - ASSERT_EQUALS("test.cpp:5:style:Consider using std::any_of algorithm instead of a raw loop.\n", errout.str()); + ASSERT_EQUALS("test.cpp:5:style:Consider using std::any_of algorithm instead of a raw loop.\n", errout_str()); checkNormal("std::vector range(int n);\n" "bool f(bool b) {\n" @@ -586,7 +580,7 @@ class TestStl : public TestFixture { " return true;\n" " return false;\n" "}\n"); - ASSERT_EQUALS("test.cpp:7:style:Consider using std::any_of algorithm instead of a raw loop.\n", errout.str()); + ASSERT_EQUALS("test.cpp:7:style:Consider using std::any_of algorithm instead of a raw loop.\n", errout_str()); checkNormal("bool g();\n" "int f(int x) {\n" @@ -599,7 +593,7 @@ class TestStl : public TestFixture { " return i;\n" " return 0;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkNormal("bool g();\n" "int f(int x) {\n" @@ -612,7 +606,7 @@ class TestStl : public TestFixture { " return i;\n" " return 0;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkNormal("bool g();\n" "void f(int x) {\n" @@ -624,14 +618,14 @@ class TestStl : public TestFixture { " for (int i = 0; i < n; ++i)\n" " h(v[i]);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkNormal("void foo(const std::vector &v) {\n" " if(v.size() >=1 && v[0] == 4 && v[1] == 2){}\n" "}\n"); ASSERT_EQUALS("test.cpp:2:warning:Either the condition 'v.size()>=1' is redundant or size of 'v' can be 1. Expression 'v[1]' causes access out of bounds.\n" "test.cpp:2:note:condition 'v.size()>=1'\n" - "test.cpp:2:note:Access out of bounds\n", errout.str()); + "test.cpp:2:note:Access out of bounds\n", errout_str()); checkNormal("int f(int x, int y) {\n" " std::vector a = {0,1,2};\n" @@ -645,20 +639,20 @@ class TestStl : public TestFixture { "test.cpp:6:warning:Either the condition 'x<2' is redundant or 'x' can have the value greater or equal to 3. Expression 'a[x]' causes access out of bounds.\n" "test.cpp:3:note:condition 'x<2'\n" "test.cpp:6:note:Access out of bounds\n", - errout.str()); + errout_str()); checkNormal("int f(std::vector v) {\n" " if (v.size() > 3)\n" " return v[v.size() - 3];\n" " return 0;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkNormal("void f(std::vector v) {\n" " v[v.size() - 1];\n" " if (v.size() == 1) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkNormal("void f(int n) {\n" " std::vector v = {1, 2, 3, 4};\n" @@ -666,7 +660,7 @@ class TestStl : public TestFixture { " if (i > 1)\n" " v[i] = 1;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkNormal("void f(std::vector& v, int i) {\n" " if (i > -1) {\n" @@ -674,7 +668,7 @@ class TestStl : public TestFixture { " if (v.empty()) {}\n" " }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkNormal("void g(const char *, ...) { exit(1); }\n" // #10025 "void f(const char c[]) {\n" @@ -683,7 +677,7 @@ class TestStl : public TestFixture { " g(\"\", c[0]);\n" " return h(&v[0], v.size()); \n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkNormal("void f(int i, std::vector v) {\n" // #9157 " if (i <= (int)v.size()) {\n" @@ -699,7 +693,7 @@ class TestStl : public TestFixture { "test.cpp:6:warning:Either the condition 'i<=static_cast(v.size())' is redundant or 'i' can have the value v.size(). Expression 'v[i]' causes access out of bounds.\n" "test.cpp:5:note:condition 'i<=static_cast(v.size())'\n" "test.cpp:6:note:Access out of bounds\n", - errout.str()); + errout_str()); check("template\n" "void b(Iterator d) {\n" @@ -712,7 +706,7 @@ class TestStl : public TestFixture { "}\n", true); ASSERT_EQUALS("test.cpp:4:error:Out of bounds access in expression 'd+c.length()' because 'buf' is empty.\n", - errout.str()); + errout_str()); check("template\n" "void b(Iterator d) {\n" @@ -724,7 +718,7 @@ class TestStl : public TestFixture { " b(buf.begin());\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f(const std::vector &v) {\n" " return !v.empty() ? 42 : v.back();\n" @@ -734,7 +728,7 @@ class TestStl : public TestFixture { "test.cpp:2:warning:Either the condition 'v.empty()' is redundant or expression 'v.back()' causes access out of bounds.\n" "test.cpp:2:note:condition 'v.empty()'\n" "test.cpp:2:note:Access out of bounds\n", - errout.str()); + errout_str()); check("std::vector g() {\n" // #10779 " std::vector v(10);\n" @@ -743,7 +737,7 @@ class TestStl : public TestFixture { " return v;\n" "}\n"); ASSERT_EQUALS("test.cpp:4:error:Out of bounds access in 'v[i]', if 'v' size is 10 and 'i' is 10\n", - errout.str()); + errout_str()); check("void f() {\n" " int s = 2;\n" @@ -751,14 +745,14 @@ class TestStl : public TestFixture { " v[100] = 1;\n" "}\n"); ASSERT_EQUALS("test.cpp:4:error:Out of bounds access in 'v[100]', if 'v' size is 2 and '100' is 100\n", - errout.str()); + errout_str()); check("void f() {\n" " std::vector v({ 1, 2, 3 });\n" " v[100] = 1;\n" "}\n"); ASSERT_EQUALS("test.cpp:3:error:Out of bounds access in 'v[100]', if 'v' size is 3 and '100' is 100\n", - errout.str()); + errout_str()); check("void f() {\n" " char c[] = { 1, 2, 3 };\n" @@ -766,7 +760,7 @@ class TestStl : public TestFixture { " v[100] = 1;\n" "}\n"); ASSERT_EQUALS("test.cpp:4:error:Out of bounds access in 'v[100]', if 'v' size is 3 and '100' is 100\n", - errout.str()); + errout_str()); check("void f() {\n" " char c[] = { 1, 2, 3 };\n" @@ -774,7 +768,7 @@ class TestStl : public TestFixture { " v[100] = 1;\n" "}\n"); ASSERT_EQUALS("test.cpp:4:error:Out of bounds access in 'v[100]', if 'v' size is 3 and '100' is 100\n", - errout.str()); + errout_str()); check("void f() {\n" " int i[] = { 1, 2, 3 };\n" @@ -782,7 +776,7 @@ class TestStl : public TestFixture { " v[100] = 1;\n" "}\n"); ASSERT_EQUALS("test.cpp:4:error:Out of bounds access in 'v[100]', if 'v' size is 3 and '100' is 100\n", - errout.str()); + errout_str()); check("void f() {\n" // #6615 " int i[] = { 1, 2, 3 };\n" @@ -791,7 +785,7 @@ class TestStl : public TestFixture { "}\n"); TODO_ASSERT_EQUALS("test.cpp:4:error:Out of bounds access in 'v[100]', if 'v' size is 3 and '100' is 100\n", "", - errout.str()); + errout_str()); check("void f() {\n" " std::array a = {};\n" @@ -807,7 +801,7 @@ class TestStl : public TestFixture { "test.cpp:5:error:Out of bounds access in 'b[10]', if 'b' size is 10 and '10' is 10\n" "test.cpp:7:error:Out of bounds access in 'c[10]', if 'c' size is 10 and '10' is 10\n" "test.cpp:9:error:Out of bounds access in 'd[10]', if 'd' size is 10 and '10' is 10\n", - errout.str()); + errout_str()); check("struct test_fixed {\n" " std::array array = {};\n" @@ -818,7 +812,7 @@ class TestStl : public TestFixture { " x.index(10);\n" "}\n"); ASSERT_EQUALS("test.cpp:3:error:Out of bounds access in 'array[i]', if 'array' size is 10 and 'i' is 10\n", - errout.str()); + errout_str()); check("struct test_constexpr {\n" " static constexpr std::array array = {};\n" @@ -829,7 +823,7 @@ class TestStl : public TestFixture { " x.index(10);\n" "}\n"); ASSERT_EQUALS("test.cpp:3:error:Out of bounds access in 'array[i]', if 'array' size is 10 and 'i' is 10\n", - errout.str()); + errout_str()); checkNormal("struct A {\n" " const std::vector& v;\n" @@ -839,7 +833,7 @@ class TestStl : public TestFixture { " return v[0];\n" " }\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkNormal("struct A {\n" " static const std::vector v;\n" @@ -848,7 +842,7 @@ class TestStl : public TestFixture { " }\n" "};\n" "const std::vector A::v = {1, 2};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkNormal("struct a {\n" " std::vector g() const;\n" @@ -859,13 +853,13 @@ class TestStl : public TestFixture { " int d = c.front();\n" " return d;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkNormal("std::string f() {\n" " std::map m = { { 1, \"1\" } };\n" " return m.at(1);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkNormal("struct A {\n" " virtual void init_v(std::vector *v) = 0;\n" @@ -884,14 +878,14 @@ class TestStl : public TestFixture { " b.init_v(&v);\n" " v[0];\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkNormal("void f(std::vector* v) {\n" " if (v->empty())\n" " v->push_back(1);\n" " auto x = v->back();\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkNormal("template \n" "struct Foo {\n" @@ -911,7 +905,7 @@ class TestStl : public TestFixture { " Foo x;\n" " if (x.Set(42U)) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkNormal("struct S { void g(std::span& r) const; };\n" // #11828 "int f(const S& s) {\n" @@ -919,14 +913,14 @@ class TestStl : public TestFixture { " s.g(t);\n" " return t[0];\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); checkNormal("char h() {\n" " std::string s;\n" " std::string_view sv(s);\n" " return s[2];\n" "}\n"); - ASSERT_EQUALS("test.cpp:4:error:Out of bounds access in expression 's[2]' because 's' is empty.\n", errout.str()); + ASSERT_EQUALS("test.cpp:4:error:Out of bounds access in expression 's[2]' because 's' is empty.\n", errout_str()); } void outOfBoundsSymbolic() @@ -938,7 +932,7 @@ class TestStl : public TestFixture { "}\n"); ASSERT_EQUALS( "[test.cpp:2] -> [test.cpp:4]: (warning) Either the condition 'col>textline.size()' is redundant or 'col' can have the value textline.size(). Expression 'textline[col]' causes access out of bounds.\n", - errout.str()); + errout_str()); } void outOfBoundsIndexExpression() { @@ -947,27 +941,27 @@ class TestStl : public TestFixture { checkNormal("void f(std::string s) {\n" " s[s.size()] = 1;\n" "}"); - ASSERT_EQUALS("test.cpp:2:error:Out of bounds access of s, index 's.size()' is out of bounds.\n", errout.str()); + ASSERT_EQUALS("test.cpp:2:error:Out of bounds access of s, index 's.size()' is out of bounds.\n", errout_str()); checkNormal("void f(std::string s) {\n" " s[s.size()+1] = 1;\n" "}"); - ASSERT_EQUALS("test.cpp:2:error:Out of bounds access of s, index 's.size()+1' is out of bounds.\n", errout.str()); + ASSERT_EQUALS("test.cpp:2:error:Out of bounds access of s, index 's.size()+1' is out of bounds.\n", errout_str()); checkNormal("void f(std::string s) {\n" " s[1+s.size()] = 1;\n" "}"); - ASSERT_EQUALS("test.cpp:2:error:Out of bounds access of s, index '1+s.size()' is out of bounds.\n", errout.str()); + ASSERT_EQUALS("test.cpp:2:error:Out of bounds access of s, index '1+s.size()' is out of bounds.\n", errout_str()); checkNormal("void f(std::string s) {\n" " s[x*s.size()] = 1;\n" "}"); - ASSERT_EQUALS("test.cpp:2:error:Out of bounds access of s, index 'x*s.size()' is out of bounds.\n", errout.str()); + ASSERT_EQUALS("test.cpp:2:error:Out of bounds access of s, index 'x*s.size()' is out of bounds.\n", errout_str()); checkNormal("bool f(std::string_view& sv) {\n" // #10031 " return sv[sv.size()] == '\\0';\n" "}\n"); - ASSERT_EQUALS("test.cpp:2:error:Out of bounds access of sv, index 'sv.size()' is out of bounds.\n", errout.str()); + ASSERT_EQUALS("test.cpp:2:error:Out of bounds access of sv, index 'sv.size()' is out of bounds.\n", errout_str()); } void outOfBoundsIterator() { check("int f() {\n" @@ -976,7 +970,7 @@ class TestStl : public TestFixture { " return *it;\n" "}\n"); ASSERT_EQUALS("[test.cpp:4]: (error) Out of bounds access in expression 'it' because 'v' is empty.\n", - errout.str()); + errout_str()); check("int f() {\n" " std::vector v;\n" @@ -985,7 +979,7 @@ class TestStl : public TestFixture { " return *it;\n" "}\n"); ASSERT_EQUALS("[test.cpp:5]: (error) Out of bounds access in 'it', if 'v' size is 1 and 'it' is at position 1 from the beginning\n", - errout.str()); + errout_str()); check("int f() {\n" " std::vector v;\n" @@ -993,7 +987,7 @@ class TestStl : public TestFixture { " auto it = v.end() - 1;\n" " return *it;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f() {\n" " std::vector v;\n" @@ -1002,7 +996,7 @@ class TestStl : public TestFixture { " return *it;\n" "}\n"); ASSERT_EQUALS("[test.cpp:5]: (error) Out of bounds access in 'it', if 'v' size is 1 and 'it' is at position 2 from the end\n", - errout.str()); + errout_str()); check("void g(int);\n" "void f(std::vector x) {\n" @@ -1011,7 +1005,7 @@ class TestStl : public TestFixture { " g(m.begin()->second);\n" " }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " std::vector vec;\n" @@ -1019,7 +1013,7 @@ class TestStl : public TestFixture { " *it = 1;\n" "}\n"); ASSERT_EQUALS("[test.cpp:4]: (error) Out of bounds access in expression 'it' because 'vec' is empty.\n", - errout.str()); + errout_str()); check("void f() {\n" " std::vector vec;\n" @@ -1027,7 +1021,7 @@ class TestStl : public TestFixture { " *it = 1;\n" "}\n"); ASSERT_EQUALS("[test.cpp:4]: (error) Out of bounds access in expression 'it' because 'vec' is empty.\n", - errout.str()); + errout_str()); } void iterator1() { @@ -1039,7 +1033,7 @@ class TestStl : public TestFixture { " { }\n" "}"); ASSERT_EQUALS("[test.cpp:5]: (error) Iterators of different containers 'l1' and 'l2' are used together.\n", - errout.str()); + errout_str()); check("void f()\n" "{\n" @@ -1049,7 +1043,7 @@ class TestStl : public TestFixture { " { }\n" "}"); ASSERT_EQUALS("[test.cpp:5]: (error) Iterators of different containers 'l2' and 'l1' are used together.\n", - errout.str()); + errout_str()); check("struct C { std::list l1; void func(); };\n" "void C::func() {\n" @@ -1058,7 +1052,7 @@ class TestStl : public TestFixture { " C c;\n" " for (it = c.l1.begin(); it != c.l1.end(); ++it) { }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Same check with reverse iterator check("void f()\n" @@ -1069,7 +1063,7 @@ class TestStl : public TestFixture { " { }\n" "}"); ASSERT_EQUALS("[test.cpp:5]: (error) Iterators of different containers 'l1' and 'l2' are used together.\n", - errout.str()); + errout_str()); } void iterator2() { @@ -1084,7 +1078,7 @@ class TestStl : public TestFixture { " }\n" "}"); ASSERT_EQUALS("[test.cpp:5]: (error) Iterators of different containers 'l1' and 'l2' are used together.\n", - errout.str()); + errout_str()); check("void foo()\n" "{\n" @@ -1097,7 +1091,7 @@ class TestStl : public TestFixture { " }\n" "}"); ASSERT_EQUALS("[test.cpp:6]: (error) Iterators of different containers 'l2' and 'l1' are used together.\n", - errout.str()); + errout_str()); } void iterator3() { @@ -1110,7 +1104,7 @@ class TestStl : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:6]: (error) Same iterator is used with different containers 'l1' and 'l2'.\n" "[test.cpp:6]: (error) Iterator 'it' referring to container 'l1' is used with container 'l2'.\n", - errout.str()); + errout_str()); check("void foo() {\n" // #5803 " std::list l1;\n" @@ -1118,7 +1112,7 @@ class TestStl : public TestFixture { " std::list::iterator it = l1.begin();\n" " l2.insert(it, l1.end());\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() {\n" // #7658 " std::list l1;\n" @@ -1127,7 +1121,7 @@ class TestStl : public TestFixture { " std::list::iterator end = l1.end();\n" " l2.insert(it, end);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // only warn for insert when there are preciself 2 arguments. check("void foo() {\n" @@ -1136,14 +1130,14 @@ class TestStl : public TestFixture { " std::list::iterator it = l1.begin();\n" " l2.insert(it);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() {\n" " std::list l1;\n" " std::list l2;\n" " std::list::iterator it = l1.begin();\n" " l2.insert(it,0,1);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } @@ -1158,7 +1152,7 @@ class TestStl : public TestFixture { " result.insert(cit->size());\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void iterator5() { @@ -1167,7 +1161,7 @@ class TestStl : public TestFixture { " std::vector::iterator it = std::find(ints1.begin(), ints2.end(), 22);\n" "}"); ASSERT_EQUALS("[test.cpp:3]: (error) Iterators of different containers 'ints1' and 'ints2' are used together.\n", - errout.str()); + errout_str()); } void iterator6() { @@ -1179,7 +1173,7 @@ class TestStl : public TestFixture { " std::set::iterator it2 = ints1.end();\n" " ints2.insert(it1, it2);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(const std::set &ints1)\n" "{\n" @@ -1188,7 +1182,7 @@ class TestStl : public TestFixture { " std::set::iterator it2 = ints2.end();\n" " ints2.insert(it1, it2);\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:6]: (error) Iterators of different containers are used together.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:6]: (error) Iterators of different containers are used together.\n", "", errout_str()); } void iterator7() { @@ -1197,13 +1191,13 @@ class TestStl : public TestFixture { " std::vector::iterator it = std::inplace_merge(ints1.begin(), std::advance(ints1.rbegin(), 5), ints2.end());\n" "}"); ASSERT_EQUALS("[test.cpp:3]: (error) Iterators of different containers 'ints1' and 'ints2' are used together.\n", - errout.str()); + errout_str()); check("void foo(std::vector ints1, std::vector ints2)\n" "{\n" " std::vector::iterator it = std::inplace_merge(ints1.begin(), std::advance(ints2.rbegin(), 5), ints1.end());\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void iterator8() { @@ -1212,27 +1206,27 @@ class TestStl : public TestFixture { " std::vector::iterator it = std::find_first_of(ints1.begin(), ints2.end(), ints1.begin(), ints1.end());\n" "}"); ASSERT_EQUALS("[test.cpp:3]: (error) Iterators of different containers 'ints1' and 'ints2' are used together.\n", - errout.str()); + errout_str()); check("void foo(std::vector ints1, std::vector ints2)\n" "{\n" " std::vector::iterator it = std::find_first_of(ints1.begin(), ints1.end(), ints2.begin(), ints1.end());\n" "}"); ASSERT_EQUALS("[test.cpp:3]: (error) Iterators of different containers 'ints2' and 'ints1' are used together.\n", - errout.str()); + errout_str()); check("void foo(std::vector ints1, std::vector ints2)\n" "{\n" " std::vector::iterator it = std::find_first_of(foo.bar.begin(), foo.bar.end()-6, ints2.begin(), ints1.end());\n" "}"); ASSERT_EQUALS("[test.cpp:3]: (error) Iterators of different containers 'ints2' and 'ints1' are used together.\n", - errout.str()); + errout_str()); check("void foo(std::vector ints1, std::vector ints2)\n" "{\n" " std::vector::iterator it = std::find_first_of(ints1.begin(), ints1.end(), ints2.begin(), ints2.end());\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #6839 check("void f(const std::wstring& a, const std::wstring& b) {\n" @@ -1247,7 +1241,7 @@ class TestStl : public TestFixture { // TODO "[test.cpp:3]: (error) Iterators of different containers are used together.\n" "[test.cpp:4]: (error) Iterators of different containers 'tp3' and 'a' are used together.\n" "[test.cpp:5]: (error) Iterators of different containers 'tp4' and 'b' are used together.\n", - errout.str()); + errout_str()); } void iterator9() { @@ -1265,7 +1259,7 @@ class TestStl : public TestFixture { " ++aI;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Ticket #2481 check("void foo(std::vector &r)\n" @@ -1281,7 +1275,7 @@ class TestStl : public TestFixture { " ++aI;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Execution path checking.. check("void foo(std::vector &r, int c)\n" @@ -1300,7 +1294,7 @@ class TestStl : public TestFixture { " ++aI;\n" " }\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:14] (error) After insert(), the iterator 'aI' may be invalid.", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:14] (error) After insert(), the iterator 'aI' may be invalid.", "", errout_str()); } void iterator10() { @@ -1316,7 +1310,7 @@ class TestStl : public TestFixture { " }\n" "}"); ASSERT_EQUALS("[test.cpp:5]: (error) Iterators of different containers 's1' and 's2' are used together.\n", - errout.str()); + errout_str()); } void iterator11() { @@ -1327,7 +1321,7 @@ class TestStl : public TestFixture { " for(vector::iterator x = myVector.begin(); x != myVector.end(); x++)\n" " myMap.erase(*x);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void iterator12() { @@ -1339,7 +1333,7 @@ class TestStl : public TestFixture { " if (it == map2.end()) { }" "}"); ASSERT_EQUALS("[test.cpp:4]: (error) Iterators of different containers 'map1' and 'map2' are used together.\n", - errout.str()); + errout_str()); check("void f() {\n" " std::map map1;\n" @@ -1348,14 +1342,14 @@ class TestStl : public TestFixture { " if (map2.end() == it) { }" "}"); ASSERT_EQUALS("[test.cpp:5]: (error) Iterators of different containers 'map2' and 'map1' are used together.\n", - errout.str()); + errout_str()); check("void f(std::string &s) {\n" " int pos = s.find(x);\n" " s.erase(pos);\n" " s.erase(pos);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void iterator13() { @@ -1371,7 +1365,7 @@ class TestStl : public TestFixture { " ++it;\n" "}"); ASSERT_EQUALS("[test.cpp:8]: (error) Iterators of different containers 't' and 'a' are used together.\n", - errout.str()); + errout_str()); // #4062 check("void f() {\n" @@ -1385,7 +1379,7 @@ class TestStl : public TestFixture { " while (it!=t.end())\n" " ++it;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " std::vector a;\n" @@ -1400,7 +1394,7 @@ class TestStl : public TestFixture { " while (!z && it!=t.end())\n" " v++it;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void iterator14() { @@ -1409,7 +1403,7 @@ class TestStl : public TestFixture { " std::map::const_iterator it;\n" " for (it = x.find(0)->second.begin(); it != x.find(0)->second.end(); ++it) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void iterator15() { @@ -1417,7 +1411,7 @@ class TestStl : public TestFixture { " std::list::iterator pos = a.begin();\n" " for(pos = x[0]->plist.begin(); pos != x[0]->plist.end(); ++pos) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void iterator16() { @@ -1433,7 +1427,7 @@ class TestStl : public TestFixture { " }\n" "}"); ASSERT_EQUALS("[test.cpp:5]: (error) Iterators of different containers 'l1' and 'l2' are used together.\n", - errout.str()); + errout_str()); check("void foo()\n" "{\n" @@ -1447,7 +1441,7 @@ class TestStl : public TestFixture { " }\n" "}"); ASSERT_EQUALS("[test.cpp:6]: (error) Iterators of different containers 'l2' and 'l1' are used together.\n", - errout.str()); + errout_str()); check("void foo()\n" "{\n" @@ -1461,7 +1455,7 @@ class TestStl : public TestFixture { " }\n" "}"); ASSERT_EQUALS("[test.cpp:6]: (error) Iterators of different containers 'l1' and 'l2' are used together.\n", - errout.str()); + errout_str()); check("void foo()\n" "{\n" @@ -1475,7 +1469,7 @@ class TestStl : public TestFixture { " }\n" "}"); ASSERT_EQUALS("[test.cpp:5]: (error) Iterators of different containers 'l1' and 'l2' are used together.\n", - errout.str()); + errout_str()); } void iterator17() { @@ -1492,7 +1486,7 @@ class TestStl : public TestFixture { " }\n" "}"); ASSERT_EQUALS("[test.cpp:5]: (error) Iterators of different containers 'l1' and 'l2' are used together.\n", - errout.str()); + errout_str()); check("void foo()\n" "{\n" @@ -1506,7 +1500,7 @@ class TestStl : public TestFixture { " }\n" " it2 = l2.end();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo()\n" "{\n" @@ -1521,7 +1515,7 @@ class TestStl : public TestFixture { " ++it1;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo()\n" "{\n" @@ -1538,7 +1532,7 @@ class TestStl : public TestFixture { " }\n" "}"); ASSERT_EQUALS("[test.cpp:5]: (error) Iterators of different containers 'l1' and 'l2' are used together.\n", - errout.str()); + errout_str()); } void iterator18() { @@ -1550,7 +1544,7 @@ class TestStl : public TestFixture { " {\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(std::list l1, std::list l2)\n" "{\n" @@ -1560,7 +1554,7 @@ class TestStl : public TestFixture { " {\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(std::list l1, std::list l2)\n" "{\n" @@ -1570,7 +1564,7 @@ class TestStl : public TestFixture { " {\n" " }\n" "}"); - TODO_ASSERT_EQUALS("", "[test.cpp:5]: (error) Dangerous comparison using operator< on iterator.\n", errout.str()); + TODO_ASSERT_EQUALS("", "[test.cpp:5]: (error) Dangerous comparison using operator< on iterator.\n", errout_str()); } void iterator19() { @@ -1587,7 +1581,7 @@ class TestStl : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:7] -> [test.cpp:4]: (error) Same iterator is used with containers 'l1' that are temporaries or defined in different scopes.\n", - errout.str()); + errout_str()); check("void foo()\n" "{\n" @@ -1603,7 +1597,7 @@ class TestStl : public TestFixture { TODO_ASSERT_EQUALS( "[test.cpp:7] -> [test.cpp:4]: (error) Same iterator is used with containers 'l1' that are defined in different scopes.\n", "[test.cpp:7] -> [test.cpp:7]: (error) Same iterator is used with containers 'l1' that are temporaries or defined in different scopes.\n[test.cpp:7]: (error) Dangerous comparison using operator< on iterator.\n", - errout.str()); + errout_str()); check("void foo()\n" "{\n" @@ -1619,7 +1613,7 @@ class TestStl : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:8] -> [test.cpp:4]: (error) Same iterator is used with containers 'l1' that are temporaries or defined in different scopes.\n", - errout.str()); + errout_str()); check("void foo()\n" "{\n" @@ -1635,7 +1629,7 @@ class TestStl : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:8] -> [test.cpp:7]: (error) Same iterator is used with containers 'l1' that are temporaries or defined in different scopes.\n", - errout.str()); + errout_str()); check("std::set g() {\n" " static const std::set s = {1};\n" @@ -1646,7 +1640,7 @@ class TestStl : public TestFixture { "}\n"); ASSERT_EQUALS( "[test.cpp:6] -> [test.cpp:6]: (error) Same iterator is used with containers 'g()' that are temporaries or defined in different scopes.\n", - errout.str()); + errout_str()); check("std::set f() {\n" // #5804 " std::set s;\n" @@ -1657,7 +1651,7 @@ class TestStl : public TestFixture { "}\n"); ASSERT_EQUALS( "[test.cpp:6] -> [test.cpp:6]: (error) Same iterator is used with containers 'f()' that are temporaries or defined in different scopes.\n", - errout.str()); + errout_str()); } void iterator20() { @@ -1674,7 +1668,7 @@ class TestStl : public TestFixture { " }\n" "}"); ASSERT_EQUALS("[test.cpp:6]: (error) Iterators of different containers 'l2' and 'l1' are used together.\n", - errout.str()); + errout_str()); check("std::list l3;\n" "std::list::iterator bar()\n" @@ -1693,7 +1687,7 @@ class TestStl : public TestFixture { " ++it1;\n" " }\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:13] -> [test.cpp:10] -> [test.cpp:11]: (error) Comparison of iterators from containers 'l1' and 'l2'.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:13] -> [test.cpp:10] -> [test.cpp:11]: (error) Comparison of iterators from containers 'l1' and 'l2'.\n", "", errout_str()); } @@ -1713,7 +1707,7 @@ class TestStl : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:5]: (error) Iterators of different containers 'l1' and 'l2' are used together.\n" "[test.cpp:6]: (error) Iterators of different containers 'l2' and 'l1' are used together.\n", - errout.str()); + errout_str()); check("void foo()\n" "{\n" @@ -1727,7 +1721,7 @@ class TestStl : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:5]: (error) Iterators of different containers 'l1' and 'l2' are used together.\n" "[test.cpp:5]: (error) Iterators of different containers 'l1' and 'l2' are used together.\n", // duplicate - errout.str()); + errout_str()); } void iterator22() { // #7107 @@ -1736,7 +1730,7 @@ class TestStl : public TestFixture { " std::list::iterator it = l.find(123);\n" " x.l.erase(it);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void iterator23() { // #9550 @@ -1751,7 +1745,7 @@ class TestStl : public TestFixture { "bool A::B::operator==(const A::B& b) const {\n" " return std::tie(x, y, z) == std::tie(b.x, b.y, b.z);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void iterator24() { @@ -1759,29 +1753,29 @@ class TestStl : public TestFixture { check("void f(int a, int b) {\n" " if (&a == &b) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int a, int b) {\n" " if (std::for_each(&a, &b + 1, [](auto) {})) {}\n" "}"); ASSERT_EQUALS("[test.cpp:2]: (error) Iterators of different containers 'a' and 'b' are used together.\n", - errout.str()); + errout_str()); check("void f(int a, int b) {\n" " if (std::for_each(&a, &b, [](auto) {})) {}\n" "}"); ASSERT_EQUALS("[test.cpp:2]: (error) Iterators of different containers 'a' and 'b' are used together.\n", - errout.str()); + errout_str()); check("void f(int a) {\n" " if (std::for_each(&a, &a, [](auto) {})) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Same iterators expression are used for algorithm.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Same iterators expression are used for algorithm.\n", errout_str()); check("void f(int a) {\n" " if (std::for_each(&a, &a + 1, [](auto) {})) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void iterator25() { @@ -1794,7 +1788,7 @@ class TestStl : public TestFixture { " return &lhs.v != &rhs.v;\n" " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void iterator26() { // #9176 @@ -1808,7 +1802,7 @@ class TestStl : public TestFixture { " }\n" " return 0;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void iterator27() { @@ -1823,7 +1817,7 @@ class TestStl : public TestFixture { " const int b( it == m.cend() ? 0 : it->second.b );\n" " return a + b;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void iterator28() @@ -1845,7 +1839,7 @@ class TestStl : public TestFixture { " }\n" " return 0;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:10]: (style) Consider using std::find_if algorithm instead of a raw loop.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:10]: (style) Consider using std::find_if algorithm instead of a raw loop.\n", errout_str()); } void iterator29() @@ -1858,7 +1852,7 @@ class TestStl : public TestFixture { " while (it != g().end())\n" " it = v.erase(it);\n" "}\n"); - ASSERT_EQUALS("[test.cpp:6]: (error) Iterator 'it' referring to container 'g()' is used with container 'v'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (error) Iterator 'it' referring to container 'g()' is used with container 'v'.\n", errout_str()); check("std::vector& g(int);\n" "void f(int i, int j) {\n" @@ -1867,7 +1861,7 @@ class TestStl : public TestFixture { " while (it != g(j).end())\n" " it = r.erase(it);\n" "}\n"); - ASSERT_EQUALS("[test.cpp:6]: (error) Iterator 'it' referring to container 'g(j)' is used with container 'r'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (error) Iterator 'it' referring to container 'g(j)' is used with container 'r'.\n", errout_str()); check("std::vector& g();\n" "void f() {\n" @@ -1876,7 +1870,7 @@ class TestStl : public TestFixture { " while (it != g().end())\n" " it = r.erase(it);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void iteratorExpression() { @@ -1886,7 +1880,7 @@ class TestStl : public TestFixture { " (void)std::find(f().begin(), g().end(), 0);\n" "}"); ASSERT_EQUALS("[test.cpp:4]: (error) Iterators of different containers 'f()' and 'g()' are used together.\n", - errout.str()); + errout_str()); check("std::vector& f();\n" "std::vector& g();\n" @@ -1894,7 +1888,7 @@ class TestStl : public TestFixture { " if(f().begin() == g().end()) {}\n" "}"); ASSERT_EQUALS("[test.cpp:4]: (error) Iterators of different containers 'f()' and 'g()' are used together.\n", - errout.str()); + errout_str()); check("std::vector& f();\n" "std::vector& g();\n" @@ -1902,7 +1896,7 @@ class TestStl : public TestFixture { " auto size = f().end() - g().begin();\n" "}"); ASSERT_EQUALS("[test.cpp:4]: (error) Iterators of different containers 'f()' and 'g()' are used together.\n", - errout.str()); + errout_str()); check("struct A {\n" " std::vector& f();\n" @@ -1913,7 +1907,7 @@ class TestStl : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:6]: (error) Iterators of different containers 'A().f()' and 'A().g()' are used together.\n", - errout.str()); + errout_str()); check("struct A {\n" " std::vector& f();\n" @@ -1924,14 +1918,14 @@ class TestStl : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:6]: (error) Iterators of different containers 'A{}.f()' and 'A{}.g()' are used together.\n", - errout.str()); + errout_str()); check("std::vector& f();\n" "std::vector& g();\n" "void foo() {\n" " (void)std::find(begin(f()), end(g()), 0);\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (warning) Iterators to containers from different expressions 'f()' and 'g()' are used together.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (warning) Iterators to containers from different expressions 'f()' and 'g()' are used together.\n", errout_str()); check("struct A {\n" " std::vector& f();\n" @@ -1940,14 +1934,14 @@ class TestStl : public TestFixture { "void foo() {\n" " (void)std::find(A().f().begin(), A().f().end(), 0);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("std::vector& f();\n" "std::vector& g();\n" "void foo() {\n" " if(bar(f().begin()) == g().end()) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("std::vector& f();\n" "void foo() {\n" @@ -1971,7 +1965,7 @@ class TestStl : public TestFixture { " (void)std::find(begin(f()), end(f()) - 1, 0);\n" " (void)std::find(begin(f()) + 1, end(f()) - 1, 0);\n" "}"); - ASSERT_EQUALS("[test.cpp:9]: (error) Dereference of an invalid iterator: f().end()+1\n", errout.str()); + ASSERT_EQUALS("[test.cpp:9]: (error) Dereference of an invalid iterator: f().end()+1\n", errout_str()); check("std::vector& f();\n" "void foo() {\n" @@ -1982,7 +1976,7 @@ class TestStl : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:4]: (error) Dereference of an invalid iterator: f().end()+1\n" "[test.cpp:6]: (error) Dereference of an invalid iterator: f().end()+1\n", - errout.str()); + errout_str()); check("std::vector& f();\n" "void foo() {\n" @@ -1993,30 +1987,30 @@ class TestStl : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:4]: (error) Dereference of an invalid iterator: std::end(f())+1\n" "[test.cpp:6]: (error) Dereference of an invalid iterator: std::end(f())+1\n", - errout.str()); + errout_str()); check("template\n" "std::vector& f();\n" "void foo() {\n" " if(f<1>().begin() == f<1>().end()) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " if (a.begin().x == b.begin().x) {}\n" " if (begin(a).x == begin(b).x) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(std::list a, std::list b) {\n" " if (*a.begin() == *b.begin()) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() {\n" " if(f().begin(1) == f().end()) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(const uint8_t* data, const uint32_t dataLength) {\n" " const uint32_t minimumLength = sizeof(uint16_t) + sizeof(uint16_t);\n" @@ -2025,12 +2019,12 @@ class TestStl : public TestFixture { " std::copy(&data[minimumLength], &data[dataLength], payload);\n" " }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool f(const std::vector& a, const std::vector& b) {\n" // #11469 " return (a.begin() - a.end()) == (b.begin() - b.end());\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S {\n" // #11469 " const std::vector* vec() const { return &v; }\n" @@ -2039,42 +2033,42 @@ class TestStl : public TestFixture { "void f(const S& a, const S& b) {\n" " if (a.vec()->begin() - a.vec()->end() != b.vec()->begin() - b.vec()->end()) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void iteratorSameExpression() { check("void f(std::vector v) {\n" " std::for_each(v.begin(), v.begin(), [](int){});\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Same iterators expression are used for algorithm.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Same iterators expression are used for algorithm.\n", errout_str()); check("std::vector& g();\n" "void f() {\n" " std::for_each(g().begin(), g().begin(), [](int){});\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Same iterators expression are used for algorithm.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Same iterators expression are used for algorithm.\n", errout_str()); check("void f(std::vector v) {\n" " std::for_each(v.end(), v.end(), [](int){});\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Same iterators expression are used for algorithm.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Same iterators expression are used for algorithm.\n", errout_str()); check("std::vector& g();\n" "void f() {\n" " std::for_each(g().end(), g().end(), [](int){});\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Same iterators expression are used for algorithm.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Same iterators expression are used for algorithm.\n", errout_str()); check("std::vector::iterator g();\n" "void f(std::vector v) {\n" " std::for_each(g(), g(), [](int){});\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Same iterators expression are used for algorithm.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Same iterators expression are used for algorithm.\n", errout_str()); check("void f(std::vector::iterator it) {\n" " std::for_each(it, it, [](int){});\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (style) Same iterators expression are used for algorithm.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (style) Same iterators expression are used for algorithm.\n", errout_str()); } void mismatchingContainerIterator() { @@ -2083,13 +2077,13 @@ class TestStl : public TestFixture { " a.insert(b.end(), value);\n" " return a;\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Iterator 'b.end()' referring to container 'b' is used with container 'a'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Iterator 'b.end()' referring to container 'b' is used with container 'a'.\n", errout_str()); check("std::vector f(std::vector a, std::vector b) {\n" " a.erase(b.begin());\n" " return a;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (error) Iterator 'b.begin()' referring to container 'b' is used with container 'a'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (error) Iterator 'b.begin()' referring to container 'b' is used with container 'a'.\n", errout_str()); // #9973 check("void f() {\n" @@ -2103,7 +2097,7 @@ class TestStl : public TestFixture { " }\n" " }\n" "}\n"); - ASSERT_EQUALS("[test.cpp:6]: (style) Consider using std::find_if algorithm instead of a raw loop.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (style) Consider using std::find_if algorithm instead of a raw loop.\n", errout_str()); // #10012 check("struct a {\n" @@ -2113,7 +2107,7 @@ class TestStl : public TestFixture { "void f(a c, a d) {\n" " if (c.end() == d.end()) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #10467 check("void f(std::array, N>& A) {\n" @@ -2123,7 +2117,7 @@ class TestStl : public TestFixture { " if (it != a.end()) {}\n" " }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #10604 check("struct S {\n" @@ -2132,7 +2126,7 @@ class TestStl : public TestFixture { "void f(S& s, int m) {\n" " s.v.erase(s.v.begin() + m);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #11093 check("struct S {\n" @@ -2142,7 +2136,7 @@ class TestStl : public TestFixture { " v.erase(v.begin());\n" " }\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #12377 check("void f(bool b) {\n" @@ -2158,7 +2152,7 @@ class TestStl : public TestFixture { " std::vector::iterator it = pv->begin();\n" " it = pv->erase(it, it + 2);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S {\n" " std::vector v;\n" @@ -2167,7 +2161,7 @@ class TestStl : public TestFixture { " p->insert(std::find(p->begin(), p->end(), 0), 1);\n" " }\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S {\n" " std::vector v;\n" @@ -2177,7 +2171,7 @@ class TestStl : public TestFixture { " p->erase(p->begin() + i, p->end());\n" " }\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #11067 check("struct S {\n" @@ -2189,7 +2183,7 @@ class TestStl : public TestFixture { " v.erase(*li.begin());\n" " li.pop_front();\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(std::set& a, std::stack::iterator>& b) {\n" " while (!b.empty()) {\n" @@ -2197,13 +2191,13 @@ class TestStl : public TestFixture { " b.pop();\n" " }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(std::vector& a, std::vector::iterator>& b) {\n" " auto it = b.begin();\n" " a.erase(*it);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("namespace N {\n" // #12443 " std::vector v;\n" @@ -2213,7 +2207,7 @@ class TestStl : public TestFixture { " auto it = std::find(v.begin(), v.end(), 0);\n" " if (it != N::v.end()) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void eraseIteratorOutOfBounds() { @@ -2221,40 +2215,40 @@ class TestStl : public TestFixture { " std::vector v;\n" " v.erase(v.begin());\n" "}\n"); - ASSERT_EQUALS("[test.cpp:3]: (error) Calling function 'erase()' on the iterator 'v.begin()' which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Calling function 'erase()' on the iterator 'v.begin()' which is out of bounds.\n", errout_str()); check("void f() {\n" " std::vector v;\n" " v.erase(v.end());\n" "}\n"); - ASSERT_EQUALS("[test.cpp:3]: (error) Calling function 'erase()' on the iterator 'v.end()' which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Calling function 'erase()' on the iterator 'v.end()' which is out of bounds.\n", errout_str()); check("void f() {\n" " std::vector v;\n" " auto it = v.begin();\n" " v.erase(it);\n" "}\n"); - ASSERT_EQUALS("[test.cpp:4]: (error) Calling function 'erase()' on the iterator 'it' which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Calling function 'erase()' on the iterator 'it' which is out of bounds.\n", errout_str()); check("void f() {\n" " std::vector v{ 1, 2, 3 };\n" " auto it = v.end();\n" " v.erase(it);\n" "}\n"); - ASSERT_EQUALS("[test.cpp:4]: (error) Calling function 'erase()' on the iterator 'it' which is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Calling function 'erase()' on the iterator 'it' which is out of bounds.\n", errout_str()); check("void f() {\n" " std::vector v{ 1, 2, 3 };\n" " auto it = v.begin();\n" " v.erase(it);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " std::vector v{ 1, 2, 3 };\n" " v.erase(v.end() - 1);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " std::vector v{ 1, 2, 3 };\n" @@ -2262,21 +2256,21 @@ class TestStl : public TestFixture { "}\n"); ASSERT_EQUALS("[test.cpp:3]: (error) Calling function 'erase()' on the iterator 'v.begin()-1' which is out of bounds.\n" "[test.cpp:3]: (error) Dereference of an invalid iterator: v.begin()-1\n", - errout.str()); + errout_str()); check("void f(std::vector& v, std::vector::iterator it) {\n" " if (it == v.end()) {}\n" " v.erase(it);\n" "}\n"); ASSERT_EQUALS("[test.cpp:3]: (warning) Either the condition 'it==v.end()' is redundant or function 'erase()' is called on the iterator 'it' which is out of bounds.\n", - errout.str()); + errout_str()); check("void f() {\n" " std::vector v;\n" " ((v).erase)(v.begin());\n" "}\n"); ASSERT_EQUALS("[test.cpp:3]: (error) Calling function 'erase()' on the iterator 'v.begin()' which is out of bounds.\n", - errout.str()); + errout_str()); } // Dereferencing invalid pointer @@ -2289,7 +2283,7 @@ class TestStl : public TestFixture { " ints.erase(iter);\n" " std::cout << (*iter) << std::endl;\n" "}", true); - TODO_ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:6] -> [test.cpp:3] -> [test.cpp:7]: (error) Using iterator to local container 'ints' that may be invalid.\n", "[test.cpp:5] -> [test.cpp:6] -> [test.cpp:3] -> [test.cpp:7]: (error, inconclusive) Using iterator to local container 'ints' that may be invalid.\n", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:6] -> [test.cpp:3] -> [test.cpp:7]: (error) Using iterator to local container 'ints' that may be invalid.\n", "[test.cpp:5] -> [test.cpp:6] -> [test.cpp:3] -> [test.cpp:7]: (error, inconclusive) Using iterator to local container 'ints' that may be invalid.\n", errout_str()); // #6554 "False positive eraseDereference - erase in while() loop" check("typedef std::map packetMap;\n" @@ -2301,7 +2295,7 @@ class TestStl : public TestFixture { " for (unsigned pos = 0; pos < buf.size(); ) { }\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #8509 Uniform initialization ignored for iterator check("void f() {\n" @@ -2309,7 +2303,7 @@ class TestStl : public TestFixture { " std::vector::const_iterator iter {ints.cbegin()};\n" " std::cout << (*iter) << std::endl;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void dereference_break() { // #3644 @@ -2326,7 +2320,7 @@ class TestStl : public TestFixture { " }\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void dereference_member() { @@ -2340,7 +2334,7 @@ class TestStl : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:7] -> [test.cpp:6]: (error) Iterator 'iter' used after element has been erased.\n" "[test.cpp:6]: (error) Calling function 'erase()' on the iterator 'iter' which is out of bounds.\n", - errout.str()); + errout_str()); // Reverse iterator check("void f()\n" @@ -2353,7 +2347,7 @@ class TestStl : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:7] -> [test.cpp:6]: (error) Iterator 'iter' used after element has been erased.\n" "[test.cpp:6]: (error) Calling function 'erase()' on the iterator 'iter' which is out of bounds.\n", - errout.str()); + errout_str()); } void dereference_auto() { @@ -2364,14 +2358,14 @@ class TestStl : public TestFixture { " ints.erase(iter);\n" " std::cout << (*iter) << std::endl;\n" "}", true); - TODO_ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:5] -> [test.cpp:3] -> [test.cpp:6]: (error) Using iterator to local container 'ints' that may be invalid.\n", "[test.cpp:4] -> [test.cpp:5] -> [test.cpp:3] -> [test.cpp:6]: (error, inconclusive) Using iterator to local container 'ints' that may be invalid.\n", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:5] -> [test.cpp:3] -> [test.cpp:6]: (error) Using iterator to local container 'ints' that may be invalid.\n", "[test.cpp:4] -> [test.cpp:5] -> [test.cpp:3] -> [test.cpp:6]: (error, inconclusive) Using iterator to local container 'ints' that may be invalid.\n", errout_str()); check("void f() {\n" " auto x = *myList.begin();\n" " myList.erase(x);\n" " auto b = x.first;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("const CXXRecordDecl *CXXRecordDecl::getTemplateInstantiationPattern() const {\n" " if (auto *TD = dyn_cast(this)) {\n" @@ -2379,7 +2373,7 @@ class TestStl : public TestFixture { " }\n" " return nullptr;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void STLSize() { @@ -2393,28 +2387,28 @@ class TestStl : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:6]: (error) Out of bounds access in expression 'foo[ii]' because 'foo' is empty.\n", - errout.str()); + errout_str()); check("void foo(std::vector foo) {\n" " for (unsigned int ii = 0; ii <= foo.size(); ++ii) {\n" " foo.at(ii) = 0;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) When ii==foo.size(), foo.at(ii) is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) When ii==foo.size(), foo.at(ii) is out of bounds.\n", errout_str()); check("void foo(const std::string& foo) {\n" " for (unsigned int ii = 0; ii <= foo.length(); ++ii) {\n" " foo[ii] = 'x';\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) When ii==foo.size(), foo[ii] is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) When ii==foo.size(), foo[ii] is out of bounds.\n", errout_str()); check("void foo(const std::string& foo, unsigned int ii) {\n" " if (ii <= foo.length()) {\n" " foo[ii] = 'x';\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) When ii==foo.size(), foo[ii] is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) When ii==foo.size(), foo[ii] is out of bounds.\n", errout_str()); check("void foo(const std::string& foo, unsigned int ii) {\n" " do {\n" @@ -2422,7 +2416,7 @@ class TestStl : public TestFixture { " ++i;\n" " } while(ii <= foo.length());\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) When ii==foo.size(), foo[ii] is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) When ii==foo.size(), foo[ii] is out of bounds.\n", errout_str()); check("void foo(const std::string& foo, unsigned int ii) {\n" " if (anything()) {\n" @@ -2430,7 +2424,7 @@ class TestStl : public TestFixture { " foo[ii] = 'x';\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) When ii==foo.size(), foo[ii] is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) When ii==foo.size(), foo[ii] is out of bounds.\n", errout_str()); check("void foo()\n" "{\n" @@ -2442,19 +2436,19 @@ class TestStl : public TestFixture { " int ii = 0;\n" " foo[ii] = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() {\n" " for (B b : D()) {}\n" // Don't crash on range-based for-loop "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(std::vector foo) {\n" " for (unsigned int ii = 0; ii <= foo.size() + 1; ++ii) {\n" " foo.at(ii) = 0;\n" " }\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:3]: (error) When ii==foo.size(), foo.at(ii) is out of bounds.\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:3]: (error) When ii==foo.size(), foo.at(ii) is out of bounds.\n", "", errout_str()); } void STLSizeNoErr() { @@ -2467,7 +2461,7 @@ class TestStl : public TestFixture { " foo[ii] = 0;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { @@ -2478,7 +2472,7 @@ class TestStl : public TestFixture { " {\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { @@ -2498,7 +2492,7 @@ class TestStl : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:11]: (error) Out of bounds access in expression 'foo[ii]' because 'foo' is empty.\n", - errout.str()); + errout_str()); } { @@ -2507,7 +2501,7 @@ class TestStl : public TestFixture { " for (int i = 5; i <= data.size(); i++)\n" " data[i] = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { @@ -2516,7 +2510,7 @@ class TestStl : public TestFixture { " foo.at(ii) = 0;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } } @@ -2524,7 +2518,7 @@ class TestStl : public TestFixture { check("void f(const std::vector &v) {\n" " v[-11] = 123;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (error) Array index -11 is out of bounds.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (error) Array index -11 is out of bounds.\n", errout_str()); check("int f(int x, const std::vector& a) {\n" " if (!(x < 5))\n" @@ -2532,7 +2526,7 @@ class TestStl : public TestFixture { " else\n" " return a[4 - x];\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("std::array values;\n" "int get_value();\n" @@ -2545,7 +2539,7 @@ class TestStl : public TestFixture { " sum += values[j-1];\n" " return sum;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct B { virtual int g() { return 0; } };\n" // #11831 "struct C {\n" @@ -2558,7 +2552,7 @@ class TestStl : public TestFixture { " C c;\n" "};\n" "int O::f() const { return v[c.h() - 1]; }\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const auto oldSettings = settings; settings.daca = true; @@ -2566,7 +2560,7 @@ class TestStl : public TestFixture { check("void f() {\n" " const char a[][5] = { \"1\", \"true\", \"on\", \"yes\" };\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); settings = oldSettings; } @@ -2589,7 +2583,7 @@ class TestStl : public TestFixture { "test.cpp:8:note:Calling function 'f', 1st argument '-1' value is -1\n" "test.cpp:3:note:Assuming condition is false\n" "test.cpp:5:note:Negative array index\n", - errout.str()); + errout_str()); settings = oldSettings; } @@ -2606,7 +2600,7 @@ class TestStl : public TestFixture { " }\n" "}"); ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:5]: (error) Iterator 'it' used after element has been erased.\n" - "[test.cpp:7] -> [test.cpp:8]: (error) Iterator 'it' used after element has been erased.\n", errout.str()); + "[test.cpp:7] -> [test.cpp:8]: (error) Iterator 'it' used after element has been erased.\n", errout_str()); check("void f(std::list &ints)\n" "{\n" @@ -2614,7 +2608,7 @@ class TestStl : public TestFixture { " i = ints.erase(i);\n" " *i = 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f()\n" "{\n" @@ -2622,7 +2616,7 @@ class TestStl : public TestFixture { " while (i != x.y.end())\n" " i = x.y.erase(i);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #2101 check("void f(vector< std::list > &ints, unsigned int i)\n" @@ -2633,7 +2627,7 @@ class TestStl : public TestFixture { " it = ints[i].erase(it);\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void erase2() { @@ -2646,7 +2640,7 @@ class TestStl : public TestFixture { " foo.erase(it);\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void erase3() { @@ -2656,7 +2650,7 @@ class TestStl : public TestFixture { " foo.erase(it->a);\n" " if (it->b);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void erase4() { @@ -2668,7 +2662,7 @@ class TestStl : public TestFixture { " foo.erase(it);\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:6]: (error) Iterator 'it' used after element has been erased.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:6]: (error) Iterator 'it' used after element has been erased.\n", errout_str()); check("void f()\n" "{\n" @@ -2678,7 +2672,7 @@ class TestStl : public TestFixture { " foo.erase(it);\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:6]: (error) Iterator 'it' used after element has been erased.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:6]: (error) Iterator 'it' used after element has been erased.\n", errout_str()); check("void f()\n" "{\n" @@ -2688,7 +2682,7 @@ class TestStl : public TestFixture { " foo.erase(it);\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:6]: (error) Iterator 'it' used after element has been erased.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:6]: (error) Iterator 'it' used after element has been erased.\n", errout_str()); check("void f()\n" "{\n" @@ -2698,7 +2692,7 @@ class TestStl : public TestFixture { " foo.erase(++it);\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:6]: (error) Iterator 'it' used after element has been erased.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:6]: (error) Iterator 'it' used after element has been erased.\n", errout_str()); } void erase5() { @@ -2712,7 +2706,7 @@ class TestStl : public TestFixture { " foo.erase(it);\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:8]: (error) Iterator 'it' used after element has been erased.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:8]: (error) Iterator 'it' used after element has been erased.\n", errout_str()); } void erase6() { @@ -2725,7 +2719,7 @@ class TestStl : public TestFixture { " vec.erase(it);\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void eraseBreak() { @@ -2738,7 +2732,7 @@ class TestStl : public TestFixture { " break;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:5]: (error) Iterator 'it' used after element has been erased.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:5]: (error) Iterator 'it' used after element has been erased.\n", errout_str()); check("void f()\n" "{\n" @@ -2750,7 +2744,7 @@ class TestStl : public TestFixture { " }\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(int x)\n" "{\n" @@ -2761,7 +2755,7 @@ class TestStl : public TestFixture { " return;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:5]: (error) Iterator 'it' used after element has been erased.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:5]: (error) Iterator 'it' used after element has been erased.\n", errout_str()); } @@ -2778,7 +2772,7 @@ class TestStl : public TestFixture { " }\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(std::map my_map) {\n" // #7365 " std::map::iterator itr = my_map.begin();\n" @@ -2791,7 +2785,7 @@ class TestStl : public TestFixture { " break;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void eraseReturn1() { @@ -2805,7 +2799,7 @@ class TestStl : public TestFixture { " return;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void eraseReturn2() { @@ -2825,7 +2819,7 @@ class TestStl : public TestFixture { " }\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void eraseReturn3() { @@ -2844,7 +2838,7 @@ class TestStl : public TestFixture { " }\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f()\n" "{\n" @@ -2863,7 +2857,7 @@ class TestStl : public TestFixture { TODO_ASSERT_EQUALS( "[test.cpp:5] -> [test.cpp:7] -> [test.cpp:8] -> [test.cpp:8] -> [test.cpp:7] -> [test.cpp:5] -> [test.cpp:9] -> [test.cpp:3] -> [test.cpp:5]: (error) Using iterator to local container 'foo' that may be invalid.\n", "[test.cpp:5] -> [test.cpp:7] -> [test.cpp:8] -> [test.cpp:8] -> [test.cpp:7] -> [test.cpp:5] -> [test.cpp:9] -> [test.cpp:3] -> [test.cpp:5]: (error, inconclusive) Using iterator to local container 'foo' that may be invalid.\n", - errout.str()); + errout_str()); } void eraseGoto() { @@ -2876,7 +2870,7 @@ class TestStl : public TestFixture { " }\n" "bar:\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void eraseAssign1() { @@ -2888,7 +2882,7 @@ class TestStl : public TestFixture { " it = foo.begin();\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void eraseAssign2() { @@ -2906,7 +2900,7 @@ class TestStl : public TestFixture { " }\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void eraseAssign3() { @@ -2915,7 +2909,7 @@ class TestStl : public TestFixture { " std::list::const_iterator j = (*i).begin();\n" " cout << *j << endl;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void eraseAssign4() { @@ -2924,14 +2918,14 @@ class TestStl : public TestFixture { " it = data.erase(it);\n" " it = data.erase(it);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(Data data) {\n" " std::list::const_iterator it = data.ints.begin();\n" " it = data.ints.erase(it);\n" " it = data.ints.erase(it);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void eraseAssignByFunctionCall() { @@ -2940,7 +2934,7 @@ class TestStl : public TestFixture { " bar(i);\n" " cout << *i;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void eraseErase() { @@ -2951,7 +2945,7 @@ class TestStl : public TestFixture { " ints.erase(iter);\n" " ints.erase(iter);\n" "}", true); - TODO_ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:4] -> [test.cpp:5] -> [test.cpp:1] -> [test.cpp:6]: (error) Using iterator to local container 'ints' that may be invalid.\n", "[test.cpp:1] -> [test.cpp:4] -> [test.cpp:5] -> [test.cpp:1] -> [test.cpp:6]: (error, inconclusive) Using iterator to local container 'ints' that may be invalid.\n", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:4] -> [test.cpp:5] -> [test.cpp:1] -> [test.cpp:6]: (error) Using iterator to local container 'ints' that may be invalid.\n", "[test.cpp:1] -> [test.cpp:4] -> [test.cpp:5] -> [test.cpp:1] -> [test.cpp:6]: (error, inconclusive) Using iterator to local container 'ints' that may be invalid.\n", errout_str()); } void eraseByValue() { @@ -2963,21 +2957,21 @@ class TestStl : public TestFixture { " foo.erase(*it);\n" " }\n" "}"); - TODO_ASSERT_EQUALS("[test.cpp:6]: (error) Iterator 'it' becomes invalid when deleted by value from 'foo'\n", "", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:6]: (error) Iterator 'it' becomes invalid when deleted by value from 'foo'\n", "", errout_str()); check("int f(std::set foo) {\n" " std::set::iterator it = foo.begin();\n" " foo.erase(*it);\n" " return *it;\n" "}"); - ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:3]: (error) Iterator 'it' used after element has been erased.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:3]: (error) Iterator 'it' used after element has been erased.\n", errout_str()); check("void f(std::set foo)\n" "{\n" " std::set::iterator it = foo.begin();\n" " foo.erase(*it);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #5669 check("void f() {\n" @@ -2985,14 +2979,14 @@ class TestStl : public TestFixture { " m_SetLoadedFactories.erase(*aIt);\n" " m_SetLoadedFactories.erase(aIt);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(const std::list& m_ImplementationMap) {\n" " std::list::iterator aIt = m_ImplementationMap.begin();\n" " m_ImplementationMap.erase(*aIt);\n" " m_ImplementationMap.erase(aIt);\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Invalid iterator: aIt\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Invalid iterator: aIt\n", errout_str()); check("void f(const std::list& m_ImplementationMap) {\n" " std::list::iterator aIt = m_ImplementationMap.begin();\n" @@ -3000,7 +2994,7 @@ class TestStl : public TestFixture { " m_ImplementationMap.erase(*bIt);\n" " m_ImplementationMap.erase(aIt);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void eraseIf() { @@ -3014,7 +3008,7 @@ class TestStl : public TestFixture { " }\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:4]: (error) Iterator 'str' used after element has been erased.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:4]: (error) Iterator 'str' used after element has been erased.\n", errout_str()); } void eraseOnVector() { @@ -3023,7 +3017,7 @@ class TestStl : public TestFixture { " v.erase(something(unknown));\n" // All iterators become invalidated when erasing from std::vector " v.erase(aIt);\n" "}"); - ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:2] -> [test.cpp:3] -> [test.cpp:1] -> [test.cpp:4]: (error) Using iterator to local container 'v' that may be invalid.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:2] -> [test.cpp:3] -> [test.cpp:1] -> [test.cpp:4]: (error) Using iterator to local container 'v' that may be invalid.\n", errout_str()); check("void f(std::vector& v) {\n" " std::vector::iterator aIt = v.begin();\n" @@ -3031,7 +3025,7 @@ class TestStl : public TestFixture { " v.erase(bIt);\n" // All iterators become invalidated when erasing from std::vector " aIt = v.erase(aIt);\n" "}"); - ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:2] -> [test.cpp:4] -> [test.cpp:1] -> [test.cpp:5]: (error) Using iterator to local container 'v' that may be invalid.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:2] -> [test.cpp:4] -> [test.cpp:1] -> [test.cpp:5]: (error) Using iterator to local container 'v' that may be invalid.\n", errout_str()); } void pushback1() { @@ -3041,7 +3035,7 @@ class TestStl : public TestFixture { " foo.push_back(123);\n" " *it;\n" "}"); - ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:3] -> [test.cpp:4] -> [test.cpp:1] -> [test.cpp:5]: (error) Using iterator to local container 'foo' that may be invalid.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:3] -> [test.cpp:4] -> [test.cpp:1] -> [test.cpp:5]: (error) Using iterator to local container 'foo' that may be invalid.\n", errout_str()); } void pushback2() { @@ -3054,7 +3048,7 @@ class TestStl : public TestFixture { " *it = 456;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void pushback3() { @@ -3068,7 +3062,7 @@ class TestStl : public TestFixture { " foo.push_back(123);\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:6] -> [test.cpp:6] -> [test.cpp:8] -> [test.cpp:3] -> [test.cpp:6]: (error) Using iterator to local container 'foo' that may be invalid.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6] -> [test.cpp:6] -> [test.cpp:8] -> [test.cpp:3] -> [test.cpp:6]: (error) Using iterator to local container 'foo' that may be invalid.\n", errout_str()); } void pushback4() { @@ -3080,7 +3074,7 @@ class TestStl : public TestFixture { " ints.push_back(2);\n" " *first;\n" "}"); - ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:6] -> [test.cpp:3] -> [test.cpp:7]: (error) Using pointer to local variable 'ints' that may be invalid.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:6] -> [test.cpp:3] -> [test.cpp:7]: (error) Using pointer to local variable 'ints' that may be invalid.\n", errout_str()); } void pushback5() { @@ -3097,7 +3091,7 @@ class TestStl : public TestFixture { " v.push_back(*i);\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void pushback6() { @@ -3113,7 +3107,7 @@ class TestStl : public TestFixture { " v.push_back(10);\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:6] -> [test.cpp:8] -> [test.cpp:8] -> [test.cpp:6] -> [test.cpp:9] -> [test.cpp:3] -> [test.cpp:6]: (error) Using iterator to local container 'v' that may be invalid.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6] -> [test.cpp:8] -> [test.cpp:8] -> [test.cpp:6] -> [test.cpp:9] -> [test.cpp:3] -> [test.cpp:6]: (error) Using iterator to local container 'v' that may be invalid.\n", errout_str()); check("void f()\n" "{\n" @@ -3126,7 +3120,7 @@ class TestStl : public TestFixture { " v.push_back(10);\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:6] -> [test.cpp:8] -> [test.cpp:8] -> [test.cpp:6] -> [test.cpp:9] -> [test.cpp:3] -> [test.cpp:6]: (error) Using iterator to local container 'v' that may be invalid.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6] -> [test.cpp:8] -> [test.cpp:8] -> [test.cpp:6] -> [test.cpp:9] -> [test.cpp:3] -> [test.cpp:6]: (error) Using iterator to local container 'v' that may be invalid.\n", errout_str()); } void pushback7() { @@ -3140,7 +3134,7 @@ class TestStl : public TestFixture { " foo.push_back(123);\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:6] -> [test.cpp:6] -> [test.cpp:8] -> [test.cpp:3] -> [test.cpp:6]: (error) Using iterator to local container 'foo' that may be invalid.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6] -> [test.cpp:6] -> [test.cpp:8] -> [test.cpp:3] -> [test.cpp:6]: (error) Using iterator to local container 'foo' that may be invalid.\n", errout_str()); } void pushback8() { @@ -3158,7 +3152,7 @@ class TestStl : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:10]: (style) Consider using std::accumulate algorithm instead of a raw loop.\n" "[test.cpp:4] -> [test.cpp:5] -> [test.cpp:3] -> [test.cpp:8]: (error) Using iterator to local container 'ints' that may be invalid.\n", - errout.str()); + errout_str()); } void pushback9() { @@ -3178,7 +3172,7 @@ class TestStl : public TestFixture { " ++i;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void pushback10() { @@ -3188,7 +3182,7 @@ class TestStl : public TestFixture { " foo.reserve(100);\n" " *it = 0;\n" "}"); - ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:3] -> [test.cpp:4] -> [test.cpp:1] -> [test.cpp:5]: (error) Using iterator to local container 'foo' that may be invalid.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:3] -> [test.cpp:4] -> [test.cpp:1] -> [test.cpp:5]: (error) Using iterator to local container 'foo' that may be invalid.\n", errout_str()); // in loop check("void f()\n" @@ -3201,7 +3195,7 @@ class TestStl : public TestFixture { " foo.reserve(123);\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:6] -> [test.cpp:6] -> [test.cpp:8] -> [test.cpp:3] -> [test.cpp:6]: (error) Using iterator to local container 'foo' that may be invalid.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6] -> [test.cpp:6] -> [test.cpp:8] -> [test.cpp:3] -> [test.cpp:6]: (error) Using iterator to local container 'foo' that may be invalid.\n", errout_str()); } void pushback11() { @@ -3215,7 +3209,7 @@ class TestStl : public TestFixture { " ints.insert(it,0);\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void pushback12() { @@ -3233,7 +3227,7 @@ class TestStl : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:4] -> [test.cpp:6] -> [test.cpp:3] -> [test.cpp:9]: (error, inconclusive) Using iterator to local container 'vec' that may be invalid.\n", - errout.str()); + errout_str()); } void pushback13() { @@ -3243,7 +3237,7 @@ class TestStl : public TestFixture { " const char *BufPtr = &FilenameBuffer[PreAppendSize];\n" " return true;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void insert1() { @@ -3253,7 +3247,7 @@ class TestStl : public TestFixture { " ints.insert(ints.begin(), 1);\n" " ++iter;\n" "}"); - ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:3] -> [test.cpp:4] -> [test.cpp:1] -> [test.cpp:5]: (error) Using iterator to local container 'ints' that may be invalid.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:3] -> [test.cpp:4] -> [test.cpp:1] -> [test.cpp:5]: (error) Using iterator to local container 'ints' that may be invalid.\n", errout_str()); check("void f()\n" "{\n" @@ -3261,7 +3255,7 @@ class TestStl : public TestFixture { " std::vector::iterator iter = ints.begin();\n" " ints.insert(iter, 1);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f()\n" "{\n" @@ -3270,7 +3264,7 @@ class TestStl : public TestFixture { " ints.insert(iter, 1);\n" " ints.insert(iter, 2);\n" "}", true); - TODO_ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:5] -> [test.cpp:3] -> [test.cpp:6]: (error) Using iterator to local container 'ints' that may be invalid.\n", "[test.cpp:4] -> [test.cpp:5] -> [test.cpp:3] -> [test.cpp:6]: (error, inconclusive) Using iterator to local container 'ints' that may be invalid.\n", errout.str()); + TODO_ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:5] -> [test.cpp:3] -> [test.cpp:6]: (error) Using iterator to local container 'ints' that may be invalid.\n", "[test.cpp:4] -> [test.cpp:5] -> [test.cpp:3] -> [test.cpp:6]: (error, inconclusive) Using iterator to local container 'ints' that may be invalid.\n", errout_str()); check("void* f(const std::vector& bars) {\n" " std::vector::iterator i = bars.begin();\n" @@ -3278,21 +3272,21 @@ class TestStl : public TestFixture { " void* v = &i->foo;\n" " return v;\n" "}"); - ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:2] -> [test.cpp:3] -> [test.cpp:1] -> [test.cpp:4]: (error) Using iterator to local container 'bars' that may be invalid.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:2] -> [test.cpp:3] -> [test.cpp:1] -> [test.cpp:4]: (error) Using iterator to local container 'bars' that may be invalid.\n", errout_str()); check("Foo f(const std::vector& bars) {\n" " std::vector::iterator i = bars.begin();\n" " bars.insert(Bar());\n" " return i->foo;\n" "}"); - ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:2] -> [test.cpp:3] -> [test.cpp:1] -> [test.cpp:4]: (error) Using iterator to local container 'bars' that may be invalid.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:2] -> [test.cpp:3] -> [test.cpp:1] -> [test.cpp:4]: (error) Using iterator to local container 'bars' that may be invalid.\n", errout_str()); check("void f(const std::vector& bars) {\n" " for(std::vector::iterator i = bars.begin(); i != bars.end(); ++i) {\n" " i = bars.insert(i, bar);\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // TODO: This shouldn't be inconclusive check("void f(const std::vector& bars) {\n" @@ -3301,7 +3295,7 @@ class TestStl : public TestFixture { " i = bars.insert(i, bar);\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:2] -> [test.cpp:3] -> [test.cpp:1] -> [test.cpp:4]: (error, inconclusive) Using iterator to local container 'bars' that may be invalid.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:2] -> [test.cpp:3] -> [test.cpp:1] -> [test.cpp:4]: (error, inconclusive) Using iterator to local container 'bars' that may be invalid.\n", errout_str()); // TODO: This shouldn't be inconclusive check("void* f(const std::vector& bars) {\n" @@ -3311,7 +3305,7 @@ class TestStl : public TestFixture { " void* v = &i->foo;\n" " return v;\n" "}"); - ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:2] -> [test.cpp:3] -> [test.cpp:1] -> [test.cpp:4]: (error, inconclusive) Using iterator to local container 'bars' that may be invalid.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:2] -> [test.cpp:3] -> [test.cpp:1] -> [test.cpp:4]: (error, inconclusive) Using iterator to local container 'bars' that may be invalid.\n", errout_str()); } void insert2() { @@ -3323,7 +3317,7 @@ class TestStl : public TestFixture { " break;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(std::vector &vec) {\n" " for(std::vector::iterator iter = vec.begin(); iter != vec.end(); ++iter)\n" @@ -3334,7 +3328,7 @@ class TestStl : public TestFixture { " }\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void popback1() { // #11553 @@ -3346,20 +3340,20 @@ class TestStl : public TestFixture { "}\n"); ASSERT_EQUALS("[test.cpp:3]: (error) Out of bounds access in expression 'v.pop_back()' because 'v' is empty.\n" "[test.cpp:5]: (error) Out of bounds access in expression 'l.pop_front()' because 'l' is empty.\n", - errout.str()); + errout_str()); check("void f(std::vector& v) {\n" " if (v.empty()) {}\n" " v.pop_back();\n" "}\n"); ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:3]: (warning) Either the condition 'v.empty()' is redundant or expression 'v.pop_back()' causes access out of bounds.\n", - errout.str()); + errout_str()); check("void f(std::vector& v) {\n" " v.pop_back();\n" " if (v.empty()) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void stlBoundaries1() { @@ -3375,21 +3369,21 @@ class TestStl : public TestFixture { " ;\n" "}"); - ASSERT_EQUALS_MSG("[test.cpp:4]: (error) Dangerous comparison using operator< on iterator.\n", errout.str(), stlCont[i]); + ASSERT_EQUALS_MSG("[test.cpp:4]: (error) Dangerous comparison using operator< on iterator.\n", errout_str(), stlCont[i]); } check("void f() {\n" " std::forward_list::iterator it;\n" " for (it = ab.begin(); ab.end() > it; ++it) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Dangerous comparison using operator< on iterator.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Dangerous comparison using operator< on iterator.\n", errout_str()); // #5926 no FP Dangerous comparison using operator< on iterator on std::deque check("void f() {\n" " std::deque::iterator it;\n" " for (it = ab.begin(); ab.end() > it; ++it) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void stlBoundaries2() { @@ -3401,7 +3395,7 @@ class TestStl : public TestFixture { " for (it = files.begin(); it < files.end(); it++) { };\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void stlBoundaries3() { @@ -3415,13 +3409,13 @@ class TestStl : public TestFixture { " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool f() {\n" " static set::const_iterator current;\n" " return 25 > current->bar;\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Invalid iterator 'current' used.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Invalid iterator 'current' used.\n", errout_str()); } void stlBoundaries4() { @@ -3430,13 +3424,13 @@ class TestStl : public TestFixture { " std::forward_list>>::iterator it;\n" " for (it = ab.begin(); ab.end() > it; ++it) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Dangerous comparison using operator< on iterator.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Dangerous comparison using operator< on iterator.\n", errout_str()); // don't crash check("void f() {\n" " if (list < 0) ;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " if (list < 0) {\n" @@ -3444,7 +3438,7 @@ class TestStl : public TestFixture { " for (it = ab.begin(); ab.end() > it; ++it) {}\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Dangerous comparison using operator< on iterator.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Dangerous comparison using operator< on iterator.\n", errout_str()); } void stlBoundaries5() { @@ -3453,7 +3447,7 @@ class TestStl : public TestFixture { " iterator i;\n" " return i.foo();;\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class iterator {\n" " Class operator*();\n" @@ -3464,7 +3458,7 @@ class TestStl : public TestFixture { " iterator i;\n" " return i.foo();;\n" "}", true); - ASSERT_EQUALS("[test.cpp:8]: (error, inconclusive) Invalid iterator 'i' used.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8]: (error, inconclusive) Invalid iterator 'i' used.\n", errout_str()); } void stlBoundaries6() { // #7106 @@ -3475,7 +3469,7 @@ class TestStl : public TestFixture { " }\n" " }\n" "}", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } @@ -3489,109 +3483,109 @@ class TestStl : public TestFixture { "{\n" " if (s.find(12)) { }\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Suspicious condition. The result of find() is an iterator, but it is not properly checked.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Suspicious condition. The result of find() is an iterator, but it is not properly checked.\n", errout_str()); // error (pointer) check("void f(std::set *s)\n" "{\n" " if ((*s).find(12)) { }\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Suspicious condition. The result of find() is an iterator, but it is not properly checked.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Suspicious condition. The result of find() is an iterator, but it is not properly checked.\n", errout_str()); // error (pointer) check("void f(std::set *s)\n" "{\n" " if (s->find(12)) { }\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Suspicious condition. The result of find() is an iterator, but it is not properly checked.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Suspicious condition. The result of find() is an iterator, but it is not properly checked.\n", errout_str()); // error (array-like pointer) check("void f(std::set *s)\n" "{\n" " if (s[0].find(12)) { }\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Suspicious condition. The result of find() is an iterator, but it is not properly checked.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Suspicious condition. The result of find() is an iterator, but it is not properly checked.\n", errout_str()); // error (array) check("void f(std::set s [10])\n" "{\n" " if (s[0].find(12)) { }\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Suspicious condition. The result of find() is an iterator, but it is not properly checked.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Suspicious condition. The result of find() is an iterator, but it is not properly checked.\n", errout_str()); // error (undefined length array) check("void f(std::set s [])\n" "{\n" " if (s[0].find(12)) { }\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Suspicious condition. The result of find() is an iterator, but it is not properly checked.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Suspicious condition. The result of find() is an iterator, but it is not properly checked.\n", errout_str()); // error (vector) check("void f(std::vector > s)\n" "{\n" " if (s[0].find(12)) { }\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Suspicious condition. The result of find() is an iterator, but it is not properly checked.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Suspicious condition. The result of find() is an iterator, but it is not properly checked.\n", errout_str()); // error (assignment) check("void f(std::set s)\n" "{\n" " if (a || (x = s.find(12))) { }\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Suspicious condition. The result of find() is an iterator, but it is not properly checked.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Suspicious condition. The result of find() is an iterator, but it is not properly checked.\n", errout_str()); // ok (simple) check("void f(std::set s)\n" "{\n" " if (s.find(123) != s.end()) { }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // ok (pointer) check("void f(std::set *s)\n" "{\n" " if ((*s).find(12) != s.end()) { }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // ok (array-like pointer) check("void f(std::set *s)\n" "{\n" " if (s[0].find(12) != s->end()) { }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // ok (array) check("void f(std::set s [10])\n" "{\n" " if (s[0].find(123) != s->end()) { }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // ok (undefined length array) check("void f(std::set s [])\n" "{\n" " if (s[0].find(123) != s->end()) { }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // ok (assignment) check("void f(std::set s)\n" "{\n" " if (a || (x = s.find(12)) != s.end()) { }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // ok (dereference, #6402) check("void f(std::set s) {\n" " if (s.find(12).member) { }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(std::set s) {\n" " if (auto result = s.find(123); result != s.end()) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // --------------------------- // std::find @@ -3602,21 +3596,21 @@ class TestStl : public TestFixture { "{\n" " if (std::find(a,b,c)) { }\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Suspicious condition. The result of find() is an iterator, but it is not properly checked.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Suspicious condition. The result of find() is an iterator, but it is not properly checked.\n", errout_str()); // ok check("void f()\n" "{\n" " if (std::find(a,b,c) != c) { }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // ok (less than comparison, #6217) check("void f(std::vector s)\n" "{\n" " if (std::find(a, b, c) < d) { }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #3714 - segmentation fault for syntax error ASSERT_THROW(check("void f() {\n" @@ -3628,7 +3622,7 @@ class TestStl : public TestFixture { check("void f() {\n" " if ((std::find(a,b,c)) != b) { }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void if_str_find() { @@ -3637,57 +3631,57 @@ class TestStl : public TestFixture { "{\n" " if (s.find(\"abc\")) { }\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (performance) Inefficient usage of string::find() in condition; string::starts_with() could be faster.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (performance) Inefficient usage of string::find() in condition; string::starts_with() could be faster.\n", errout_str()); // error (pointer) check("void f(const std::string *s)\n" "{\n" " if ((*s).find(\"abc\")) { }\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (performance) Inefficient usage of string::find() in condition; string::starts_with() could be faster.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (performance) Inefficient usage of string::find() in condition; string::starts_with() could be faster.\n", errout_str()); // error (pointer) check("void f(const std::string *s)\n" "{\n" " if (s->find(\"abc\")) { }\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (performance) Inefficient usage of string::find() in condition; string::starts_with() could be faster.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (performance) Inefficient usage of string::find() in condition; string::starts_with() could be faster.\n", errout_str()); // error (vector) check("void f(const std::vector &s)\n" "{\n" " if (s[0].find(\"abc\")) { }\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (performance) Inefficient usage of string::find() in condition; string::starts_with() could be faster.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (performance) Inefficient usage of string::find() in condition; string::starts_with() could be faster.\n", errout_str()); // #3162 check("void f(const std::string& s1, const std::string& s2)\n" "{\n" " if ((!s1.empty()) && (0 == s1.find(s2))) { }\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (performance) Inefficient usage of string::find() in condition; string::starts_with() could be faster.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (performance) Inefficient usage of string::find() in condition; string::starts_with() could be faster.\n", errout_str()); // #4102 check("void f(const std::string &define) {\n" " if (define.find(\"=\") + 1U == define.size());\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(std::string a, std::string b) {\n" // #4480 " if (a.find(\"<\") < b.find(\">\")) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(const std::string &s) {\n" " if (foo(s.find(\"abc\"))) { }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #7349 - std::string::find_first_of check("void f(const std::string &s) {\n" " if (s.find_first_of(\"abc\")==0) { }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // # 10153 check("int main() {\n" @@ -3698,7 +3692,7 @@ class TestStl : public TestFixture { " }\n" " return 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } @@ -3712,9 +3706,9 @@ class TestStl : public TestFixture { " if (x.size() == 0) {}\n" "}"; check(code, false, Standards::CPP03); - ASSERT_EQUALS("[test.cpp:7]: (performance) Possible inefficient checking for 'x' emptiness.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (performance) Possible inefficient checking for 'x' emptiness.\n", errout_str()); check(code); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); code = "std::list x;\n" "void f()\n" @@ -3722,9 +3716,9 @@ class TestStl : public TestFixture { " if (x.size() == 0) {}\n" "}"; check(code, false, Standards::CPP03); - ASSERT_EQUALS("[test.cpp:4]: (performance) Possible inefficient checking for 'x' emptiness.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (performance) Possible inefficient checking for 'x' emptiness.\n", errout_str()); check(code); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); code = "void f()\n" "{\n" @@ -3732,9 +3726,9 @@ class TestStl : public TestFixture { " if (x.size() == 0) {}\n" "}"; check(code, false, Standards::CPP03); - ASSERT_EQUALS("[test.cpp:4]: (performance) Possible inefficient checking for 'x' emptiness.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (performance) Possible inefficient checking for 'x' emptiness.\n", errout_str()); check(code); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); code = "void f()\n" "{\n" @@ -3742,9 +3736,9 @@ class TestStl : public TestFixture { " if (0 == x.size()) {}\n" "}"; check(code, false, Standards::CPP03); - ASSERT_EQUALS("[test.cpp:4]: (performance) Possible inefficient checking for 'x' emptiness.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (performance) Possible inefficient checking for 'x' emptiness.\n", errout_str()); check(code); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); code = "void f()\n" "{\n" @@ -3752,9 +3746,9 @@ class TestStl : public TestFixture { " if (x.size() != 0) {}\n" "}"; check(code, false, Standards::CPP03); - ASSERT_EQUALS("[test.cpp:4]: (performance) Possible inefficient checking for 'x' emptiness.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (performance) Possible inefficient checking for 'x' emptiness.\n", errout_str()); check(code); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); code = "void f()\n" "{\n" @@ -3762,9 +3756,9 @@ class TestStl : public TestFixture { " if (0 != x.size()) {}\n" "}"; check(code, false, Standards::CPP03); - ASSERT_EQUALS("[test.cpp:4]: (performance) Possible inefficient checking for 'x' emptiness.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (performance) Possible inefficient checking for 'x' emptiness.\n", errout_str()); check(code); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); code = "void f()\n" "{\n" @@ -3772,9 +3766,9 @@ class TestStl : public TestFixture { " if (x.size() > 0) {}\n" "}"; check(code, false, Standards::CPP03); - ASSERT_EQUALS("[test.cpp:4]: (performance) Possible inefficient checking for 'x' emptiness.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (performance) Possible inefficient checking for 'x' emptiness.\n", errout_str()); check(code); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); code = "void f()\n" "{\n" @@ -3782,9 +3776,9 @@ class TestStl : public TestFixture { " if (0 < x.size()) {}\n" "}"; check(code, false, Standards::CPP03); - ASSERT_EQUALS("[test.cpp:4]: (performance) Possible inefficient checking for 'x' emptiness.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (performance) Possible inefficient checking for 'x' emptiness.\n", errout_str()); check(code); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); code = "void f()\n" "{\n" @@ -3792,9 +3786,9 @@ class TestStl : public TestFixture { " if (x.size() >= 1) {}\n" "}"; check(code, false, Standards::CPP03); - ASSERT_EQUALS("[test.cpp:4]: (performance) Possible inefficient checking for 'x' emptiness.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (performance) Possible inefficient checking for 'x' emptiness.\n", errout_str()); check(code); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); code = "void f()\n" "{\n" @@ -3802,9 +3796,9 @@ class TestStl : public TestFixture { " if (x.size() < 1) {}\n" "}"; check(code, false, Standards::CPP03); - ASSERT_EQUALS("[test.cpp:4]: (performance) Possible inefficient checking for 'x' emptiness.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (performance) Possible inefficient checking for 'x' emptiness.\n", errout_str()); check(code); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); code = "void f()\n" "{\n" @@ -3812,9 +3806,9 @@ class TestStl : public TestFixture { " if (1 <= x.size()) {}\n" "}"; check(code, false, Standards::CPP03); - ASSERT_EQUALS("[test.cpp:4]: (performance) Possible inefficient checking for 'x' emptiness.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (performance) Possible inefficient checking for 'x' emptiness.\n", errout_str()); check(code); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); code = "void f()\n" "{\n" @@ -3822,9 +3816,9 @@ class TestStl : public TestFixture { " if (1 > x.size()) {}\n" "}"; check(code, false, Standards::CPP03); - ASSERT_EQUALS("[test.cpp:4]: (performance) Possible inefficient checking for 'x' emptiness.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (performance) Possible inefficient checking for 'x' emptiness.\n", errout_str()); check(code); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); code = "void f()\n" "{\n" @@ -3832,9 +3826,9 @@ class TestStl : public TestFixture { " if (x.size()) {}\n" "}"; check(code, false, Standards::CPP03); - ASSERT_EQUALS("[test.cpp:4]: (performance) Possible inefficient checking for 'x' emptiness.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (performance) Possible inefficient checking for 'x' emptiness.\n", errout_str()); check(code); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); code = "void f()\n" "{\n" @@ -3842,16 +3836,16 @@ class TestStl : public TestFixture { " if (!x.size()) {}\n" "}"; check(code, false, Standards::CPP03); - ASSERT_EQUALS("[test.cpp:4]: (performance) Possible inefficient checking for 'x' emptiness.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (performance) Possible inefficient checking for 'x' emptiness.\n", errout_str()); check(code); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f()\n" "{\n" " std::list x;\n" " fun(x.size());\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); code ="void f()\n" "{\n" @@ -3859,9 +3853,9 @@ class TestStl : public TestFixture { " fun(!x.size());\n" "}"; check(code, false, Standards::CPP03); - ASSERT_EQUALS("[test.cpp:4]: (performance) Possible inefficient checking for 'x' emptiness.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (performance) Possible inefficient checking for 'x' emptiness.\n", errout_str()); check(code); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); code = "void f()\n" "{\n" @@ -3869,27 +3863,27 @@ class TestStl : public TestFixture { " fun(a && x.size());\n" "}"; check(code, false, Standards::CPP03); - ASSERT_EQUALS("[test.cpp:4]: (performance) Possible inefficient checking for 'x' emptiness.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (performance) Possible inefficient checking for 'x' emptiness.\n", errout_str()); check(code); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" // #4039 " std::list x;\n" " fun(width % x.size() != 0);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #4584 check("void f() {\n" " std::list x;\n" " if (foo + 1 > x.size()) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " std::list x;\n" " if (x.size() < 1 + foo) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void size2() { @@ -3908,10 +3902,10 @@ class TestStl : public TestFixture { ASSERT_EQUALS( "[test.cpp:10]: (performance) Possible inefficient checking for 'x' emptiness.\n" "[test.cpp:10]: (performance) Possible inefficient checking for 'x' emptiness.\n", // duplicate - errout.str()); + errout_str()); check(code); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void size3() { @@ -3930,7 +3924,7 @@ class TestStl : public TestFixture { ASSERT_EQUALS( "[test.cpp:10]: (performance) Possible inefficient checking for 'x' emptiness.\n" "[test.cpp:10]: (performance) Possible inefficient checking for 'x' emptiness.\n", // duplicate - errout.str()); + errout_str()); code = "namespace N {\n" " class Zzz {\n" @@ -3947,27 +3941,27 @@ class TestStl : public TestFixture { ASSERT_EQUALS( "[test.cpp:10]: (performance) Possible inefficient checking for 'x' emptiness.\n" "[test.cpp:10]: (performance) Possible inefficient checking for 'x' emptiness.\n", // duplicate - errout.str()); + errout_str()); check(code); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void size4() { // #2652 - don't warn about vector/deque check("void f(std::vector &v) {\n" " if (v.size() > 0U) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(std::deque &v) {\n" " if (v.size() > 0U) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(std::array &a) {\n" " if (a.size() > 0U) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void redundantCondition1() { @@ -3976,7 +3970,7 @@ class TestStl : public TestFixture { " if (haystack.find(needle) != haystack.end())\n" " haystack.remove(needle);" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Redundant checking of STL container element existence before removing it.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Redundant checking of STL container element existence before removing it.\n", errout_str()); } void missingInnerComparison1() { @@ -3987,14 +3981,14 @@ class TestStl : public TestFixture { " }\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:2]: (warning) Missing bounds check for extra iterator increment in loop.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:2]: (warning) Missing bounds check for extra iterator increment in loop.\n", errout_str()); check("void f(std::map &ints) {\n" " for (std::map::iterator it = ints.begin(); it != ints.end(); ++it) {\n" " ++it->second;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(const std::vector &v) {\n" " for(std::vector::const_iterator it = v.begin(); it != v.end(); ++it) {\n" @@ -4005,7 +3999,7 @@ class TestStl : public TestFixture { " }\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void missingInnerComparison2() { @@ -4018,7 +4012,7 @@ class TestStl : public TestFixture { " }\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void missingInnerComparison3() { @@ -4028,7 +4022,7 @@ class TestStl : public TestFixture { " { }\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void missingInnerComparison4() { @@ -4040,7 +4034,7 @@ class TestStl : public TestFixture { " }\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Consider using std::find_if algorithm instead of a raw loop.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Consider using std::find_if algorithm instead of a raw loop.\n", errout_str()); check("function f1(std::list &l1) {\n" " for(std::list::iterator i = l1.begin(); i != l1.end(); i++) {\n" @@ -4050,7 +4044,7 @@ class TestStl : public TestFixture { " }\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (style) Consider using std::find_if algorithm instead of a raw loop.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Consider using std::find_if algorithm instead of a raw loop.\n", errout_str()); } void missingInnerComparison5() { @@ -4059,7 +4053,7 @@ class TestStl : public TestFixture { " str[i++] = (*it).first;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void missingInnerComparison6() { @@ -4068,7 +4062,7 @@ class TestStl : public TestFixture { " it = s.insert(++it, 0);\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void cstr() { @@ -4076,50 +4070,50 @@ class TestStl : public TestFixture { " std::string errmsg;\n" " throw errmsg.c_str();\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Dangerous usage of c_str(). The value returned by c_str() is invalid after throwing exception.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Dangerous usage of c_str(). The value returned by c_str() is invalid after throwing exception.\n", errout_str()); check("const char *get_msg() {\n" " std::string errmsg;\n" " return errmsg.c_str();\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Dangerous usage of c_str(). The value returned by c_str() is invalid after this call.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Dangerous usage of c_str(). The value returned by c_str() is invalid after this call.\n", errout_str()); check("const char *get_msg() {\n" " std::ostringstream errmsg;\n" " return errmsg.str().c_str();\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Dangerous usage of c_str(). The value returned by c_str() is invalid after this call.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Dangerous usage of c_str(). The value returned by c_str() is invalid after this call.\n", errout_str()); check("const char *get_msg() {\n" " std::string errmsg;\n" " return std::string(\"ERROR: \" + errmsg).c_str();\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Dangerous usage of c_str(). The value returned by c_str() is invalid after this call.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Dangerous usage of c_str(). The value returned by c_str() is invalid after this call.\n", errout_str()); check("const char *get_msg() {\n" " std::string errmsg;\n" " return (\"ERROR: \" + errmsg).c_str();\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Dangerous usage of c_str(). The value returned by c_str() is invalid after this call.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Dangerous usage of c_str(). The value returned by c_str() is invalid after this call.\n", errout_str()); check("const char *get_msg() {\n" " std::string errmsg;\n" " return (\"ERROR: \" + std::string(\"crash me\")).c_str();\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Dangerous usage of c_str(). The value returned by c_str() is invalid after this call.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Dangerous usage of c_str(). The value returned by c_str() is invalid after this call.\n", errout_str()); check("void f() {\n" " std::ostringstream errmsg;\n" " const char *c = errmsg.str().c_str();\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Dangerous usage of c_str(). The value returned by c_str() is invalid after this call.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Dangerous usage of c_str(). The value returned by c_str() is invalid after this call.\n", errout_str()); check("std::string f();\n" "\n" "void foo() {\n" " const char *c = f().c_str();\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Dangerous usage of c_str(). The value returned by c_str() is invalid after this call.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Dangerous usage of c_str(). The value returned by c_str() is invalid after this call.\n", errout_str()); check("class Foo {\n" " const char *f();\n" @@ -4128,7 +4122,7 @@ class TestStl : public TestFixture { " std::string s;\n" " return s.c_str();\n" "}"); - ASSERT_EQUALS("[test.cpp:6]: (error) Dangerous usage of c_str(). The value returned by c_str() is invalid after this call.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (error) Dangerous usage of c_str(). The value returned by c_str() is invalid after this call.\n", errout_str()); check("class Foo {\n" " std::string GetVal() const;\n" @@ -4137,27 +4131,27 @@ class TestStl : public TestFixture { " Foo f;\n" " return f.GetVal().c_str();\n" "}"); - ASSERT_EQUALS("[test.cpp:6]: (error) Dangerous usage of c_str(). The value returned by c_str() is invalid after this call.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (error) Dangerous usage of c_str(). The value returned by c_str() is invalid after this call.\n", errout_str()); check("const char* foo() {\n" " static std::string text;\n" " text = \"hello world\\n\";\n" " return text.c_str();\n" "}"); - ASSERT_EQUALS("", errout.str()); // #3427 + ASSERT_EQUALS("", errout_str()); // #3427 // Implicit conversion back to std::string check("std::string get_msg() {\n" " std::string errmsg;\n" " return errmsg.c_str();\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (performance) Returning the result of c_str() in a function that returns std::string is slow and redundant.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (performance) Returning the result of c_str() in a function that returns std::string is slow and redundant.\n", errout_str()); check("const std::string& get_msg() {\n" " std::string errmsg;\n" " return errmsg.c_str();\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (performance) Returning the result of c_str() in a function that returns std::string is slow and redundant.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (performance) Returning the result of c_str() in a function that returns std::string is slow and redundant.\n", errout_str()); check("class Foo {\n" " std::string GetVal() const;\n" @@ -4166,19 +4160,19 @@ class TestStl : public TestFixture { " Foo f;\n" " return f.GetVal().c_str();\n" "}"); - ASSERT_EQUALS("[test.cpp:6]: (performance) Returning the result of c_str() in a function that returns std::string is slow and redundant.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (performance) Returning the result of c_str() in a function that returns std::string is slow and redundant.\n", errout_str()); check("std::string get_msg() {\n" " std::string errmsg;\n" " return errmsg;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("std::string get_msg() {\n" // #3678 " MyStringClass errmsg;\n" " return errmsg.c_str();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void Foo1(const std::string& str) {}\n" "void Foo2(const char* c, const std::string str) {}\n" @@ -4205,7 +4199,7 @@ class TestStl : public TestFixture { "[test.cpp:15]: (performance) Passing the result of c_str() to a function that takes std::string as argument no. 2 is slow and redundant.\n" "[test.cpp:16]: (performance) Passing the result of c_str() to a function that takes std::string as argument no. 2 is slow and redundant.\n" "[test.cpp:17]: (performance) Passing the result of c_str() to a function that takes std::string as argument no. 1 is slow and redundant.\n" - "[test.cpp:17]: (performance) Passing the result of c_str() to a function that takes std::string as argument no. 2 is slow and redundant.\n", errout.str()); + "[test.cpp:17]: (performance) Passing the result of c_str() to a function that takes std::string as argument no. 2 is slow and redundant.\n", errout_str()); check("void Foo1(const std::string& str) {}\n" "void Foo2(char* c, const std::string str) {}\n" @@ -4214,7 +4208,7 @@ class TestStl : public TestFixture { " Foo1(str, foo);\n" // Don't crash " Foo2(str.c_str());\n" // Don't crash "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct Foo {\n" " void func(std::string str) const {}\n" @@ -4231,7 +4225,7 @@ class TestStl : public TestFixture { ASSERT_EQUALS("[test.cpp:9]: (performance) Passing the result of c_str() to a function that takes std::string as argument no. 1 is slow and redundant.\n" "[test.cpp:10]: (performance) Passing the result of c_str() to a function that takes std::string as argument no. 1 is slow and redundant.\n" "[test.cpp:11]: (performance) Passing the result of c_str() to a function that takes std::string as argument no. 1 is slow and redundant.\n", - errout.str()); + errout_str()); check("void f(const std::string& s);\n" // #8336 "struct T {\n" @@ -4255,7 +4249,7 @@ class TestStl : public TestFixture { "[test.cpp:12]: (performance) Passing the result of c_str() to a function that takes std::string as argument no. 1 is slow and redundant.\n" "[test.cpp:13]: (performance) Passing the result of c_str() to a function that takes std::string as argument no. 1 is slow and redundant.\n" "[test.cpp:14]: (performance) Passing the result of c_str() to a function that takes std::string as argument no. 1 is slow and redundant.\n", - errout.str()); + errout_str()); check("void svgFile(const std::string &content, const std::string &fileName, const double end = 1000., const double start = 0.);\n" "void Bar(std::string filename) {\n" @@ -4263,7 +4257,7 @@ class TestStl : public TestFixture { " std::ofstream svgFile(filename.c_str(), std::ios::trunc);\n" " svgFile << \"test\";\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void Foo(const char* p) {}\n" "void Foo(const std::string& str) {Foo(str.c_str());}\n" // Overloaded @@ -4272,12 +4266,12 @@ class TestStl : public TestFixture { " Foo(str);\n" " Foo(str.c_str());\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int atoi(const std::string& str) {\n" // #3729: Don't suggest recursive call " return atoi(str.c_str());\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("std::string hello()\n" "{\n" @@ -4288,7 +4282,7 @@ class TestStl : public TestFixture { "{\n" " return hello().c_str();\n" "}"); - ASSERT_EQUALS("[test.cpp:8]: (error) Dangerous usage of c_str(). The value returned by c_str() is invalid after this call.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8]: (error) Dangerous usage of c_str(). The value returned by c_str() is invalid after this call.\n", errout_str()); check("class Fred {\n" " std::string hello();\n" @@ -4302,7 +4296,7 @@ class TestStl : public TestFixture { "{\n" " return hello().c_str();\n" "}"); - ASSERT_EQUALS("[test.cpp:11]: (error) Dangerous usage of c_str(). The value returned by c_str() is invalid after this call.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:11]: (error) Dangerous usage of c_str(). The value returned by c_str() is invalid after this call.\n", errout_str()); // #4183 - using MyStringClass.c_str() check("void a(const std::string &str);\n" @@ -4311,12 +4305,12 @@ class TestStl : public TestFixture { " MyStringClass s;\n" " a(s.c_str());\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("std::string Format(const char * name) {\n" // #4938 " return String::Format(\"%s:\", name).c_str();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #7480 check("struct InternalMapInfo {\n" @@ -4326,7 +4320,7 @@ class TestStl : public TestFixture { " const InternalMapInfo* mapInfo = &internal_getMapInfo;\n" " return mapInfo->author.c_str();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct InternalMapInfo {\n" " std::string author;\n" @@ -4335,7 +4329,7 @@ class TestStl : public TestFixture { " const InternalMapInfo* mapInfo = &internal_getMapInfo;\n" " return mapInfo->author.c_str();\n" "}"); - ASSERT_EQUALS("[test.cpp:6]: (performance) Returning the result of c_str() in a function that returns std::string is slow and redundant.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (performance) Returning the result of c_str() in a function that returns std::string is slow and redundant.\n", errout_str()); check("struct InternalMapInfo {\n" " std::string author;\n" @@ -4344,7 +4338,7 @@ class TestStl : public TestFixture { " const InternalMapInfo mapInfo = internal_getMapInfo;\n" " return mapInfo.author.c_str();\n" "}"); - ASSERT_EQUALS("[test.cpp:6]: (error) Dangerous usage of c_str(). The value returned by c_str() is invalid after this call.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (error) Dangerous usage of c_str(). The value returned by c_str() is invalid after this call.\n", errout_str()); check("struct S {\n" // #7656 " std::string data;\n" @@ -4354,7 +4348,7 @@ class TestStl : public TestFixture { " const struct S &s = getS();\n" " return s.data.c_str();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S {\n" // #7930 " std::string data;\n" @@ -4364,14 +4358,14 @@ class TestStl : public TestFixture { " std::string &ref = s.data;\n" " return ref.c_str();\n" "}"); - ASSERT_EQUALS("[test.cpp:7]: (error) Dangerous usage of c_str(). The value returned by c_str() is invalid after this call.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (error) Dangerous usage of c_str(). The value returned by c_str() is invalid after this call.\n", errout_str()); check("void f(const wchar_t* w, int i = 0, ...);\n" // #10357 "void f(const std::string& s, int i = 0);\n" "void g(const std::wstring& p) {\n" " f(p.c_str());\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S {\n" //#9161 " const char* f() const noexcept {\n" @@ -4379,7 +4373,7 @@ class TestStl : public TestFixture { " }\n" " std::string m;\n" "};\n", /*inconclusive*/ true); - ASSERT_EQUALS("[test.cpp:3]: (error) Dangerous usage of c_str(). The value returned by c_str() is invalid after this call.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Dangerous usage of c_str(). The value returned by c_str() is invalid after this call.\n", errout_str()); check("struct S {\n" // #10493 " void f(const char** pp);\n" @@ -4394,42 +4388,42 @@ class TestStl : public TestFixture { " *pp = member.c_str();\n" " }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("std::string f(const std::string& a) {\n" " std::string b(a.c_str());\n" " return b;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:2]: (performance) Constructing a std::string from the result of c_str() is slow and redundant.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (performance) Constructing a std::string from the result of c_str() is slow and redundant.\n", errout_str()); check("std::string f(const std::string& a) {\n" " std::string b{ a.c_str() };\n" " return b;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:2]: (performance) Constructing a std::string from the result of c_str() is slow and redundant.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (performance) Constructing a std::string from the result of c_str() is slow and redundant.\n", errout_str()); check("std::string f(const std::string& a) {\n" " std::string b = a.c_str();\n" " return b;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:2]: (performance) Assigning the result of c_str() to a std::string is slow and redundant.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (performance) Assigning the result of c_str() to a std::string is slow and redundant.\n", errout_str()); check("std::string g(const std::string& a, const std::string& b) {\n" " return a + b.c_str();\n" "}\n"); - ASSERT_EQUALS("[test.cpp:2]: (performance) Concatenating the result of c_str() and a std::string is slow and redundant.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (performance) Concatenating the result of c_str() and a std::string is slow and redundant.\n", errout_str()); check("std::string g(const std::string& a, const std::string& b) {\n" " return a.c_str() + b;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:2]: (performance) Concatenating the result of c_str() and a std::string is slow and redundant.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (performance) Concatenating the result of c_str() and a std::string is slow and redundant.\n", errout_str()); check("std::vector v;\n" // don't crash "int i;\n" "void f() {\n" " const double* const QM_R__ buf(v.data() + i);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct T {\n" // #7515 " std::string g();\n" @@ -4453,7 +4447,7 @@ class TestStl : public TestFixture { "[test.cpp:11]: (performance) Passing the result of c_str() to a stream is slow and redundant.\n" "[test.cpp:12]: (performance) Passing the result of c_str() to a stream is slow and redundant.\n" "[test.cpp:14]: (performance) Passing the result of c_str() to a stream is slow and redundant.\n", - errout.str()); + errout_str()); check("struct S { std::string str; };\n" "struct T { S s; };\n" @@ -4466,14 +4460,14 @@ class TestStl : public TestFixture { "}\n"); ASSERT_EQUALS("[test.cpp:6]: (performance) Assigning the result of c_str() to a std::string is slow and redundant.\n" "[test.cpp:8]: (performance) Assigning the result of c_str() to a std::string is slow and redundant.\n", - errout.str()); + errout_str()); check("void f(std::string_view);\n" // #11547 "void g(const std::string & s) {\n" " f(s.c_str());\n" "}\n"); ASSERT_EQUALS("[test.cpp:3]: (performance) Passing the result of c_str() to a function that takes std::string_view as argument no. 1 is slow and redundant.\n", - errout.str()); + errout_str()); check("std::string_view f(const std::string& s) {\n" " std::string_view sv = s.c_str();\n" @@ -4485,12 +4479,12 @@ class TestStl : public TestFixture { "}\n"); ASSERT_EQUALS("[test.cpp:2]: (performance) Assigning the result of c_str() to a std::string_view is slow and redundant.\n" "[test.cpp:6]: (performance) Constructing a std::string_view from the result of c_str() is slow and redundant.\n", - errout.str()); + errout_str()); check("void f(const std::string& s) {\n" // #11819 " std::string_view sv(s.data(), 13);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct S { std::string x; };\n" // #11802 "std::vector> global;\n" @@ -4499,7 +4493,7 @@ class TestStl : public TestFixture { " global.push_back(s);\n" " return s->x.c_str();\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void uselessCalls() { @@ -4509,7 +4503,7 @@ class TestStl : public TestFixture { " s1.swap(s2);\n" " s2.swap(s2);\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f()\n" "{\n" @@ -4517,7 +4511,7 @@ class TestStl : public TestFixture { " s1.swap(s2);\n" " s2.swap(s2);\n" "};"); - ASSERT_EQUALS("[test.cpp:5]: (performance) It is inefficient to swap a object with itself by calling 's2.swap(s2)'\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (performance) It is inefficient to swap a object with itself by calling 's2.swap(s2)'\n", errout_str()); check("void f()\n" "{\n" @@ -4527,7 +4521,7 @@ class TestStl : public TestFixture { " s1.compare(s2.c_str());\n" " s1.compare(0, s1.size(), s1);\n" "};"); - ASSERT_EQUALS("[test.cpp:5]: (warning) It is inefficient to call 's2.compare(s2)' as it always returns 0.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (warning) It is inefficient to call 's2.compare(s2)' as it always returns 0.\n", errout_str()); // #7370 False positive uselessCallsCompare on unknown type check("class ReplayIteratorImpl{\n" @@ -4538,7 +4532,7 @@ class TestStl : public TestFixture { " }\n" " WT_CURSOR *cursor_;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f()\n" "{\n" @@ -4554,7 +4548,7 @@ class TestStl : public TestFixture { "the object. Use operator= instead.\n" "[test.cpp:8]: (performance) Ineffective call of function \'substr\' because it returns a copy of " "the object. Use operator= instead.\n" - "[test.cpp:9]: (performance) Ineffective call of function \'substr\' because it returns an empty string.\n", errout.str()); + "[test.cpp:9]: (performance) Ineffective call of function \'substr\' because it returns an empty string.\n", errout_str()); check("void f()\n" "{\n" @@ -4566,26 +4560,26 @@ class TestStl : public TestFixture { " s1 = s2.substr(0,std::string::npos);\n" " s1 = s2.substr(x+5-n, 0);\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int main()\n" "{\n" " std::string str = \"a1b1\";\n" " return str.find(str[1], 2);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool foo(std::vector& v) {\n" " v.empty();\n" " return v.empty();\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Ineffective call of function 'empty()'. Did you intend to call 'clear()' instead?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Ineffective call of function 'empty()'. Did you intend to call 'clear()' instead?\n", errout_str()); check("void f() {\n" // #4938 " OdString str;\n" " str.empty();\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" // #4032 " const std::string greeting(\"Hello World !!!\");\n" @@ -4593,7 +4587,7 @@ class TestStl : public TestFixture { " if (npos != std::string::npos)\n" " std::cout << greeting.substr(0, npos) << std::endl;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(std::vector a) {\n" " std::remove(a.begin(), a.end(), val);\n" @@ -4605,19 +4599,19 @@ class TestStl : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:2]: (warning) Return value of std::remove() ignored. Elements remain in container.\n" "[test.cpp:3]: (warning) Return value of std::remove_if() ignored. Elements remain in container.\n" - "[test.cpp:4]: (warning) Return value of std::unique() ignored. Elements remain in container.\n", errout.str()); + "[test.cpp:4]: (warning) Return value of std::unique() ignored. Elements remain in container.\n", errout_str()); // #4431 - fp check("bool f() {\n" " return x ? true : (y.empty());\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #8360 check("void f(std::string s) {\n" " for (;s.empty();) {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #11166 check("std::string f(std::string s) {\n" @@ -4625,49 +4619,49 @@ class TestStl : public TestFixture { " return s;\n" "}\n"); ASSERT_EQUALS("[test.cpp:2]: (performance) Ineffective call of function 'substr' because a prefix of the string is assigned to itself. Use resize() or pop_back() instead.\n", - errout.str()); + errout_str()); check("std::string f(std::string s, std::size_t start, std::size_t end, const std::string& i) {\n" " s = s.substr(0, start) + i + s.substr(end + 1);\n" " return s;\n" "}\n"); ASSERT_EQUALS("[test.cpp:2]: (performance) Ineffective call of function 'substr' because a prefix of the string is assigned to itself. Use replace() instead.\n", - errout.str()); + errout_str()); check("std::string f(std::string s, std::size_t end) {\n" " s = { s.begin(), s.begin() + end };\n" " return s;\n" "}\n"); ASSERT_EQUALS("[test.cpp:2]: (performance) Inefficient constructor call: container 's' is assigned a partial copy of itself. Use erase() or resize() instead.\n", - errout.str()); + errout_str()); check("std::list f(std::list l, std::size_t end) {\n" " l = { l.begin(), l.begin() + end };\n" " return l;\n" "}\n"); ASSERT_EQUALS("[test.cpp:2]: (performance) Inefficient constructor call: container 'l' is assigned a partial copy of itself. Use erase() or resize() instead.\n", - errout.str()); + errout_str()); check("std::string f(std::string s, std::size_t end) {\n" " s = std::string{ s.begin(), s.begin() + end };\n" " return s;\n" "}\n"); ASSERT_EQUALS("[test.cpp:2]: (performance) Inefficient constructor call: container 's' is assigned a partial copy of itself. Use erase() or resize() instead.\n", - errout.str()); + errout_str()); check("std::string f(std::string s, std::size_t end) {\n" " s = std::string(s.begin(), s.begin() + end);\n" " return s;\n" "}\n"); ASSERT_EQUALS("[test.cpp:2]: (performance) Inefficient constructor call: container 's' is assigned a partial copy of itself. Use erase() or resize() instead.\n", - errout.str()); + errout_str()); check("std::vector f(std::vector v, std::size_t end) {\n" " v = std::vector(v.begin(), v.begin() + end);\n" " return v;\n" "}\n"); ASSERT_EQUALS("[test.cpp:2]: (performance) Inefficient constructor call: container 'v' is assigned a partial copy of itself. Use erase() or resize() instead.\n", - errout.str()); + errout_str()); } void stabilityOfChecks() { @@ -4682,7 +4676,7 @@ class TestStl : public TestFixture { " }\n" " void shift() { EffectivityRangeData::iterator it; }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void dereferenceInvalidIterator() { @@ -4692,7 +4686,7 @@ class TestStl : public TestFixture { " std::cout << *i;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Possible dereference of an invalid iterator: i\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Possible dereference of an invalid iterator: i\n", errout_str()); check("void foo(std::string::iterator& i) {\n" " if(foo) { bar(); }\n" @@ -4700,7 +4694,7 @@ class TestStl : public TestFixture { " std::cout << *i;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Possible dereference of an invalid iterator: i\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Possible dereference of an invalid iterator: i\n", errout_str()); // Test suggested correction doesn't report an error check("void foo(std::string::iterator& i) {\n" @@ -4708,7 +4702,7 @@ class TestStl : public TestFixture { " std::cout << *i;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Test "while" with "&&" case check("void foo(std::string::iterator& i) {\n" @@ -4717,7 +4711,7 @@ class TestStl : public TestFixture { " i ++;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Possible dereference of an invalid iterator: i\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Possible dereference of an invalid iterator: i\n", errout_str()); check("void foo(std::string::iterator& i) {\n" " do {\n" @@ -4725,7 +4719,7 @@ class TestStl : public TestFixture { " i ++;\n" " } while (std::isalpha(*i) && i != str.end());\n" "}"); - ASSERT_EQUALS("[test.cpp:5]: (warning) Possible dereference of an invalid iterator: i\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (warning) Possible dereference of an invalid iterator: i\n", errout_str()); // Test "while" with "||" case check("void foo(std::string::iterator& i) {\n" @@ -4734,7 +4728,7 @@ class TestStl : public TestFixture { " i ++;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Possible dereference of an invalid iterator: i\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Possible dereference of an invalid iterator: i\n", errout_str()); // Test fix for "while" with "||" case check("void foo(std::string::iterator& i) {\n" @@ -4743,7 +4737,7 @@ class TestStl : public TestFixture { " i ++;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Test "for" with "&&" case check("void foo(std::string::iterator& i) {\n" @@ -4752,7 +4746,7 @@ class TestStl : public TestFixture { " i ++;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Possible dereference of an invalid iterator: i\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Possible dereference of an invalid iterator: i\n", errout_str()); // Test "for" with "||" case check("void foo(std::string::iterator& i) {\n" @@ -4761,7 +4755,7 @@ class TestStl : public TestFixture { " i ++;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Possible dereference of an invalid iterator: i\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Possible dereference of an invalid iterator: i\n", errout_str()); // Test that a dereference outside the condition part of a "for" // loop does not result in a false positive @@ -4771,7 +4765,7 @@ class TestStl : public TestFixture { " i ++;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Test that other "&&" terms in the condition don't invalidate the check check("void foo(char* c, std::string::iterator& i) {\n" @@ -4779,7 +4773,7 @@ class TestStl : public TestFixture { " std::cout << *i;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Possible dereference of an invalid iterator: i\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Possible dereference of an invalid iterator: i\n", errout_str()); // Test that dereference of different variable doesn't trigger a false positive check("void foo(const char* c, std::string::iterator& i) {\n" @@ -4787,7 +4781,7 @@ class TestStl : public TestFixture { " std::cout << *c;\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Test case involving "rend()" instead of "end()" check("void foo(std::string::iterator& i) {\n" @@ -4796,7 +4790,7 @@ class TestStl : public TestFixture { " i ++;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Possible dereference of an invalid iterator: i\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Possible dereference of an invalid iterator: i\n", errout_str()); // Test that mixed "&&" and "||" don't result in a false positive check("void foo(std::string::iterator& i) {\n" @@ -4804,51 +4798,51 @@ class TestStl : public TestFixture { " std::cout << \"foo\";\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " std::vector v;\n" " std::vector ::iterator i = v.end();\n" " *i=0;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:4]: (error) Dereference of an invalid iterator: i\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Dereference of an invalid iterator: i\n", errout_str()); check("void f() {\n" " std::vector v;\n" " std::vector ::iterator i = std::end(v);\n" " *i=0;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:4]: (error) Dereference of an invalid iterator: i\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Dereference of an invalid iterator: i\n", errout_str()); check("void f(std::vector v) {\n" " std::vector ::iterator i = v.end();\n" " *i=0;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:3]: (error) Dereference of an invalid iterator: i\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Dereference of an invalid iterator: i\n", errout_str()); check("void f(std::vector v) {\n" " std::vector ::iterator i = v.end();\n" " *(i+1)=0;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:3]: (error) Dereference of an invalid iterator: i+1\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Dereference of an invalid iterator: i+1\n", errout_str()); check("void f(std::vector v) {\n" " std::vector ::iterator i = v.end();\n" " *(i-1)=0;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(std::vector v) {\n" " std::vector ::iterator i = v.begin();\n" " *(i-1)=0;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:3]: (error) Dereference of an invalid iterator: i-1\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Dereference of an invalid iterator: i-1\n", errout_str()); check("void f(std::vector v) {\n" " std::vector ::iterator i = std::begin(v);\n" " *(i-1)=0;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:3]: (error) Dereference of an invalid iterator: i-1\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Dereference of an invalid iterator: i-1\n", errout_str()); check("void f(std::vector v, bool b) {\n" " std::vector ::iterator i = v.begin();\n" @@ -4856,7 +4850,7 @@ class TestStl : public TestFixture { " i = v.end();\n" " *i=0;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:5]: (warning) Possible dereference of an invalid iterator: i\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (warning) Possible dereference of an invalid iterator: i\n", errout_str()); check("void f(std::vector v, bool b) {\n" " std::vector ::iterator i = v.begin();\n" @@ -4864,7 +4858,7 @@ class TestStl : public TestFixture { " i = v.end();\n" " *(i+1)=0;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:5]: (warning) Possible dereference of an invalid iterator: i+1\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (warning) Possible dereference of an invalid iterator: i+1\n", errout_str()); check("void f(std::vector v, bool b) {\n" " std::vector ::iterator i = v.begin();\n" @@ -4872,27 +4866,27 @@ class TestStl : public TestFixture { " i = v.end();\n" " *(i-1)=0;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:5]: (warning) Possible dereference of an invalid iterator: i-1\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (warning) Possible dereference of an invalid iterator: i-1\n", errout_str()); check("int f(std::vector v, int pos) {\n" " if (pos >= 0)\n" " return *(v.begin() + pos);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f(std::vector v, int i) {\n" " auto it = std::find(v.begin(), v.end(), i);\n" " if (it != v.end()) {}\n" " return *it;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (warning) Either the condition 'it!=v.end()' is redundant or there is possible dereference of an invalid iterator: it.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (warning) Either the condition 'it!=v.end()' is redundant or there is possible dereference of an invalid iterator: it.\n", errout_str()); check("void f(std::vector & v) {\n" " std::vector::iterator i= v.begin();\n" " if(i == v.end() && *(i+1) == *i) {}\n" "}\n"); ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:3]: (warning) Either the condition 'i==v.end()' is redundant or there is possible dereference of an invalid iterator: i+1.\n" - "[test.cpp:3] -> [test.cpp:3]: (warning) Either the condition 'i==v.end()' is redundant or there is possible dereference of an invalid iterator: i.\n", errout.str()); + "[test.cpp:3] -> [test.cpp:3]: (warning) Either the condition 'i==v.end()' is redundant or there is possible dereference of an invalid iterator: i.\n", errout_str()); check("void f(std::vector & v) {\n" @@ -4900,13 +4894,13 @@ class TestStl : public TestFixture { " if(i == v.end() && *i == *(i+1)) {}\n" "}\n"); ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:3]: (warning) Either the condition 'i==v.end()' is redundant or there is possible dereference of an invalid iterator: i.\n" - "[test.cpp:3] -> [test.cpp:3]: (warning) Either the condition 'i==v.end()' is redundant or there is possible dereference of an invalid iterator: i+1.\n", errout.str()); + "[test.cpp:3] -> [test.cpp:3]: (warning) Either the condition 'i==v.end()' is redundant or there is possible dereference of an invalid iterator: i+1.\n", errout_str()); check("void f(std::vector & v) {\n" " std::vector::iterator i= v.begin();\n" " if(i != v.end() && *i == *(i+1)) {}\n" "}\n"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:3]: (warning) Either the condition 'i!=v.end()' is redundant or there is possible dereference of an invalid iterator: i+1.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:3]: (warning) Either the condition 'i!=v.end()' is redundant or there is possible dereference of an invalid iterator: i+1.\n", errout_str()); check("void f(std::vector & v) {\n" " std::vector::iterator i= v.begin();\n" @@ -4914,20 +4908,20 @@ class TestStl : public TestFixture { " if (*(i+1) == *i) {}\n" " }\n" "}\n"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (warning) Either the condition 'i!=v.end()' is redundant or there is possible dereference of an invalid iterator: i+1.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (warning) Either the condition 'i!=v.end()' is redundant or there is possible dereference of an invalid iterator: i+1.\n", errout_str()); check("void f(std::vector & v) {\n" " std::vector::iterator i= v.begin();\n" " if(i == v.end()) { return; }\n" " if (*(i+1) == *i) {}\n" "}\n"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (warning) Either the condition 'i==v.end()' is redundant or there is possible dereference of an invalid iterator: i+1.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (warning) Either the condition 'i==v.end()' is redundant or there is possible dereference of an invalid iterator: i+1.\n", errout_str()); check("void f(std::vector & v) {\n" " std::vector::iterator i= v.begin();\n" " if(i != v.end() && (i+1) != v.end() && *(i+1) == *i) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(std::string s) {\n" " for (std::string::const_iterator i = s.begin(); i != s.end(); ++i) {\n" @@ -4940,13 +4934,13 @@ class TestStl : public TestFixture { " }\n" " }\n" "}\n"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (warning) Either the condition '(i+1)!=s.end()' is redundant or there is possible dereference of an invalid iterator: i+2.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4]: (warning) Either the condition '(i+1)!=s.end()' is redundant or there is possible dereference of an invalid iterator: i+2.\n", errout_str()); check("void f(int v, std::map &items) {\n" " for (auto it = items.begin(); it != items.end();)\n" " (it->first == v) ? it = items.erase(it) : ++it;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(std::string s) {\n" " for (std::string::const_iterator i = s.begin(); i != s.end(); ++i) {\n" @@ -4959,7 +4953,7 @@ class TestStl : public TestFixture { " }\n" " }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f(std::vector::iterator it, const std::vector& vector) {\n" " if (!(it != vector.end() && it != vector.begin()))\n" @@ -4968,13 +4962,13 @@ class TestStl : public TestFixture { " return -1;\n" " return *it;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f(std::vector &vect) {\n" " const int &v = *vect.emplace(vect.end());\n" " return v;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("extern bool bar(int);\n" "void f(std::vector & v) {\n" @@ -4983,7 +4977,7 @@ class TestStl : public TestFixture { "}\n"); ASSERT_EQUALS( "[test.cpp:4] -> [test.cpp:4]: (warning) Either the condition 'i==v.end()' is redundant or there is possible dereference of an invalid iterator: i+1.\n", - errout.str()); + errout_str()); // #10657 check("std::list mValues;\n" @@ -4997,13 +4991,13 @@ class TestStl : public TestFixture { " }\n" " if (endValue == mValues.end()) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #10642 check("int f(std::vector v) {\n" " return *(v.begin() + v.size() - 1);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #10716 check("struct a;\n" @@ -5017,7 +5011,7 @@ class TestStl : public TestFixture { " auto f = *e[d].begin();\n" "}\n"); ASSERT_EQUALS("[test.cpp:9]: (error) Out of bounds access in expression 'e[d].begin()' because 'e[d]' is empty.\n", - errout.str()); + errout_str()); // #10151 check("std::set::iterator f(std::set& s) {\n" @@ -5026,7 +5020,7 @@ class TestStl : public TestFixture { " return s.erase(it);\n" " return s.end();\n" "}\n"); - ASSERT_EQUALS("[test.cpp:3]: (style) Consider using std::find_if algorithm instead of a raw loop.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Consider using std::find_if algorithm instead of a raw loop.\n", errout_str()); // #11381 check("int f(std::map& map) {\n" @@ -5037,7 +5031,7 @@ class TestStl : public TestFixture { " }\n" " return debug_valueflow(it)->second;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #11557 check("bool f(const std::vector& v, std::vector::iterator it, bool b) {\n" @@ -5047,7 +5041,7 @@ class TestStl : public TestFixture { " return false;\n" " return true;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #6925 check("void f(const std::string& s, std::string::iterator i) {\n" @@ -5056,7 +5050,7 @@ class TestStl : public TestFixture { " }\n" "}\n"); ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2]: (warning) Either the condition 'i+1!=s.end()' is redundant or there is possible dereference of an invalid iterator: i+1.\n", - errout.str()); + errout_str()); } void dereferenceInvalidIterator2() { @@ -5081,7 +5075,7 @@ class TestStl : public TestFixture { " it->m_place = 0;\n" " return it;\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:18]: (error, inconclusive) Invalid iterator 'it' used.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:18]: (error, inconclusive) Invalid iterator 'it' used.\n", errout_str()); } void loopAlgoElementAssign() { @@ -5090,35 +5084,35 @@ class TestStl : public TestFixture { " x = 1;\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:3]: (style) Consider using std::fill algorithm instead of a raw loop.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Consider using std::fill algorithm instead of a raw loop.\n", errout_str()); check("void foo() {\n" " for(int& x:v)\n" " x = x + 1;\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:3]: (style) Consider using std::transform algorithm instead of a raw loop.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Consider using std::transform algorithm instead of a raw loop.\n", errout_str()); check("void foo(int a, int b) {\n" " for(int& x:v)\n" " x = a + b;\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:3]: (style) Consider using std::fill or std::generate algorithm instead of a raw loop.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Consider using std::fill or std::generate algorithm instead of a raw loop.\n", errout_str()); check("void foo() {\n" " for(int& x:v)\n" " x += 1;\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:3]: (style) Consider using std::transform algorithm instead of a raw loop.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Consider using std::transform algorithm instead of a raw loop.\n", errout_str()); check("void foo() {\n" " for(int& x:v)\n" " x = f();\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:3]: (style) Consider using std::generate algorithm instead of a raw loop.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Consider using std::generate algorithm instead of a raw loop.\n", errout_str()); check("void foo() {\n" " for(int& x:v) {\n" @@ -5127,7 +5121,7 @@ class TestStl : public TestFixture { " }\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() {\n" " for(int& x:v) {\n" @@ -5136,7 +5130,7 @@ class TestStl : public TestFixture { " }\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // There should probably be a message for unconditional break check("void foo() {\n" @@ -5146,14 +5140,14 @@ class TestStl : public TestFixture { " }\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() {\n" " for(int& x:v)\n" " x = ++x;\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void loopAlgoAccumulateAssign() { @@ -5163,7 +5157,7 @@ class TestStl : public TestFixture { " n += x;\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:4]: (style) Consider using std::accumulate algorithm instead of a raw loop.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Consider using std::accumulate algorithm instead of a raw loop.\n", errout_str()); check("void foo() {\n" " int n = 0;\n" @@ -5171,7 +5165,7 @@ class TestStl : public TestFixture { " n = n + x;\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:4]: (style) Consider using std::accumulate algorithm instead of a raw loop.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Consider using std::accumulate algorithm instead of a raw loop.\n", errout_str()); check("void foo() {\n" " int n = 0;\n" @@ -5179,7 +5173,7 @@ class TestStl : public TestFixture { " n += 1;\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:4]: (style) Consider using std::distance algorithm instead of a raw loop.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Consider using std::distance algorithm instead of a raw loop.\n", errout_str()); check("void foo() {\n" " int n = 0;\n" @@ -5187,7 +5181,7 @@ class TestStl : public TestFixture { " n = n + 1;\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:4]: (style) Consider using std::distance algorithm instead of a raw loop.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Consider using std::distance algorithm instead of a raw loop.\n", errout_str()); check("bool f(int);\n" "void foo() {\n" @@ -5196,7 +5190,7 @@ class TestStl : public TestFixture { " b &= f(x);\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool f(int);\n" "void foo() {\n" @@ -5205,7 +5199,7 @@ class TestStl : public TestFixture { " b |= f(x);\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool f(int);\n" "void foo() {\n" @@ -5214,7 +5208,7 @@ class TestStl : public TestFixture { " b = b && f(x);\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool f(int);\n" "void foo() {\n" @@ -5223,7 +5217,7 @@ class TestStl : public TestFixture { " b = b || f(x);\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() {\n" " int n = 0;\n" @@ -5231,7 +5225,7 @@ class TestStl : public TestFixture { " n = ++x;\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("std::size_t f(const std::map& m) {\n" // #10412 " std::size_t t = 0;\n" @@ -5245,7 +5239,7 @@ class TestStl : public TestFixture { "}\n"); ASSERT_EQUALS("[test.cpp:4]: (style) Consider using std::accumulate algorithm instead of a raw loop.\n" "[test.cpp:7]: (style) Consider using std::accumulate algorithm instead of a raw loop.\n", - errout.str()); + errout_str()); check("int g(const std::vector& v) {\n" " int t = 0;\n" @@ -5254,7 +5248,7 @@ class TestStl : public TestFixture { " }\n" " return t;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:4]: (style) Consider using std::accumulate algorithm instead of a raw loop.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Consider using std::accumulate algorithm instead of a raw loop.\n", errout_str()); check("auto g(const std::vector& v) {\n" " std::vector::iterator> r;\n" @@ -5263,7 +5257,7 @@ class TestStl : public TestFixture { " }\n" " return r;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("std::string f(std::vector v) {\n" " std::string ret;\n" @@ -5271,7 +5265,7 @@ class TestStl : public TestFixture { " ret += s + '\\n';\n" " return ret;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("std::string f(const std::string& s) {\n" " std::string ret;\n" @@ -5280,7 +5274,7 @@ class TestStl : public TestFixture { " ret += i;\n" " return ret;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f(const std::vector& v) {\n" " int sum = 0;\n" @@ -5288,7 +5282,7 @@ class TestStl : public TestFixture { " sum += *it;\n" " return sum;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void loopAlgoContainerInsert() { @@ -5298,7 +5292,7 @@ class TestStl : public TestFixture { " c.push_back(x);\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:4]: (style) Consider using std::copy algorithm instead of a raw loop.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Consider using std::copy algorithm instead of a raw loop.\n", errout_str()); check("void foo() {\n" " std::vector c;\n" @@ -5306,7 +5300,7 @@ class TestStl : public TestFixture { " c.push_back(f(x));\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:4]: (style) Consider using std::transform algorithm instead of a raw loop.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Consider using std::transform algorithm instead of a raw loop.\n", errout_str()); check("void foo() {\n" " std::vector c;\n" @@ -5314,7 +5308,7 @@ class TestStl : public TestFixture { " c.push_back(x + 1);\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:4]: (style) Consider using std::transform algorithm instead of a raw loop.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Consider using std::transform algorithm instead of a raw loop.\n", errout_str()); check("void foo() {\n" " std::vector c;\n" @@ -5322,7 +5316,7 @@ class TestStl : public TestFixture { " c.push_front(x);\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:4]: (style) Consider using std::copy algorithm instead of a raw loop.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Consider using std::copy algorithm instead of a raw loop.\n", errout_str()); check("void foo() {\n" " std::vector c;\n" @@ -5330,7 +5324,7 @@ class TestStl : public TestFixture { " c.push_front(f(x));\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:4]: (style) Consider using std::transform algorithm instead of a raw loop.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Consider using std::transform algorithm instead of a raw loop.\n", errout_str()); check("void foo() {\n" " std::vector c;\n" @@ -5338,7 +5332,7 @@ class TestStl : public TestFixture { " c.push_front(x + 1);\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:4]: (style) Consider using std::transform algorithm instead of a raw loop.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Consider using std::transform algorithm instead of a raw loop.\n", errout_str()); check("void foo() {\n" " std::vector c;\n" @@ -5346,7 +5340,7 @@ class TestStl : public TestFixture { " c.push_back(v);\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() {\n" " std::vector c;\n" @@ -5354,7 +5348,7 @@ class TestStl : public TestFixture { " c.push_back(0);\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void loopAlgoIncrement() { @@ -5364,7 +5358,7 @@ class TestStl : public TestFixture { " n++;\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:4]: (style) Consider using std::distance algorithm instead of a raw loop.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Consider using std::distance algorithm instead of a raw loop.\n", errout_str()); check("void foo() {\n" " int n = 0;\n" @@ -5372,21 +5366,21 @@ class TestStl : public TestFixture { " ++n;\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:4]: (style) Consider using std::distance algorithm instead of a raw loop.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Consider using std::distance algorithm instead of a raw loop.\n", errout_str()); check("void foo() {\n" " for(int& x:v)\n" " x++;\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:3]: (style) Consider using std::transform algorithm instead of a raw loop.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Consider using std::transform algorithm instead of a raw loop.\n", errout_str()); check("void foo() {\n" " for(int& x:v)\n" " ++x;\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:3]: (style) Consider using std::transform algorithm instead of a raw loop.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Consider using std::transform algorithm instead of a raw loop.\n", errout_str()); } void loopAlgoConditional() { @@ -5399,7 +5393,7 @@ class TestStl : public TestFixture { " }\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:5]: (style) Consider using std::replace_if algorithm instead of a raw loop.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (style) Consider using std::replace_if algorithm instead of a raw loop.\n", errout_str()); check("bool pred(int x);\n" "void foo() {\n" @@ -5411,7 +5405,7 @@ class TestStl : public TestFixture { " }\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:6]: (style) Consider using std::accumulate algorithm instead of a raw loop.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (style) Consider using std::accumulate algorithm instead of a raw loop.\n", errout_str()); check("bool pred(int x);\n" "void foo() {\n" @@ -5423,7 +5417,7 @@ class TestStl : public TestFixture { " }\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:6]: (style) Consider using std::count_if algorithm instead of a raw loop.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (style) Consider using std::count_if algorithm instead of a raw loop.\n", errout_str()); check("bool pred(int x);\n" "void foo() {\n" @@ -5435,7 +5429,7 @@ class TestStl : public TestFixture { " }\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:6]: (style) Consider using std::count_if algorithm instead of a raw loop.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (style) Consider using std::count_if algorithm instead of a raw loop.\n", errout_str()); check("bool pred(int x);\n" "void foo() {\n" @@ -5446,7 +5440,7 @@ class TestStl : public TestFixture { " }\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:5]: (style) Consider using std::transform algorithm instead of a raw loop.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (style) Consider using std::transform algorithm instead of a raw loop.\n", errout_str()); check("bool pred(int x);\n" "void foo() {\n" @@ -5458,7 +5452,7 @@ class TestStl : public TestFixture { " }\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:6]: (style) Consider using std::copy_if algorithm instead of a raw loop.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (style) Consider using std::copy_if algorithm instead of a raw loop.\n", errout_str()); check("bool pred(int x);\n" "bool foo() {\n" @@ -5471,7 +5465,7 @@ class TestStl : public TestFixture { "}\n", true); ASSERT_EQUALS("[test.cpp:3]: (style) Consider using std::all_of or std::none_of algorithm instead of a raw loop.\n", - errout.str()); + errout_str()); check("bool pred(int x);\n" "bool foo() {\n" @@ -5483,7 +5477,7 @@ class TestStl : public TestFixture { " return true;\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:4]: (style) Consider using std::any_of algorithm instead of a raw loop.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Consider using std::any_of algorithm instead of a raw loop.\n", errout_str()); check("bool pred(int x);\n" "void f();\n" @@ -5496,7 +5490,7 @@ class TestStl : public TestFixture { " }\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:5]: (style) Consider using std::any_of algorithm instead of a raw loop.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (style) Consider using std::any_of algorithm instead of a raw loop.\n", errout_str()); check("bool pred(int x);\n" "void f(int x);\n" @@ -5509,7 +5503,7 @@ class TestStl : public TestFixture { " }\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:5]: (style) Consider using std::find_if algorithm instead of a raw loop.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (style) Consider using std::find_if algorithm instead of a raw loop.\n", errout_str()); check("bool pred(int x);\n" "bool foo() {\n" @@ -5523,7 +5517,7 @@ class TestStl : public TestFixture { " return true;\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool pred(int x);\n" "bool foo() {\n" @@ -5536,7 +5530,7 @@ class TestStl : public TestFixture { " return true;\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool pred(int x);\n" "bool foo() {\n" @@ -5549,7 +5543,7 @@ class TestStl : public TestFixture { " return true;\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool pred(int x);\n" "bool foo() {\n" @@ -5561,7 +5555,7 @@ class TestStl : public TestFixture { " }\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // There is no transform_if check("bool pred(int x);\n" @@ -5574,7 +5568,7 @@ class TestStl : public TestFixture { " }\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool pred(int x);\n" "void foo() {\n" @@ -5586,7 +5580,7 @@ class TestStl : public TestFixture { " }\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool pred(int x);\n" "void f();\n" @@ -5599,7 +5593,7 @@ class TestStl : public TestFixture { " }\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool g(int);\n" "int f(const std::vector& v) {\n" @@ -5609,7 +5603,7 @@ class TestStl : public TestFixture { " ret = 1;\n" " return ret;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f(const std::vector& v) {\n" " int ret = 0;\n" @@ -5620,7 +5614,7 @@ class TestStl : public TestFixture { "}\n"); TODO_ASSERT_EQUALS("[test.cpp:5]: (style) Consider using std::any_of, std::all_of, std::none_of algorithm instead of a raw loop.\n", "", - errout.str()); + errout_str()); check("int f(const std::vector& v) {\n" " int ret = 0;\n" @@ -5631,7 +5625,7 @@ class TestStl : public TestFixture { " }\n" " return ret;\n" "}\n"); - ASSERT_EQUALS("[test.cpp:4]: (style) Consider using std::any_of algorithm instead of a raw loop.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Consider using std::any_of algorithm instead of a raw loop.\n", errout_str()); check("struct T {\n" " std::vector v0, v1;\n" @@ -5647,7 +5641,7 @@ class TestStl : public TestFixture { " v1.erase(it1);\n" " }\n" "}\n"); - ASSERT_EQUALS("[test.cpp:9]: (style) Consider using std::find_if algorithm instead of a raw loop.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:9]: (style) Consider using std::find_if algorithm instead of a raw loop.\n", errout_str()); check("bool f(const std::set& set, const std::string& f) {\n" // #11595 " for (const std::string& s : set) {\n" @@ -5658,14 +5652,14 @@ class TestStl : public TestFixture { " return false;\n" "}\n"); ASSERT_EQUALS("[test.cpp:2]: (style) Consider using std::any_of algorithm instead of a raw loop.\n", - errout.str()); + errout_str()); check("void f() {\n" // #12064 " for (const auto& animal : { \"cat\", \"bat\", \"tiger\", \"rat\" })\n" " if (std::strlen(animal) > 4)\n" " throw 1;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void loopAlgoMinMax() { @@ -5675,7 +5669,7 @@ class TestStl : public TestFixture { " n = x > n ? x : n;\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:4]: (style) Consider using std::max_element algorithm instead of a raw loop.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Consider using std::max_element algorithm instead of a raw loop.\n", errout_str()); check("void foo() {\n" " int n = 0;\n" @@ -5683,7 +5677,7 @@ class TestStl : public TestFixture { " n = x < n ? x : n;\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:4]: (style) Consider using std::min_element algorithm instead of a raw loop.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Consider using std::min_element algorithm instead of a raw loop.\n", errout_str()); check("void foo() {\n" " int n = 0;\n" @@ -5691,7 +5685,7 @@ class TestStl : public TestFixture { " n = x > n ? n : x;\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:4]: (style) Consider using std::min_element algorithm instead of a raw loop.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Consider using std::min_element algorithm instead of a raw loop.\n", errout_str()); check("void foo() {\n" " int n = 0;\n" @@ -5699,7 +5693,7 @@ class TestStl : public TestFixture { " n = x < n ? n : x;\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:4]: (style) Consider using std::max_element algorithm instead of a raw loop.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Consider using std::max_element algorithm instead of a raw loop.\n", errout_str()); check("void foo(int m) {\n" " int n = 0;\n" @@ -5707,7 +5701,7 @@ class TestStl : public TestFixture { " n = x > m ? x : n;\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:4]: (style) Consider using std::accumulate algorithm instead of a raw loop.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Consider using std::accumulate algorithm instead of a raw loop.\n", errout_str()); check("void f(const std::vector& v) {\n" " int maxY = 0;\n" @@ -5719,7 +5713,7 @@ class TestStl : public TestFixture { true); TODO_ASSERT_EQUALS("[test.cpp:5]: (style) Consider using std::max_element algorithm instead of a raw loop.\n", "", - errout.str()); + errout_str()); } void loopAlgoMultipleReturn() @@ -5735,7 +5729,7 @@ class TestStl : public TestFixture { "}\n", true); ASSERT_EQUALS("[test.cpp:2]: (style) Consider using std::any_of algorithm instead of a raw loop.\n", - errout.str()); + errout_str()); check("bool g(const std::vector& v) {\n" " for (auto i : v) {\n" @@ -5748,7 +5742,7 @@ class TestStl : public TestFixture { "}\n", true); ASSERT_EQUALS("[test.cpp:2]: (style) Consider using std::any_of algorithm instead of a raw loop.\n", - errout.str()); + errout_str()); check("bool g(const std::vector& v) {\n" " for (auto i : v) {\n" @@ -5760,7 +5754,7 @@ class TestStl : public TestFixture { " return false;\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool g(std::vector& v) {\n" " for (auto& i : v) {\n" @@ -5772,7 +5766,7 @@ class TestStl : public TestFixture { " return false;\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool g(const std::vector& v, int& j) {\n" " for (auto i : v) {\n" @@ -5784,7 +5778,7 @@ class TestStl : public TestFixture { " return false;\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool g(const std::vector& v, int& j) {\n" " for (auto i : v) {\n" @@ -5797,7 +5791,7 @@ class TestStl : public TestFixture { " return false;\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool g(const std::vector& v, int& j) {\n" " for (auto i : v) {\n" @@ -5810,7 +5804,7 @@ class TestStl : public TestFixture { " return false;\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool g(const std::vector& v, int j) {\n" " for (auto i : v) {\n" @@ -5824,7 +5818,7 @@ class TestStl : public TestFixture { "}\n", true); ASSERT_EQUALS("[test.cpp:2]: (style) Consider using std::all_of or std::none_of algorithm instead of a raw loop.\n", - errout.str()); + errout_str()); check("class C {\n" "private:\n" @@ -5841,7 +5835,7 @@ class TestStl : public TestFixture { " }\n" "};\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void invalidContainer() { @@ -5851,7 +5845,7 @@ class TestStl : public TestFixture { " std::cout << *v0 << std::endl;\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:2] -> [test.cpp:3] -> [test.cpp:1] -> [test.cpp:4]: (error) Using iterator to local container 'v' that may be invalid.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:2] -> [test.cpp:3] -> [test.cpp:1] -> [test.cpp:4]: (error) Using iterator to local container 'v' that may be invalid.\n", errout_str()); check("std::string e();\n" "void a() {\n" @@ -5863,7 +5857,7 @@ class TestStl : public TestFixture { " }\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(std::vector &v) {\n" " int *v0 = &v[0];\n" @@ -5871,7 +5865,7 @@ class TestStl : public TestFixture { " std::cout << (*v0)[0] << std::endl;\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:2] -> [test.cpp:3] -> [test.cpp:1] -> [test.cpp:4]: (error) Using pointer to local variable 'v' that may be invalid.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1] -> [test.cpp:2] -> [test.cpp:3] -> [test.cpp:1] -> [test.cpp:4]: (error) Using pointer to local variable 'v' that may be invalid.\n", errout_str()); check("void f() {\n" " std::vector v = {1};\n" @@ -5882,7 +5876,7 @@ class TestStl : public TestFixture { true); ASSERT_EQUALS( "[test.cpp:3] -> [test.cpp:3] -> [test.cpp:4] -> [test.cpp:5]: (error) Reference to v that may be invalid.\n", - errout.str()); + errout_str()); check("void f() {\n" " std::vector v = {1};\n" @@ -5892,7 +5886,7 @@ class TestStl : public TestFixture { "}\n", true); ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:4] -> [test.cpp:5]: (error) Reference to v that may be invalid.\n", - errout.str()); + errout_str()); check("void f(std::vector &v) {\n" " int &v0 = v.front();\n" @@ -5902,7 +5896,7 @@ class TestStl : public TestFixture { true); ASSERT_EQUALS( "[test.cpp:2] -> [test.cpp:2] -> [test.cpp:1] -> [test.cpp:3] -> [test.cpp:4]: (error) Reference to v that may be invalid.\n", - errout.str()); + errout_str()); check("void f(std::vector &v) {\n" " int &v0 = v[0];\n" @@ -5912,7 +5906,7 @@ class TestStl : public TestFixture { true); ASSERT_EQUALS( "[test.cpp:2] -> [test.cpp:1] -> [test.cpp:3] -> [test.cpp:4]: (error) Reference to v that may be invalid.\n", - errout.str()); + errout_str()); check("void f(std::vector &v) {\n" " std::vector *v0 = &v;\n" @@ -5920,7 +5914,7 @@ class TestStl : public TestFixture { " std::cout << (*v0)[0] << std::endl;\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("const std::vector * g(int);\n" "void f() {\n" @@ -5936,7 +5930,7 @@ class TestStl : public TestFixture { " }\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("std::vector g();\n" "void f() {\n" @@ -5946,7 +5940,7 @@ class TestStl : public TestFixture { " z += \"\";\n" " z += y;\n" "}\n",true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(std::vector v)\n" "{\n" @@ -5958,14 +5952,14 @@ class TestStl : public TestFixture { " end = cur + v.size();\n" " }\n" "}\n",true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #9598 check("void f(std::vector v) {\n" " for (auto it = v.begin(); it != v.end(); it = v.erase(it))\n" " *it;\n" "}\n",true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #9714 check("void f() {\n" @@ -5974,7 +5968,7 @@ class TestStl : public TestFixture { " v.push_back(x.insert(0, \"x\"));\n" " v.push_back(\"y\");\n" "}\n",true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #9783 check("std::string GetTaskIDPerUUID(int);\n" @@ -5983,7 +5977,7 @@ class TestStl : public TestFixture { " CString sAppID = GetTaskIDPerUUID(123).c_str();\n" " InitializeJumpList(sAppID);\n" "}\n",true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #9796 check("struct A {};\n" "void f() {\n" @@ -5994,7 +5988,7 @@ class TestStl : public TestFixture { " v.pop_back();\n" " delete b;\n" "}\n",true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A {};\n" "void f() {\n" @@ -6005,7 +5999,7 @@ class TestStl : public TestFixture { " v.pop_back();\n" " delete b;\n" "}\n",true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A {};\n" "void f() {\n" @@ -6016,7 +6010,7 @@ class TestStl : public TestFixture { " v.pop_back();\n" " delete b;\n" "}\n",true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #9780 check("int f() {\n" @@ -6026,7 +6020,7 @@ class TestStl : public TestFixture { " vect.push_back(1);\n" " return info.ret;\n" "}\n",true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #9133 check("struct Fred {\n" @@ -6045,7 +6039,7 @@ class TestStl : public TestFixture { true); ASSERT_EQUALS( "[test.cpp:7] -> [test.cpp:8] -> [test.cpp:12] -> [test.cpp:9]: (error) Using iterator to member container 'v' that may be invalid.\n", - errout.str()); + errout_str()); check("void foo(std::vector& v) {\n" " std::vector::iterator it = v.begin();\n" @@ -6058,7 +6052,7 @@ class TestStl : public TestFixture { true); ASSERT_EQUALS( "[test.cpp:1] -> [test.cpp:2] -> [test.cpp:3] -> [test.cpp:7] -> [test.cpp:1] -> [test.cpp:4]: (error) Using iterator to local container 'v' that may be invalid.\n", - errout.str()); + errout_str()); // #10264 check("void f(std::vector& x) {\n" @@ -6069,7 +6063,7 @@ class TestStl : public TestFixture { " x.clear();\n" " Parse(i);\n" "}\n",true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " std::string x;\n" @@ -6085,7 +6079,7 @@ class TestStl : public TestFixture { " for (long i = 0; i < 1; ++i)\n" " cb[i] = b[i];\n" "}\n",true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #9836 check("void f() {\n" @@ -6097,7 +6091,7 @@ class TestStl : public TestFixture { true); ASSERT_EQUALS( "[test.cpp:3] -> [test.cpp:3] -> [test.cpp:3] -> [test.cpp:4] -> [test.cpp:2] -> [test.cpp:5]: (error) Using pointer to local variable 'v' that may be invalid.\n", - errout.str()); + errout_str()); check("struct A {\n" " const std::vector* i;\n" @@ -6112,7 +6106,7 @@ class TestStl : public TestFixture { " return a.i->front();\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A {\n" " const std::vector* i;\n" @@ -6128,7 +6122,7 @@ class TestStl : public TestFixture { " g(a);\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #10984 check("void f() {\n" @@ -6138,7 +6132,7 @@ class TestStl : public TestFixture { " g();\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(std::vector v) {\n" " auto it = v.begin();\n" @@ -6149,7 +6143,7 @@ class TestStl : public TestFixture { true); ASSERT_EQUALS( "[test.cpp:2] -> [test.cpp:3] -> [test.cpp:4] -> [test.cpp:1] -> [test.cpp:5]: (error) Using iterator to local container 'v' that may be invalid.\n", - errout.str()); + errout_str()); check("void f(std::vector v) {\n" " auto it = v.begin();\n" @@ -6160,7 +6154,7 @@ class TestStl : public TestFixture { true); ASSERT_EQUALS( "[test.cpp:2] -> [test.cpp:4] -> [test.cpp:1] -> [test.cpp:5]: (error) Using iterator to local container 'v' that may be invalid.\n", - errout.str()); + errout_str()); check("struct A {\n" " int* p;\n" @@ -6175,7 +6169,7 @@ class TestStl : public TestFixture { true); ASSERT_EQUALS( "[test.cpp:7] -> [test.cpp:8] -> [test.cpp:5] -> [test.cpp:9]: (error) Using object that points to local variable 'v' that may be invalid.\n", - errout.str()); + errout_str()); check("struct A {\n" " int*& p;\n" @@ -6190,7 +6184,7 @@ class TestStl : public TestFixture { true); ASSERT_EQUALS( "[test.cpp:6] -> [test.cpp:7] -> [test.cpp:8] -> [test.cpp:5] -> [test.cpp:9]: (error) Using object that points to local variable 'v' that may be invalid.\n", - errout.str()); + errout_str()); // #11028 check("void f(std::vector c) {\n" @@ -6199,7 +6193,7 @@ class TestStl : public TestFixture { " d.push_back(0);\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #11147 check("void f(std::string& s) {\n" @@ -6211,7 +6205,7 @@ class TestStl : public TestFixture { true); ASSERT_EQUALS( "[test.cpp:4]: (performance) Ineffective call of function 'substr' because a prefix of the string is assigned to itself. Use resize() or pop_back() instead.\n", - errout.str()); + errout_str()); // #11630 check("int main(int argc, const char* argv[]) {\n" @@ -6220,7 +6214,7 @@ class TestStl : public TestFixture { " args.front();\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void invalidContainerLoop() { @@ -6232,7 +6226,7 @@ class TestStl : public TestFixture { " }\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:4]: (error) Calling 'push_back' while iterating the container is invalid.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2] -> [test.cpp:4]: (error) Calling 'push_back' while iterating the container is invalid.\n", errout_str()); // #9713 check("void f() {\n" @@ -6245,7 +6239,7 @@ class TestStl : public TestFixture { " }\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:4]: (style) Consider using std::any_of algorithm instead of a raw loop.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Consider using std::any_of algorithm instead of a raw loop.\n", errout_str()); check("struct A {\n" " std::vector v;\n" @@ -6260,7 +6254,7 @@ class TestStl : public TestFixture { true); ASSERT_EQUALS( "[test.cpp:4] -> [test.cpp:7] -> [test.cpp:8]: (error) Calling 'add' while iterating the container is invalid.\n", - errout.str()); + errout_str()); } void findInsert() { @@ -6270,7 +6264,7 @@ class TestStl : public TestFixture { " }\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:3]: (performance) Searching before insertion is not necessary.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (performance) Searching before insertion is not necessary.\n", errout_str()); check("void f2(std::map& m, unsigned x) {\n" " if (m.find(x) == m.end()) {\n" @@ -6280,7 +6274,7 @@ class TestStl : public TestFixture { " }\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:3]: (performance) Searching before insertion is not necessary.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (performance) Searching before insertion is not necessary.\n", errout_str()); check("void f3(std::map& m, unsigned x) {\n" " if (m.count(x) == 0) {\n" @@ -6288,7 +6282,7 @@ class TestStl : public TestFixture { " }\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:3]: (performance) Searching before insertion is not necessary.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (performance) Searching before insertion is not necessary.\n", errout_str()); check("void f4(std::set& s, unsigned x) {\n" " if (s.find(x) == s.end()) {\n" @@ -6296,7 +6290,7 @@ class TestStl : public TestFixture { " }\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:3]: (performance) Searching before insertion is not necessary.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (performance) Searching before insertion is not necessary.\n", errout_str()); check("void f5(std::map& m, unsigned x) {\n" " if (m.count(x) == 0) {\n" @@ -6306,7 +6300,7 @@ class TestStl : public TestFixture { " }\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:3]: (performance) Searching before insertion is not necessary.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (performance) Searching before insertion is not necessary.\n", errout_str()); check("void f6(std::map& m, unsigned x) {\n" " if (m.count(x) == 0) {\n" @@ -6314,7 +6308,7 @@ class TestStl : public TestFixture { " }\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:3]: (performance) Searching before insertion is not necessary.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (performance) Searching before insertion is not necessary.\n", errout_str()); check("void f1(std::unordered_set& s, unsigned x) {\n" " if (s.find(x) == s.end()) {\n" @@ -6322,7 +6316,7 @@ class TestStl : public TestFixture { " }\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:3]: (performance) Searching before insertion is not necessary.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (performance) Searching before insertion is not necessary.\n", errout_str()); check("void f2(std::unordered_map& m, unsigned x) {\n" " if (m.find(x) == m.end()) {\n" @@ -6332,7 +6326,7 @@ class TestStl : public TestFixture { " }\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:3]: (performance) Searching before insertion is not necessary.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (performance) Searching before insertion is not necessary.\n", errout_str()); check("void f3(std::unordered_map& m, unsigned x) {\n" " if (m.count(x) == 0) {\n" @@ -6340,7 +6334,7 @@ class TestStl : public TestFixture { " }\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:3]: (performance) Searching before insertion is not necessary.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (performance) Searching before insertion is not necessary.\n", errout_str()); check("void f4(std::unordered_set& s, unsigned x) {\n" " if (s.find(x) == s.end()) {\n" @@ -6348,7 +6342,7 @@ class TestStl : public TestFixture { " }\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:3]: (performance) Searching before insertion is not necessary.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (performance) Searching before insertion is not necessary.\n", errout_str()); check("void f5(std::unordered_map& m, unsigned x) {\n" " if (m.count(x) == 0) {\n" @@ -6358,7 +6352,7 @@ class TestStl : public TestFixture { " }\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:3]: (performance) Searching before insertion is not necessary.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (performance) Searching before insertion is not necessary.\n", errout_str()); check("void f6(std::unordered_map& m, unsigned x) {\n" " if (m.count(x) == 0) {\n" @@ -6366,7 +6360,7 @@ class TestStl : public TestFixture { " }\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:3]: (performance) Searching before insertion is not necessary.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (performance) Searching before insertion is not necessary.\n", errout_str()); check("void g1(std::map& m, unsigned x) {\n" " if (m.find(x) == m.end()) {\n" @@ -6376,7 +6370,7 @@ class TestStl : public TestFixture { " }\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void g1(std::map& m, unsigned x) {\n" " if (m.count(x) == 0) {\n" @@ -6386,7 +6380,7 @@ class TestStl : public TestFixture { " }\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f1(QSet& s, unsigned x) {\n" " if (s.find(x) == s.end()) {\n" @@ -6394,7 +6388,7 @@ class TestStl : public TestFixture { " }\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f1(std::multiset& s, unsigned x) {\n" " if (s.find(x) == s.end()) {\n" @@ -6402,7 +6396,7 @@ class TestStl : public TestFixture { " }\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f2(std::multimap& m, unsigned x) {\n" " if (m.find(x) == m.end()) {\n" @@ -6412,7 +6406,7 @@ class TestStl : public TestFixture { " }\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f3(std::multimap& m, unsigned x) {\n" " if (m.count(x) == 0) {\n" @@ -6420,7 +6414,7 @@ class TestStl : public TestFixture { " }\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f4(std::multiset& s, unsigned x) {\n" " if (s.find(x) == s.end()) {\n" @@ -6428,7 +6422,7 @@ class TestStl : public TestFixture { " }\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f5(std::multimap& m, unsigned x) {\n" " if (m.count(x) == 0) {\n" @@ -6438,7 +6432,7 @@ class TestStl : public TestFixture { " }\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f1(std::unordered_multiset& s, unsigned x) {\n" " if (s.find(x) == s.end()) {\n" @@ -6446,7 +6440,7 @@ class TestStl : public TestFixture { " }\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f2(std::unordered_multimap& m, unsigned x) {\n" " if (m.find(x) == m.end()) {\n" @@ -6456,7 +6450,7 @@ class TestStl : public TestFixture { " }\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f3(std::unordered_multimap& m, unsigned x) {\n" " if (m.count(x) == 0) {\n" @@ -6464,7 +6458,7 @@ class TestStl : public TestFixture { " }\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f4(std::unordered_multiset& s, unsigned x) {\n" " if (s.find(x) == s.end()) {\n" @@ -6472,7 +6466,7 @@ class TestStl : public TestFixture { " }\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f5(std::unordered_multimap& m, unsigned x) {\n" " if (m.count(x) == 0) {\n" @@ -6482,7 +6476,7 @@ class TestStl : public TestFixture { " }\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #9218 - not small type => do not warn if cpp standard is < c++17 { @@ -6492,11 +6486,11 @@ class TestStl : public TestFixture { " }\n" "}\n"; check(code, true, Standards::CPP11); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check(code, true, Standards::CPP14); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check(code, true, Standards::CPP17); - ASSERT_EQUALS("[test.cpp:3]: (performance) Searching before insertion is not necessary.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (performance) Searching before insertion is not necessary.\n", errout_str()); } { // #10558 @@ -6509,7 +6503,7 @@ class TestStl : public TestFixture { " x[5] = data;\n" " }\n" "}", false, Standards::CPP03); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() {\n" " std::map x;\n" @@ -6520,7 +6514,7 @@ class TestStl : public TestFixture { " x[5] = data;\n" " }\n" "}", false, Standards::CPP11); - ASSERT_EQUALS("[test.cpp:7]: (performance) Searching before insertion is not necessary. Instead of 'x[5]=data' consider using 'x.emplace(5, data);'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (performance) Searching before insertion is not necessary. Instead of 'x[5]=data' consider using 'x.emplace(5, data);'.\n", errout_str()); check("void foo() {\n" " std::map x;\n" @@ -6531,7 +6525,7 @@ class TestStl : public TestFixture { " x[5] = data;\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:7]: (performance) Searching before insertion is not necessary. Instead of 'x[5]=data' consider using 'x.try_emplace(5, data);'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (performance) Searching before insertion is not necessary. Instead of 'x[5]=data' consider using 'x.try_emplace(5, data);'.\n", errout_str()); } } @@ -6541,35 +6535,35 @@ class TestStl : public TestFixture { " for(auto x:v) {}\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:3]: (style) Iterating over container 'v' that is always empty.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Iterating over container 'v' that is always empty.\n", errout_str()); check("void f(std::vector v) {\n" " v.clear();\n" " for(auto x:v) {}\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:3]: (style) Iterating over container 'v' that is always empty.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Iterating over container 'v' that is always empty.\n", errout_str()); check("void f(std::vector v) {\n" " if (!v.empty()) { return; }\n" " for(auto x:v) {}\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:3]: (style) Iterating over container 'v' that is always empty.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Iterating over container 'v' that is always empty.\n", errout_str()); check("void f(std::vector v) {\n" " if (v.empty()) { return; }\n" " for(auto x:v) {}\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " std::vector v;\n" " std::sort(v.begin(), v.end());\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:3]: (style) Using sort with iterator 'v.begin()' that is always empty.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (style) Using sort with iterator 'v.begin()' that is always empty.\n", errout_str()); check("void f() {\n" // #1201 " std::vector v1{ 0, 1 };\n" @@ -6577,14 +6571,14 @@ class TestStl : public TestFixture { " std::copy(v1.begin(), v1.end(), v2.begin());\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:4]: (style) Using copy with iterator 'v2.begin()' that is always empty.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (style) Using copy with iterator 'v2.begin()' that is always empty.\n", errout_str()); check("void f() {\n" " std::vector v;\n" " v.insert(v.end(), 1);\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct A {\n" " explicit A(std::vector*);\n" @@ -6596,7 +6590,7 @@ class TestStl : public TestFixture { " return a;\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("static void f1(std::list& parameters) {\n" " parameters.push_back(a);\n" @@ -6610,7 +6604,7 @@ class TestStl : public TestFixture { " for (auto param : parameters) {}\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("namespace ns {\n" " using ArrayType = std::vector;\n" @@ -6621,7 +6615,7 @@ class TestStl : public TestFixture { " for (const auto &a : arr) {}\n" "}", true); - ASSERT_EQUALS("[test.cpp:7]: (style) Iterating over container 'arr' that is always empty.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (style) Iterating over container 'arr' that is always empty.\n", errout_str()); check("struct S {\n" " std::vector v;\n" @@ -6632,7 +6626,7 @@ class TestStl : public TestFixture { " std::sort(s.v.begin(), s.v.end());\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(const std::vector& v, int e) {\n" " if (!v.empty()) {\n" @@ -6644,7 +6638,7 @@ class TestStl : public TestFixture { " for (auto i : v) {}\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " std::vector v;\n" @@ -6653,7 +6647,7 @@ class TestStl : public TestFixture { " for (auto i : v) {}\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("extern void f(std::string&&);\n" "static void func() {\n" @@ -6662,7 +6656,7 @@ class TestStl : public TestFixture { " f(std::move(s));\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void checkMutexes() { @@ -6671,14 +6665,14 @@ class TestStl : public TestFixture { " static std::lock_guard g(m);\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:3]: (warning) Lock guard is defined globally. Lock guards are intended to be local. A global lock guard could lead to a deadlock since it won't unlock until the end of the program.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Lock guard is defined globally. Lock guards are intended to be local. A global lock guard could lead to a deadlock since it won't unlock until the end of the program.\n", errout_str()); check("void f() {\n" " static std::mutex m;\n" " std::lock_guard g(m);\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " static std::mutex m;\n" @@ -6686,7 +6680,7 @@ class TestStl : public TestFixture { " static std::lock(g);\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:3]: (warning) Lock guard is defined globally. Lock guards are intended to be local. A global lock guard could lead to a deadlock since it won't unlock until the end of the program.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Lock guard is defined globally. Lock guards are intended to be local. A global lock guard could lead to a deadlock since it won't unlock until the end of the program.\n", errout_str()); check("void f() {\n" " static std::mutex m;\n" @@ -6694,21 +6688,21 @@ class TestStl : public TestFixture { " std::lock(g);\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " std::mutex m;\n" " std::lock_guard g(m);\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:3]: (warning) The lock is ineffective because the mutex is locked at the same scope as the mutex itself.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) The lock is ineffective because the mutex is locked at the same scope as the mutex itself.\n", errout_str()); check("void f() {\n" " std::mutex m;\n" " std::unique_lock g(m);\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:3]: (warning) The lock is ineffective because the mutex is locked at the same scope as the mutex itself.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) The lock is ineffective because the mutex is locked at the same scope as the mutex itself.\n", errout_str()); check("void f() {\n" " std::mutex m;\n" @@ -6716,7 +6710,7 @@ class TestStl : public TestFixture { " std::lock(g);\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:3]: (warning) The lock is ineffective because the mutex is locked at the same scope as the mutex itself.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) The lock is ineffective because the mutex is locked at the same scope as the mutex itself.\n", errout_str()); check("void g();\n" "void f() {\n" @@ -6726,7 +6720,7 @@ class TestStl : public TestFixture { " m.unlock();\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void g();\n" "void f() {\n" @@ -6736,7 +6730,7 @@ class TestStl : public TestFixture { " m.unlock();\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:4]: (warning) The lock is ineffective because the mutex is locked at the same scope as the mutex itself.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (warning) The lock is ineffective because the mutex is locked at the same scope as the mutex itself.\n", errout_str()); check("class A {\n" " std::mutex m;\n" @@ -6745,7 +6739,7 @@ class TestStl : public TestFixture { " }\n" "};\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class A {\n" " std::mutex m;\n" @@ -6757,7 +6751,7 @@ class TestStl : public TestFixture { " }\n" "};\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class A {\n" " std::mutex m;\n" @@ -6766,7 +6760,7 @@ class TestStl : public TestFixture { " }\n" "};\n", true); - ASSERT_EQUALS("[test.cpp:4]: (warning) Lock guard is defined globally. Lock guards are intended to be local. A global lock guard could lead to a deadlock since it won't unlock until the end of the program.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (warning) Lock guard is defined globally. Lock guards are intended to be local. A global lock guard could lead to a deadlock since it won't unlock until the end of the program.\n", errout_str()); check("std::mutex& h();\n" "void f() {\n" @@ -6774,7 +6768,7 @@ class TestStl : public TestFixture { " std::lock_guard g(m);\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void g();\n" "std::mutex& h();\n" @@ -6785,7 +6779,7 @@ class TestStl : public TestFixture { " m.unlock();\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("std::mutex& h();\n" "void f() {\n" @@ -6793,7 +6787,7 @@ class TestStl : public TestFixture { " std::lock_guard g(m);\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:4]: (warning) The lock is ineffective because the mutex is locked at the same scope as the mutex itself.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (warning) The lock is ineffective because the mutex is locked at the same scope as the mutex itself.\n", errout_str()); check("void g();\n" "std::mutex& h();\n" @@ -6804,7 +6798,7 @@ class TestStl : public TestFixture { " m.unlock();\n" "}\n", true); - ASSERT_EQUALS("[test.cpp:5]: (warning) The lock is ineffective because the mutex is locked at the same scope as the mutex itself.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5]: (warning) The lock is ineffective because the mutex is locked at the same scope as the mutex itself.\n", errout_str()); check("void foo();\n" "void bar();\n" @@ -6820,7 +6814,7 @@ class TestStl : public TestFixture { " m.unlock();\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo();\n" "void bar();\n" @@ -6834,10 +6828,10 @@ class TestStl : public TestFixture { " bar();\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo() { int f = 0; auto g(f); g = g; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("struct foobar {\n" " int foo;\n" @@ -6853,7 +6847,7 @@ class TestStl : public TestFixture { " std::scoped_lock shared_multi_lock(shared_foo_lock, shared_bar_lock);\n" " }\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } }; diff --git a/test/teststring.cpp b/test/teststring.cpp index 8168d77d5ba1..2ec35394bbbf 100644 --- a/test/teststring.cpp +++ b/test/teststring.cpp @@ -64,9 +64,6 @@ class TestString : public TestFixture { #define check(...) check_(__FILE__, __LINE__, __VA_ARGS__) void check_(const char* file, int line, const char code[], const char filename[] = "test.cpp") { - // Clear the error buffer.. - errout.str(""); - std::vector files(1, filename); Tokenizer tokenizer(settings, this); PreprocessorHelper::preprocess(code, files, tokenizer); @@ -83,25 +80,25 @@ class TestString : public TestFixture { " char *abc = \"abc\";\n" " abc[0] = 'a';\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2]: (error) Modifying string literal \"abc\" directly or indirectly is undefined behaviour.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2]: (error) Modifying string literal \"abc\" directly or indirectly is undefined behaviour.\n", errout_str()); check("void f() {\n" " char *abc = \"abc\";\n" " *abc = 'a';\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2]: (error) Modifying string literal \"abc\" directly or indirectly is undefined behaviour.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2]: (error) Modifying string literal \"abc\" directly or indirectly is undefined behaviour.\n", errout_str()); check("void f() {\n" " char *abc = \"A very long string literal\";\n" " abc[0] = 'a';\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2]: (error) Modifying string literal \"A very long stri..\" directly or indirectly is undefined behaviour.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2]: (error) Modifying string literal \"A very long stri..\" directly or indirectly is undefined behaviour.\n", errout_str()); check("void f() {\n" " QString abc = \"abc\";\n" " abc[0] = 'a';\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo_FP1(char *p) {\n" " p[1] = 'B';\n" @@ -112,7 +109,7 @@ class TestString : public TestFixture { "}"); ASSERT_EQUALS( "[test.cpp:2] -> [test.cpp:5]: (error) Modifying string literal \"Y\" directly or indirectly is undefined behaviour.\n", - errout.str()); + errout_str()); check("void foo_FP1(char *p) {\n" " p[1] = 'B';\n" @@ -121,19 +118,19 @@ class TestString : public TestFixture { " char s[10] = \"Y\";\n" " foo_FP1(s);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " wchar_t *abc = L\"abc\";\n" " abc[0] = u'a';\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2]: (error) Modifying string literal L\"abc\" directly or indirectly is undefined behaviour.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2]: (error) Modifying string literal L\"abc\" directly or indirectly is undefined behaviour.\n", errout_str()); check("void f() {\n" " char16_t *abc = u\"abc\";\n" " abc[0] = 'a';\n" "}"); - ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2]: (error) Modifying string literal u\"abc\" directly or indirectly is undefined behaviour.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3] -> [test.cpp:2]: (error) Modifying string literal u\"abc\" directly or indirectly is undefined behaviour.\n", errout_str()); check("void foo() {\n" // #8332 " int i;\n" @@ -143,7 +140,7 @@ class TestString : public TestFixture { " }\n" " printf(\"%s\\n\", p);\n" "}"); - ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:3]: (error) Modifying string literal \"string literal\" directly or indirectly is undefined behaviour.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:3]: (error) Modifying string literal \"string literal\" directly or indirectly is undefined behaviour.\n", errout_str()); } void alwaysTrueFalseStringCompare() { @@ -172,7 +169,7 @@ class TestString : public TestFixture { "[test.cpp:10]: (warning) Unnecessary comparison of static strings.\n" "[test.cpp:11]: (warning) Unnecessary comparison of static strings.\n" "[test.cpp:12]: (warning) Unnecessary comparison of static strings.\n" - "[test.cpp:13]: (warning) Unnecessary comparison of static strings.\n", errout.str()); + "[test.cpp:13]: (warning) Unnecessary comparison of static strings.\n", errout_str()); // avoid false positives when the address is modified #6415 check("void f(void *p, int offset) {\n" @@ -181,7 +178,7 @@ class TestString : public TestFixture { " if (!memcmp(offset + p, p, 42)){}\n" " if (!memcmp(p, offset + p, 42)){}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // avoid false positives when the address is modified #6415 check("void f(char *c, int offset) {\n" @@ -190,7 +187,7 @@ class TestString : public TestFixture { " if (!memcmp(offset + c, c, 42)){}\n" " if (!memcmp(c, offset + c, 42)){}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // avoid false positives when the address is modified #6415 check("void f(std::string s, int offset) {\n" @@ -199,7 +196,7 @@ class TestString : public TestFixture { " if (!memcmp(offset + s.c_str(), s.c_str(), 42)){}\n" " if (!memcmp(s.c_str(), offset + s.c_str(), 42)){}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int main()\n" "{\n" @@ -208,17 +205,17 @@ class TestString : public TestFixture { " std::cout << \"Equal\";" " }" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Unnecessary comparison of static strings.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Unnecessary comparison of static strings.\n", errout_str()); check("void f() {\n" " if (strcmp($\"00FF00\", \"00FF00\") == 0) {}" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f() {\n" " if ($strcmp(\"00FF00\", \"00FF00\") == 0) {}" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int main()\n" "{\n" @@ -227,7 +224,7 @@ class TestString : public TestFixture { " std::cout << \"Equal\";" " }" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Unnecessary comparison of static strings.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Unnecessary comparison of static strings.\n", errout_str()); check("int main()\n" "{\n" @@ -236,7 +233,7 @@ class TestString : public TestFixture { " std::cout << \"Equal\";" " }" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Unnecessary comparison of static strings.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Unnecessary comparison of static strings.\n", errout_str()); check("int main()\n" "{\n" @@ -245,7 +242,7 @@ class TestString : public TestFixture { " std::cout << \"Equal\";" " }" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int main()\n" "{\n" @@ -254,7 +251,7 @@ class TestString : public TestFixture { " std::cout << \"Equal\";" " }" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Unnecessary comparison of static strings.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Unnecessary comparison of static strings.\n", errout_str()); check("int foo(const char *buf)\n" "{\n" @@ -263,7 +260,7 @@ class TestString : public TestFixture { " std::cout << \"Equal\";" " }" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Comparison of identical string variables.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Comparison of identical string variables.\n", errout_str()); check("int foo(const std::string& buf)\n" "{\n" @@ -272,123 +269,123 @@ class TestString : public TestFixture { " std::cout << \"Equal\";" " }" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Comparison of identical string variables.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Comparison of identical string variables.\n", errout_str()); check("int main() {\n" " if (\"str\" == \"str\") {\n" " std::cout << \"Equal\";\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Unnecessary comparison of static strings.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Unnecessary comparison of static strings.\n", errout_str()); check("int main() {\n" " if (\"str\" != \"str\") {\n" " std::cout << \"Equal\";\n" " }\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Unnecessary comparison of static strings.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Unnecessary comparison of static strings.\n", errout_str()); check("int main() {\n" " if (a+\"str\" != \"str\"+b) {\n" " std::cout << \"Equal\";\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void suspiciousStringCompare() { check("bool foo(char* c) {\n" " return c == \"x\";\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) String literal compared with variable 'c'. Did you intend to use strcmp() instead?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) String literal compared with variable 'c'. Did you intend to use strcmp() instead?\n", errout_str()); check("bool foo(char** c) {\n" " return c[3] == \"x\";\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) String literal compared with variable 'c[3]'. Did you intend to use strcmp() instead?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) String literal compared with variable 'c[3]'. Did you intend to use strcmp() instead?\n", errout_str()); check("bool foo(wchar_t* c) {\n" " return c == L\"x\";\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) String literal compared with variable 'c'. Did you intend to use wcscmp() instead?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) String literal compared with variable 'c'. Did you intend to use wcscmp() instead?\n", errout_str()); check("bool foo(const char* c) {\n" " return \"x\" == c;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) String literal compared with variable 'c'. Did you intend to use strcmp() instead?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) String literal compared with variable 'c'. Did you intend to use strcmp() instead?\n", errout_str()); check("bool foo(char* c) {\n" " return foo+\"x\" == c;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool foo(char* c) {\n" " return \"x\" == c+foo;\n" "}", "test.cpp"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool foo(char* c) {\n" " return \"x\" == c+foo;\n" "}", "test.c"); - ASSERT_EQUALS("[test.c:2]: (warning) String literal compared with variable 'c+foo'. Did you intend to use strcmp() instead?\n", errout.str()); + ASSERT_EQUALS("[test.c:2]: (warning) String literal compared with variable 'c+foo'. Did you intend to use strcmp() instead?\n", errout_str()); check("bool foo(Foo c) {\n" " return \"x\" == c.foo;\n" "}", "test.cpp"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool foo(Foo c) {\n" " return \"x\" == c.foo;\n" "}", "test.c"); - ASSERT_EQUALS("[test.c:2]: (warning) String literal compared with variable 'c.foo'. Did you intend to use strcmp() instead?\n", errout.str()); + ASSERT_EQUALS("[test.c:2]: (warning) String literal compared with variable 'c.foo'. Did you intend to use strcmp() instead?\n", errout_str()); check("bool foo(const std::string& c) {\n" " return \"x\" == c;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool foo(const Foo* c) {\n" " return \"x\" == c->bar();\n" // #4314 "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Ticket #4257 check("bool foo() {\n" "MyString *str=Getter();\n" "return *str==\"bug\"; }\n", "test.c"); - ASSERT_EQUALS("[test.c:3]: (warning) String literal compared with variable '*str'. Did you intend to use strcmp() instead?\n", errout.str()); + ASSERT_EQUALS("[test.c:3]: (warning) String literal compared with variable '*str'. Did you intend to use strcmp() instead?\n", errout_str()); // Ticket #4257 check("bool foo() {\n" "MyString *str=Getter();\n" "return *str==\"bug\"; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Ticket #4257 check("bool foo() {\n" "MyString **str=OtherGetter();\n" "return *str==\"bug\"; }", "test.c"); - ASSERT_EQUALS("[test.c:3]: (warning) String literal compared with variable '*str'. Did you intend to use strcmp() instead?\n", errout.str()); + ASSERT_EQUALS("[test.c:3]: (warning) String literal compared with variable '*str'. Did you intend to use strcmp() instead?\n", errout_str()); // Ticket #4257 check("bool foo() {\n" "MyString str=OtherGetter2();\n" "return &str==\"bug\"; }", "test.c"); - ASSERT_EQUALS("[test.c:3]: (warning) String literal compared with variable '&str'. Did you intend to use strcmp() instead?\n", errout.str()); + ASSERT_EQUALS("[test.c:3]: (warning) String literal compared with variable '&str'. Did you intend to use strcmp() instead?\n", errout_str()); // Ticket #5734 check("int foo(char c) {\n" "return c == '4';}", "test.cpp"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int foo(char c) {\n" "return c == '4';}", "test.c"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int foo(char c) {\n" "return c == \"42\"[0];}", "test.cpp"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int foo(char c) {\n" "return c == \"42\"[0];}", "test.c"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // 5639 String literal compared with char buffer in a struct check("struct Example {\n" @@ -398,7 +395,7 @@ class TestString : public TestFixture { " struct Example example;\n" " if (example.buffer == \"test\") ;\n" "}\n", "test.cpp"); - ASSERT_EQUALS("[test.cpp:6]: (warning) String literal compared with variable 'example.buffer'. Did you intend to use strcmp() instead?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (warning) String literal compared with variable 'example.buffer'. Did you intend to use strcmp() instead?\n", errout_str()); check("struct Example {\n" " char buffer[200];\n" "};\n" @@ -406,88 +403,88 @@ class TestString : public TestFixture { " struct Example example;\n" " if (example.buffer == \"test\") ;\n" "}\n", "test.c"); - ASSERT_EQUALS("[test.c:6]: (warning) String literal compared with variable 'example.buffer'. Did you intend to use strcmp() instead?\n", errout.str()); + ASSERT_EQUALS("[test.c:6]: (warning) String literal compared with variable 'example.buffer'. Did you intend to use strcmp() instead?\n", errout_str()); // #9726 check("void f(std::vector theArgs) {\n" " std::string arg1(*theArgs.begin());\n" " if(arg1 == \"aaa\") {}\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void suspiciousStringCompare_char() { check("bool foo(char* c) {\n" " return c == 'x';\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Char literal compared with pointer 'c'. Did you intend to dereference it?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Char literal compared with pointer 'c'. Did you intend to dereference it?\n", errout_str()); check("bool foo(wchar_t* c) {\n" " return c == L'x';\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Char literal compared with pointer 'c'. Did you intend to dereference it?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Char literal compared with pointer 'c'. Did you intend to dereference it?\n", errout_str()); check("bool foo(char* c) {\n" " return '\\0' != c;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Char literal compared with pointer 'c'. Did you intend to dereference it?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Char literal compared with pointer 'c'. Did you intend to dereference it?\n", errout_str()); check("bool foo(char c) {\n" " return c == '\\0';\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool foo(char* c) {\n" " return c[0] == '\\0';\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool foo(char** c) {\n" " return c[0] == '\\0';\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Char literal compared with pointer 'c[0]'. Did you intend to dereference it?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Char literal compared with pointer 'c[0]'. Did you intend to dereference it?\n", errout_str()); check("bool foo(char** c) {\n" " return *c == '\\0';\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Char literal compared with pointer '*c'. Did you intend to dereference it?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Char literal compared with pointer '*c'. Did you intend to dereference it?\n", errout_str()); check("bool foo(char c) {\n" " return c == 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool foo(char* c) {\n" " return *c == 0;\n" "}", "test.c"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool foo(char* c) {\n" " return *c == 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("bool foo(Foo* c) {\n" " return 0 == c->x;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void foo(char* c) {\n" " if(c == '\\0') bar();\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Char literal compared with pointer 'c'. Did you intend to dereference it?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Char literal compared with pointer 'c'. Did you intend to dereference it?\n", errout_str()); check("void f() {\n" " struct { struct { char *str; } x; } a;\n" " return a.x.str == '\\0';" "}"); - ASSERT_EQUALS("[test.cpp:3]: (warning) Char literal compared with pointer 'a.x.str'. Did you intend to dereference it?\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (warning) Char literal compared with pointer 'a.x.str'. Did you intend to dereference it?\n", errout_str()); check("void f() {\n" " struct { struct { char *str; } x; } a;\n" " return *a.x.str == '\\0';" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } @@ -497,7 +494,7 @@ class TestString : public TestFixture { " char buf[100];\n" " snprintf(buf,100,\"%s\",buf);\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Undefined behavior: Variable 'buf' is used as parameter and destination in snprintf().\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Undefined behavior: Variable 'buf' is used as parameter and destination in snprintf().\n", errout_str()); } void sprintf1() { @@ -506,7 +503,7 @@ class TestString : public TestFixture { " char buf[100];\n" " sprintf(buf,\"%s\",buf);\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Undefined behavior: Variable 'buf' is used as parameter and destination in sprintf().\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Undefined behavior: Variable 'buf' is used as parameter and destination in sprintf().\n", errout_str()); } void sprintf2() { @@ -515,7 +512,7 @@ class TestString : public TestFixture { " char buf[100];\n" " sprintf(buf,\"%i\",sizeof(buf));\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void sprintf3() { @@ -525,7 +522,7 @@ class TestString : public TestFixture { " sprintf(buf,\"%i\",sizeof(buf));\n" " if (buf[0]);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void sprintf4() { @@ -540,7 +537,7 @@ class TestString : public TestFixture { " struct A a;\n" " snprintf(a.filename, 128, \"%s\", filename);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void sprintf5() { @@ -553,7 +550,7 @@ class TestString : public TestFixture { "{\n" " snprintf(a->filename, 128, \"%s\", a->filename);\n" "}"); - ASSERT_EQUALS("[test.cpp:8]: (error) Undefined behavior: Variable 'a->filename' is used as parameter and destination in snprintf().\n", errout.str()); + ASSERT_EQUALS("[test.cpp:8]: (error) Undefined behavior: Variable 'a->filename' is used as parameter and destination in snprintf().\n", errout_str()); } void sprintf6() { @@ -562,7 +559,7 @@ class TestString : public TestFixture { " char buf[100];\n" " sprintf((char*)buf,\"%s\",(char*)buf);\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Undefined behavior: Variable 'buf' is used as parameter and destination in sprintf().\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Undefined behavior: Variable 'buf' is used as parameter and destination in sprintf().\n", errout_str()); } void sprintf7() { @@ -571,7 +568,7 @@ class TestString : public TestFixture { " char buf[100];\n" " sprintf((char*)(void*)buf,\"%s\",(void*)(char*)buf);\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Undefined behavior: Variable 'buf' is used as parameter and destination in sprintf().\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Undefined behavior: Variable 'buf' is used as parameter and destination in sprintf().\n", errout_str()); } void wsprintf1() { @@ -580,7 +577,7 @@ class TestString : public TestFixture { " wchar_t buf[100];\n" " swprintf(buf,10, \"%s\",buf);\n" "}"); - ASSERT_EQUALS("[test.cpp:4]: (error) Undefined behavior: Variable 'buf' is used as parameter and destination in swprintf().\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Undefined behavior: Variable 'buf' is used as parameter and destination in swprintf().\n", errout_str()); } void strPlusChar1() { @@ -589,7 +586,7 @@ class TestString : public TestFixture { "{\n" " const char *p = \"/usr\" + '/';\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Unusual pointer arithmetic. A value of type 'char' is added to a string literal.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Unusual pointer arithmetic. A value of type 'char' is added to a string literal.\n", errout_str()); } void strPlusChar2() { @@ -599,7 +596,7 @@ class TestString : public TestFixture { " char ch = 1;\n" " const char *p = ch + \"/usr\";\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // Strange looking pointer arithmetic.. check("void foo()\n" @@ -608,7 +605,7 @@ class TestString : public TestFixture { " const char* psz = \"Bla\";\n" " const std::string str = i + psz;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void strPlusChar3() { @@ -618,7 +615,7 @@ class TestString : public TestFixture { " std::string temp = \"/tmp\";\n" " std::string path = temp + '/' + \"sub\" + '/';\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void strPlusChar4() { @@ -627,100 +624,100 @@ class TestString : public TestFixture { "{\n" " const wchar_t *p = L\"/usr\" + L'/';\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Unusual pointer arithmetic. A value of type 'wchar_t' is added to a string literal.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Unusual pointer arithmetic. A value of type 'wchar_t' is added to a string literal.\n", errout_str()); check("void foo(wchar_t c)\n" "{\n" " const wchar_t *p = L\"/usr\" + c;\n" "}"); - ASSERT_EQUALS("[test.cpp:3]: (error) Unusual pointer arithmetic. A value of type 'wchar_t' is added to a string literal.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Unusual pointer arithmetic. A value of type 'wchar_t' is added to a string literal.\n", errout_str()); } void incorrectStringCompare() { check("int f() {\n" " return test.substr( 0 , 4 ) == \"Hello\" ? 0 : 1 ;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) String literal \"Hello\" doesn't match length argument for substr().\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) String literal \"Hello\" doesn't match length argument for substr().\n", errout_str()); check("int f() {\n" " return test.substr( 0 , 4 ) == L\"Hello\" ? 0 : 1 ;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) String literal L\"Hello\" doesn't match length argument for substr().\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) String literal L\"Hello\" doesn't match length argument for substr().\n", errout_str()); check("int f() {\n" " return test.substr( 0 , 5 ) == \"Hello\" ? 0 : 1 ;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f() {\n" " return \"Hello\" == test.substr( 0 , 4 ) ? 0 : 1 ;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) String literal \"Hello\" doesn't match length argument for substr().\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) String literal \"Hello\" doesn't match length argument for substr().\n", errout_str()); check("int f() {\n" " return \"Hello\" == foo.bar().z[1].substr(i+j*4, 4) ? 0 : 1 ;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) String literal \"Hello\" doesn't match length argument for substr().\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) String literal \"Hello\" doesn't match length argument for substr().\n", errout_str()); check("int f() {\n" " return \"Hello\" == test.substr( 0 , 5 ) ? 0 : 1 ;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f() {\n" " if (\"Hello\") { }\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Conversion of string literal \"Hello\" to bool always evaluates to true.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Conversion of string literal \"Hello\" to bool always evaluates to true.\n", errout_str()); check("int f() {\n" " if (\"Hello\" && test) { }\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Conversion of string literal \"Hello\" to bool always evaluates to true.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Conversion of string literal \"Hello\" to bool always evaluates to true.\n", errout_str()); check("int f() {\n" " if (test && \"Hello\") { }\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Conversion of string literal \"Hello\" to bool always evaluates to true.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Conversion of string literal \"Hello\" to bool always evaluates to true.\n", errout_str()); check("int f() {\n" " while (\"Hello\") { }\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Conversion of string literal \"Hello\" to bool always evaluates to true.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Conversion of string literal \"Hello\" to bool always evaluates to true.\n", errout_str()); check("int f() {\n" " return \"Hello\" ? 1 : 2;\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Conversion of string literal \"Hello\" to bool always evaluates to true.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Conversion of string literal \"Hello\" to bool always evaluates to true.\n", errout_str()); check("int f() {\n" " assert (test || \"Hello\");\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Conversion of string literal \"Hello\" to bool always evaluates to true.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Conversion of string literal \"Hello\" to bool always evaluates to true.\n", errout_str()); check("int f() {\n" " assert (test && \"Hello\");\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f() {\n" " assert (\"Hello\" || test);\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) Conversion of string literal \"Hello\" to bool always evaluates to true.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) Conversion of string literal \"Hello\" to bool always evaluates to true.\n", errout_str()); check("int f() {\n" " assert (\"Hello\" && test);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f() {\n" " BOOST_ASSERT (\"Hello\" && test);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int f() {\n" " return f2(\"Hello\");\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #7750 warn about char literals in boolean expressions check("void f() {\n" @@ -733,7 +730,7 @@ class TestString : public TestFixture { "[test.cpp:3]: (warning) Conversion of char literal L'b' to bool always evaluates to true.\n" "[test.cpp:4]: (warning) Conversion of char literal 'c' to bool always evaluates to true.\n" "[test.cpp:5]: (warning) Conversion of char literal 'd' to bool always evaluates to true.\n" - , errout.str()); + , errout_str()); check("void f() {\n" " if('\\0'){}\n" @@ -741,28 +738,28 @@ class TestString : public TestFixture { "}"); ASSERT_EQUALS("[test.cpp:2]: (warning) Conversion of char literal '\\0' to bool always evaluates to false.\n" "[test.cpp:3]: (warning) Conversion of char literal L'\\0' to bool always evaluates to false.\n", - errout.str()); + errout_str()); check("void f() {\n" " if('\\0' || cond){}\n" " if(L'\\0' || cond){}\n" "}"); ASSERT_EQUALS("[test.cpp:2]: (warning) Conversion of char literal '\\0' to bool always evaluates to false.\n" - "[test.cpp:3]: (warning) Conversion of char literal L'\\0' to bool always evaluates to false.\n", errout.str()); + "[test.cpp:3]: (warning) Conversion of char literal L'\\0' to bool always evaluates to false.\n", errout_str()); check("void f(bool b);\n" // #9450 "void f(std::string s);\n" "void g() {\n" " f(\"abc\");\n" "}\n"); - ASSERT_EQUALS("[test.cpp:4]: (warning) Conversion of string literal \"abc\" to bool always evaluates to true.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (warning) Conversion of string literal \"abc\" to bool always evaluates to true.\n", errout_str()); check("void g(bool);\n" " void f(std::map>&m) {\n" " if (m.count(\"abc\"))\n" " g(m[\"abc\"][0] ? true : false);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void g(bool b);\n" "void f() {\n" @@ -771,33 +768,33 @@ class TestString : public TestFixture { "}\n"); ASSERT_EQUALS("[test.cpp:3]: (warning) Conversion of char literal '\\0' to bool always evaluates to false.\n" "[test.cpp:4]: (warning) Conversion of char literal 'a' to bool always evaluates to true.\n", - errout.str()); + errout_str()); check("#define ERROR(msg) if (msg) printf(\"%s\\n\", msg);\n" "void f() {\n" " ERROR(\"abc\")\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void g(int, bool);\n" "void f() {\n" " MyAssert(!\"abc\");\n" " g(2, !\"def\");\n" "}\n"); - ASSERT_EQUALS("[test.cpp:4]: (warning) Conversion of string literal \"def\" to bool always evaluates to true.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (warning) Conversion of string literal \"def\" to bool always evaluates to true.\n", errout_str()); check("bool f(const char *p) {\n" " if (*p == '\\0')\n" " return *p == '\\0';\n" " return false;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("void f(const int* p, const int* q) {\n" " assert((p != NULL && q != NULL) || !\"abc\");\n" " ASSERT((void*)(\"def\") == 0);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class C {\n" // #6109 " void check(const char code[], bool validate = true, const char* filename = \"test.cpp\");\n" @@ -805,19 +802,19 @@ class TestString : public TestFixture { " check(\"class A;\", \"test.C\");\n" " }\n" "};\n"); - ASSERT_EQUALS("[test.cpp:4]: (warning) Conversion of string literal \"test.C\" to bool always evaluates to true.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (warning) Conversion of string literal \"test.C\" to bool always evaluates to true.\n", errout_str()); } void deadStrcmp() { check("void f(const char *str) {\n" " if (strcmp(str, \"abc\") == 0 || strcmp(str, \"def\")) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) The expression 'strcmp(str,\"def\") != 0' is suspicious. It overlaps 'strcmp(str,\"abc\") == 0'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) The expression 'strcmp(str,\"def\") != 0' is suspicious. It overlaps 'strcmp(str,\"abc\") == 0'.\n", errout_str()); check("void f(const wchar_t *str) {\n" " if (wcscmp(str, L\"abc\") == 0 || wcscmp(str, L\"def\")) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:2]: (warning) The expression 'wcscmp(str,L\"def\") != 0' is suspicious. It overlaps 'wcscmp(str,L\"abc\") == 0'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (warning) The expression 'wcscmp(str,L\"def\") != 0' is suspicious. It overlaps 'wcscmp(str,L\"abc\") == 0'.\n", errout_str()); check("struct X {\n" " char *str;\n" @@ -826,7 +823,7 @@ class TestString : public TestFixture { "void f(const struct X *x) {\n" " if (strcmp(x->str, \"abc\") == 0 || strcmp(x->str, \"def\")) {}\n" "}"); - ASSERT_EQUALS("[test.cpp:6]: (warning) The expression 'strcmp(x->str,\"def\") != 0' is suspicious. It overlaps 'strcmp(x->str,\"abc\") == 0'.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:6]: (warning) The expression 'strcmp(x->str,\"def\") != 0' is suspicious. It overlaps 'strcmp(x->str,\"abc\") == 0'.\n", errout_str()); } }; diff --git a/test/testsummaries.cpp b/test/testsummaries.cpp index 053f04ae60d7..454131c38c5d 100644 --- a/test/testsummaries.cpp +++ b/test/testsummaries.cpp @@ -40,9 +40,6 @@ class TestSummaries : public TestFixture { #define createSummaries(...) createSummaries_(__FILE__, __LINE__, __VA_ARGS__) std::string createSummaries_(const char* file, int line, const char code[], const char filename[] = "test.cpp") { - // Clear the error buffer.. - errout.str(""); - // tokenize.. Tokenizer tokenizer(settingsDefault, this); std::istringstream istr(code); diff --git a/test/testsuppressions.cpp b/test/testsuppressions.cpp index c4e080978486..4de36a14a865 100644 --- a/test/testsuppressions.cpp +++ b/test/testsuppressions.cpp @@ -227,9 +227,6 @@ class TestSuppressions : public TestFixture { // Check the suppression for multiple files unsigned int _checkSuppression(std::map &f, bool useFS, const std::string &suppression = emptyString) { - // Clear the error log - errout.str(""); - std::list fileSettings; std::list> filelist; @@ -280,8 +277,6 @@ class TestSuppressions : public TestFixture { } unsigned int _checkSuppressionThreads(const char code[], bool useFS, const std::string &suppression = emptyString) { - errout.str(""); - std::list fileSettings; std::list> filelist; @@ -328,8 +323,6 @@ class TestSuppressions : public TestFixture { } unsigned int _checkSuppressionProcesses(const char code[], bool useFS, const std::string &suppression = emptyString) { - errout.str(""); - std::list fileSettings; std::list> filelist; @@ -374,7 +367,7 @@ class TestSuppressions : public TestFixture { " a++;\n" "}\n", "")); - ASSERT_EQUALS("[test.cpp:3]: (error) Uninitialized variable: a\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (error) Uninitialized variable: a\n", errout_str()); ASSERT_EQUALS(1, (this->*check)("void f() {\n" " int a;\n" @@ -384,7 +377,7 @@ class TestSuppressions : public TestFixture { "}\n", "")); ASSERT_EQUALS("[test.cpp:3]: (error) Uninitialized variable: a\n" - "[test.cpp:5]: (error) Uninitialized variable: b\n", errout.str()); + "[test.cpp:5]: (error) Uninitialized variable: b\n", errout_str()); // suppress uninitvar globally ASSERT_EQUALS(0, (this->*check)("void f() {\n" @@ -392,7 +385,7 @@ class TestSuppressions : public TestFixture { " a++;\n" "}\n", "uninitvar")); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); (this->*check)("void f() {\n" " // cppcheck-suppress-file uninitvar\n" @@ -401,7 +394,7 @@ class TestSuppressions : public TestFixture { "}\n", ""); ASSERT_EQUALS("[test.cpp:2]: (error) File suppression should be at the top of the file\n" - "[test.cpp:4]: (error) Uninitialized variable: a\n", errout.str()); + "[test.cpp:4]: (error) Uninitialized variable: a\n", errout_str()); (this->*check)("void f() {\n" " int a;\n" @@ -410,7 +403,7 @@ class TestSuppressions : public TestFixture { "// cppcheck-suppress-file uninitvar\n", ""); ASSERT_EQUALS("[test.cpp:5]: (error) File suppression should be at the top of the file\n" - "[test.cpp:3]: (error) Uninitialized variable: a\n", errout.str()); + "[test.cpp:3]: (error) Uninitialized variable: a\n", errout_str()); ASSERT_EQUALS(0, (this->*check)("// cppcheck-suppress-file uninitvar\n" "void f() {\n" @@ -420,7 +413,7 @@ class TestSuppressions : public TestFixture { " b++;\n" "}\n", "")); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); ASSERT_EQUALS(0, (this->*check)("/* Fake file description\n" " * End\n" @@ -435,7 +428,7 @@ class TestSuppressions : public TestFixture { " b++;\n" "}\n", "")); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); (this->*check)("// cppcheck-suppress-file uninitvar\n" "void f() {\n" @@ -445,7 +438,7 @@ class TestSuppressions : public TestFixture { " b++;\n" "}\n", ""); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // suppress uninitvar globally, without error present ASSERT_EQUALS(0, (this->*check)("void f() {\n" @@ -453,7 +446,7 @@ class TestSuppressions : public TestFixture { " b++;\n" "}\n", "uninitvar")); - ASSERT_EQUALS("(information) Unmatched suppression: uninitvar\n", errout.str()); + ASSERT_EQUALS("(information) Unmatched suppression: uninitvar\n", errout_str()); (this->*check)("// cppcheck-suppress-file uninitvar\n" "void f() {\n" @@ -461,7 +454,7 @@ class TestSuppressions : public TestFixture { " b++;\n" "}\n", ""); - ASSERT_EQUALS("[test.cpp:1]: (information) Unmatched suppression: uninitvar\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (information) Unmatched suppression: uninitvar\n", errout_str()); // suppress uninitvar for this file only ASSERT_EQUALS(0, (this->*check)("void f() {\n" @@ -469,7 +462,7 @@ class TestSuppressions : public TestFixture { " a++;\n" "}\n", "uninitvar:test.cpp")); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // suppress uninitvar for this file only, without error present (this->*check)("void f() {\n" @@ -477,7 +470,7 @@ class TestSuppressions : public TestFixture { " b++;\n" "}\n", "uninitvar:test.cpp"); - ASSERT_EQUALS("[test.cpp]: (information) Unmatched suppression: uninitvar\n", errout.str()); + ASSERT_EQUALS("[test.cpp]: (information) Unmatched suppression: uninitvar\n", errout_str()); // suppress all for this file only ASSERT_EQUALS(0, (this->*check)("void f() {\n" @@ -485,7 +478,7 @@ class TestSuppressions : public TestFixture { " a++;\n" "}\n", "*:test.cpp")); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // suppress all for this file only, without error present (this->*check)("void f() {\n" @@ -493,7 +486,7 @@ class TestSuppressions : public TestFixture { " b++;\n" "}\n", "*:test.cpp"); - ASSERT_EQUALS("[test.cpp]: (information) Unmatched suppression: *\n", errout.str()); + ASSERT_EQUALS("[test.cpp]: (information) Unmatched suppression: *\n", errout_str()); // suppress uninitvar for this file and line ASSERT_EQUALS(0, (this->*check)("void f() {\n" @@ -501,7 +494,7 @@ class TestSuppressions : public TestFixture { " a++;\n" "}\n", "uninitvar:test.cpp:3")); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // suppress uninitvar for this file and line, without error present (this->*check)("void f() {\n" @@ -509,7 +502,7 @@ class TestSuppressions : public TestFixture { " b++;\n" "}\n", "uninitvar:test.cpp:3"); - ASSERT_EQUALS("[test.cpp:3]: (information) Unmatched suppression: uninitvar\n", errout.str()); + ASSERT_EQUALS("[test.cpp:3]: (information) Unmatched suppression: uninitvar\n", errout_str()); // suppress uninitvar inline ASSERT_EQUALS(0, (this->*check)("void f() {\n" @@ -518,7 +511,7 @@ class TestSuppressions : public TestFixture { " a++;\n" "}\n", "")); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // suppress uninitvar inline ASSERT_EQUALS(0, (this->*check)("void f() {\n" @@ -528,7 +521,7 @@ class TestSuppressions : public TestFixture { " a++;\n" "}\n", "")); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // suppress uninitvar inline ASSERT_EQUALS(0, (this->*check)("void f() {\n" @@ -536,7 +529,7 @@ class TestSuppressions : public TestFixture { " a++;// cppcheck-suppress uninitvar\n" "}\n", "")); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // suppress uninitvar inline ASSERT_EQUALS(0, (this->*check)("void f() {\n" @@ -545,7 +538,7 @@ class TestSuppressions : public TestFixture { " a++;\n" "}\n", "")); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // suppress uninitvar inline ASSERT_EQUALS(0, (this->*check)("void f() {\n" @@ -555,7 +548,7 @@ class TestSuppressions : public TestFixture { " a++;\n" "}\n", "")); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // suppress uninitvar inline ASSERT_EQUALS(0, (this->*check)("void f() {\n" @@ -563,7 +556,7 @@ class TestSuppressions : public TestFixture { " a++;/* cppcheck-suppress uninitvar */\n" "}\n", "")); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // suppress uninitvar inline ASSERT_EQUALS(0, (this->*check)("void f() {\n" @@ -572,7 +565,7 @@ class TestSuppressions : public TestFixture { " a++;\n" "}\n", "")); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // suppress uninitvar inline ASSERT_EQUALS(0, (this->*check)("void f() {\n" @@ -583,7 +576,7 @@ class TestSuppressions : public TestFixture { " a++;\n" "}\n", "")); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // suppress uninitvar inline ASSERT_EQUALS(0, (this->*check)("void f() {\n" @@ -591,7 +584,7 @@ class TestSuppressions : public TestFixture { " a++;// cppcheck-suppress[uninitvar]\n" "}\n", "")); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // suppress uninitvar inline ASSERT_EQUALS(0, (this->*check)("void f() {\n" @@ -600,7 +593,7 @@ class TestSuppressions : public TestFixture { " a++;\n" "}\n", "")); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // suppress uninitvar inline ASSERT_EQUALS(0, (this->*check)("void f() {\n" @@ -610,7 +603,7 @@ class TestSuppressions : public TestFixture { " a++;\n" "}\n", "")); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // suppress uninitvar inline ASSERT_EQUALS(0, (this->*check)("void f() {\n" @@ -618,7 +611,7 @@ class TestSuppressions : public TestFixture { " a++;/* cppcheck-suppress[uninitvar]*/\n" "}\n", "")); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // suppress uninitvar inline, with asm before (#6813) ASSERT_EQUALS(0, (this->*check)("void f() {\n" @@ -630,7 +623,7 @@ class TestSuppressions : public TestFixture { " a++;\n" "}", "")); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // suppress uninitvar inline, without error present (this->*check)("void f() {\n" @@ -639,7 +632,7 @@ class TestSuppressions : public TestFixture { " b++;\n" "}\n", ""); - ASSERT_EQUALS("[test.cpp:4]: (information) Unmatched suppression: uninitvar\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (information) Unmatched suppression: uninitvar\n", errout_str()); // suppress block inline checks ASSERT_EQUALS(0, (this->*check)("void f() {\n" @@ -651,7 +644,7 @@ class TestSuppressions : public TestFixture { " // cppcheck-suppress-end uninitvar\n" "}\n", "")); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); ASSERT_EQUALS(1, (this->*check)("void f() {\n" " // cppcheck-suppress-begin uninitvar\n" @@ -663,7 +656,7 @@ class TestSuppressions : public TestFixture { "")); ASSERT_EQUALS("[test.cpp:2]: (error) Suppress Begin: No matching end\n" "[test.cpp:4]: (error) Uninitialized variable: a\n" - "[test.cpp:6]: (error) Uninitialized variable: b\n", errout.str()); + "[test.cpp:6]: (error) Uninitialized variable: b\n", errout_str()); ASSERT_EQUALS(1, (this->*check)("void f() {\n" " int a;\n" @@ -675,7 +668,7 @@ class TestSuppressions : public TestFixture { "")); ASSERT_EQUALS("[test.cpp:6]: (error) Suppress End: No matching begin\n" "[test.cpp:3]: (error) Uninitialized variable: a\n" - "[test.cpp:5]: (error) Uninitialized variable: b\n", errout.str()); + "[test.cpp:5]: (error) Uninitialized variable: b\n", errout_str()); ASSERT_EQUALS(1, (this->*check)("void f() {\n" " int a;\n" @@ -686,7 +679,7 @@ class TestSuppressions : public TestFixture { " b++;\n" "}\n", "")); - ASSERT_EQUALS("[test.cpp:7]: (error) Uninitialized variable: b\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (error) Uninitialized variable: b\n", errout_str()); ASSERT_EQUALS(1, (this->*check)("void f() {\n" " int a;\n" @@ -697,7 +690,7 @@ class TestSuppressions : public TestFixture { " b++;\n" "}\n", "")); - ASSERT_EQUALS("[test.cpp:7]: (error) Uninitialized variable: b\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (error) Uninitialized variable: b\n", errout_str()); ASSERT_EQUALS(1, (this->*check)("void f() {\n" " int a;\n" @@ -708,7 +701,7 @@ class TestSuppressions : public TestFixture { " b++;\n" "}\n", "")); - ASSERT_EQUALS("[test.cpp:7]: (error) Uninitialized variable: b\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (error) Uninitialized variable: b\n", errout_str()); ASSERT_EQUALS(1, (this->*check)("void f() {\n" " int a;\n" @@ -719,7 +712,7 @@ class TestSuppressions : public TestFixture { " b++;\n" "}\n", "")); - ASSERT_EQUALS("[test.cpp:7]: (error) Uninitialized variable: b\n", errout.str()); + ASSERT_EQUALS("[test.cpp:7]: (error) Uninitialized variable: b\n", errout_str()); (this->*check)("void f() {\n" " int a;\n" @@ -732,7 +725,7 @@ class TestSuppressions : public TestFixture { " // cppcheck-suppress-end uninitvar\n" "}\n", ""); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); (this->*check)("void f() {\n" " int a;\n" @@ -745,7 +738,7 @@ class TestSuppressions : public TestFixture { " // cppcheck-suppress-end uninitvar\n" "}\n", ""); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); (this->*check)("void f() {\n" " // cppcheck-suppress-begin [uninitvar]\n" @@ -760,7 +753,7 @@ class TestSuppressions : public TestFixture { " // cppcheck-suppress-end [uninitvar]\n" "}\n", ""); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); (this->*check)("void f() {\n" " // cppcheck-suppress-begin [uninitvar, syntaxError]\n" @@ -775,7 +768,7 @@ class TestSuppressions : public TestFixture { " // cppcheck-suppress-end [uninitvar, syntaxError]\n" "}\n", ""); - ASSERT_EQUALS("[test.cpp:2]: (information) Unmatched suppression: syntaxError\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (information) Unmatched suppression: syntaxError\n", errout_str()); (this->*check)("// cppcheck-suppress-begin [uninitvar, syntaxError]\n" "void f() {\n" @@ -790,7 +783,7 @@ class TestSuppressions : public TestFixture { "}\n" "// cppcheck-suppress-end [uninitvar, syntaxError]\n", ""); - ASSERT_EQUALS("[test.cpp:1]: (information) Unmatched suppression: syntaxError\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (information) Unmatched suppression: syntaxError\n", errout_str()); (this->*check)("// cppcheck-suppress-begin [uninitvar, syntaxError]\n" "void f() {\n" @@ -805,7 +798,7 @@ class TestSuppressions : public TestFixture { "}\n" "// cppcheck-suppress-end [uninitvar, syntaxError]", ""); - ASSERT_EQUALS("[test.cpp:1]: (information) Unmatched suppression: syntaxError\n", errout.str()); + ASSERT_EQUALS("[test.cpp:1]: (information) Unmatched suppression: syntaxError\n", errout_str()); // test of multiple suppression types (this->*check)("// cppcheck-suppress-file uninitvar\n" @@ -817,7 +810,7 @@ class TestSuppressions : public TestFixture { " // cppcheck-suppress-end uninitvar\n" "}\n", ""); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); (this->*check)("void f() {\n" " int a;\n" @@ -827,7 +820,7 @@ class TestSuppressions : public TestFixture { " // cppcheck-suppress-end uninitvar\n" "}\n", ""); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); (this->*check)("// cppcheck-suppress-file uninitvar\n" "void f() {\n" @@ -836,7 +829,7 @@ class TestSuppressions : public TestFixture { " a++;\n" "}\n", ""); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); (this->*check)("// cppcheck-suppress-file uninitvar\n" "void f() {\n" @@ -846,7 +839,7 @@ class TestSuppressions : public TestFixture { " // cppcheck-suppress-end uninitvar\n" "}\n", ""); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); (this->*check)("// cppcheck-suppress-file uninitvar\n" "void f() {\n" @@ -855,7 +848,7 @@ class TestSuppressions : public TestFixture { " a++;\n" "}\n", ""); - ASSERT_EQUALS("[test.cpp:4]: (information) Unmatched suppression: uninitvar\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (information) Unmatched suppression: uninitvar\n", errout_str()); // #5746 - exitcode ASSERT_EQUALS(1U, @@ -863,24 +856,27 @@ class TestSuppressions : public TestFixture { " int a; return a;\n" "}\n", "")); + (void)errout_str(); + ASSERT_EQUALS(0U, (this->*check)("int f() {\n" " int a; return a;\n" "}\n", "uninitvar")); + (void)errout_str(); // cppcheck-suppress-macro (this->*check)("// cppcheck-suppress-macro zerodiv\n" "#define DIV(A,B) A/B\n" "a = DIV(10,0);\n", ""); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); (this->*check)("// cppcheck-suppress-macro abc\n" "#define DIV(A,B) A/B\n" "a = DIV(10,1);\n", ""); - ASSERT_EQUALS("", errout.str()); // <- no unmatched suppression reported for macro suppression + ASSERT_EQUALS("", errout_str()); // <- no unmatched suppression reported for macro suppression } void suppressionsSettingsFiles() { @@ -921,7 +917,7 @@ class TestSuppressions : public TestFixture { // suppress uninitvar for this file and line ASSERT_EQUALS(0, (this->*check)(files, "uninitvar:xyz.cpp:3")); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void suppressionsMultiFileFiles() { @@ -1031,7 +1027,7 @@ class TestSuppressions : public TestFixture { " a++;\n" "}\n", "")); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); ASSERT_EQUALS(1, (this->*check)("void f() {\n" " int a,b;\n" @@ -1039,7 +1035,7 @@ class TestSuppressions : public TestFixture { " a++; b++;\n" "}\n", "")); - ASSERT_EQUALS("[test.cpp:4]: (error) Uninitialized variable: a\n", errout.str()); + ASSERT_EQUALS("[test.cpp:4]: (error) Uninitialized variable: a\n", errout_str()); } void inlinesuppress_symbolname_Files() { @@ -1189,8 +1185,6 @@ class TestSuppressions : public TestFixture { } void globalSuppressions() { // Testing that Cppcheck::useGlobalSuppressions works (#8515) - errout.str(""); - CppCheck cppCheck(*this, false, nullptr); // <- do not "use global suppressions". pretend this is a thread that just checks a file. Settings& settings = cppCheck.settings(); settings.quiet = true; @@ -1199,7 +1193,7 @@ class TestSuppressions : public TestFixture { const char code[] = "int f() { int a; return a; }"; ASSERT_EQUALS(0, cppCheck.check("test.c", code)); // <- no unsuppressed error is seen - ASSERT_EQUALS("[test.c:1]: (error) Uninitialized variable: a\n", errout.str()); // <- report error so ThreadExecutor can suppress it and make sure the global suppression is matched. + ASSERT_EQUALS("[test.c:1]: (error) Uninitialized variable: a\n", errout_str()); // <- report error so ThreadExecutor can suppress it and make sure the global suppression is matched. } void inlinesuppress_unusedFunction() const { // #4210, #4946 - wrong report of "unmatchedSuppression" for "unusedFunction" @@ -1223,9 +1217,6 @@ class TestSuppressions : public TestFixture { } void suppressionWithRelativePaths() { - // Clear the error log - errout.str(""); - CppCheck cppCheck(*this, true, nullptr); Settings& settings = cppCheck.settings(); settings.quiet = true; @@ -1242,14 +1233,14 @@ class TestSuppressions : public TestFixture { " int y;\n" "};"; ASSERT_EQUALS(0, cppCheck.check("/somewhere/test.cpp", code)); - ASSERT_EQUALS("",errout.str()); + ASSERT_EQUALS("",errout_str()); } void suppressingSyntaxErrorsInternal(unsigned int (TestSuppressions::*check)(const char[], const std::string &)) { // syntaxErrors should be suppressible (#7076) const char code[] = "if if\n"; ASSERT_EQUALS(0, (this->*check)(code, "syntaxError:test.cpp:1")); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void suppressingSyntaxErrorsFiles() { @@ -1272,7 +1263,7 @@ class TestSuppressions : public TestFixture { " pop EAX ; restore EAX\n" "}"; ASSERT_EQUALS(0, (this->*check)(code, "")); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void suppressingSyntaxErrorsInlineFiles() { @@ -1298,7 +1289,7 @@ class TestSuppressions : public TestFixture { "[!ENDIF!][!//\n" "};"; ASSERT_EQUALS(0, (this->*check)(code, "syntaxError:test.cpp:4")); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void suppressingSyntaxErrorsWhileFileReadFiles() { @@ -1348,13 +1339,13 @@ class TestSuppressions : public TestFixture { const char code[] = "fi if;"; ASSERT_EQUALS(0, (this->*check)(code, "*:test.cpp")); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // multi error in file, but only suppression one error const char code2[] = "fi fi\n" "if if;"; ASSERT_EQUALS(1, (this->*check)(code2, "*:test.cpp:1")); // suppress all error at line 1 of test.cpp - ASSERT_EQUALS("[test.cpp:2]: (error) syntax error\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (error) syntax error\n", errout_str()); // multi error in file, but only suppression one error (2) const char code3[] = "void f(int x, int y){\n" @@ -1362,7 +1353,8 @@ class TestSuppressions : public TestFixture { " int b = y/0;\n" "}\n" "f(0, 1);\n"; - ASSERT_EQUALS(1, (this->*check)(code3, "zerodiv:test.cpp:3")); // suppress 'errordiv' at line 3 of test.cpp + ASSERT_EQUALS(1, (this->*check)(code3, "zerodiv:test.cpp:3")); // suppress 'zerodiv' at line 3 of test.cpp + ASSERT_EQUALS("[test.cpp:2]: (error) Division by zero.\n", errout_str()); } void suppressingSyntaxErrorAndExitCodeFiles() { @@ -1380,7 +1372,7 @@ class TestSuppressions : public TestFixture { mfiles["test.cpp"] = "fi if;"; mfiles["test2.cpp"] = "fi if"; ASSERT_EQUALS(1, (this->*check)(mfiles, "*:test.cpp")); - ASSERT_EQUALS("[test2.cpp:1]: (error) syntax error\n", errout.str()); + ASSERT_EQUALS("[test2.cpp:1]: (error) syntax error\n", errout_str()); } void suppressingSyntaxErrorAndExitCodeMultiFileFiles() { @@ -1411,58 +1403,51 @@ class TestSuppressions : public TestFixture { std::list suppressions; // No unmatched suppression - errout.str(""); suppressions.clear(); ASSERT_EQUALS(false, SuppressionList::reportUnmatchedSuppressions(suppressions, *this)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // suppress all unmatchedSuppression - errout.str(""); suppressions.clear(); suppressions.emplace_back("abc", "a.c", 10U); suppressions.emplace_back("unmatchedSuppression", "*", SuppressionList::Suppression::NO_LINE); ASSERT_EQUALS(false, SuppressionList::reportUnmatchedSuppressions(suppressions, *this)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // suppress all unmatchedSuppression (corresponds to "--suppress=unmatchedSuppression") - errout.str(""); suppressions.clear(); suppressions.emplace_back("abc", "a.c", 10U); suppressions.emplace_back("unmatchedSuppression", "", SuppressionList::Suppression::NO_LINE); ASSERT_EQUALS(false, SuppressionList::reportUnmatchedSuppressions(suppressions, *this)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // suppress all unmatchedSuppression in a.c - errout.str(""); suppressions.clear(); suppressions.emplace_back("abc", "a.c", 10U); suppressions.emplace_back("unmatchedSuppression", "a.c", SuppressionList::Suppression::NO_LINE); ASSERT_EQUALS(false, SuppressionList::reportUnmatchedSuppressions(suppressions, *this)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // suppress unmatchedSuppression in a.c at line 10 - errout.str(""); suppressions.clear(); suppressions.emplace_back("abc", "a.c", 10U); suppressions.emplace_back("unmatchedSuppression", "a.c", 10U); ASSERT_EQUALS(false, SuppressionList::reportUnmatchedSuppressions(suppressions, *this)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // don't suppress unmatchedSuppression when file is mismatching - errout.str(""); suppressions.clear(); suppressions.emplace_back("abc", "a.c", 10U); suppressions.emplace_back("unmatchedSuppression", "b.c", SuppressionList::Suppression::NO_LINE); ASSERT_EQUALS(true, SuppressionList::reportUnmatchedSuppressions(suppressions, *this)); - ASSERT_EQUALS("[a.c:10]: (information) Unmatched suppression: abc\n", errout.str()); + ASSERT_EQUALS("[a.c:10]: (information) Unmatched suppression: abc\n", errout_str()); // don't suppress unmatchedSuppression when line is mismatching - errout.str(""); suppressions.clear(); suppressions.emplace_back("abc", "a.c", 10U); suppressions.emplace_back("unmatchedSuppression", "a.c", 1U); ASSERT_EQUALS(true, SuppressionList::reportUnmatchedSuppressions(suppressions, *this)); - ASSERT_EQUALS("[a.c:10]: (information) Unmatched suppression: abc\n", errout.str()); + ASSERT_EQUALS("[a.c:10]: (information) Unmatched suppression: abc\n", errout_str()); } void suppressionsParseXmlFile() const { diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp index 1328945d3255..20ad30fd8479 100644 --- a/test/testsymboldatabase.cpp +++ b/test/testsymboldatabase.cpp @@ -75,7 +75,6 @@ class TestSymbolDatabase : public TestFixture { } const SymbolDatabase* getSymbolDB_inner(Tokenizer& tokenizer, const char* code, const char* filename) { - errout.str(""); std::istringstream istr(code); return tokenizer.tokenize(istr, filename) ? tokenizer.getSymbolDatabase() : nullptr; } @@ -2142,7 +2141,7 @@ class TestSymbolDatabase : public TestFixture { ASSERT_EQUALS(true, db->getVariableFromVarId(8) && db->getVariableFromVarId(8)->dimensions().size() == 1); ASSERT_EQUALS(true, db->getVariableFromVarId(9) && db->getVariableFromVarId(9)->dimensions().size() == 1); ASSERT_EQUALS(true, db->getVariableFromVarId(10) && db->getVariableFromVarId(10)->dimensions().size() == 1); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void pointerToMemberFunction() { @@ -2154,7 +2153,7 @@ class TestSymbolDatabase : public TestFixture { ASSERT_EQUALS(true, db->getVariableFromVarId(1) != nullptr); ASSERT_EQUALS("pFun", db->getVariableFromVarId(1)->name()); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void hasSubClassConstructor() { @@ -2340,7 +2339,7 @@ class TestSymbolDatabase : public TestFixture { " if (pDocSh && !getCellRangesForAddress(nFlags)) ;\n" "}"); - ASSERT(db && errout.str().empty()); + ASSERT(db && errout_str().empty()); const Scope *scope = db->findScopeByName("getFormula1"); ASSERT(scope != nullptr); @@ -2354,7 +2353,7 @@ class TestSymbolDatabase : public TestFixture { " if (pDocSh && !getCellRangesForAddress(nFlags)) ;\n" "}"); - ASSERT(db && errout.str().empty()); + ASSERT(db && errout_str().empty()); const Scope *scope = db->findScopeByName("getFormula1"); ASSERT(scope != nullptr); @@ -2372,7 +2371,7 @@ class TestSymbolDatabase : public TestFixture { " if (pDocSh && !getCellRangesForAddress(nFlags)) ;\n" "}"); - ASSERT(db && errout.str().empty()); + ASSERT(db && errout_str().empty()); const Scope *scope = db->findScopeByName("getFormula1"); ASSERT(scope != nullptr); @@ -2387,7 +2386,7 @@ class TestSymbolDatabase : public TestFixture { "extern void f5() { };\n" "void f6() { }"); - ASSERT(db && errout.str().empty()); + ASSERT(db && errout_str().empty()); const Token *f = Token::findsimplematch(tokenizer.tokens(), "f1"); ASSERT(f && f->function() && f->function()->isStaticLocal() && f->function()->retDef->str() == "void"); @@ -2415,7 +2414,7 @@ class TestSymbolDatabase : public TestFixture { " bar();\n" "}\n"); - ASSERT(db && errout.str().empty()); + ASSERT(db && errout_str().empty()); const Token *f = Token::findsimplematch(tokenizer.tokens(), "bar"); ASSERT(f && f->function() && f->function()->isExtern() && f == f->function()->tokenDef && f->function()->retDef->str() == "void"); @@ -2435,7 +2434,7 @@ class TestSymbolDatabase : public TestFixture { " }\n" "}\n"); - ASSERT(db && errout.str().empty()); + ASSERT(db && errout_str().empty()); } void classWithFriend() { @@ -2574,9 +2573,6 @@ class TestSymbolDatabase : public TestFixture { #define check(...) check_(__FILE__, __LINE__, __VA_ARGS__) void check_(const char* file, int line, const char code[], bool debug = true, const char filename[] = "test.cpp", const Settings* pSettings = nullptr) { - // Clear the error log - errout.str(""); - // Check.. const Settings settings = settingsBuilder(pSettings ? *pSettings : settings1).debugwarnings(debug).exhaustive().build(); @@ -2599,7 +2595,7 @@ class TestSymbolDatabase : public TestFixture { ASSERT(f && f->type == Scope::eFunction && f->function); ASSERT(f->function->argumentList.size() == 2 && f->function->argumentList.front().index() == 0 && f->function->argumentList.front().name().empty() && f->function->argumentList.back().index() == 1); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { GET_SYMBOL_DB("void g(std::map > m) { }"); @@ -2608,31 +2604,31 @@ class TestSymbolDatabase : public TestFixture { ASSERT(m && !m->isReference() && !m->isConst() && m->isArgument() && m->isClass()); const Scope* g = db->findScopeByName("g"); ASSERT(g && g->type == Scope::eFunction && g->function && g->function->argumentList.size() == 1 && g->function->argumentList.front().index() == 0); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { GET_SYMBOL_DB("void g(std::map m = std::map()) { }"); const Scope* g = db->findScopeByName("g"); ASSERT(g && g->type == Scope::eFunction && g->function && g->function->argumentList.size() == 1 && g->function->argumentList.front().index() == 0 && g->function->initializedArgCount() == 1); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { GET_SYMBOL_DB("void g(int = 0) { }"); const Scope* g = db->findScopeByName("g"); ASSERT(g && g->type == Scope::eFunction && g->function && g->function->argumentList.size() == 1 && g->function->argumentList.front().hasDefault()); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { GET_SYMBOL_DB("void g(int*) { }"); // unnamed pointer argument (#8052) const Scope* g = db->findScopeByName("g"); ASSERT(g && g->type == Scope::eFunction && g->function && g->function->argumentList.size() == 1 && g->function->argumentList.front().nameToken() == nullptr && g->function->argumentList.front().isPointer()); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { GET_SYMBOL_DB("void g(int* const) { }"); // 'const' is not the name of the variable - #5882 const Scope* g = db->findScopeByName("g"); ASSERT(g && g->type == Scope::eFunction && g->function && g->function->argumentList.size() == 1 && g->function->argumentList.front().nameToken() == nullptr); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } } @@ -3143,7 +3139,7 @@ class TestSymbolDatabase : public TestFixture { " using type = T;\n" " type t_;\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { GET_SYMBOL_DB_DBG("class T;\n" // #12367 @@ -3151,13 +3147,13 @@ class TestSymbolDatabase : public TestFixture { " S(T& t);\n" " T& _t;\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { GET_SYMBOL_DB_DBG("struct S {\n" // #12395 " static S s;\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const Variable* const s = db->getVariableFromVarId(1); ASSERT(s->scope()->definedType->needInitialization == Type::NeedInitialization::False); } @@ -3172,7 +3168,7 @@ class TestSymbolDatabase : public TestFixture { " catch (X::Error4 x) { }\n" "}"; GET_SYMBOL_DB(str); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); ASSERT(db && db->variableList().size() == 5); // index 0 + 4 variables ASSERT(db && db->scopeList.size() == 7); // global + function + try + 4 catch } @@ -3182,11 +3178,11 @@ class TestSymbolDatabase : public TestFixture { check("namespace foo {\n" " class bar;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class foo : public bar < int, int> {\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void symboldatabase2() { @@ -3194,13 +3190,13 @@ class TestSymbolDatabase : public TestFixture { "public:\n" "foo() { }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("class foo {\n" "class bar;\n" "foo() { }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void symboldatabase3() { @@ -3208,7 +3204,7 @@ class TestSymbolDatabase : public TestFixture { "struct A {\n" " friend func_type f : 2;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void symboldatabase4() { @@ -3216,15 +3212,15 @@ class TestSymbolDatabase : public TestFixture { "static void function_declaration_before(void) {}\n" "static void function_declaration_after(void) {}\n" "static void function_declaration_after(void) __attribute__((__used__));"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("main(int argc, char *argv[]) { }", true, "test.c"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const Settings s = settingsBuilder(settings1).severity(Severity::portability).build(); check("main(int argc, char *argv[]) { }", false, "test.c", &s); ASSERT_EQUALS("[test.c:1]: (portability) Omitted return type of function 'main' defaults to int, this is not supported by ISO C99 and later standards.\n", - errout.str()); + errout_str()); check("namespace boost {\n" " std::locale generate_locale()\n" @@ -3232,7 +3228,7 @@ class TestSymbolDatabase : public TestFixture { " return std::locale();\n" " }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("namespace X {\n" " static void function_declaration_before(void) __attribute__((__used__));\n" @@ -3240,7 +3236,7 @@ class TestSymbolDatabase : public TestFixture { " static void function_declaration_after(void) {}\n" " static void function_declaration_after(void) __attribute__((__used__));\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("testing::testing()\n" "{\n" @@ -3248,7 +3244,7 @@ class TestSymbolDatabase : public TestFixture { ASSERT_EQUALS( "[test.cpp:1]: (debug) Executable scope 'testing' with unknown function.\n" "[test.cpp:1]: (debug) Executable scope 'testing' with unknown function.\n", // duplicate - errout.str()); + errout_str()); } void symboldatabase5() { @@ -3267,7 +3263,7 @@ class TestSymbolDatabase : public TestFixture { "Y> x3;\n" "Y>1>> x4;\n" "Y>1)>> x5;\n", false); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void symboldatabase7() { @@ -3282,7 +3278,7 @@ class TestSymbolDatabase : public TestFixture { "public:\n" " int f() { return C< ::D,int>::f(); }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void symboldatabase8() { @@ -3296,7 +3292,7 @@ class TestSymbolDatabase : public TestFixture { " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void symboldatabase9() { @@ -3310,7 +3306,7 @@ class TestSymbolDatabase : public TestFixture { " }\n" "};\n", false); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void symboldatabase10() { @@ -3323,7 +3319,7 @@ class TestSymbolDatabase : public TestFixture { " friend void A::f();\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void symboldatabase11() { @@ -3333,7 +3329,7 @@ class TestSymbolDatabase : public TestFixture { " int i : (false ? g () : 1);\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void symboldatabase12() { @@ -3342,7 +3338,7 @@ class TestSymbolDatabase : public TestFixture { " void bar2 () = __null;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void symboldatabase13() { @@ -3351,7 +3347,7 @@ class TestSymbolDatabase : public TestFixture { " void bar2 () = A::f;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void symboldatabase14() { @@ -3363,7 +3359,7 @@ class TestSymbolDatabase : public TestFixture { // ticket #2657 - segmentation fault check("{return f(){}}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void symboldatabase19() { @@ -3373,7 +3369,7 @@ class TestSymbolDatabase : public TestFixture { ASSERT_EQUALS("[test.cpp:1]: (debug) Executable scope 'y' with unknown function.\n" "[test.cpp:1]: (debug) valueFlowConditionExpressions bailout: Skipping function due to incomplete variable x\n" "[test.cpp:1]: (debug) Executable scope 'y' with unknown function.\n", // duplicate - errout.str()); + errout_str()); } void symboldatabase20() { @@ -3390,14 +3386,14 @@ class TestSymbolDatabase : public TestFixture { " Foo foo;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } // ticket 3437 (segmentation fault) void symboldatabase22() { check("template struct A {};\n" "A a;"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } // ticket 3435 (std::vector) @@ -3457,7 +3453,7 @@ class TestSymbolDatabase : public TestFixture { " throw bar;\n" "}"; GET_SYMBOL_DB(str); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); ASSERT(db && db->variableList().size() == 2); // index 0 + 1 variable } @@ -3467,7 +3463,7 @@ class TestSymbolDatabase : public TestFixture { " throw bar;\n" "}"; GET_SYMBOL_DB_C(str); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); ASSERT(db && db->variableList().size() == 2); // index 0 + 1 variable } @@ -3478,7 +3474,7 @@ class TestSymbolDatabase : public TestFixture { " B1()\n" " {} C(int) : B1() class\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void symboldatabase28() { @@ -3492,7 +3488,7 @@ class TestSymbolDatabase : public TestFixture { check("struct B : A {\n" " B() : A {}\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void symboldatabase30() { @@ -3567,18 +3563,18 @@ class TestSymbolDatabase : public TestFixture { "struct S {\n" " _Atomic union { int n; };\n" "};"); - ASSERT_EQUALS("[test.cpp:2]: (debug) Failed to parse 'typedef _Atomic ( int ) & atomic_int_ref ;'. The checking continues anyway.\n", errout.str()); + ASSERT_EQUALS("[test.cpp:2]: (debug) Failed to parse 'typedef _Atomic ( int ) & atomic_int_ref ;'. The checking continues anyway.\n", errout_str()); } void symboldatabase35() { // ticket #4806 and #4841 check("class FragmentQueue : public CL_NS(util)::PriorityQueue >\n" "{};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void symboldatabase36() { // ticket #4892 check("void struct ( ) { if ( 1 ) } int main ( ) { }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void symboldatabase37() { @@ -3626,7 +3622,7 @@ class TestSymbolDatabase : public TestFixture { " try { }\n" " catch (std::bad_alloc) { }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void symboldatabase41() { // ticket #5197 (unknown macro) @@ -3646,7 +3642,7 @@ class TestSymbolDatabase : public TestFixture { check("void f() {\n" " new int;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void symboldatabase44() { @@ -4832,13 +4828,13 @@ class TestSymbolDatabase : public TestFixture { void symboldatabase65() { // don't crash on missing links from instantiation of template with typedef check("int ( * X0 ) ( long ) < int ( ) ( long ) > :: f0 ( int * ) { return 0 ; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); check("int g();\n" // #11385 "void f(int i) {\n" " if (i > ::g()) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void symboldatabase66() { // #8540 @@ -5031,7 +5027,7 @@ class TestSymbolDatabase : public TestFixture { "}\n" "void e() { using c = a<>; }"); ASSERT(db != nullptr); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void symboldatabase79() { // #9392 @@ -5192,7 +5188,7 @@ class TestSymbolDatabase : public TestFixture { ASSERT(scope->functionList.front().isConstructor() == true); ASSERT(scope->functionList.front().isDefault() == true); ASSERT(scope->functionList.front().isNoExcept() == true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void symboldatabase84() { @@ -5207,7 +5203,7 @@ class TestSymbolDatabase : public TestFixture { ASSERT(scope->functionList.front().isConstructor() == true); ASSERT(scope->functionList.front().isDefault() == true); ASSERT(scope->functionList.front().isNoExcept() == false); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { GET_SYMBOL_DB_DBG("struct a { a() noexcept(true); };\n" @@ -5220,7 +5216,7 @@ class TestSymbolDatabase : public TestFixture { ASSERT(scope->functionList.front().isConstructor() == true); ASSERT(scope->functionList.front().isDefault() == true); ASSERT(scope->functionList.front().isNoExcept() == true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } } @@ -5273,7 +5269,7 @@ class TestSymbolDatabase : public TestFixture { "static void make(external::ns::s ss) {\n" " internal::ns1::make(ss);\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void symboldatabase89() { // valuetype name @@ -5302,7 +5298,7 @@ class TestSymbolDatabase : public TestFixture { " void foo(const int * const x);\n" "};\n" "void Fred::foo(const int * x) { }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const Token *functok = Token::findsimplematch(tokenizer.tokens(), "foo ( const int * x )"); ASSERT(functok); ASSERT(functok->function()); @@ -5315,7 +5311,7 @@ class TestSymbolDatabase : public TestFixture { " void foo(const std::vector> &callbacks);\n" "}\n" "void Fred::foo(const std::vector> &callbacks) { }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const Token *functok = Token::findsimplematch(tokenizer.tokens(), "foo ( const std :: vector < std :: function < void ( const Fred :: Value & ) > > & callbacks ) { }"); ASSERT(functok); @@ -5329,11 +5325,11 @@ class TestSymbolDatabase : public TestFixture { "template \n" "struct a : a<1, d...> {};\n" "template struct f : a<0, e...> {};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { GET_SYMBOL_DB("b.f();"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } } @@ -5360,7 +5356,7 @@ class TestSymbolDatabase : public TestFixture { "};\n" "void B::foo1() {}\n" "void B::foo2(void) {}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const Token *functok = Token::findsimplematch(tokenizer.tokens(), "foo1 ( ) { }"); ASSERT(functok); ASSERT(functok->function()); @@ -5376,7 +5372,7 @@ class TestSymbolDatabase : public TestFixture { " int i, j;\n" "};\n" "std::map m{ { 0, A{0,0} }, {0, A{0,0} } };\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void symboldatabase97() { // #10598 - final class @@ -5414,7 +5410,7 @@ class TestSymbolDatabase : public TestFixture { void symboldatabase99() { // #10864 check("void f() { std::map m; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void symboldatabase100() { @@ -5509,7 +5505,7 @@ class TestSymbolDatabase : public TestFixture { "lambda{}();\n" "}\n"); ASSERT(db != nullptr); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void symboldatabase104() { @@ -5529,7 +5525,7 @@ class TestSymbolDatabase : public TestFixture { "void S::f5(char* const) {}\n" "void S::f6(char* const c) {}\n"); ASSERT(db != nullptr); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { GET_SYMBOL_DB_DBG("struct S2 {\n" // #11602 @@ -5540,7 +5536,7 @@ class TestSymbolDatabase : public TestFixture { "};\n" "void S1::f(const S2::E) const {}\n"); ASSERT(db != nullptr); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { GET_SYMBOL_DB_DBG("struct S {\n" @@ -5548,7 +5544,7 @@ class TestSymbolDatabase : public TestFixture { "};\n" "void S::f(const bool b) {}\n"); ASSERT(db != nullptr); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } } @@ -5564,7 +5560,7 @@ class TestSymbolDatabase : public TestFixture { " clear();\n" "}\n"); ASSERT(db != nullptr); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const Token* const c = Token::findsimplematch(tokenizer.tokens(), "clear ("); ASSERT(!c->type()); } @@ -5745,7 +5741,7 @@ class TestSymbolDatabase : public TestFixture { " S g() { return {}; }\n" "}\n"); ASSERT(db); // don't crash - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } } @@ -5756,7 +5752,7 @@ class TestSymbolDatabase : public TestFixture { " auto s1 = std::string{ \"abc\" };\n" " auto s2 = std::string(\"def\");\n" "}\n"); - ASSERT(db && errout.str().empty()); + ASSERT(db && errout_str().empty()); const Token* s1 = Token::findsimplematch(tokenizer.tokens(), "string {"); ASSERT(s1 && !s1->isIncompleteVar()); const Token* s2 = Token::findsimplematch(s1, "string ("); @@ -5770,7 +5766,7 @@ class TestSymbolDatabase : public TestFixture { " if (t == typeid(std::string)) {}\n" " return (std::string) \"abc\";\n" "}\n"); - ASSERT(db && errout.str().empty()); + ASSERT(db && errout_str().empty()); const Token* s1 = Token::findsimplematch(tokenizer.tokens(), "string *"); ASSERT(s1 && !s1->isIncompleteVar()); const Token* s2 = Token::findsimplematch(s1, "string &"); @@ -5789,7 +5785,7 @@ class TestSymbolDatabase : public TestFixture { " destroy(q, std::free);\n" " destroy(r, N::free);\n" "}\n"); - ASSERT(db && errout.str().empty()); + ASSERT(db && errout_str().empty()); const Token* free1 = Token::findsimplematch(tokenizer.tokens(), "free"); ASSERT(free1 && !free1->isIncompleteVar()); const Token* free2 = Token::findsimplematch(free1->next(), "free"); @@ -5803,7 +5799,7 @@ class TestSymbolDatabase : public TestFixture { " g(static_cast(s));\n" " const std::uint64_t* const data = nullptr;\n" "}\n"); - ASSERT(db && errout.str().empty()); + ASSERT(db && errout_str().empty()); const Token* qw = Token::findsimplematch(tokenizer.tokens(), "QWidget * >"); ASSERT(qw && !qw->isIncompleteVar()); const Token* s = Token::findsimplematch(qw, "string >"); @@ -5818,7 +5814,7 @@ class TestSymbolDatabase : public TestFixture { " std::string* r = new std::string{ \"def\" };\n" " std::string* s = new std::string[3]{ \"ghi\" };\n" "}\n"); - ASSERT(db && errout.str().empty()); + ASSERT(db && errout_str().empty()); const Token* s1 = Token::findsimplematch(tokenizer.tokens(), "string ;"); ASSERT(s1 && !s1->isIncompleteVar()); const Token* s2 = Token::findsimplematch(s1->next(), "string ("); @@ -5834,7 +5830,7 @@ class TestSymbolDatabase : public TestFixture { " T*** q;\n" " T** const * r;\n" "}\n"); - ASSERT(db && errout.str().empty()); + ASSERT(db && errout_str().empty()); const Token* p = Token::findsimplematch(tokenizer.tokens(), "p"); ASSERT(p && !p->isIncompleteVar()); const Token* q = Token::findsimplematch(p, "q"); @@ -6138,7 +6134,7 @@ class TestSymbolDatabase : public TestFixture { void enum11() { check("enum class E;\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void enum12() { @@ -6478,7 +6474,7 @@ class TestSymbolDatabase : public TestFixture { " foo();\n" /* 4 */ " foo(1);\n" /* 5 */ "}"); /* 6 */ - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); ASSERT(db); const Scope * bar = db->findScopeByName("bar"); ASSERT(bar != nullptr); @@ -6508,7 +6504,7 @@ class TestSymbolDatabase : public TestFixture { " func(x, &t);\n" "}"); const Token *callfunc = Token::findsimplematch(tokenizer.tokens(), "func ( x , & t ) ;"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); ASSERT_EQUALS(true, db != nullptr); // not null ASSERT_EQUALS(true, callfunc != nullptr); // not null ASSERT_EQUALS(false, (callfunc && callfunc->function())); // callfunc->function() should be null @@ -6523,7 +6519,7 @@ class TestSymbolDatabase : public TestFixture { "}"); const Token *callfunc = Token::findsimplematch(tokenizer.tokens(), "d . foo ( ) ;"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); ASSERT_EQUALS(true, db != nullptr); // not null ASSERT_EQUALS(true, callfunc != nullptr); // not null ASSERT_EQUALS(true, callfunc && callfunc->tokAt(2)->function() && callfunc->tokAt(2)->function()->tokenDef->linenr() == 2); // should find function on line 2 @@ -6590,7 +6586,7 @@ class TestSymbolDatabase : public TestFixture { " foo(crld);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const Token *f = Token::findsimplematch(tokenizer.tokens(), "foo ( 1 ) ;"); ASSERT_EQUALS(true, db && f && f->function() && f->function()->tokenDef->linenr() == 2); @@ -6718,7 +6714,7 @@ class TestSymbolDatabase : public TestFixture { " }\n" "};"); const Token *callfunc = Token::findsimplematch(tokenizer.tokens(), "power . nodeResults ( ) . size ( ) ;"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); ASSERT_EQUALS(true, db != nullptr); // not null ASSERT_EQUALS(true, callfunc != nullptr); // not null ASSERT_EQUALS(true, callfunc && callfunc->tokAt(2)->function() && callfunc->tokAt(2)->function()->tokenDef->linenr() == 3); @@ -6745,7 +6741,7 @@ class TestSymbolDatabase : public TestFixture { "void S::g() const { }\n" "void S::g() const & { }\n" "void S::g() const &&{ }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const Token *f = Token::findsimplematch(tokenizer.tokens(), "f ( ) {"); ASSERT_EQUALS(true, db && f && f->function() && f->function()->tokenDef->linenr() == 2); @@ -6807,7 +6803,7 @@ class TestSymbolDatabase : public TestFixture { " void foo(const int * p);\n" "};\n" "void Fred::foo(const int * const p) { }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const Token *f = Token::findsimplematch(tokenizer.tokens(), "foo ( const int * const p ) {"); ASSERT_EQUALS(true, db && f && f->function() && f->function()->tokenDef->linenr() == 2); @@ -6818,7 +6814,7 @@ class TestSymbolDatabase : public TestFixture { " void foo(const int * p);\n" "};\n" "void Fred::foo(const int p []) { }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const Token *f = Token::findsimplematch(tokenizer.tokens(), "foo ( const int p [ ] ) {"); ASSERT_EQUALS(true, db && f && f->function() && f->function()->tokenDef->linenr() == 2); @@ -6836,7 +6832,7 @@ class TestSymbolDatabase : public TestFixture { " foo(\"\");\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const Token *f = Token::findsimplematch(tokenizer.tokens(), "foo ( 0 ) ;"); ASSERT_EQUALS(true, db && f && f->function() && f->function()->tokenDef->linenr() == 2); @@ -6874,7 +6870,7 @@ class TestSymbolDatabase : public TestFixture { " foo(\"\");\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const Token* f = Token::findsimplematch(tokenizer.tokens(), "foo ( 0.f ) ;"); ASSERT_EQUALS(true, f && f->function()); @@ -6922,7 +6918,7 @@ class TestSymbolDatabase : public TestFixture { " foo2(NULL);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const Token *f = Token::findsimplematch(tokenizer.tokens(), "foo ( ip ) ;"); ASSERT_EQUALS(true, db && f && f->function() && f->function()->tokenDef->linenr() == 1); @@ -6971,7 +6967,7 @@ class TestSymbolDatabase : public TestFixture { " foo3(7, L'c');\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const Token *f = Token::findsimplematch(tokenizer.tokens(), "foo1 ( 1"); ASSERT_EQUALS(true, db && f && f->function() && f->function()->tokenDef->linenr() == 2); @@ -7011,7 +7007,7 @@ class TestSymbolDatabase : public TestFixture { " foo(c.fp);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const Token *f = Token::findsimplematch(tokenizer.tokens(), "foo ( c . i ) ;"); ASSERT_EQUALS(true, db && f && f->function() && f->function()->tokenDef->linenr() == 3); @@ -7048,7 +7044,7 @@ class TestSymbolDatabase : public TestFixture { " foo(f + i);\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const Token *f = Token::findsimplematch(tokenizer.tokens(), "foo ( i + i ) ;"); ASSERT_EQUALS(true, db && f && f->function() && f->function()->tokenDef->linenr() == 1); @@ -7074,7 +7070,7 @@ class TestSymbolDatabase : public TestFixture { " void b() { f(1.f); }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const Token *f = Token::findsimplematch(tokenizer.tokens(), "f ( 1 ) ;"); ASSERT_EQUALS(true, db && f && f->function() && f->function()->tokenDef->linenr() == 2); @@ -7119,7 +7115,7 @@ class TestSymbolDatabase : public TestFixture { " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); ASSERT(db); const Token *f = Token::findsimplematch(tokenizer.tokens(), "get ( get ( v1 ) ) ;"); @@ -7220,7 +7216,7 @@ class TestSymbolDatabase : public TestFixture { " int _y;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const Token *f = Token::findsimplematch(tokenizer.tokens(), "copy ( & f ) ;"); ASSERT_EQUALS(true, db && f && f->function() && f->function()->tokenDef->linenr() == 7); @@ -7582,7 +7578,7 @@ class TestSymbolDatabase : public TestFixture { "namespace ns {\n" " void A::f(external::T link_type) { }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const Token *functok = Token::findsimplematch(tokenizer.tokens(), "f ( external :: T link_type )"); ASSERT(functok); ASSERT(functok->function()); @@ -7600,7 +7596,7 @@ class TestSymbolDatabase : public TestFixture { "};\n" "using ::ns::V;\n" "void A::f(const V&) { }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const Token *functok = Token::findsimplematch(tokenizer.tokens(), "f ( const :: ns :: V & )"); ASSERT(functok); ASSERT(functok->function()); @@ -7618,7 +7614,7 @@ class TestSymbolDatabase : public TestFixture { "};\n" "using ::ns::Var;\n" "void A::f(const Var&) {}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const Token *functok = Token::findsimplematch(tokenizer.tokens(), "f ( const :: ns :: V & )"); ASSERT(functok); ASSERT(functok->function()); @@ -7638,7 +7634,7 @@ class TestSymbolDatabase : public TestFixture { "};\n" "using ::external::V;\n" "void A::f(V::I) {}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const Token *functok = Token::findsimplematch(tokenizer.tokens(), "f ( int )"); ASSERT(functok); ASSERT(functok->function()); @@ -7654,7 +7650,7 @@ class TestSymbolDatabase : public TestFixture { "const char* E::what() const noexcept {\n" " return nullptr;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const Token *functok = Token::findsimplematch(tokenizer.tokens(), "what ( ) const noexcept ( true ) {"); ASSERT(functok); ASSERT(functok->function()); @@ -7671,7 +7667,7 @@ class TestSymbolDatabase : public TestFixture { " int* y = g(x);\n" " *y = 0;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const Token *functok = Token::findsimplematch(tokenizer.tokens(), "g ( x )"); ASSERT(functok); ASSERT(functok->function()); @@ -7686,7 +7682,7 @@ class TestSymbolDatabase : public TestFixture { " int* y = g(x);\n" " *y = 0;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const Token *functok = Token::findsimplematch(tokenizer.tokens(), "g ( x )"); ASSERT(functok); ASSERT(functok->function()); @@ -7699,7 +7695,7 @@ class TestSymbolDatabase : public TestFixture { GET_SYMBOL_DB("void a(const std::string &, const std::string &);\n" "void a(long, long);\n" "void b() { a(true, false); }\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const Token *functok = Token::findsimplematch(tokenizer.tokens(), "a ( true , false )"); ASSERT(functok); ASSERT(functok->function()); @@ -7713,7 +7709,7 @@ class TestSymbolDatabase : public TestFixture { "const A* g(const std::string&);\n" "const A& g(std::vector::size_type i);\n" "const A& f(std::vector::size_type i) { return g(i); }\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const Token *functok = Token::findsimplematch(tokenizer.tokens(), "g ( i )"); ASSERT(functok); ASSERT(functok->function()); @@ -7725,7 +7721,7 @@ class TestSymbolDatabase : public TestFixture { "const A& g(std::vector::size_type i);\n" "const A* g(const std::string&);\n" "const A& f(std::vector::size_type i) { return g(i); }\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const Token *functok = Token::findsimplematch(tokenizer.tokens(), "g ( i )"); ASSERT(functok); ASSERT(functok->function()); @@ -7742,7 +7738,7 @@ class TestSymbolDatabase : public TestFixture { " void f(const int&, T::E) {}\n" " void g() { f(nullptr, T::E0); }\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const Token *functok = Token::findsimplematch(tokenizer.tokens(), "f ( nullptr"); ASSERT(functok); ASSERT(functok->function()); @@ -7756,7 +7752,7 @@ class TestSymbolDatabase : public TestFixture { " void f(int, int) {}\n" " void g() { f(nullptr, E0); }\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const Token *functok = Token::findsimplematch(tokenizer.tokens(), "f ( nullptr"); ASSERT(functok); ASSERT(functok->function()); @@ -7770,7 +7766,7 @@ class TestSymbolDatabase : public TestFixture { "void g() {\n" " f(nullptr, t.E0);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const Token *functok = Token::findsimplematch(tokenizer.tokens(), "f ( nullptr"); ASSERT(functok); ASSERT(functok->function()); @@ -7785,7 +7781,7 @@ class TestSymbolDatabase : public TestFixture { " std::vector::iterator it = v.begin();\n" " it->g(1);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const Token *functok = Token::findsimplematch(tokenizer.tokens(), "g ( 1"); ASSERT(functok); ASSERT(functok->function()); @@ -7803,7 +7799,7 @@ class TestSymbolDatabase : public TestFixture { " int* p = s.g(E0, i);\n" " *p = 0;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const Token *functok = Token::findsimplematch(tokenizer.tokens(), "g ( E0"); ASSERT(functok && functok->function()); ASSERT(functok->function()->name() == "g"); @@ -7819,7 +7815,7 @@ class TestSymbolDatabase : public TestFixture { " using namespace N;\n" " toupper(s);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const Token *functok = Token::findsimplematch(tokenizer.tokens(), "toupper ( s"); ASSERT(functok && functok->function()); ASSERT(functok->function()->name() == "toupper"); @@ -7833,7 +7829,7 @@ class TestSymbolDatabase : public TestFixture { "void f(std::string s) {\n" " toupper(s);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const Token *functok = Token::findsimplematch(tokenizer.tokens(), "toupper ( s"); ASSERT(functok && functok->function()); ASSERT(functok->function()->name() == "toupper"); @@ -7846,7 +7842,7 @@ class TestSymbolDatabase : public TestFixture { " S() {}\n" " std::list l;\n" "};\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const Token* typeTok = Token::findsimplematch(tokenizer.tokens(), "S >"); ASSERT(typeTok && typeTok->type()); ASSERT(typeTok->type()->name() == "S"); @@ -7862,7 +7858,7 @@ class TestSymbolDatabase : public TestFixture { " D d;\n" " f(&d, true);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const Token* ftok = Token::findsimplematch(tokenizer.tokens(), "f ( &"); ASSERT(ftok && ftok->function()); ASSERT(ftok->function()->name() == "f"); @@ -8102,7 +8098,7 @@ class TestSymbolDatabase : public TestFixture { "void func2() noexcept { }\n" "void func3() noexcept(true);\n" "void func4() noexcept(true) { }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); ASSERT_EQUALS(true, db != nullptr); // not null FUNC(func1); @@ -8114,7 +8110,7 @@ class TestSymbolDatabase : public TestFixture { void noexceptFunction2() { GET_SYMBOL_DB("template void self_assign(T& t) noexcept(noexcept(t = t)) {t = t; }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); ASSERT_EQUALS(true, db != nullptr); // not null FUNC(self_assign); @@ -8142,7 +8138,7 @@ class TestSymbolDatabase : public TestFixture { " void func12() const noexcept(true) = 0;\n" " void func13() const noexcept(false) = 0;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); ASSERT_EQUALS(true, db != nullptr); // not null const Scope *fred = db->findScopeByName("Fred"); @@ -8174,7 +8170,7 @@ class TestSymbolDatabase : public TestFixture { " B(B&& b) noexcept\n" " :a(std::move(b.a)) { }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); ASSERT(db != nullptr); // not null const Scope *b = db->findScopeByName("B"); ASSERT(b != nullptr); @@ -8192,7 +8188,7 @@ class TestSymbolDatabase : public TestFixture { "void func2() throw() { }\n" "void func3() throw(int);\n" "void func4() throw(int) { }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); ASSERT(db != nullptr); // not null FUNC_THROW(func1); @@ -8221,7 +8217,7 @@ class TestSymbolDatabase : public TestFixture { " void func11() const throw() = 0;\n" " void func12() const throw(int) = 0;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); ASSERT_EQUALS(true, db != nullptr); // not null const Scope *fred = db->findScopeByName("Fred"); @@ -8243,7 +8239,7 @@ class TestSymbolDatabase : public TestFixture { void nothrowAttributeFunction() { GET_SYMBOL_DB("void func() __attribute__((nothrow));\n" "void func() { }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); ASSERT_EQUALS(true, db != nullptr); // not null const Function *func = findFunctionByName("func", &db->scopeList.front()); @@ -8253,7 +8249,7 @@ class TestSymbolDatabase : public TestFixture { void nothrowDeclspecFunction() { GET_SYMBOL_DB("void __declspec(nothrow) func() { }"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); ASSERT_EQUALS(true, db != nullptr); // not null const Function *func = findFunctionByName("func", &db->scopeList.front()); @@ -8270,7 +8266,7 @@ class TestSymbolDatabase : public TestFixture { "[[noreturn]] [[gnu::format(printf, 1, 2)]] void func5(const char*, ...);\n" "[[gnu::format(printf, 1, 2)]] [[noreturn]] void func6(const char*, ...);\n" ); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); ASSERT_EQUALS(true, db != nullptr); // not null const Function *func = findFunctionByName("func1", &db->scopeList.front()); @@ -8308,7 +8304,7 @@ class TestSymbolDatabase : public TestFixture { "std::pair [[nodiscard]] func5();\n" "[[nodiscard]] std::pair func6();\n" ); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); ASSERT_EQUALS(true, db != nullptr); // not null const Function *func = findFunctionByName("func1", &db->scopeList.front()); @@ -8457,7 +8453,7 @@ class TestSymbolDatabase : public TestFixture { " int func4(int);\n" " return func4(x);\n" "}\n", true); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void lambda() { @@ -9118,7 +9114,7 @@ class TestSymbolDatabase : public TestFixture { " auto& s = v[i][j];\n" " s.insert(0);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const Token* tok = tokenizer.tokens(); tok = Token::findsimplematch(tok, "s ."); @@ -9129,7 +9125,7 @@ class TestSymbolDatabase : public TestFixture { GET_SYMBOL_DB("void f(std::vector v) {\n" " auto it = std::find(v.begin(), v.end(), 0);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const Token* tok = tokenizer.tokens(); tok = Token::findsimplematch(tok, "auto"); @@ -9140,7 +9136,7 @@ class TestSymbolDatabase : public TestFixture { GET_SYMBOL_DB("void f(std::vector::iterator beg, std::vector::iterator end) {\n" " auto it = std::find(beg, end, 0);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const Token* tok = tokenizer.tokens(); tok = Token::findsimplematch(tok, "auto"); @@ -9157,7 +9153,7 @@ class TestSymbolDatabase : public TestFixture { " for (const auto& c : v)\n" " c->f(i);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const Token* tok = tokenizer.tokens(); tok = Token::findsimplematch(tok, "auto"); @@ -9170,7 +9166,7 @@ class TestSymbolDatabase : public TestFixture { "void f(const std::vector& v) {\n" " auto it = std::find_if(std::begin(v), std::end(v), [](const S& s) { return s.i != 0; });\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const Token* tok = tokenizer.tokens(); tok = Token::findsimplematch(tok, "auto"); @@ -9183,7 +9179,7 @@ class TestSymbolDatabase : public TestFixture { "void f(T* t) {\n" " auto it = std::find(t->s.v.begin(), t->s.v.end(), 0);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const Token* tok = tokenizer.tokens(); tok = Token::findsimplematch(tok, "auto"); @@ -9196,7 +9192,7 @@ class TestSymbolDatabase : public TestFixture { "void f(T * t) {\n" " auto it = std::find(t->s[0].v[0][0].begin(), t->s[0].v[0][0].end(), 0);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const Token* tok = tokenizer.tokens(); tok = Token::findsimplematch(tok, "auto"); @@ -9208,7 +9204,7 @@ class TestSymbolDatabase : public TestFixture { "void f() {\n" " auto it = std::find(g().begin(), g().end(), 0);\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const Token* tok = tokenizer.tokens(); tok = Token::findsimplematch(tok, "auto"); @@ -9221,7 +9217,7 @@ class TestSymbolDatabase : public TestFixture { "void f(U* u) {\n" " for (const auto& str : u->get()->s) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const Token* tok = tokenizer.tokens(); tok = Token::findsimplematch(tok, "auto"); @@ -9235,7 +9231,7 @@ class TestSymbolDatabase : public TestFixture { " for (auto&& j : v)\n" " j = 1;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const Token* tok = tokenizer.tokens(); tok = Token::findsimplematch(tok, "auto &"); @@ -9259,7 +9255,7 @@ class TestSymbolDatabase : public TestFixture { " for (const auto& p : v)\n" " if (p == nullptr) {}\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const Token* tok = tokenizer.tokens(); tok = Token::findsimplematch(tok, "auto"); @@ -9278,7 +9274,7 @@ class TestSymbolDatabase : public TestFixture { } { GET_SYMBOL_DB("auto a = 1;\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const Token* tok = tokenizer.tokens(); tok = Token::findsimplematch(tok, "auto"); @@ -9289,7 +9285,7 @@ class TestSymbolDatabase : public TestFixture { GET_SYMBOL_DB("void f(const std::string& s) {\n" " const auto* const p = s.data();\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const Token* tok = tokenizer.tokens(); tok = Token::findsimplematch(tok, "auto"); @@ -9309,7 +9305,7 @@ class TestSymbolDatabase : public TestFixture { " auto r = t.substr(1, 2);\n" " return r;\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const Token* tok = tokenizer.tokens(); tok = Token::findsimplematch(tok, "auto r"); @@ -10188,7 +10184,7 @@ class TestSymbolDatabase : public TestFixture { " v.push_back(1);\n" " return v.size();\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const Token* a = Token::findsimplematch(tokenizer.tokens(), "auto"); ASSERT(a && a->valueType()); ASSERT_EQUALS(a->valueType()->type, ValueType::CONTAINER); @@ -10203,7 +10199,7 @@ class TestSymbolDatabase : public TestFixture { " auto& s = b ? v[0] : v[1];\n" " s += \"abc\";\n" "}\n"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const Token* a = Token::findsimplematch(tokenizer.tokens(), "auto"); ASSERT(a && a->valueType()); ASSERT_EQUALS(a->valueType()->type, ValueType::CONTAINER); @@ -10222,7 +10218,7 @@ class TestSymbolDatabase : public TestFixture { " float f;\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); const Token *f = Token::findsimplematch(tokenizer.tokens(), "Fred ( int"); ASSERT(f && f->function() && f->function()->tokenDef->linenr() == 2); @@ -10246,7 +10242,7 @@ class TestSymbolDatabase : public TestFixture { " }\n" "};"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void exprIds() diff --git a/test/testthreadexecutor.cpp b/test/testthreadexecutor.cpp index 0216fb1ef203..c197312e595a 100644 --- a/test/testthreadexecutor.cpp +++ b/test/testthreadexecutor.cpp @@ -67,8 +67,6 @@ class TestThreadExecutorBase : public TestFixture { * identical data, given within data. */ void check(unsigned int jobs, int files, int result, const std::string &data, const CheckOptions& opt = make_default_obj{}) { - errout.str(""); - std::list fileSettings; std::list> filelist; @@ -158,22 +156,26 @@ class TestThreadExecutorBase : public TestFixture { std::ostringstream oss; oss << "int main()\n" << "{\n"; - for (int i = 0; i < 500; i++) + const int num_err = 1; + for (int i = 0; i < num_err; i++) { oss << " {int i = *((int*)0);}\n"; - + } oss << " return 0;\n" << "}\n"; - check(2, 3, 3, oss.str()); + const int num_files = 3; + check(2, num_files, num_files, oss.str()); + ASSERT_EQUALS(num_err * num_files, cppcheck::count_all_of(errout_str(), "(error) Null pointer dereference: (int*)0")); } - // TODO: check the output void many_threads() { - check(16, 100, 100, + const int num_files = 100; + check(16, num_files, num_files, "int main()\n" "{\n" " int i = *((int*)0);\n" " return 0;\n" "}"); + ASSERT_EQUALS(num_files, cppcheck::count_all_of(errout_str(), "(error) Null pointer dereference: (int*)0")); } // #11249 - reports TSAN errors - only applies to threads not processes though @@ -185,6 +187,8 @@ class TestThreadExecutorBase : public TestFixture { " int i = *((int*)0);\n" " return 0;\n" "}", dinit(CheckOptions, $.showtime = SHOWTIME_MODES::SHOWTIME_SUMMARY)); + // we are not interested in the results - so just consume them + (void)errout_str(); } void many_threads_plist() { @@ -197,6 +201,8 @@ class TestThreadExecutorBase : public TestFixture { " int i = *((int*)0);\n" " return 0;\n" "}", dinit(CheckOptions, $.plistOutput = plistOutput.c_str())); + // we are not interested in the results - so just consume them + (void)errout_str(); } void no_errors_more_files() { @@ -230,15 +236,18 @@ class TestThreadExecutorBase : public TestFixture { " {int i = *((int*)0);}\n" " return 0;\n" "}"); + ASSERT_EQUALS("[" + fprefix() + "_1.cpp:3]: (error) Null pointer dereference: (int*)0\n", errout_str()); } void one_error_several_files() { - check(2, 20, 20, + const int num_files = 20; + check(2, num_files, num_files, "int main()\n" "{\n" " {int i = *((int*)0);}\n" " return 0;\n" "}"); + ASSERT_EQUALS(num_files, cppcheck::count_all_of(errout_str(), "(error) Null pointer dereference: (int*)0")); } void clangTidy() { @@ -340,7 +349,7 @@ class TestThreadExecutorBase : public TestFixture { " int i = *((int*)0);\n" " return 0;\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); settings = settingsOld; } @@ -354,7 +363,7 @@ class TestThreadExecutorBase : public TestFixture { check(2, 2, 2, "#include \"" + inc_h.name() +"\""); // this is made unique by the executor - ASSERT_EQUALS("[" + inc_h.name() + ":3]: (error) Null pointer dereference: (int*)0\n", errout.str()); + ASSERT_EQUALS("[" + inc_h.name() + ":3]: (error) Null pointer dereference: (int*)0\n", errout_str()); } // TODO: test whole program analysis diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index 94e273d72578..e9d386610b2c 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -453,8 +453,6 @@ class TestTokenizer : public TestFixture { #define tokenizeAndStringify(...) tokenizeAndStringify_(__FILE__, __LINE__, __VA_ARGS__) std::string tokenizeAndStringify_(const char* file, int linenr, const char code[], bool expand = true, Platform::Type platform = Platform::Type::Native, const char* filename = "test.cpp", Standards::cppstd_t std = Standards::CPP11) { - errout.str(""); - const Settings settings = settingsBuilder(settings1).debugwarnings().cpp(std).platform(platform).build(); // tokenize.. @@ -464,13 +462,12 @@ class TestTokenizer : public TestFixture { // TODO: handle in a better way // filter out ValueFlow messages.. - const std::string debugwarnings = errout.str(); - errout.str(""); + const std::string debugwarnings = errout_str(); std::istringstream istr2(debugwarnings); std::string line; while (std::getline(istr2,line)) { if (line.find("bailout") == std::string::npos) - errout << line << "\n"; + {} // TODO mErrout << line << "\n"; } if (tokenizer.tokens()) @@ -480,8 +477,6 @@ class TestTokenizer : public TestFixture { #define tokenizeAndStringifyWindows(...) tokenizeAndStringifyWindows_(__FILE__, __LINE__, __VA_ARGS__) std::string tokenizeAndStringifyWindows_(const char* file, int linenr, const char code[], bool expand = true, Platform::Type platform = Platform::Type::Native, const char* filename = "test.cpp", bool cpp11 = true) { - errout.str(""); - const Settings settings = settingsBuilder(settings_windows).debugwarnings().cpp(cpp11 ? Standards::CPP11 : Standards::CPP03).platform(platform).build(); // tokenize.. @@ -490,13 +485,12 @@ class TestTokenizer : public TestFixture { ASSERT_LOC(tokenizer.tokenize(istr, filename), file, linenr); // filter out ValueFlow messages.. - const std::string debugwarnings = errout.str(); - errout.str(""); + const std::string debugwarnings = errout_str(); std::istringstream istr2(debugwarnings); std::string line; while (std::getline(istr2,line)) { if (line.find("valueflow.cpp") == std::string::npos) - errout << line << "\n"; + {} // TODO errout << line << "\n"; } if (tokenizer.tokens()) @@ -505,8 +499,6 @@ class TestTokenizer : public TestFixture { } std::string tokenizeAndStringify_(const char* file, int line, const char code[], const Settings &settings, const char filename[] = "test.cpp") { - errout.str(""); - // tokenize.. Tokenizer tokenizer(settings, this); std::istringstream istr(code); @@ -518,8 +510,6 @@ class TestTokenizer : public TestFixture { #define tokenizeDebugListing(...) tokenizeDebugListing_(__FILE__, __LINE__, __VA_ARGS__) std::string tokenizeDebugListing_(const char* file, int line, const char code[], const char filename[] = "test.cpp") { - errout.str(""); - const Settings settings = settingsBuilder(settings0).c(Standards::C89).cpp(Standards::CPP03).build(); Tokenizer tokenizer(settings, this); @@ -552,7 +542,7 @@ class TestTokenizer : public TestFixture { "public:\n" "const int i ;\n" "}", tokenizeAndStringify(code)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void tokenize5() { @@ -589,7 +579,7 @@ class TestTokenizer : public TestFixture { " fpp x = (fpp)f();\n" "}"; tokenizeAndStringify(code); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void tokenize11() { @@ -824,43 +814,43 @@ class TestTokenizer : public TestFixture { void syntax_case_default() { // correct syntax tokenizeAndStringify("void f() {switch (n) { case 0: z(); break;}}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); tokenizeAndStringify("void f() {switch (n) { case 0:; break;}}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // TODO: Do not throw AST validation exception TODO_ASSERT_THROW(tokenizeAndStringify("void f() {switch (n) { case 0?1:2 : z(); break;}}"), InternalError); - //ASSERT_EQUALS("", errout.str()); + //ASSERT_EQUALS("", errout_str()); // TODO: Do not throw AST validation exception TODO_ASSERT_THROW(tokenizeAndStringify("void f() {switch (n) { case 0?(1?3:4):2 : z(); break;}}"), InternalError); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); //allow GCC '({ %name%|%num%|%bool% ; })' statement expression extension // TODO: Do not throw AST validation exception TODO_ASSERT_THROW(tokenizeAndStringify("void f() {switch (n) { case 0?({0;}):1: z(); break;}}"), InternalError); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); //'b' can be or a macro or an undefined enum tokenizeAndStringify("void f() {switch (n) { case b: z(); break;}}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); //valid, when there's this declaration: 'constexpr int g() { return 2; }' tokenizeAndStringify("void f() {switch (n) { case g(): z(); break;}}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); //valid, when there's also this declaration: 'constexpr int g[1] = {0};' tokenizeAndStringify("void f() {switch (n) { case g[0]: z(); break;}}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); //valid, similar to above case tokenizeAndStringify("void f() {switch (n) { case *g: z(); break;}}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); //valid, when 'x' and 'y' are constexpr. tokenizeAndStringify("void f() {switch (n) { case sqrt(x+y): z(); break;}}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void removePragma() { @@ -1663,7 +1653,7 @@ class TestTokenizer : public TestFixture { tokenizeAndStringify("void foo(int, int)\n" "{}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); // #3848 - Don't hang tokenizeAndStringify("sal_Bool ShapeHasText(sal_uLong, sal_uLong) const {\n" @@ -1673,7 +1663,7 @@ class TestTokenizer : public TestFixture { " comphelper::EmbeddedObjectContainer aCnt( xDestStorage );\n" " { }\n" "}"); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } void simplifyFunctionTryCatch() { @@ -2891,7 +2881,6 @@ class TestTokenizer : public TestFixture { const char code[] = "class A{\n" " void f() {}\n" "};"; - errout.str(""); Tokenizer tokenizer(settings0, this); std::istringstream istr(code); ASSERT(tokenizer.tokenize(istr, "test.cpp")); @@ -2908,7 +2897,7 @@ class TestTokenizer : public TestFixture { ASSERT_EQUALS(true, tok->linkAt(5) == tok->tokAt(6)); ASSERT_EQUALS(true, tok->linkAt(6) == tok->tokAt(5)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { @@ -2916,7 +2905,6 @@ class TestTokenizer : public TestFixture { " char a[10];\n" " char *b ; b = new char[a[0]];\n" "};"; - errout.str(""); Tokenizer tokenizer(settings0, this); std::istringstream istr(code); ASSERT(tokenizer.tokenize(istr, "test.cpp")); @@ -2933,14 +2921,13 @@ class TestTokenizer : public TestFixture { ASSERT_EQUALS(true, tok->linkAt(21) == tok->tokAt(23)); ASSERT_EQUALS(true, tok->linkAt(23) == tok->tokAt(21)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { const char code[] = "void f(){\n" " foo(g());\n" "};"; - errout.str(""); Tokenizer tokenizer(settings0, this); std::istringstream istr(code); ASSERT(tokenizer.tokenize(istr, "test.cpp")); @@ -2953,14 +2940,13 @@ class TestTokenizer : public TestFixture { ASSERT_EQUALS(true, tok->linkAt(8) == tok->tokAt(9)); ASSERT_EQUALS(true, tok->linkAt(9) == tok->tokAt(8)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { const char code[] = "bool foo(C a, bar>& f, int b) {\n" " return(af);\n" "}"; - errout.str(""); Tokenizer tokenizer(settings0, this); std::istringstream istr(code); ASSERT(tokenizer.tokenize(istr, "test.cpp")); @@ -2981,14 +2967,13 @@ class TestTokenizer : public TestFixture { ASSERT_EQUALS(true, nullptr == tok->linkAt(28)); ASSERT_EQUALS(true, nullptr == tok->linkAt(32)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { const char code[] = "void foo() {\n" " return static_cast(a);\n" "}"; - errout.str(""); Tokenizer tokenizer(settings0, this); std::istringstream istr(code); ASSERT(tokenizer.tokenize(istr, "test.cpp")); @@ -2998,14 +2983,13 @@ class TestTokenizer : public TestFixture { ASSERT_EQUALS(true, tok->tokAt(9) == tok->linkAt(7)); ASSERT_EQUALS(true, tok->tokAt(7) == tok->linkAt(9)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { const char code[] = "void foo() {\n" " nvwa<(x > y)> ERROR_nnn;\n" "}"; - errout.str(""); Tokenizer tokenizer(settings0, this); std::istringstream istr(code); ASSERT(tokenizer.tokenize(istr, "test.cpp")); @@ -3015,13 +2999,12 @@ class TestTokenizer : public TestFixture { ASSERT_EQUALS(true, tok->tokAt(12) == tok->linkAt(6)); ASSERT_EQUALS(true, tok->tokAt(6) == tok->linkAt(12)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { // #4860 const char code[] = "class A : public B {};"; - errout.str(""); Tokenizer tokenizer(settings0, this); std::istringstream istr(code); ASSERT(tokenizer.tokenize(istr, "test.cpp")); @@ -3031,13 +3014,12 @@ class TestTokenizer : public TestFixture { ASSERT_EQUALS(true, tok->tokAt(5) == tok->linkAt(7)); ASSERT_EQUALS(true, tok->linkAt(5) == tok->tokAt(7)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { // #4860 const char code[] = "Bar>>>::set(1, 2, 3);"; - errout.str(""); Tokenizer tokenizer(settings0, this); std::istringstream istr(code); ASSERT(tokenizer.tokenize(istr, "test.cpp")); @@ -3048,13 +3030,12 @@ class TestTokenizer : public TestFixture { ASSERT_EQUALS(true, tok->tokAt(7) == tok->linkAt(16)); ASSERT_EQUALS(true, tok->tokAt(11) == tok->linkAt(15)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { // #5627 const char code[] = "new Foo[10];"; - errout.str(""); Tokenizer tokenizer(settings0, this); std::istringstream istr(code); ASSERT(tokenizer.tokenize(istr, "test.cpp")); @@ -3065,12 +3046,11 @@ class TestTokenizer : public TestFixture { ASSERT_EQUALS(true, tok->tokAt(5) == tok->linkAt(7)); ASSERT_EQUALS(true, tok->tokAt(7) == tok->linkAt(5)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { // #6242 const char code[] = "func = integral_;"; - errout.str(""); Tokenizer tokenizer(settings0, this); std::istringstream istr(code); ASSERT(tokenizer.tokenize(istr, "test.cpp")); @@ -3079,13 +3059,12 @@ class TestTokenizer : public TestFixture { ASSERT_EQUALS(true, tok->tokAt(3) == tok->linkAt(9)); ASSERT_EQUALS(true, tok->linkAt(3) == tok->tokAt(9)); - ASSERT_EQUALS("", errout.str()); + ASSERT_EQUALS("", errout_str()); } { // if (a < b || c > d) { } const char code[] = "{ if (a < b || c > d); }"; - errout.str(""); Tokenizer tokenizer(settings0, this); std::istringstream istr(code); ASSERT(tokenizer.tokenize(istr, "test.cpp")); @@ -3097,7 +3076,6 @@ class TestTokenizer : public TestFixture { { // bool f = a < b || c > d const char code[] = "bool f = a < b || c > d;"; - errout.str(""); Tokenizer tokenizer(settings0, this); std::istringstream istr(code); ASSERT(tokenizer.tokenize(istr, "test.cpp")); @@ -3109,7 +3087,6 @@ class TestTokenizer : public TestFixture { { // template const char code[] = "a < b || c > d;"; - errout.str(""); Tokenizer tokenizer(settings0, this); std::istringstream istr(code); ASSERT(tokenizer.tokenize(istr, "test.cpp")); @@ -3121,7 +3098,6 @@ class TestTokenizer : public TestFixture { { // if (a < ... > d) { } const char code[] = "{ if (a < b || c == 3 || d > e); }"; - errout.str(""); Tokenizer tokenizer(settings0, this); std::istringstream istr(code); ASSERT(tokenizer.tokenize(istr, "test.cpp")); @@ -3133,7 +3109,6 @@ class TestTokenizer : public TestFixture { { // template const char code[] = "a d;"; - errout.str(""); Tokenizer tokenizer(settings0, this); std::istringstream istr(code); ASSERT(tokenizer.tokenize(istr, "test.cpp")); @@ -3144,7 +3119,6 @@ class TestTokenizer : public TestFixture { { // template const char code[] = "a d;"; - errout.str(""); Tokenizer tokenizer(settings0, this); std::istringstream istr(code); ASSERT(tokenizer.tokenize(istr, "test.cpp")); @@ -3154,7 +3128,6 @@ class TestTokenizer : public TestFixture { { const char code[] = "template < f = b || c > struct S;"; - errout.str(""); Tokenizer tokenizer(settings0, this); std::istringstream istr(code); ASSERT(tokenizer.tokenize(istr, "test.cpp")); @@ -3165,7 +3138,6 @@ class TestTokenizer : public TestFixture { { const char code[] = "struct A : B {};"; - errout.str(""); Tokenizer tokenizer(settings0, this); std::istringstream istr(code); ASSERT(tokenizer.tokenize(istr, "test.cpp")); @@ -3176,7 +3148,6 @@ class TestTokenizer : public TestFixture { { const char code[] = "Data;"; - errout.str(""); Tokenizer tokenizer(settings0, this); std::istringstream istr(code); ASSERT(tokenizer.tokenize(istr, "test.cpp")); @@ -3188,7 +3159,6 @@ class TestTokenizer : public TestFixture { { // #6601 const char code[] = "template struct FuncType : FuncType { };"; - errout.str(""); Tokenizer tokenizer(settings0, this); std::istringstream istr(code); ASSERT(tokenizer.tokenize(istr, "test.cpp")); @@ -3208,7 +3178,6 @@ class TestTokenizer : public TestFixture { { // #7158 const char code[] = "enum { value = boost::mpl::at_c };"; - errout.str(""); Tokenizer tokenizer(settings0, this); std::istringstream istr(code); ASSERT(tokenizer.tokenize(istr, "test.cpp")); @@ -3222,7 +3191,6 @@ class TestTokenizer : public TestFixture { const char code[] = "template \n" "struct CheckedDivOp< T, U, typename std::enable_if::value || std::is_floating_point::value>::type> {\n" "};\n"; - errout.str(""); Tokenizer tokenizer(settings0, this); std::istringstream istr(code); ASSERT(tokenizer.tokenize(istr, "test.cpp")); @@ -3235,7 +3203,6 @@ class TestTokenizer : public TestFixture { { // #7975 const char code[] = "template X copy() {};\n"; - errout.str(""); Tokenizer tokenizer(settings0, this); std::istringstream istr(code); ASSERT(tokenizer.tokenize(istr, "test.cpp")); @@ -3248,7 +3215,6 @@ class TestTokenizer : public TestFixture { { // #8006 const char code[] = "C && a = b;"; - errout.str(""); Tokenizer tokenizer(settings0, this); std::istringstream istr(code); ASSERT(tokenizer.tokenize(istr, "test.cpp")); @@ -3261,7 +3227,6 @@ class TestTokenizer : public TestFixture { { // #8115 const char code[] = "void Test(C && c);"; - errout.str(""); Tokenizer tokenizer(settings0, this); std::istringstream istr(code); ASSERT(tokenizer.tokenize(istr, "test.cpp")); @@ -3274,7 +3239,6 @@ class TestTokenizer : public TestFixture { // #8654 const char code[] = "template struct A {}; " "template struct foo : A... {};"; - errout.str(""); Tokenizer tokenizer(settings0, this); std::istringstream istr(code); ASSERT(tokenizer.tokenize(istr, "test.cpp")); @@ -3285,7 +3249,6 @@ class TestTokenizer : public TestFixture { // #8851 const char code[] = "template::type>" "void basic_json() {}"; - errout.str(""); Tokenizer tokenizer(settings0, this); std::istringstream istr(code); ASSERT(tokenizer.tokenize(istr, "test.cpp")); @@ -3410,7 +3373,6 @@ class TestTokenizer : public TestFixture { { // #10491 const char code[] = "template