diff --git a/lib/checkclass.cpp b/lib/checkclass.cpp index 540f07362..086671f1b 100644 --- a/lib/checkclass.cpp +++ b/lib/checkclass.cpp @@ -565,7 +565,12 @@ void CheckClass::initializeVarList(const Function &func, std::list intContainer;"); ASSERT_EQUALS("", errout.str()); } + + void uninitAssignmentWithOperator() { + check("struct C {\n" + " int x;\n" + " C() {\n" + " bool b = false;\n" + " b = b && SetValue();\n" + " }\n" + " bool SetValue() {\n" + " x = 1;\n" + " return true;\n" + " }\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()); + + check("struct C {\n" + " int x;\n" + " C() {\n" + " bool b = false;\n" + " b = true || SetValue();\n" + " }\n" + " bool SetValue() {\n" + " x = 1;\n" + " return true;\n" + " }\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()); + + check("struct C {\n" + " int x;\n" + " C() {\n" + " bool b = true;\n" + " b = b & SetValue();\n" + " }\n" + " bool SetValue() {\n" + " x = 1;\n" + " return true;\n" + " }\n" + "};"); + ASSERT_EQUALS("", errout.str()); + + check("struct C {\n" + " int x;\n" + " C() {\n" + " bool b = false;\n" + " b = true | SetValue();\n" + " }\n" + " bool SetValue() {\n" + " x = 1;\n" + " return true;\n" + " }\n" + "};"); + ASSERT_EQUALS("", errout.str()); + + check("struct C {\n" + " int x;\n" + " C() {\n" + " int i = 0;\n" + " i = i * SetValue();\n" + " }\n" + " int SetValue() { return x = 1; }\n" + "};"); + ASSERT_EQUALS("", errout.str()); + + check("struct C {\n" + " int x;\n" + " C() {\n" + " int i = 0;\n" + " i = i / SetValue();\n" + " }\n" + " int SetValue() { return x = 1; }\n" + "};"); + ASSERT_EQUALS("", errout.str()); + + check("struct C {\n" + " int x;\n" + " C() {\n" + " int i = 0;\n" + " i = i % SetValue();\n" + " }\n" + " int SetValue() { return x = 1; }\n" + "};"); + ASSERT_EQUALS("", errout.str()); + + check("struct C {\n" + " int x;\n" + " C() {\n" + " int i = 0;\n" + " i = i + SetValue();\n" + " }\n" + " int SetValue() { return x = 1; }\n" + "};"); + ASSERT_EQUALS("", errout.str()); + + check("struct C {\n" + " int x;\n" + " C() {\n" + " int i = 0;\n" + " i = i - SetValue();\n" + " }\n" + " int SetValue() { return x = 1; }\n" + "};"); + ASSERT_EQUALS("", errout.str()); + + check("struct C {\n" + " int x;\n" + " C() {\n" + " int i = 0;\n" + " i = i << SetValue();\n" + " }\n" + " int SetValue() { return x = 1; }\n" + "};"); + ASSERT_EQUALS("", errout.str()); + + check("struct C {\n" + " int x;\n" + " C() {\n" + " int i = 0;\n" + " i = i >> SetValue();\n" + " }\n" + " int SetValue() { return x = 1; }\n" + "};"); + ASSERT_EQUALS("", errout.str()); + + check("struct C {\n" + " int x;\n" + " C() {\n" + " int i = 0;\n" + " i = i ^ SetValue();\n" + " }\n" + " int SetValue() { return x = 1; }\n" + "};"); + ASSERT_EQUALS("", errout.str()); + } + + void uninitCompoundAssignment() { + check("struct C {\n" + " int x;\n" + " C() {\n" + " bool b = true;\n" + " b &= SetValue();\n" + " }\n" + " bool SetValue() {\n" + " x = 1;\n" + " return true;\n" + " }\n" + "};"); + ASSERT_EQUALS("", errout.str()); + + check("struct C {\n" + " int x;\n" + " C() {\n" + " bool b = false;\n" + " b |= SetValue();\n" + " }\n" + " bool SetValue() {\n" + " x = 1;\n" + " return true;\n" + " }\n" + "};"); + ASSERT_EQUALS("", errout.str()); + + check("struct C {\n" + " int x;\n" + " C() {\n" + " int i = 0;\n" + " i *= SetValue();\n" + " }\n" + " int SetValue() { return x = 1; }\n" + "};"); + ASSERT_EQUALS("", errout.str()); + + check("struct C {\n" + " int x;\n" + " C() {\n" + " int i = 0;\n" + " i /= SetValue();\n" + " }\n" + " int SetValue() { return x = 1; }\n" + "};"); + ASSERT_EQUALS("", errout.str()); + + check("struct C {\n" + " int x;\n" + " C() {\n" + " int i = 0;\n" + " i %= SetValue();\n" + " }\n" + " int SetValue() { return x = 1; }\n" + "};"); + ASSERT_EQUALS("", errout.str()); + + check("struct C {\n" + " int x;\n" + " C() {\n" + " int i = 0;\n" + " i += SetValue();\n" + " }\n" + " int SetValue() { return x = 1; }\n" + "};"); + ASSERT_EQUALS("", errout.str()); + + check("struct C {\n" + " int x;\n" + " C() {\n" + " int i = 0;\n" + " i -= SetValue();\n" + " }\n" + " int SetValue() { return x = 1; }\n" + "};"); + ASSERT_EQUALS("", errout.str()); + + check("struct C {\n" + " int x;\n" + " C() {\n" + " int i = 0;\n" + " i <<= SetValue();\n" + " }\n" + " int SetValue() { return x = 1; }\n" + "};"); + ASSERT_EQUALS("", errout.str()); + + check("struct C {\n" + " int x;\n" + " C() {\n" + " int i = 0;\n" + " i >>= SetValue();\n" + " }\n" + " int SetValue() { return x = 1; }\n" + "};"); + ASSERT_EQUALS("", errout.str()); + + check("struct C {\n" + " int x;\n" + " C() {\n" + " int i = 0;\n" + " i ^= SetValue();\n" + " }\n" + " int SetValue() { return x = 1; }\n" + "};"); + ASSERT_EQUALS("", errout.str()); + } + + void uninitComparisonAssignment() { + check("struct C {\n" + " int x;\n" + " C() {\n" + " bool b = true;\n" + " b = (true == SetValue());\n" + " }\n" + " bool SetValue() {\n" + " x = 1;\n" + " return true;\n" + " }\n" + "};"); + ASSERT_EQUALS("", errout.str()); + + check("struct C {\n" + " int x;\n" + " C() {\n" + " bool b = false;\n" + " b |= (true != SetValue());\n" + " }\n" + " bool SetValue() {\n" + " x = 1;\n" + " return true;\n" + " }\n" + "};"); + ASSERT_EQUALS("", errout.str()); + + check("struct C {\n" + " int x;\n" + " C() {\n" + " bool b = (0 < SetValue());\n" + " }\n" + " int SetValue() { return x = 1; }\n" + "};"); + ASSERT_EQUALS("", errout.str()); + + check("struct C {\n" + " int x;\n" + " C() {\n" + " bool b = (0 <= SetValue());\n" + " }\n" + " int SetValue() { return x = 1; }\n" + "};"); + ASSERT_EQUALS("", errout.str()); + + check("struct C {\n" + " int x;\n" + " C() {\n" + " bool b = (0 > SetValue());\n" + " }\n" + " int SetValue() { return x = 1; }\n" + "};"); + ASSERT_EQUALS("", errout.str()); + + check("struct C {\n" + " int x;\n" + " C() {\n" + " bool b = (0 >= SetValue());\n" + " }\n" + " int SetValue() { return x = 1; }\n" + "};"); + ASSERT_EQUALS("", errout.str()); + } }; REGISTER_TEST(TestConstructors)