Fix #868 (False positive - buffer access out of bounds in for loop)
http://sourceforge.net/apps/trac/cppcheck/ticket/868
This commit is contained in:
parent
38e1a0e03d
commit
504ae8e22d
|
@ -376,7 +376,10 @@ void CheckBufferOverrun::checkScope(const Token *tok, const char *varname[], con
|
||||||
}
|
}
|
||||||
|
|
||||||
std::ostringstream pattern;
|
std::ostringstream pattern;
|
||||||
pattern << varnames << " [ " << strindex << " ]";
|
if (varid > 0)
|
||||||
|
pattern << "%varid% [ " << strindex << " ]";
|
||||||
|
else
|
||||||
|
pattern << varnames << " [ " << strindex << " ]";
|
||||||
|
|
||||||
int indentlevel2 = 0;
|
int indentlevel2 = 0;
|
||||||
while ((tok2 = tok2->next()) != 0)
|
while ((tok2 = tok2->next()) != 0)
|
||||||
|
@ -400,7 +403,7 @@ void CheckBufferOverrun::checkScope(const Token *tok, const char *varname[], con
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Token::Match(tok2, pattern.str().c_str()) && condition_out_of_bounds)
|
if (condition_out_of_bounds && Token::Match(tok2, pattern.str().c_str(), varid))
|
||||||
{
|
{
|
||||||
bufferOverrun(tok2);
|
bufferOverrun(tok2);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -89,6 +89,7 @@ private:
|
||||||
TEST_CASE(array_index_17);
|
TEST_CASE(array_index_17);
|
||||||
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_multidim);
|
TEST_CASE(array_index_multidim);
|
||||||
|
|
||||||
TEST_CASE(buffer_overrun_1);
|
TEST_CASE(buffer_overrun_1);
|
||||||
|
@ -624,6 +625,18 @@ private:
|
||||||
ASSERT_EQUALS("[test.cpp:4]: (error) Array index out of bounds\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:4]: (error) Array index out of bounds\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void array_index_20()
|
||||||
|
{
|
||||||
|
check("void f()\n"
|
||||||
|
"{\n"
|
||||||
|
" char a[8];\n"
|
||||||
|
" int b[10];\n"
|
||||||
|
" for ( int i = 0; i < 9; i++ )\n"
|
||||||
|
" b[i] = 0;\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