Fix #1340 (False positive: Array out of bounds for re-initialised array pointer)
http://sourceforge.net/apps/trac/cppcheck/ticket/1340
This commit is contained in:
parent
0a6aa0f094
commit
2a78637da7
|
@ -203,6 +203,12 @@ void CheckBufferOverrun::checkScope(const Token *tok, const char *varname[], con
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (varid != 0 && Token::Match(tok, "%varid% = new|malloc|realloc", varid))
|
||||||
|
{
|
||||||
|
// Abort
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
// Array index..
|
// Array index..
|
||||||
if (varid > 0)
|
if (varid > 0)
|
||||||
{
|
{
|
||||||
|
|
|
@ -92,7 +92,6 @@ private:
|
||||||
TEST_CASE(array_index_20);
|
TEST_CASE(array_index_20);
|
||||||
TEST_CASE(array_index_21);
|
TEST_CASE(array_index_21);
|
||||||
TEST_CASE(array_index_22);
|
TEST_CASE(array_index_22);
|
||||||
TEST_CASE(array_index_23);
|
|
||||||
TEST_CASE(array_index_multidim);
|
TEST_CASE(array_index_multidim);
|
||||||
TEST_CASE(array_index_switch_in_for);
|
TEST_CASE(array_index_switch_in_for);
|
||||||
TEST_CASE(array_index_calculation);
|
TEST_CASE(array_index_calculation);
|
||||||
|
@ -736,17 +735,6 @@ private:
|
||||||
ASSERT_EQUALS("[test.cpp:4]: (error) Array 'indices[2]' index 2 out of bounds\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:4]: (error) Array 'indices[2]' index 2 out of bounds\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void array_index_23()
|
|
||||||
{
|
|
||||||
// ticket #842
|
|
||||||
check("void f() {\n"
|
|
||||||
" int *tab4 = malloc(20 * sizeof(int));\n"
|
|
||||||
" tab4[20] = 0;\n"
|
|
||||||
" free(tab4);\n"
|
|
||||||
"}\n");
|
|
||||||
ASSERT_EQUALS("[test.cpp:3]: (error) Array 'tab4[20]' index 20 out of bounds\n", errout.str());
|
|
||||||
}
|
|
||||||
|
|
||||||
void array_index_multidim()
|
void array_index_multidim()
|
||||||
{
|
{
|
||||||
check("void f()\n"
|
check("void f()\n"
|
||||||
|
@ -1374,6 +1362,55 @@ private:
|
||||||
" s[10] = 0;\n"
|
" s[10] = 0;\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("[test.cpp:4]: (error) Array 's[10]' index 10 out of bounds\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:4]: (error) Array 's[10]' index 10 out of bounds\n", errout.str());
|
||||||
|
|
||||||
|
check("void foo()\n"
|
||||||
|
"{\n"
|
||||||
|
"char * buf = new char[8];\n"
|
||||||
|
"buf[7] = 0;\n"
|
||||||
|
"delete [] buf;\n"
|
||||||
|
"buf = new char[9];\n"
|
||||||
|
"buf[8] = 0;\n"
|
||||||
|
"delete [] buf;\n"
|
||||||
|
"}\n");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
|
check("void foo()\n"
|
||||||
|
"{\n"
|
||||||
|
"char * buf = new char[8];\n"
|
||||||
|
"buf[7] = 0;\n"
|
||||||
|
"delete [] buf;\n"
|
||||||
|
"buf = new char[9];\n"
|
||||||
|
"buf[9] = 0;\n"
|
||||||
|
"delete [] buf;\n"
|
||||||
|
"}\n");
|
||||||
|
ASSERT_EQUALS("[test.cpp:7]: (error) Array 'buf[9]' index 9 out of bounds\n", errout.str());
|
||||||
|
|
||||||
|
// ticket #842
|
||||||
|
check("void f() {\n"
|
||||||
|
" int *tab4 = malloc(20 * sizeof(int));\n"
|
||||||
|
" tab4[20] = 0;\n"
|
||||||
|
" free(tab4);\n"
|
||||||
|
"}\n");
|
||||||
|
ASSERT_EQUALS("[test.cpp:3]: (error) Array 'tab4[20]' index 20 out of bounds\n", errout.str());
|
||||||
|
|
||||||
|
check("void f() {\n"
|
||||||
|
" int *tab4 = malloc(20 * sizeof(int));\n"
|
||||||
|
" tab4[19] = 0;\n"
|
||||||
|
" free(tab4);\n"
|
||||||
|
" tab4 = malloc(21 * sizeof(int));\n"
|
||||||
|
" tab4[20] = 0;\n"
|
||||||
|
" free(tab4);\n"
|
||||||
|
"}\n");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
|
check("void f() {\n"
|
||||||
|
" int *tab4 = malloc(20 * sizeof(int));\n"
|
||||||
|
" tab4[19] = 0;\n"
|
||||||
|
" tab4 = realloc(tab4,21 * sizeof(int));\n"
|
||||||
|
" tab4[20] = 0;\n"
|
||||||
|
" free(tab4);\n"
|
||||||
|
"}\n");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue