Fixed #7961 (Hang in CheckOther::checkFuncArgNamesDifferent)

This commit is contained in:
Daniel Marjamäki 2017-03-24 22:01:05 +01:00
parent 5fb0f46a3a
commit f5d56fd303
2 changed files with 15 additions and 15 deletions

View File

@ -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 += ", ";

View File

@ -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);