TestOther::uninitvar1: refactoring. splitting up this function into multiple functions
This commit is contained in:
parent
25ba399a50
commit
019f775aa5
|
@ -71,7 +71,13 @@ private:
|
||||||
TEST_CASE(nullpointer7);
|
TEST_CASE(nullpointer7);
|
||||||
|
|
||||||
TEST_CASE(uninitvar1);
|
TEST_CASE(uninitvar1);
|
||||||
TEST_CASE(uninitvar_func); // analyse functions
|
TEST_CASE(uninitvar_alloc); // data is allocated but not initialized
|
||||||
|
TEST_CASE(uninitvar_arrays); // arrays
|
||||||
|
TEST_CASE(uninitvar_class); // class/struct
|
||||||
|
TEST_CASE(uninitvar_enum); // enum variables
|
||||||
|
TEST_CASE(uninitvar_if); // handling if/while/switch
|
||||||
|
TEST_CASE(uninitvar_references); // references
|
||||||
|
TEST_CASE(uninitvar_func); // analyse functions
|
||||||
|
|
||||||
TEST_CASE(oldStylePointerCast);
|
TEST_CASE(oldStylePointerCast);
|
||||||
|
|
||||||
|
@ -1293,8 +1299,24 @@ private:
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
|
// macro_for..
|
||||||
|
checkUninitVar("int foo()\n"
|
||||||
|
"{\n"
|
||||||
|
" int retval;\n"
|
||||||
|
" if (condition) {\n"
|
||||||
|
" for12(1,2) { }\n"
|
||||||
|
" retval = 1;\n"
|
||||||
|
" }\n"
|
||||||
|
" else\n"
|
||||||
|
" retval = 2;\n"
|
||||||
|
" return retval;\n"
|
||||||
|
"}\n");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
}
|
||||||
|
|
||||||
// if..
|
// if..
|
||||||
|
void uninitvar_if()
|
||||||
|
{
|
||||||
checkUninitVar("static void foo()\n"
|
checkUninitVar("static void foo()\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
" Foo *p;\n"
|
" Foo *p;\n"
|
||||||
|
@ -1442,70 +1464,34 @@ private:
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("[test.cpp:6]: (error) Uninitialized variable: a\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:6]: (error) Uninitialized variable: a\n", errout.str());
|
||||||
|
|
||||||
// member variables..
|
// ; { .. }
|
||||||
checkUninitVar("class Fred\n"
|
checkUninitVar("int foo()\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
" int i;\n"
|
" int retval;\n"
|
||||||
" int a() { return i; }\n"
|
" if (condition) {\n"
|
||||||
"};\n");
|
" { }\n"
|
||||||
|
" retval = 1; }\n"
|
||||||
|
" else\n"
|
||||||
|
" retval = 2;\n"
|
||||||
|
" return retval;\n"
|
||||||
|
"}\n");
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
// function calls..
|
checkUninitVar("void foo()\n"
|
||||||
checkUninitVar("void assignOne(int &x)\n"
|
"{\n"
|
||||||
"{ x = 1; }\n"
|
" {\n"
|
||||||
|
" for (int i = 0; i < 10; ++i)\n"
|
||||||
|
" { }\n"
|
||||||
|
" }\n"
|
||||||
"\n"
|
"\n"
|
||||||
"int f()\n"
|
" { }\n"
|
||||||
"{\n"
|
|
||||||
" int i;\n"
|
|
||||||
" assignOne(i);\n"
|
|
||||||
" return i;\n"
|
|
||||||
"};\n");
|
|
||||||
ASSERT_EQUALS("", errout.str());
|
|
||||||
|
|
||||||
checkUninitVar("int f(int (*assign)(int *p))\n"
|
|
||||||
"{\n"
|
|
||||||
" int i;\n"
|
|
||||||
" (*assign)(&i);\n"
|
|
||||||
" return i;\n"
|
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
}
|
||||||
|
|
||||||
checkUninitVar("int f()\n"
|
// arrays..
|
||||||
"{\n"
|
void uninitvar_arrays()
|
||||||
" char s[10];\n"
|
{
|
||||||
" return bar(s);\n"
|
|
||||||
"}\n");
|
|
||||||
ASSERT_EQUALS("", errout.str());
|
|
||||||
|
|
||||||
checkUninitVar("void f()\n"
|
|
||||||
"{\n"
|
|
||||||
" FILE *f;\n"
|
|
||||||
" fflush(f);\n"
|
|
||||||
"}\n");
|
|
||||||
ASSERT_EQUALS("[test.cpp:4]: (error) Uninitialized variable: f\n", errout.str());
|
|
||||||
|
|
||||||
checkUninitVar("void f()\n"
|
|
||||||
"{\n"
|
|
||||||
" Abc *p;\n"
|
|
||||||
" int sz = sizeof(*p);\n"
|
|
||||||
"}");
|
|
||||||
ASSERT_EQUALS("", errout.str());
|
|
||||||
|
|
||||||
checkUninitVar("void foo()\n"
|
|
||||||
"{\n"
|
|
||||||
" Foo *p;\n"
|
|
||||||
" x = bar(sizeof(*p));\n"
|
|
||||||
"}\n");
|
|
||||||
ASSERT_EQUALS("", errout.str());
|
|
||||||
|
|
||||||
checkUninitVar("void foo()\n"
|
|
||||||
"{\n"
|
|
||||||
" Foo *p;\n"
|
|
||||||
" x = bar(p->begin());\n"
|
|
||||||
"}\n");
|
|
||||||
ASSERT_EQUALS("[test.cpp:4]: (error) Uninitialized variable: p\n", errout.str());
|
|
||||||
|
|
||||||
// arrays..
|
|
||||||
checkUninitVar("void f()\n"
|
checkUninitVar("void f()\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
" char a[10], b[10];\n"
|
" char a[10], b[10];\n"
|
||||||
|
@ -1555,8 +1541,11 @@ private:
|
||||||
" strcat(s, \"abc\");\n"
|
" strcat(s, \"abc\");\n"
|
||||||
"};\n");
|
"};\n");
|
||||||
ASSERT_EQUALS("[test.cpp:5]: (error) Uninitialized variable: s\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:5]: (error) Uninitialized variable: s\n", errout.str());
|
||||||
|
}
|
||||||
|
|
||||||
// alloc..
|
// alloc..
|
||||||
|
void uninitvar_alloc()
|
||||||
|
{
|
||||||
checkUninitVar("void f()\n"
|
checkUninitVar("void f()\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
" char *s = malloc(100);\n"
|
" char *s = malloc(100);\n"
|
||||||
|
@ -1629,8 +1618,18 @@ private:
|
||||||
" char c = *s;\n"
|
" char c = *s;\n"
|
||||||
"};\n");
|
"};\n");
|
||||||
ASSERT_EQUALS("[test.cpp:6]: (error) Data is allocated but not initialized: s\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:6]: (error) Data is allocated but not initialized: s\n", errout.str());
|
||||||
|
}
|
||||||
|
|
||||||
|
// class / struct..
|
||||||
|
void uninitvar_class()
|
||||||
|
{
|
||||||
|
checkUninitVar("class Fred\n"
|
||||||
|
"{\n"
|
||||||
|
" int i;\n"
|
||||||
|
" int a() { return i; }\n"
|
||||||
|
"};\n");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
// struct..
|
|
||||||
checkUninitVar("void f()\n"
|
checkUninitVar("void f()\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
" struct Relative {\n"
|
" struct Relative {\n"
|
||||||
|
@ -1650,8 +1649,11 @@ private:
|
||||||
" } = { 0, 0 };\n"
|
" } = { 0, 0 };\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
}
|
||||||
|
|
||||||
// enum..
|
// enum..
|
||||||
|
void uninitvar_enum()
|
||||||
|
{
|
||||||
checkUninitVar("void f()\n"
|
checkUninitVar("void f()\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
" enum AB { a, b };\n"
|
" enum AB { a, b };\n"
|
||||||
|
@ -1659,8 +1661,11 @@ private:
|
||||||
" if (ab);\n"
|
" if (ab);\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("[test.cpp:5]: (error) Uninitialized variable: ab\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:5]: (error) Uninitialized variable: ab\n", errout.str());
|
||||||
|
}
|
||||||
|
|
||||||
// references..
|
// references..
|
||||||
|
void uninitvar_references()
|
||||||
|
{
|
||||||
checkUninitVar("void f()\n"
|
checkUninitVar("void f()\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
" int a;\n"
|
" int a;\n"
|
||||||
|
@ -1684,63 +1689,6 @@ private:
|
||||||
" strchr(s.c_str(), ',');\n"
|
" strchr(s.c_str(), ',');\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
// ; { .. }
|
|
||||||
checkUninitVar("int foo()\n"
|
|
||||||
"{\n"
|
|
||||||
" int retval;\n"
|
|
||||||
" if (condition) {\n"
|
|
||||||
" { }\n"
|
|
||||||
" retval = 1; }\n"
|
|
||||||
" else\n"
|
|
||||||
" retval = 2;\n"
|
|
||||||
" return retval;\n"
|
|
||||||
"}\n");
|
|
||||||
ASSERT_EQUALS("", errout.str());
|
|
||||||
|
|
||||||
checkUninitVar("void foo()\n"
|
|
||||||
"{\n"
|
|
||||||
" {\n"
|
|
||||||
" for (int i = 0; i < 10; ++i)\n"
|
|
||||||
" { }\n"
|
|
||||||
" }\n"
|
|
||||||
"\n"
|
|
||||||
" { }\n"
|
|
||||||
"}\n");
|
|
||||||
ASSERT_EQUALS("", errout.str());
|
|
||||||
|
|
||||||
// macro_for..
|
|
||||||
checkUninitVar("int foo()\n"
|
|
||||||
"{\n"
|
|
||||||
" int retval;\n"
|
|
||||||
" if (condition) {\n"
|
|
||||||
" for12(1,2) { }\n"
|
|
||||||
" retval = 1;\n"
|
|
||||||
" }\n"
|
|
||||||
" else\n"
|
|
||||||
" retval = 2;\n"
|
|
||||||
" return retval;\n"
|
|
||||||
"}\n");
|
|
||||||
ASSERT_EQUALS("", errout.str());
|
|
||||||
|
|
||||||
|
|
||||||
// sub functions..
|
|
||||||
checkUninitVar("int foo(int x) { return x; }\n"
|
|
||||||
"void f2()\n"
|
|
||||||
"{\n"
|
|
||||||
" int x;\n"
|
|
||||||
" foo(x);\n"
|
|
||||||
"}\n");
|
|
||||||
ASSERT_EQUALS("[test.cpp:5]: (error) Uninitialized variable: x\n", errout.str());
|
|
||||||
|
|
||||||
|
|
||||||
// using uninitialized function pointer..
|
|
||||||
checkUninitVar("void foo()\n"
|
|
||||||
"{\n"
|
|
||||||
" void (*f)();\n"
|
|
||||||
" f();\n"
|
|
||||||
"}\n");
|
|
||||||
ASSERT_EQUALS("[test.cpp:4]: (error) Uninitialized variable: f\n", errout.str());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1762,8 +1710,80 @@ private:
|
||||||
|
|
||||||
void uninitvar_func()
|
void uninitvar_func()
|
||||||
{
|
{
|
||||||
|
// function analysis..
|
||||||
ASSERT_EQUALS("foo ", analyseFunctions("void foo(int x) { }"));
|
ASSERT_EQUALS("foo ", analyseFunctions("void foo(int x) { }"));
|
||||||
ASSERT_EQUALS("", analyseFunctions("void foo(s x) { }"));
|
ASSERT_EQUALS("", analyseFunctions("void foo(s x) { }"));
|
||||||
|
|
||||||
|
// function calls..
|
||||||
|
checkUninitVar("void assignOne(int &x)\n"
|
||||||
|
"{ x = 1; }\n"
|
||||||
|
"\n"
|
||||||
|
"int f()\n"
|
||||||
|
"{\n"
|
||||||
|
" int i;\n"
|
||||||
|
" assignOne(i);\n"
|
||||||
|
" return i;\n"
|
||||||
|
"};\n");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
|
checkUninitVar("int f(int (*assign)(int *p))\n"
|
||||||
|
"{\n"
|
||||||
|
" int i;\n"
|
||||||
|
" (*assign)(&i);\n"
|
||||||
|
" return i;\n"
|
||||||
|
"}\n");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
|
checkUninitVar("int f()\n"
|
||||||
|
"{\n"
|
||||||
|
" char s[10];\n"
|
||||||
|
" return bar(s);\n"
|
||||||
|
"}\n");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
|
checkUninitVar("void f()\n"
|
||||||
|
"{\n"
|
||||||
|
" FILE *f;\n"
|
||||||
|
" fflush(f);\n"
|
||||||
|
"}\n");
|
||||||
|
ASSERT_EQUALS("[test.cpp:4]: (error) Uninitialized variable: f\n", errout.str());
|
||||||
|
|
||||||
|
checkUninitVar("void f()\n"
|
||||||
|
"{\n"
|
||||||
|
" Abc *p;\n"
|
||||||
|
" int sz = sizeof(*p);\n"
|
||||||
|
"}");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
|
checkUninitVar("void foo()\n"
|
||||||
|
"{\n"
|
||||||
|
" Foo *p;\n"
|
||||||
|
" x = bar(sizeof(*p));\n"
|
||||||
|
"}\n");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
|
checkUninitVar("void foo()\n"
|
||||||
|
"{\n"
|
||||||
|
" Foo *p;\n"
|
||||||
|
" x = bar(p->begin());\n"
|
||||||
|
"}\n");
|
||||||
|
ASSERT_EQUALS("[test.cpp:4]: (error) Uninitialized variable: p\n", errout.str());
|
||||||
|
|
||||||
|
checkUninitVar("int foo(int x) { return x; }\n"
|
||||||
|
"void f2()\n"
|
||||||
|
"{\n"
|
||||||
|
" int x;\n"
|
||||||
|
" foo(x);\n"
|
||||||
|
"}\n");
|
||||||
|
ASSERT_EQUALS("[test.cpp:5]: (error) Uninitialized variable: x\n", errout.str());
|
||||||
|
|
||||||
|
// using uninitialized function pointer..
|
||||||
|
checkUninitVar("void foo()\n"
|
||||||
|
"{\n"
|
||||||
|
" void (*f)();\n"
|
||||||
|
" f();\n"
|
||||||
|
"}\n");
|
||||||
|
ASSERT_EQUALS("[test.cpp:4]: (error) Uninitialized variable: f\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue