Fixed #425 (False positive: usage of char variable.. c = c & 0x03)
Using char variables in bit operations are ok if: * the result is stored in a char * the variable is and'ed with a number that is less than 0x100
This commit is contained in:
parent
d1d9c9a9c9
commit
8a3ec4549b
|
@ -752,10 +752,26 @@ void CheckOther::CheckCharVariable()
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string tempFirst = "%var% [&|] " + tok->str();
|
if (Token::Match(tok2, "[;{}] %var% = %any% [&|] %any% ;"))
|
||||||
std::string tempSecond = tok->str() + " [&|]";
|
|
||||||
if (Token::Match(tok2, tempFirst.c_str()) || Token::Match(tok2, tempSecond.c_str()))
|
|
||||||
{
|
{
|
||||||
|
// is the char variable used in the calculation?
|
||||||
|
if (tok2->tokAt(3)->varId() != tok->varId() && tok2->tokAt(5)->varId() != tok->varId())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// it's ok with a bitwise and where the other operand is 0xff or less..
|
||||||
|
if (std::string(tok2->strAt(4)) == "&")
|
||||||
|
{
|
||||||
|
if (tok2->tokAt(3)->isNumber() && MathLib::isGreater("0x100", tok2->strAt(3)))
|
||||||
|
continue;
|
||||||
|
if (tok2->tokAt(5)->isNumber() && MathLib::isGreater("0x100", tok2->strAt(5)))
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// is the result stored in a short|int|long?
|
||||||
|
if (!Token::findmatch(_tokenizer->tokens(), "short|int|long %varid%", tok2->next()->varId()))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// This is an error..
|
||||||
charBitOpError(tok2);
|
charBitOpError(tok2);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,6 +39,8 @@ private:
|
||||||
TEST_CASE(bitop1);
|
TEST_CASE(bitop1);
|
||||||
TEST_CASE(bitop2);
|
TEST_CASE(bitop2);
|
||||||
TEST_CASE(return1);
|
TEST_CASE(return1);
|
||||||
|
TEST_CASE(assignChar);
|
||||||
|
TEST_CASE(and03);
|
||||||
}
|
}
|
||||||
|
|
||||||
void check(const char code[])
|
void check(const char code[])
|
||||||
|
@ -93,6 +95,7 @@ private:
|
||||||
{
|
{
|
||||||
check("void foo()\n"
|
check("void foo()\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
|
" int result = 0;\n"
|
||||||
" char ch;\n"
|
" char ch;\n"
|
||||||
" result = a | ch;\n"
|
" result = a | ch;\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
|
@ -118,6 +121,28 @@ private:
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void assignChar()
|
||||||
|
{
|
||||||
|
check("void foo()\n"
|
||||||
|
"{\n"
|
||||||
|
" char c;\n"
|
||||||
|
" c = c & 0x123;\n"
|
||||||
|
"}\n");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
}
|
||||||
|
|
||||||
|
void and03()
|
||||||
|
{
|
||||||
|
check("void foo()\n"
|
||||||
|
"{\n"
|
||||||
|
" char c;\n"
|
||||||
|
" int i = c & 0x03;\n"
|
||||||
|
"}\n");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
REGISTER_TEST(TestCharVar)
|
REGISTER_TEST(TestCharVar)
|
||||||
|
|
Loading…
Reference in New Issue