Some fixes for CheckOther::checkIgnoredReturnValue():

- Fixed name of the function
- Fixed false positive for code like "class strcmp { strcmp() {} };"
- Fixed FP #6233 on checking side (no AST generated for function call)
This commit is contained in:
PKEuS 2014-10-30 23:24:13 +01:00
parent b7996bd0b0
commit b5ea677180
3 changed files with 23 additions and 4 deletions

View File

@ -2744,7 +2744,7 @@ void CheckOther::varFuncNullUBError(const Token *tok)
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
// Check for ignored return values. // Check for ignored return values.
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
void CheckOther::checkReturnIgnoredReturnValue() void CheckOther::checkIgnoredReturnValue()
{ {
if (!_settings->isEnabled("warning")) if (!_settings->isEnabled("warning"))
return; return;
@ -2754,9 +2754,12 @@ void CheckOther::checkReturnIgnoredReturnValue()
for (std::size_t i = 0; i < functions; ++i) { for (std::size_t i = 0; i < functions; ++i) {
const Scope * scope = symbolDatabase->functionScopes[i]; const Scope * scope = symbolDatabase->functionScopes[i];
for (const Token* tok = scope->classStart; tok != scope->classEnd; tok = tok->next()) { for (const Token* tok = scope->classStart; tok != scope->classEnd; tok = tok->next()) {
if (tok->varId() || !Token::Match(tok, "%var% (") || tok->strAt(-1) == ".") if (tok->varId() || !Token::Match(tok, "%var% (") || tok->strAt(-1) == "." || tok->next()->astOperand1() != tok)
continue; continue;
if (!tok->scope()->isExecutable())
tok = tok->scope()->classEnd;
if (!tok->next()->astParent() && (!tok->function() || !Token::Match(tok->function()->retDef, "void %var%")) && _settings->library.useretval.find(tok->str()) != _settings->library.useretval.end()) if (!tok->next()->astParent() && (!tok->function() || !Token::Match(tok->function()->retDef, "void %var%")) && _settings->library.useretval.find(tok->str()) != _settings->library.useretval.end())
ignoredReturnValueError(tok, tok->str()); ignoredReturnValueError(tok, tok->str());
} }

View File

@ -73,7 +73,7 @@ public:
checkOther.checkVarFuncNullUB(); checkOther.checkVarFuncNullUB();
checkOther.checkNanInArithmeticExpression(); checkOther.checkNanInArithmeticExpression();
checkOther.checkCommaSeparatedReturn(); checkOther.checkCommaSeparatedReturn();
checkOther.checkReturnIgnoredReturnValue(); checkOther.checkIgnoredReturnValue();
} }
/** @brief Run checks against the simplified token list */ /** @brief Run checks against the simplified token list */
@ -231,7 +231,7 @@ public:
void checkComparisonFunctionIsAlwaysTrueOrFalse(); void checkComparisonFunctionIsAlwaysTrueOrFalse();
/** @brief %Check for ignored return values. */ /** @brief %Check for ignored return values. */
void checkReturnIgnoredReturnValue(); void checkIgnoredReturnValue();
private: private:
// Error messages.. // Error messages..

View File

@ -6277,6 +6277,11 @@ private:
"}", "test.cpp", false, false, false, true, &settings_std); "}", "test.cpp", false, false, false, true, &settings_std);
ASSERT_EQUALS("", errout.str()); ASSERT_EQUALS("", errout.str());
check("void foo() {\n"
" class strcmp { strcmp() {} };\n" // strcmp is a constructor definition here
"}", "test.cpp", false, false, false, true, &settings_std);
ASSERT_EQUALS("", errout.str());
check("void foo() {\n" check("void foo() {\n"
" return strcmp(a, b);\n" " return strcmp(a, b);\n"
"}", "test.cpp", false, false, false, true, &settings_std); "}", "test.cpp", false, false, false, true, &settings_std);
@ -6303,6 +6308,17 @@ private:
" DebugLog::getInstance().log(systemInfo.getSystemInfo());\n" " DebugLog::getInstance().log(systemInfo.getSystemInfo());\n"
"}", "test.cpp", false, false, false, true, &settings_std); "}", "test.cpp", false, false, false, true, &settings_std);
ASSERT_EQUALS("", errout.str()); ASSERT_EQUALS("", errout.str());
// #6233
check("int main() {\n"
" auto lambda = [](double value) {\n"
" double rounded = floor(value + 0.5);\n"
" printf(\"Rounded value = %f\\n\", rounded);\n"
" };\n"
" lambda(13.3);\n"
" return 0;\n"
"}");
ASSERT_EQUALS("", errout.str());
} }
}; };