From 905615e99197275d6f59f7f7fa0698d5cb2afb81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Sat, 9 Jun 2012 08:43:13 +0200 Subject: [PATCH] Fixed #3878 (Sign extension with unsigned char false positive) --- lib/checkother.cpp | 2 +- test/testcharvar.cpp | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/checkother.cpp b/lib/checkother.cpp index 97533d86d..9f35c0128 100644 --- a/lib/checkother.cpp +++ b/lib/checkother.cpp @@ -1794,7 +1794,7 @@ void CheckOther::checkCharVariable() else if (Token::Match(tok, "[;{}] %var% = %any% [&^|] ( * %var% ) ;")) { const Variable* var = symbolDatabase->getVariableFromVarId(tok->tokAt(7)->varId()); - if (!var || !var->isPointer() || var->typeStartToken()->str() != "char") + if (!var || !var->isPointer() || var->typeStartToken()->str() != "char" || var->typeStartToken()->isUnsigned()) continue; // it's ok with a bitwise and where the other operand is 0xff or less.. if (tok->strAt(4) == "&" && tok->tokAt(3)->isNumber() && MathLib::isGreater("0x100", tok->strAt(3))) diff --git a/test/testcharvar.cpp b/test/testcharvar.cpp index 4a6c0623f..7f985e3f0 100644 --- a/test/testcharvar.cpp +++ b/test/testcharvar.cpp @@ -212,6 +212,14 @@ private: " return ret;\n" "}"); ASSERT_EQUALS("", errout.str()); + + // #3878 - false positive + check("int f(unsigned char *p) {\n" + " int ret = a();\n" + " ret |= *p;\n" + " return ret;\n" + "}"); + ASSERT_EQUALS("", errout.str()); } };