add debug message for function argument missing varid

This commit is contained in:
Robert Reif 2011-03-02 21:08:27 -05:00
parent 8e9a1c33ad
commit c9b2ab3c26
3 changed files with 51 additions and 37 deletions

View File

@ -623,22 +623,7 @@ SymbolDatabase::SymbolDatabase(const Tokenizer *tokenizer, const Settings *setti
scope = *it; scope = *it;
if (scope->isClassOrStruct() && scope->needInitialization == Scope::Unknown) if (scope->isClassOrStruct() && scope->needInitialization == Scope::Unknown)
{ debugMessage(scope->classDef, "SymbolDatabase::SymbolDatabase couldn't resolve all user defined types.");
std::list<ErrorLogger::ErrorMessage::FileLocation> locationList;
ErrorLogger::ErrorMessage::FileLocation loc;
loc.line = scope->classDef->linenr();
loc.setfile(_tokenizer->file(scope->classDef));
locationList.push_back(loc);
const ErrorLogger::ErrorMessage errmsg(locationList,
Severity::debug,
"SymbolDatabase::SymbolDatabase couldn't resolve all user defined types.",
"debug");
if (_errorLogger)
_errorLogger->reportErr(errmsg);
else
Check::reportError(errmsg);
}
} }
} }
@ -1078,6 +1063,27 @@ const Token *SymbolDatabase::initBaseInfo(Scope *scope, const Token *tok)
return tok2; return tok2;
} }
void SymbolDatabase::debugMessage(const Token *tok, const std::string &msg) const
{
if (tok && _settings->debugwarnings)
{
std::list<ErrorLogger::ErrorMessage::FileLocation> locationList;
ErrorLogger::ErrorMessage::FileLocation loc;
loc.line = tok->linenr();
loc.setfile(_tokenizer->file(tok));
locationList.push_back(loc);
const ErrorLogger::ErrorMessage errmsg(locationList,
Severity::debug,
msg,
"debug");
if (_errorLogger)
_errorLogger->reportErr(errmsg);
else
Check::reportError(errmsg);
}
}
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
unsigned int Function::argCount() const unsigned int Function::argCount() const
@ -1124,6 +1130,7 @@ void Function::addArguments(const SymbolDatabase *symbolDatabase, const Scope *s
const Token *endTok; const Token *endTok;
const Token *nameTok; const Token *nameTok;
bool isConstVar; bool isConstVar;
bool isArrayVar;
const Token *tok = arg->next(); const Token *tok = arg->next();
for (;;) for (;;)
{ {
@ -1131,6 +1138,7 @@ void Function::addArguments(const SymbolDatabase *symbolDatabase, const Scope *s
endTok = NULL; endTok = NULL;
nameTok = NULL; nameTok = NULL;
isConstVar = bool(tok->str() == "const"); isConstVar = bool(tok->str() == "const");
isArrayVar = false;
while (tok->str() != "," && tok->str() != ")") while (tok->str() != "," && tok->str() != ")")
{ {
@ -1139,12 +1147,28 @@ void Function::addArguments(const SymbolDatabase *symbolDatabase, const Scope *s
nameTok = tok; nameTok = tok;
endTok = tok->previous(); endTok = tok->previous();
} }
else if (tok->str() == "[")
isArrayVar = true;
tok = tok->next(); tok = tok->next();
} }
// check for argument with no name // check for argument with no name or missing varid
if (!endTok) if (!endTok)
endTok = tok->previous(); {
if (tok->previous()->isName())
{
if (tok->previous() != startTok->tokAt(isConstVar ? 1 : 0))
{
nameTok = tok->previous();
endTok = nameTok->previous();
symbolDatabase->debugMessage(nameTok, "Function::addArguments found argument \'" + nameTok->str() + "\' with varid 0.");
}
}
else
endTok = tok->previous();
}
const Token *typeTok = startTok; const Token *typeTok = startTok;
if (isConstVar) if (isConstVar)
@ -1156,7 +1180,7 @@ void Function::addArguments(const SymbolDatabase *symbolDatabase, const Scope *s
bool isClassVar = startTok == endTok && !startTok->isStandardType(); bool isClassVar = startTok == endTok && !startTok->isStandardType();
argumentList.push_back(Variable(nameTok, startTok, endTok, count++, Argument, false, false, isConstVar, isClassVar, argType, scope, false)); argumentList.push_back(Variable(nameTok, startTok, endTok, count++, Argument, false, false, isConstVar, isClassVar, argType, scope, isArrayVar));
if (tok->str() == ")") if (tok->str() == ")")
break; break;
@ -1429,23 +1453,8 @@ void Scope::getVariableList()
// If the vartok was set in the if-blocks above, create a entry for this variable.. // If the vartok was set in the if-blocks above, create a entry for this variable..
if (vartok && vartok->str() != "operator") if (vartok && vartok->str() != "operator")
{ {
if (vartok->varId() == 0 && !vartok->isBoolean() && check->_settings->debugwarnings) if (vartok->varId() == 0 && !vartok->isBoolean())
{ check->debugMessage(vartok, "Scope::getVariableList found variable \'" + vartok->str() + "\' with varid 0.");
std::list<ErrorLogger::ErrorMessage::FileLocation> locationList;
ErrorLogger::ErrorMessage::FileLocation loc;
loc.line = vartok->linenr();
loc.setfile(check->_tokenizer->file(vartok));
locationList.push_back(loc);
const ErrorLogger::ErrorMessage errmsg(locationList,
Severity::debug,
"Scope::getVariableList found variable \'" + vartok->str() + "\' with varid 0.",
"debug");
if (check->_errorLogger)
check->_errorLogger->reportErr(errmsg);
else
Check::reportError(errmsg);
}
const Scope *scope = NULL; const Scope *scope = NULL;

View File

@ -500,6 +500,11 @@ public:
return _variableList[varId]; return _variableList[varId];
} }
/**
* @brief output a debug message
*/
void debugMessage(const Token *tok, const std::string &msg) const;
private: private:
// Needed by Borland C++: // Needed by Borland C++:

View File

@ -216,7 +216,7 @@ private:
" EventPtr event = *eventP;\n" " EventPtr event = *eventP;\n"
" *actionsP = &event->actions;\n" " *actionsP = &event->actions;\n"
"}\n"); "}\n");
ASSERT_EQUALS(std::string(""), errout.str()); TODO_ASSERT_EQUALS("", "[test.cpp:1]: (debug) Function::addArguments found argument 'eventP' with varid 0.\n", errout.str());
} }
void returnLocalVariable1() void returnLocalVariable1()