TestUninitVar: cleanup duplicate tests for function handling
This commit is contained in:
parent
25d09b34fd
commit
8f309aed12
|
@ -46,9 +46,6 @@ private:
|
|||
TEST_CASE(uninitvar_references); // references
|
||||
TEST_CASE(uninitvar_return); // return
|
||||
TEST_CASE(uninitvar_strncpy); // strncpy doesn't always null-terminate
|
||||
TEST_CASE(uninitvar_memset_nonchar);
|
||||
TEST_CASE(uninitvar_memset_char_access);
|
||||
TEST_CASE(uninitvar_func); // analyse functions
|
||||
TEST_CASE(func_uninit_var); // analyse function calls for: 'int a(int x) { return x+x; }'
|
||||
TEST_CASE(func_uninit_pointer); // analyse function calls for: 'void a(int *p) { *p = 0; }'
|
||||
TEST_CASE(uninitvar_typeof); // typeof
|
||||
|
@ -1849,252 +1846,6 @@ private:
|
|||
ASSERT_EQUALS("", errout.str());
|
||||
}
|
||||
|
||||
void uninitvar_memset_nonchar() {
|
||||
checkUninitVar("void f() {\n"
|
||||
" int a[20];\n"
|
||||
" memset(a, 1, 20);\n"
|
||||
" a[0] |= 2;\n"
|
||||
"}");
|
||||
ASSERT_EQUALS(errout.str(), "");
|
||||
}
|
||||
|
||||
void uninitvar_memset_char_access() {
|
||||
checkUninitVar("void f() {\n"
|
||||
" unsigned char c[10];\n"
|
||||
" memset(c, 32, 10);\n"
|
||||
" unsigned char value = c[3];\n"
|
||||
"}");
|
||||
ASSERT_EQUALS(errout.str(), "");
|
||||
}
|
||||
|
||||
void uninitvar_func() {
|
||||
// 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"
|
||||
"};");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
checkUninitVar("int f(int (*assign)(int *p))\n"
|
||||
"{\n"
|
||||
" int i;\n"
|
||||
" (*assign)(&i);\n"
|
||||
" return i;\n"
|
||||
"}");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
checkUninitVar("int f()\n"
|
||||
"{\n"
|
||||
" char s[10];\n"
|
||||
" return bar(s);\n"
|
||||
"}");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
checkUninitVar("void f() {\n"
|
||||
" FILE *f;\n"
|
||||
" fflush(f);\n"
|
||||
"}");
|
||||
ASSERT_EQUALS("[test.cpp:3]: (error) Uninitialized variable: f\n", errout.str());
|
||||
|
||||
checkUninitVar("void f() {\n"
|
||||
" int i;\n"
|
||||
" x(i+2);\n"
|
||||
"}");
|
||||
ASSERT_EQUALS("[test.cpp:3]: (error) Uninitialized variable: i\n", errout.str());
|
||||
|
||||
checkUninitVar("void f()\n"
|
||||
"{\n"
|
||||
" char *p = malloc(10);\n"
|
||||
" read(p + 1);\n"
|
||||
" return p;\n"
|
||||
"}");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
checkUninitVar("void f()\n"
|
||||
"{\n"
|
||||
" Abc *p;\n"
|
||||
" int sz = sizeof(*p);\n"
|
||||
"}");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
checkUninitVar("void foo() {\n"
|
||||
" Foo *p;\n"
|
||||
" x = bar(sizeof(*p));\n"
|
||||
"}");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
checkUninitVar("void foo() {\n"
|
||||
" Foo *p;\n"
|
||||
" x = bar(p->begin());\n"
|
||||
"}");
|
||||
ASSERT_EQUALS("[test.cpp:3]: (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"
|
||||
"}");
|
||||
ASSERT_EQUALS("[test.cpp:5]: (error) Uninitialized variable: x\n", errout.str());
|
||||
|
||||
checkUninitVar("void foo(const char *s)\n"
|
||||
"{\n"
|
||||
" char *p;\n"
|
||||
" memcpy(p, s, 100);\n"
|
||||
"}");
|
||||
ASSERT_EQUALS("[test.cpp:4]: (error) Uninitialized variable: p\n", errout.str());
|
||||
|
||||
checkUninitVar("void foo(const char *s)\n"
|
||||
"{\n"
|
||||
" char *p = malloc(100);\n"
|
||||
" memcpy(p, s, 100);\n"
|
||||
"}");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
checkUninitVar("int calc(const int *p, int n);\n"
|
||||
"void f() {\n"
|
||||
" int x[10];\n"
|
||||
" calc(x,10);\n"
|
||||
"}");
|
||||
TODO_ASSERT_EQUALS("[test.cpp:4]: (error) Uninitialized variable: x\n",
|
||||
"", errout.str());
|
||||
|
||||
// #2401 - unknown function/macro might init the variable
|
||||
checkUninitVar("int f() {\n"
|
||||
" int x;\n"
|
||||
" INIT(x);\n"
|
||||
" return x;\n"
|
||||
"}");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
// #3222 - calling function through function pointer
|
||||
checkUninitVar("char f() {\n"
|
||||
" char buffer[100];\n"
|
||||
" (foo.init)(buffer);\n"
|
||||
" return buffer[0];\n"
|
||||
"}");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
checkUninitVar("void f() {\n" // #3586 - calling template function
|
||||
" int i;\n"
|
||||
" a::b<int>(i);\n"
|
||||
"}");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
checkUninitVar("void test() {\n"
|
||||
" double d;\n"
|
||||
" double x = dostuff<int>(d);\n"
|
||||
" return x;\n"
|
||||
"}");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
checkUninitVar("template <class T> double dostuff(int x, T &y);\n"
|
||||
"void test() {\n"
|
||||
" double d;\n"
|
||||
" a = dostuff<double>(0, d);\n"
|
||||
"}");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
// using uninitialized function pointer..
|
||||
checkUninitVar("void foo()\n"
|
||||
"{\n"
|
||||
" void (*f)();\n"
|
||||
" f();\n"
|
||||
"}");
|
||||
ASSERT_EQUALS("[test.cpp:4]: (error) Uninitialized variable: f\n", errout.str());
|
||||
|
||||
checkUninitVar("void foo() {\n"
|
||||
" int f = 1 + f();\n"
|
||||
"}");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
// calling noreturn function..
|
||||
checkUninitVar("int foo(int a) {\n"
|
||||
" int x;\n"
|
||||
" if (a==1)\n"
|
||||
" g();\n" // might be a noreturn function
|
||||
" else\n"
|
||||
" x = 3;\n"
|
||||
" return x;\n"
|
||||
"}");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
checkUninitVar("int foo(int a) {\n"
|
||||
" int x;\n"
|
||||
" if (a==1)\n"
|
||||
" g(1);\n" // might be a noreturn function
|
||||
" else\n"
|
||||
" x = 3;\n"
|
||||
" return x;\n"
|
||||
"}");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
checkUninitVar("int foo(int a) {\n" // #4880
|
||||
" int x;\n"
|
||||
" if (a==1)\n"
|
||||
" g(1);\n" // might be a noreturn function
|
||||
" if (a==17)\n"
|
||||
" g(2);\n" // might be a noreturn function
|
||||
" return x;\n"
|
||||
"}");
|
||||
ASSERT_EQUALS("[test.cpp:7]: (error) Uninitialized variable: x\n", errout.str());
|
||||
|
||||
checkUninitVar("void (*init)(char *str);\n"
|
||||
"\n"
|
||||
"char x() {\n"
|
||||
" char cmd[10];\n"
|
||||
" init(cmd);\n"
|
||||
" return cmd[0];\n"
|
||||
"}");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
checkUninitVar("char fn(FILE *f) {\n"
|
||||
" char buf[10];\n"
|
||||
" fread(buf, 1, 10, f);\n"
|
||||
"}");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
// #2775 - uninitialized struct pointer in subfunction
|
||||
checkUninitVar("void a(struct Fred *fred) {\n"
|
||||
" fred->x = 0;\n"
|
||||
"}\n"
|
||||
"\n"
|
||||
"void b() {\n"
|
||||
" struct Fred *p;\n"
|
||||
" a(p);\n"
|
||||
"}");
|
||||
ASSERT_EQUALS("[test.cpp:7]: (error) Uninitialized variable: p\n", errout.str());
|
||||
|
||||
// #2946 - FP array is initialized in subfunction
|
||||
checkUninitVar("void a(char *buf) {\n"
|
||||
" buf[0] = 0;\n"
|
||||
"}\n"
|
||||
"void b() {\n"
|
||||
" char buf[10];\n"
|
||||
" a(buf);\n"
|
||||
" buf[1] = buf[0];\n"
|
||||
"}");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
// #3159 - initialization by function
|
||||
checkUninitVar("static int isnumber(const char *arg) {\n"
|
||||
" char *p;\n"
|
||||
" return strtod(arg, &p) != 0 || p != arg;\n"
|
||||
"}");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
checkUninitVar("static int isnumber(const char *arg) {\n"
|
||||
" char *p;\n"
|
||||
" return strtod(&arg) != 0 || p != arg;\n"
|
||||
"}");
|
||||
ASSERT_EQUALS("[test.cpp:3]: (error) Uninitialized variable: p\n", errout.str());
|
||||
}
|
||||
|
||||
// valid and invalid use of 'int a(int x) { return x + x; }'
|
||||
void func_uninit_var() {
|
||||
const std::string funca("int a(int x) { return x + x; }");
|
||||
|
@ -2882,6 +2633,16 @@ private:
|
|||
"}");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
// array
|
||||
checkUninitVar("int calc(const int *p, int n);\n"
|
||||
"void f() {\n"
|
||||
" int x[10];\n"
|
||||
" calc(x,10);\n"
|
||||
"}");
|
||||
TODO_ASSERT_EQUALS("[test.cpp:4]: (error) Uninitialized variable: x\n",
|
||||
"", errout.str());
|
||||
|
||||
// ....
|
||||
checkUninitVar("struct ABC { int a; };\n" // struct initialization
|
||||
"void clear(struct ABC &abc);\n"
|
||||
"int f() {\n"
|
||||
|
@ -2908,6 +2669,28 @@ private:
|
|||
" strcmp(&now0, sth);\n"
|
||||
"}", "test.c");
|
||||
ASSERT_EQUALS("[test.c:3]: (error) Uninitialized variable: now0\n", errout.str());
|
||||
|
||||
// #2775 - uninitialized struct pointer in subfunction
|
||||
checkUninitVar("void a(struct Fred *fred) {\n"
|
||||
" fred->x = 0;\n"
|
||||
"}\n"
|
||||
"\n"
|
||||
"void b() {\n"
|
||||
" struct Fred *p;\n"
|
||||
" a(p);\n"
|
||||
"}");
|
||||
ASSERT_EQUALS("[test.cpp:7]: (error) Uninitialized variable: p\n", errout.str());
|
||||
|
||||
// #2946 - FP array is initialized in subfunction
|
||||
checkUninitVar("void a(char *buf) {\n"
|
||||
" buf[0] = 0;\n"
|
||||
"}\n"
|
||||
"void b() {\n"
|
||||
" char buf[10];\n"
|
||||
" a(buf);\n"
|
||||
" buf[1] = buf[0];\n"
|
||||
"}");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
}
|
||||
|
||||
void uninitvar2_value() {
|
||||
|
|
Loading…
Reference in New Issue