Remove inline suppression and fix false positive.

This commit is contained in:
Daniel Marjamäki 2019-01-13 07:59:41 +01:00
parent 738fef6c27
commit d50c3de740
3 changed files with 44 additions and 4 deletions

View File

@ -1404,6 +1404,22 @@ bool FwdAnalysis::possiblyAliased(const Token *expr, const Token *startToken) co
if (tok->str() == "{" && tok->scope()->type == Scope::eFunction) if (tok->str() == "{" && tok->scope()->type == Scope::eFunction)
break; break;
if (Token::Match(tok, "%name% (") && !Token::Match(tok, "if|while|for")) {
// Is argument passed by reference?
const std::vector<const Token*> args = getArguments(tok);
for (unsigned int argnr = 0; argnr < args.size(); ++argnr) {
if (!Token::Match(args[argnr], "%name%|.|::"))
continue;
if (tok->function() && tok->function()->getArgumentVar(argnr) && !tok->function()->getArgumentVar(argnr)->isReference() && !tok->function()->isConst())
continue;
for (const Token *subexpr = expr; subexpr; subexpr = subexpr->astOperand1()) {
if (isSameExpression(mCpp, macro, subexpr, args[argnr], mLibrary, pure, followVar))
return true;
}
}
continue;
}
const Token *addrOf = nullptr; const Token *addrOf = nullptr;
if (Token::Match(tok, "& %name% =")) if (Token::Match(tok, "& %name% ="))
addrOf = tok->tokAt(2)->astOperand2(); addrOf = tok->tokAt(2)->astOperand2();

View File

@ -822,7 +822,6 @@ void Preprocessor::getErrorMessages(ErrorLogger *errorLogger, const Settings *se
{ {
Settings settings2(*settings); Settings settings2(*settings);
Preprocessor preprocessor(settings2, errorLogger); Preprocessor preprocessor(settings2, errorLogger);
// cppcheck-suppress unreadVariable // FP
settings2.checkConfiguration = true; settings2.checkConfiguration = true;
preprocessor.missingInclude(emptyString, 1, emptyString, UserHeader); preprocessor.missingInclude(emptyString, 1, emptyString, UserHeader);
preprocessor.missingInclude(emptyString, 1, emptyString, SystemHeader); preprocessor.missingInclude(emptyString, 1, emptyString, SystemHeader);

View File

@ -2161,14 +2161,25 @@ private:
"}\n"); "}\n");
ASSERT_EQUALS("[test.cpp:3]: (style) Variable 'x' is assigned a value that is never used.\n", errout.str()); ASSERT_EQUALS("[test.cpp:3]: (style) Variable 'x' is assigned a value that is never used.\n", errout.str());
functionVariableUsage("void fun() {\n" functionVariableUsage("void dostuff(int x);\n"
"void fun() {\n"
" int x = 1;\n" " int x = 1;\n"
" while (c) {\n" " while (c) {\n"
" dostuff(x);\n" " dostuff(x);\n"
" if (y) { x=10; break; }\n" " if (y) { x=10; break; }\n"
" }\n" " }\n"
"}\n"); "}\n");
ASSERT_EQUALS("[test.cpp:5]: (style) Variable 'x' is assigned a value that is never used.\n", errout.str()); ASSERT_EQUALS("[test.cpp:6]: (style) Variable 'x' is assigned a value that is never used.\n", errout.str());
functionVariableUsage("void dostuff(int &x);\n"
"void fun() {\n"
" int x = 1;\n"
" while (c) {\n"
" dostuff(x);\n"
" if (y) { x=10; break; }\n"
" }\n"
"}\n");
ASSERT_EQUALS("", errout.str()); // TODO : in this special case we can ignore that x is aliased. x is local and there are no function calls after the assignment
functionVariableUsage("void fun() {\n" functionVariableUsage("void fun() {\n"
" int x = 0;\n" " int x = 0;\n"
@ -3170,11 +3181,25 @@ private:
} }
void localvaralias14() { // #5619 void localvaralias14() { // #5619
functionVariableUsage("char * dostuff(char *p);\n"
"void f() {\n"
" char a[4], *p=a;\n"
" p = dostuff(p);\n"
"}");
ASSERT_EQUALS("[test.cpp:4]: (style) Variable 'p' is assigned a value that is never used.\n", errout.str());
functionVariableUsage("char * dostuff(char *&p);\n"
"void f() {\n"
" char a[4], *p=a;\n"
" p = dostuff(p);\n"
"}");
ASSERT_EQUALS("", errout.str()); // TODO: we can warn in this special case; variable is local and there are no function calls after the assignment
functionVariableUsage("void f() {\n" functionVariableUsage("void f() {\n"
" char a[4], *p=a;\n" " char a[4], *p=a;\n"
" p = dostuff(p);\n" " p = dostuff(p);\n"
"}"); "}");
ASSERT_EQUALS("[test.cpp:3]: (style) Variable 'p' is assigned a value that is never used.\n", errout.str()); ASSERT_EQUALS("", errout.str()); // TODO: we can warn in this special case; variable is local and there are no function calls after the assignment
} }
void localvaralias15() { // #6315 void localvaralias15() { // #6315