Fixed #7083 (false positive: typedef and initialization with strings)
This commit is contained in:
parent
315f705f53
commit
0f11007c19
|
@ -1502,15 +1502,20 @@ void CheckBufferOverrun::bufferOverrun2()
|
||||||
varname = tok->str();
|
varname = tok->str();
|
||||||
|
|
||||||
|
|
||||||
|
const Variable * const var = tok->variable();
|
||||||
|
if (!var)
|
||||||
|
continue;
|
||||||
|
|
||||||
const Token * const strtoken = tok->getValueTokenMinStrSize();
|
const Token * const strtoken = tok->getValueTokenMinStrSize();
|
||||||
if (strtoken) {
|
if (strtoken && !var->isArray()) {
|
||||||
|
// TODO: check for access to symbol inside the array bounds, but outside the stored string:
|
||||||
|
// char arr[10] = "123";
|
||||||
|
// arr[7] = 'x'; // warning: arr[7] is inside the array bounds, but past the string's end
|
||||||
|
|
||||||
ArrayInfo arrayInfo(tok->varId(), varname, 1U, Token::getStrSize(strtoken));
|
ArrayInfo arrayInfo(tok->varId(), varname, 1U, Token::getStrSize(strtoken));
|
||||||
valueFlowCheckArrayIndex(tok->next(), arrayInfo);
|
valueFlowCheckArrayIndex(tok->next(), arrayInfo);
|
||||||
}
|
} else {
|
||||||
|
if (var->nameToken() == tok || !var->isArray())
|
||||||
else {
|
|
||||||
const Variable * const var = tok->variable();
|
|
||||||
if (!var || var->nameToken() == tok || !var->isArray())
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// TODO: last array in struct..
|
// TODO: last array in struct..
|
||||||
|
|
|
@ -164,6 +164,7 @@ private:
|
||||||
TEST_CASE(buffer_overrun_26); // #4432 (segmentation fault)
|
TEST_CASE(buffer_overrun_26); // #4432 (segmentation fault)
|
||||||
TEST_CASE(buffer_overrun_27); // #4444 (segmentation fault)
|
TEST_CASE(buffer_overrun_27); // #4444 (segmentation fault)
|
||||||
TEST_CASE(buffer_overrun_28); // Out of bound char array access
|
TEST_CASE(buffer_overrun_28); // Out of bound char array access
|
||||||
|
TEST_CASE(buffer_overrun_29); // #7083: false positive: typedef and initialization with strings
|
||||||
TEST_CASE(buffer_overrun_bailoutIfSwitch); // ticket #2378 : bailoutIfSwitch
|
TEST_CASE(buffer_overrun_bailoutIfSwitch); // ticket #2378 : bailoutIfSwitch
|
||||||
TEST_CASE(buffer_overrun_function_array_argument);
|
TEST_CASE(buffer_overrun_function_array_argument);
|
||||||
TEST_CASE(possible_buffer_overrun_1); // #3035
|
TEST_CASE(possible_buffer_overrun_1); // #3035
|
||||||
|
@ -2475,6 +2476,19 @@ private:
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// #7083: false positive: typedef and initialization with strings
|
||||||
|
void buffer_overrun_29() {
|
||||||
|
check("typedef char testChar[10]; \n"
|
||||||
|
"int main(){ \n"
|
||||||
|
" testChar tc1 = \"\"; \n"
|
||||||
|
" tc1[5]='a'; \n"
|
||||||
|
"} \n"
|
||||||
|
);
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void buffer_overrun_bailoutIfSwitch() {
|
void buffer_overrun_bailoutIfSwitch() {
|
||||||
// No false positive
|
// No false positive
|
||||||
check("void f1(char *s) {\n"
|
check("void f1(char *s) {\n"
|
||||||
|
|
Loading…
Reference in New Issue