TestOther::uninitvar1: refactoring. splitting up this function into multiple functions

This commit is contained in:
Daniel Marjamäki 2010-01-24 15:23:21 +01:00
parent 25ba399a50
commit 019f775aa5
1 changed files with 140 additions and 120 deletions

View File

@ -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());
} }