Fix #946 (False positive: Buffer access out-of-bounds)
http://sourceforge.net/apps/trac/cppcheck/ticket/946
This commit is contained in:
parent
b2cec721c0
commit
0518eed937
|
@ -716,6 +716,7 @@ void CheckBufferOverrun::checkStructVariable()
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
const char *varname[3] = {0, 0, 0};
|
const char *varname[3] = {0, 0, 0};
|
||||||
|
const unsigned int varId = tok2->tokAt(ivar)->varId();
|
||||||
varname[1] = tok2->strAt(ivar);
|
varname[1] = tok2->strAt(ivar);
|
||||||
int arrsize = std::atoi(tok2->strAt(ivar + 2));
|
int arrsize = std::atoi(tok2->strAt(ivar + 2));
|
||||||
int total_size = arrsize * _tokenizer->sizeOfType(tok2->tokAt(1));
|
int total_size = arrsize * _tokenizer->sizeOfType(tok2->tokAt(1));
|
||||||
|
@ -737,8 +738,7 @@ void CheckBufferOverrun::checkStructVariable()
|
||||||
|
|
||||||
if (Token::simpleMatch(tok4, ") {"))
|
if (Token::simpleMatch(tok4, ") {"))
|
||||||
{
|
{
|
||||||
const char *names[2] = {varname[1], 0};
|
checkScope(tok4->tokAt(2), 0, arrsize, total_size, varId);
|
||||||
checkScope(tok4->tokAt(2), names, arrsize, total_size, 0);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -89,6 +89,7 @@ private:
|
||||||
TEST_CASE(array_index_18);
|
TEST_CASE(array_index_18);
|
||||||
TEST_CASE(array_index_19);
|
TEST_CASE(array_index_19);
|
||||||
TEST_CASE(array_index_20);
|
TEST_CASE(array_index_20);
|
||||||
|
TEST_CASE(array_index_21);
|
||||||
TEST_CASE(array_index_multidim);
|
TEST_CASE(array_index_multidim);
|
||||||
|
|
||||||
TEST_CASE(buffer_overrun_1);
|
TEST_CASE(buffer_overrun_1);
|
||||||
|
@ -653,6 +654,21 @@ private:
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void array_index_21()
|
||||||
|
{
|
||||||
|
check("class A {\n"
|
||||||
|
" int indices[2];\n"
|
||||||
|
" void foo(int indices[3]);\n"
|
||||||
|
"};\n"
|
||||||
|
"\n"
|
||||||
|
"void A::foo(int indices[3]) {\n"
|
||||||
|
" for(int j=0; j<3; ++j) {\n"
|
||||||
|
" int b = indices[j];\n"
|
||||||
|
" }\n"
|
||||||
|
"}\n");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
}
|
||||||
|
|
||||||
void array_index_multidim()
|
void array_index_multidim()
|
||||||
{
|
{
|
||||||
check("void f()\n"
|
check("void f()\n"
|
||||||
|
|
Loading…
Reference in New Issue