Fixed #2031 (Tokenizer: simplify known value (string has known value after strcpy))
This commit is contained in:
parent
96c85104ab
commit
c1c9b96bb6
|
@ -6356,6 +6356,22 @@ bool Tokenizer::simplifyKnownVariables()
|
|||
|
||||
ret |= simplifyKnownVariablesSimplify(&tok2, tok3, varid, structname, value, valueVarId, valueIsPointer, valueToken, indentlevel);
|
||||
}
|
||||
|
||||
else if (Token::Match(tok2, "strcpy ( %var% , %str% ) ;"))
|
||||
{
|
||||
const unsigned int varid(tok2->tokAt(2)->varId());
|
||||
if (varid == 0)
|
||||
continue;
|
||||
const std::string structname("");
|
||||
const Token * const valueToken = tok2->tokAt(4);
|
||||
std::string value(valueToken->str());
|
||||
const unsigned int valueVarId(0);
|
||||
const bool valueIsPointer(false);
|
||||
Token *tok3 = tok2;
|
||||
for (int i = 0; i < 6; ++i)
|
||||
tok3 = tok3->next();
|
||||
ret |= simplifyKnownVariablesSimplify(&tok2, tok3, varid, structname, value, valueVarId, valueIsPointer, valueToken, indentlevel);
|
||||
}
|
||||
}
|
||||
|
||||
if (tok2)
|
||||
|
|
|
@ -129,6 +129,7 @@ private:
|
|||
TEST_CASE(simplifyKnownVariables39);
|
||||
TEST_CASE(simplifyKnownVariables40);
|
||||
TEST_CASE(simplifyKnownVariables41); // p=&x; if (p) ..
|
||||
TEST_CASE(simplifyKnownVariables42); // ticket #2031 - known string value after strcpy
|
||||
TEST_CASE(simplifyKnownVariablesBailOutAssign);
|
||||
TEST_CASE(simplifyKnownVariablesBailOutFor1);
|
||||
TEST_CASE(simplifyKnownVariablesBailOutFor2);
|
||||
|
@ -2040,6 +2041,21 @@ private:
|
|||
ASSERT_EQUALS("void f ( ) {\nint x ; x = 0 ;\nconst int * p ; p = & x ;\nif ( & x ) { return 0 ; }\n}", tokenizeAndStringify(code, true));
|
||||
}
|
||||
|
||||
void simplifyKnownVariables42()
|
||||
{
|
||||
const char code[] = "void f() {\n"
|
||||
" char str1[10], str2[10];\n"
|
||||
" strcpy(str1, \"abc\");\n"
|
||||
" strcpy(str2, str1);\n"
|
||||
"}";
|
||||
const char expected[] = "void f ( ) {\n"
|
||||
"char str1 [ 10 ] ; char str2 [ 10 ] ;\n"
|
||||
"strcpy ( str1 , \"abc\" ) ;\n"
|
||||
"strcpy ( str2 , \"abc\" ) ;\n"
|
||||
"}";
|
||||
ASSERT_EQUALS(expected, tokenizeAndStringify(code, true));
|
||||
}
|
||||
|
||||
void simplifyKnownVariablesBailOutAssign()
|
||||
{
|
||||
const char code[] = "int foo() {\n"
|
||||
|
|
Loading…
Reference in New Issue