Fixed #1169 (improve check: divsion by zero not detected when using the shift (>>) operator)

This commit is contained in:
Zachary Blair 2010-04-23 22:59:53 -07:00
parent d738785b61
commit 5835b2665b
2 changed files with 45 additions and 15 deletions

View File

@ -5010,8 +5010,9 @@ bool Tokenizer::simplifyKnownVariables()
// Variable is used in calculation.. // Variable is used in calculation..
if (Token::Match(tok3, "[=+-*/[] %varid% [?+-*/;]]", varid) || if (Token::Match(tok3, "[=+-*/[] %varid% [?+-*/;]]", varid) ||
Token::Match(tok3, "[=+-*/[] %varid% <<", varid) || Token::Match(tok3, "[(=+-*/[] %varid% <<|>>", varid) ||
Token::Match(tok3, "<< %varid% [+-*/;]]", varid)) Token::Match(tok3, "<< %varid% [+-*/;])]", varid) ||
Token::Match(tok3, ">> %varid% [+-*/])]", varid))
{ {
tok3 = tok3->next(); tok3 = tok3->next();
tok3->str(value); tok3->str(value);

View File

@ -1063,21 +1063,50 @@ private:
void simplifyKnownVariables22() void simplifyKnownVariables22()
{ {
// This testcase is related to ticket #1169 // This testcase is related to ticket #1169
const char code[] = "void foo()\n" {
"{\n" const char code[] = "void foo()\n"
" int n = 10;\n" "{\n"
" i = (n >> 1);\n" " int n = 10;\n"
"}\n"; " i = (n >> 1);\n"
"}\n";
// Wanted result - Ticket #1169 can probably be closed when this works ASSERT_EQUALS(
TODO_ASSERT_EQUALS( "void foo ( ) { int n ; n = 10 ; i = ( 10 >> 1 ) ; }",
"void foo ( ) { int n ; n = 10 ; i = ( 10 >> 1 ) ; }", simplifyKnownVariables(code));
simplifyKnownVariables(code)); }
{
const char code[] = "void foo()\n"
"{\n"
" int n = 10;\n"
" i = (n << 1);\n"
"}\n";
// Current result ASSERT_EQUALS(
ASSERT_EQUALS( "void foo ( ) { int n ; n = 10 ; i = ( 10 << 1 ) ; }",
"void foo ( ) { int n ; n = 10 ; i = ( n >> 1 ) ; }", simplifyKnownVariables(code));
simplifyKnownVariables(code)); }
{
const char code[] = "void foo()\n"
"{\n"
" int n = 10;\n"
" i = (1 << n);\n"
"}\n";
ASSERT_EQUALS(
"void foo ( ) { int n ; n = 10 ; i = ( 1 << 10 ) ; }",
simplifyKnownVariables(code));
}
{
const char code[] = "void foo()\n"
"{\n"
" int n = 10;\n"
" i = (1 >> n);\n"
"}\n";
ASSERT_EQUALS(
"void foo ( ) { int n ; n = 10 ; i = ( 1 >> 10 ) ; }",
simplifyKnownVariables(code));
}
} }
void simplifyKnownVariables23() void simplifyKnownVariables23()