Fixed #7961 (Hang in CheckOther::checkFuncArgNamesDifferent)
This commit is contained in:
parent
5fb0f46a3a
commit
f5d56fd303
|
@ -2819,22 +2819,22 @@ void CheckOther::checkFuncArgNamesDifferent()
|
||||||
definitions[j] = variable->nameToken();
|
definitions[j] = variable->nameToken();
|
||||||
}
|
}
|
||||||
// get the declaration (search for first token with varId)
|
// get the declaration (search for first token with varId)
|
||||||
bool skip = false;
|
|
||||||
while (decl && !Token::Match(decl, ",|)|;")) {
|
while (decl && !Token::Match(decl, ",|)|;")) {
|
||||||
// skip everything after the assignment because
|
// skip everything after the assignment because
|
||||||
// it could also have a varId or be the first
|
// it could also have a varId or be the first
|
||||||
// token with a varId if there is no name token
|
// token with a varId if there is no name token
|
||||||
if (decl->str() == "=")
|
if (decl->str() == "=") {
|
||||||
skip = true;
|
decl = decl->nextArgument();
|
||||||
// skip over template
|
break;
|
||||||
else if (decl->link())
|
|
||||||
decl = decl->link();
|
|
||||||
else if (!skip && decl->varId()) {
|
|
||||||
declarations[j] = decl;
|
|
||||||
}
|
}
|
||||||
|
// skip over template
|
||||||
|
if (decl->link())
|
||||||
|
decl = decl->link();
|
||||||
|
else if (decl->varId())
|
||||||
|
declarations[j] = decl;
|
||||||
decl = decl->next();
|
decl = decl->next();
|
||||||
}
|
}
|
||||||
if (decl)
|
if (Token::simpleMatch(decl, ","))
|
||||||
decl = decl->next();
|
decl = decl->next();
|
||||||
}
|
}
|
||||||
// check for different argument order
|
// check for different argument order
|
||||||
|
@ -2866,19 +2866,19 @@ void CheckOther::checkFuncArgNamesDifferent()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckOther::funcArgNamesDifferent(const std::string & name, size_t index,
|
void CheckOther::funcArgNamesDifferent(const std::string & functionName, size_t index,
|
||||||
const Token* declaration, const Token* definition)
|
const Token* declaration, const Token* definition)
|
||||||
{
|
{
|
||||||
std::list<const Token *> tokens;
|
std::list<const Token *> tokens;
|
||||||
tokens.push_back(declaration);
|
tokens.push_back(declaration);
|
||||||
tokens.push_back(definition);
|
tokens.push_back(definition);
|
||||||
reportError(tokens, Severity::style, "funcArgNamesDifferent",
|
reportError(tokens, Severity::style, "funcArgNamesDifferent",
|
||||||
"Function '" + name + "' argument " + MathLib::toString(index + 1) + " names different: declaration '" +
|
"Function '" + functionName + "' argument " + MathLib::toString(index + 1) + " names different: declaration '" +
|
||||||
(declaration ? declaration->str() : std::string("A")) + "' definition '" +
|
(declaration ? declaration->str() : std::string("A")) + "' definition '" +
|
||||||
(definition ? definition->str() : std::string("B")) + "'.", CWE(0U), true);
|
(definition ? definition->str() : std::string("B")) + "'.", CWE(0U), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckOther::funcArgOrderDifferent(const std::string & name,
|
void CheckOther::funcArgOrderDifferent(const std::string & functionName,
|
||||||
const Token* declaration, const Token* definition,
|
const Token* declaration, const Token* definition,
|
||||||
const std::vector<const Token *> & declarations,
|
const std::vector<const Token *> & declarations,
|
||||||
const std::vector<const Token *> & definitions)
|
const std::vector<const Token *> & definitions)
|
||||||
|
@ -2886,7 +2886,7 @@ void CheckOther::funcArgOrderDifferent(const std::string & name,
|
||||||
std::list<const Token *> tokens;
|
std::list<const Token *> tokens;
|
||||||
tokens.push_back(declarations.size() ? declarations[0] ? declarations[0] : declaration : nullptr);
|
tokens.push_back(declarations.size() ? declarations[0] ? declarations[0] : declaration : nullptr);
|
||||||
tokens.push_back(definitions.size() ? definitions[0] ? definitions[0] : definition : nullptr);
|
tokens.push_back(definitions.size() ? definitions[0] ? definitions[0] : definition : nullptr);
|
||||||
std::string msg = "Function '" + name + "' argument order different: declaration '";
|
std::string msg = "Function '" + functionName + "' argument order different: declaration '";
|
||||||
for (std::size_t i = 0; i < declarations.size(); ++i) {
|
for (std::size_t i = 0; i < declarations.size(); ++i) {
|
||||||
if (i != 0)
|
if (i != 0)
|
||||||
msg += ", ";
|
msg += ", ";
|
||||||
|
|
|
@ -262,8 +262,8 @@ private:
|
||||||
void unknownEvaluationOrder(const Token* tok);
|
void unknownEvaluationOrder(const Token* tok);
|
||||||
static bool isMovedParameterAllowedForInconclusiveFunction(const Token * tok);
|
static bool isMovedParameterAllowedForInconclusiveFunction(const Token * tok);
|
||||||
void accessMovedError(const Token *tok, const std::string &varname, ValueFlow::Value::MoveKind moveKind, bool inconclusive);
|
void accessMovedError(const Token *tok, const std::string &varname, ValueFlow::Value::MoveKind moveKind, bool inconclusive);
|
||||||
void funcArgNamesDifferent(const std::string & name, size_t index, const Token* declaration, const Token* definition);
|
void funcArgNamesDifferent(const std::string & functionName, size_t index, const Token* declaration, const Token* definition);
|
||||||
void funcArgOrderDifferent(const std::string & name, const Token * declaration, const Token * definition, const std::vector<const Token*> & declarations, const std::vector<const Token*> & definitions);
|
void funcArgOrderDifferent(const std::string & functionName, const Token * declaration, const Token * definition, const std::vector<const Token*> & declarations, const std::vector<const Token*> & definitions);
|
||||||
|
|
||||||
void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const {
|
void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const {
|
||||||
CheckOther c(nullptr, settings, errorLogger);
|
CheckOther c(nullptr, settings, errorLogger);
|
||||||
|
|
Loading…
Reference in New Issue