Rename old uninitvar ID to use legacyUninitvar (#4043)
This commit is contained in:
parent
bcbc29affb
commit
3e3abecba0
|
@ -80,6 +80,15 @@ static const Token *getAstParentSkipPossibleCastAndAddressOf(const Token *vartok
|
||||||
return parent;
|
return parent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CheckUninitVar::diag(const Token* tok)
|
||||||
|
{
|
||||||
|
if (!tok)
|
||||||
|
return true;
|
||||||
|
while (Token::Match(tok->astParent(), "*|&|."))
|
||||||
|
tok = tok->astParent();
|
||||||
|
return !mUninitDiags.insert(tok).second;
|
||||||
|
}
|
||||||
|
|
||||||
void CheckUninitVar::check()
|
void CheckUninitVar::check()
|
||||||
{
|
{
|
||||||
const SymbolDatabase *symbolDatabase = mTokenizer->getSymbolDatabase();
|
const SymbolDatabase *symbolDatabase = mTokenizer->getSymbolDatabase();
|
||||||
|
@ -1496,12 +1505,21 @@ void CheckUninitVar::uninitdataError(const Token *tok, const std::string &varnam
|
||||||
|
|
||||||
void CheckUninitVar::uninitvarError(const Token *tok, const std::string &varname, ErrorPath errorPath)
|
void CheckUninitVar::uninitvarError(const Token *tok, const std::string &varname, ErrorPath errorPath)
|
||||||
{
|
{
|
||||||
|
if (diag(tok))
|
||||||
|
return;
|
||||||
errorPath.emplace_back(tok, "");
|
errorPath.emplace_back(tok, "");
|
||||||
reportError(errorPath, Severity::error, "uninitvar", "$symbol:" + varname + "\nUninitialized variable: $symbol", CWE_USE_OF_UNINITIALIZED_VARIABLE, Certainty::normal);
|
reportError(errorPath,
|
||||||
|
Severity::error,
|
||||||
|
"legacyUninitvar",
|
||||||
|
"$symbol:" + varname + "\nUninitialized variable: $symbol",
|
||||||
|
CWE_USE_OF_UNINITIALIZED_VARIABLE,
|
||||||
|
Certainty::normal);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckUninitVar::uninitvarError(const Token* tok, const ValueFlow::Value& v)
|
void CheckUninitVar::uninitvarError(const Token* tok, const ValueFlow::Value& v)
|
||||||
{
|
{
|
||||||
|
if (diag(tok))
|
||||||
|
return;
|
||||||
const Token* ltok = tok;
|
const Token* ltok = tok;
|
||||||
if (tok && Token::simpleMatch(tok->astParent(), ".") && astIsRHS(tok))
|
if (tok && Token::simpleMatch(tok->astParent(), ".") && astIsRHS(tok))
|
||||||
ltok = tok->astParent();
|
ltok = tok->astParent();
|
||||||
|
@ -1666,10 +1684,6 @@ void CheckUninitVar::valueFlowUninit()
|
||||||
ids.insert(tok->exprId());
|
ids.insert(tok->exprId());
|
||||||
if (v->tokvalue)
|
if (v->tokvalue)
|
||||||
ids.insert(v->tokvalue->exprId());
|
ids.insert(v->tokvalue->exprId());
|
||||||
const Token* nextTok = nextAfterAstRightmostLeaf(parent);
|
|
||||||
if (nextTok == scope->bodyEnd)
|
|
||||||
break;
|
|
||||||
tok = nextTok ? nextTok : tok;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -71,10 +71,11 @@ public:
|
||||||
/** @brief Run checks against the normal token list */
|
/** @brief Run checks against the normal token list */
|
||||||
void runChecks(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) override {
|
void runChecks(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) override {
|
||||||
CheckUninitVar checkUninitVar(tokenizer, settings, errorLogger);
|
CheckUninitVar checkUninitVar(tokenizer, settings, errorLogger);
|
||||||
checkUninitVar.check();
|
|
||||||
checkUninitVar.valueFlowUninit();
|
checkUninitVar.valueFlowUninit();
|
||||||
|
checkUninitVar.check();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool diag(const Token* tok);
|
||||||
/** Check for uninitialized variables */
|
/** Check for uninitialized variables */
|
||||||
void check();
|
void check();
|
||||||
void checkScope(const Scope* scope, const std::set<std::string> &arrayTypeDefs);
|
void checkScope(const Scope* scope, const std::set<std::string> &arrayTypeDefs);
|
||||||
|
@ -131,10 +132,12 @@ public:
|
||||||
void uninitStructMemberError(const Token *tok, const std::string &membername);
|
void uninitStructMemberError(const Token *tok, const std::string &membername);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
std::set<const Token*> mUninitDiags;
|
||||||
Check::FileInfo* getFileInfo() const;
|
Check::FileInfo* getFileInfo() const;
|
||||||
bool isUnsafeFunction(const Scope* scope, int argnr, const Token** tok) const;
|
bool isUnsafeFunction(const Scope* scope, int argnr, const Token** tok) const;
|
||||||
|
|
||||||
void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const override {
|
void getErrorMessages(ErrorLogger* errorLogger, const Settings* settings) const override
|
||||||
|
{
|
||||||
CheckUninitVar c(nullptr, settings, errorLogger);
|
CheckUninitVar c(nullptr, settings, errorLogger);
|
||||||
|
|
||||||
ValueFlow::Value v{};
|
ValueFlow::Value v{};
|
||||||
|
|
|
@ -14,3 +14,4 @@ release notes for cppcheck-2.8
|
||||||
- Improvements to unreadVariable
|
- Improvements to unreadVariable
|
||||||
- Detect more instances of C style casts
|
- Detect more instances of C style casts
|
||||||
- Warn if the return value of new is discarded
|
- Warn if the return value of new is discarded
|
||||||
|
- The pre-ValueFlow uninitialized checker now uses a different ID as legacyUninitvar
|
||||||
|
|
Loading…
Reference in New Issue