Bug hunting; Clarify bughuntingUninit output for non-const parameters

This commit is contained in:
Daniel Marjamäki 2020-12-08 11:16:26 +01:00
parent 8161baf1e9
commit 99cb65b4b2
2 changed files with 9 additions and 6 deletions

View File

@ -498,22 +498,25 @@ static void uninit(const Token *tok, const ExprEngine::Value &value, ExprEngine:
const std::string symbol = (tok->varId() > 0) ? ("$symbol:" + tok->str() + "\n") : std::string(); const std::string symbol = (tok->varId() > 0) ? ("$symbol:" + tok->str() + "\n") : std::string();
std::string constMessage;
std::string errorId = "bughuntingUninit"; std::string errorId = "bughuntingUninit";
{ {
const Token *vartok = tok; const Token *vartok = tok;
while (Token::simpleMatch(vartok, ".")) while (Token::Match(vartok, ".|["))
vartok = vartok->previous(); vartok = vartok->astOperand1();
const Variable *var = vartok ? vartok->variable() : nullptr; const Variable *var = vartok ? vartok->variable() : nullptr;
if (var && var->isArgument()) if (var && var->isArgument()) {
errorId += "Arg"; errorId += "NonConstArg";
constMessage = " (you can use 'const' to say data must be initialized)";
}
} }
dataBase->reportError(tok, dataBase->reportError(tok,
Severity::SeverityType::error, Severity::SeverityType::error,
errorId.c_str(), errorId.c_str(),
symbol + "Cannot determine that '" + uninitexpr + "' is initialized" + inconclusiveMessage, symbol + "Cannot determine that '" + uninitexpr + "' is initialized" + constMessage + inconclusiveMessage,
CWE_USE_OF_UNINITIALIZED_VARIABLE, CWE_USE_OF_UNINITIALIZED_VARIABLE,
inconclusive, inconclusive,
value.type == ExprEngine::ValueType::BailoutValue); value.type == ExprEngine::ValueType::BailoutValue);

View File

@ -207,7 +207,7 @@ private:
// constant parameters should point at initialized data // constant parameters should point at initialized data
check("char foo(char id[]) { return id[0]; }"); check("char foo(char id[]) { return id[0]; }");
ASSERT_EQUALS("[test.cpp:1]: (error) Cannot determine that 'id[0]' is initialized\n", errout.str()); ASSERT_EQUALS("[test.cpp:1]: (error) Cannot determine that 'id[0]' is initialized (you can use 'const' to say data must be initialized)\n", errout.str());
check("char foo(const char id[]) { return id[0]; }"); check("char foo(const char id[]) { return id[0]; }");
ASSERT_EQUALS("", errout.str()); ASSERT_EQUALS("", errout.str());