Make use of recently implemented Token::type() functionality

This commit is contained in:
PKEuS 2012-04-25 09:56:07 +02:00
parent fb6c7f33f0
commit dd5e9aa454
9 changed files with 41 additions and 42 deletions

View File

@ -396,7 +396,7 @@ static bool for_bailout(const Token * const tok1, unsigned int varid)
if (loopTok->varId() == varid) { if (loopTok->varId() == varid) {
// Counter variable used inside loop // Counter variable used inside loop
if (Token::Match(loopTok->next(), "+=|-=|++|--|=") || if (Token::Match(loopTok->next(), "+=|-=|++|--|=") ||
Token::Match(loopTok->previous(), "++|--")) { (loopTok->previous()->type() == Token::eIncDecOp)) {
return true; return true;
} }
} }
@ -558,7 +558,7 @@ void CheckBufferOverrun::checkFunctionParameter(const Token &tok, unsigned int p
} }
} }
else if (Token::Match(tok2->next(), ",|)") && tok2->str()[0] == '\'') { else if (Token::Match(tok2->next(), ",|)") && tok2->type() == Token::eChar) {
sizeArgumentAsCharError(tok2); sizeArgumentAsCharError(tok2);
} }
} else if (arg == 1001) { // special code. This parameter multiplied with the next must not exceed total_size } else if (arg == 1001) { // special code. This parameter multiplied with the next must not exceed total_size
@ -1574,13 +1574,13 @@ MathLib::bigint CheckBufferOverrun::countSprintfLength(const std::string &input_
break; break;
case 'd': case 'd':
i_d_x_f_found = true; i_d_x_f_found = true;
if (paramIter != parameters.end() && *paramIter && (*paramIter)->str()[0] != '"') if (paramIter != parameters.end() && *paramIter && (*paramIter)->type() != Token::eString)
parameterLength = (*paramIter)->str().length(); parameterLength = (*paramIter)->str().length();
handleNextParameter = true; handleNextParameter = true;
break; break;
case 's': case 's':
if (paramIter != parameters.end() && *paramIter && (*paramIter)->str()[0] == '"') if (paramIter != parameters.end() && *paramIter && (*paramIter)->type() == Token::eString)
parameterLength = Token::getStrLength(*paramIter); parameterLength = Token::getStrLength(*paramIter);
handleNextParameter = true; handleNextParameter = true;
@ -1646,7 +1646,7 @@ void CheckBufferOverrun::checkSprintfCall(const Token *tok, const MathLib::bigin
const Token* vaArg = tok->tokAt(2)->nextArgument()->nextArgument(); const Token* vaArg = tok->tokAt(2)->nextArgument()->nextArgument();
while (vaArg) { while (vaArg) {
if (Token::Match(vaArg->next(), "[,)]")) { if (Token::Match(vaArg->next(), "[,)]")) {
if (vaArg->str()[0] == '"') // %str% if (vaArg->type() == Token::eString)
parameters.push_back(vaArg); parameters.push_back(vaArg);
else if (vaArg->isNumber()) else if (vaArg->isNumber())
@ -2064,7 +2064,7 @@ void CheckBufferOverrun::arrayIndexThenCheck()
return; return;
// skip comparison // skip comparison
if (Token::Match(tok, "==|!=|<|<=|>|>= %any% &&")) if (tok->type() == Token::eComparisionOp && tok->strAt(2) == "&&")
tok = tok->tokAt(2); tok = tok->tokAt(2);
// check if array index is ok // check if array index is ok

View File

@ -39,7 +39,7 @@ void CheckInternal::checkTokenMatchPatterns()
// Get pattern string // Get pattern string
const Token *pattern_tok = tok->tokAt(4)->nextArgument(); const Token *pattern_tok = tok->tokAt(4)->nextArgument();
if (!pattern_tok || !Token::Match(pattern_tok, "%str%")) if (!pattern_tok || pattern_tok->type() != Token::eString)
continue; continue;
const std::string pattern = pattern_tok->strValue(); const std::string pattern = pattern_tok->strValue();
@ -68,7 +68,7 @@ void CheckInternal::checkTokenSimpleMatchPatterns()
// Get pattern string // Get pattern string
const Token *pattern_tok = tok->tokAt(4)->nextArgument(); const Token *pattern_tok = tok->tokAt(4)->nextArgument();
if (!pattern_tok || !Token::Match(pattern_tok, "%str%")) if (!pattern_tok || pattern_tok->type() != Token::eString)
continue; continue;
const std::string pattern = pattern_tok->strValue(); const std::string pattern = pattern_tok->strValue();
@ -140,7 +140,7 @@ void CheckInternal::checkMissingPercentCharacter()
// Get pattern string // Get pattern string
const Token *pattern_tok = tok->tokAt(4)->nextArgument(); const Token *pattern_tok = tok->tokAt(4)->nextArgument();
if (!pattern_tok || !Token::Match(pattern_tok, "%str%")) if (!pattern_tok || pattern_tok->type() != Token::eString)
continue; continue;
const std::string pattern = pattern_tok->strValue(); const std::string pattern = pattern_tok->strValue();

View File

@ -152,7 +152,7 @@ void CheckNullPointer::parseFunctionCall(const Token &tok, std::list<const Token
argListTok = secondParam; argListTok = secondParam;
} else if (Token::Match(&tok, "sprintf|fprintf|sscanf|fscanf")) { } else if (Token::Match(&tok, "sprintf|fprintf|sscanf|fscanf")) {
const Token* formatStringTok = secondParam; // Find second parameter (format string) const Token* formatStringTok = secondParam; // Find second parameter (format string)
if (formatStringTok && formatStringTok->str()[0] == '"') { if (formatStringTok && formatStringTok->type() == Token::eString) {
argListTok = formatStringTok->nextArgument(); // Find third parameter (first argument of va_args) argListTok = formatStringTok->nextArgument(); // Find third parameter (first argument of va_args)
formatString = formatStringTok->strValue(); formatString = formatStringTok->strValue();
} }
@ -161,7 +161,7 @@ void CheckNullPointer::parseFunctionCall(const Token &tok, std::list<const Token
for (int i = 0; i < 1 && formatStringTok; i++) { for (int i = 0; i < 1 && formatStringTok; i++) {
formatStringTok = formatStringTok->nextArgument(); // Find third parameter (format string) formatStringTok = formatStringTok->nextArgument(); // Find third parameter (format string)
} }
if (formatStringTok && formatStringTok->str()[0] == '"') { if (formatStringTok && formatStringTok->type() == Token::eString) {
argListTok = formatStringTok->nextArgument(); // Find fourth parameter (first argument of va_args) argListTok = formatStringTok->nextArgument(); // Find fourth parameter (first argument of va_args)
formatString = formatStringTok->strValue(); formatString = formatStringTok->strValue();
} }
@ -616,7 +616,7 @@ void CheckNullPointer::nullPointerStructByDeRefAndChec()
continue; continue;
// name of struct pointer // name of struct pointer
const std::string varname(tok1->str()); const std::string& varname(tok1->str());
// is pointer local? // is pointer local?
bool isLocal = false; bool isLocal = false;

View File

@ -153,7 +153,7 @@ void CheckOther::clarifyCondition()
for (const Token *tok2 = tok->tokAt(3); tok2; tok2 = tok2->next()) { for (const Token *tok2 = tok->tokAt(3); tok2; tok2 = tok2->next()) {
if (tok2->str() == "(" || tok2->str() == "[") if (tok2->str() == "(" || tok2->str() == "[")
tok2 = tok2->link(); tok2 = tok2->link();
else if (Token::Match(tok2, "<|<=|==|!=|>|>=")) { else if (tok2->type() == Token::eComparisionOp) {
// This might be a template // This might be a template
if (!_tokenizer->isC() && Token::Match(tok2->previous(), "%var% <")) if (!_tokenizer->isC() && Token::Match(tok2->previous(), "%var% <"))
break; break;
@ -964,7 +964,7 @@ void CheckOther::checkAssignmentInAssert()
while (tok && endTok) { while (tok && endTok) {
for (tok = tok->tokAt(2); tok != endTok; tok = tok->next()) { for (tok = tok->tokAt(2); tok != endTok; tok = tok->next()) {
if (tok->isName() && (tok->next()->isAssignmentOp() || tok->next()->str() == "++" || tok->next()->str() == "--")) if (tok->isName() && (tok->next()->isAssignmentOp() || tok->next()->type() == Token::eIncDecOp))
assignmentInAssertError(tok, tok->str()); assignmentInAssertError(tok, tok->str());
else if (Token::Match(tok, "--|++ %var%")) else if (Token::Match(tok, "--|++ %var%"))
assignmentInAssertError(tok, tok->strAt(1)); assignmentInAssertError(tok, tok->strAt(1));
@ -1350,7 +1350,7 @@ void CheckOther::invalidScanf()
formatToken = tok->tokAt(2); formatToken = tok->tokAt(2);
else if (Token::Match(tok, "sscanf|vsscanf|fscanf|vfscanf (")) { else if (Token::Match(tok, "sscanf|vsscanf|fscanf|vfscanf (")) {
const Token* nextArg = tok->tokAt(2)->nextArgument(); const Token* nextArg = tok->tokAt(2)->nextArgument();
if (nextArg && Token::Match(nextArg, "%str%")) if (nextArg && nextArg->type() == Token::eString)
formatToken = nextArg; formatToken = nextArg;
else else
continue; continue;
@ -1460,7 +1460,7 @@ void CheckOther::checkWrongPrintfScanfArguments()
} else { } else {
continue; continue;
} }
} else if (Token::Match(tok, "snprintf|fnprintf ( %any%")) { } else if (Token::Match(tok, "snprintf|fnprintf (")) {
const Token* formatStringTok = tok->tokAt(2); const Token* formatStringTok = tok->tokAt(2);
for (int i = 0; i < 2 && formatStringTok; i++) { for (int i = 0; i < 2 && formatStringTok; i++) {
formatStringTok = formatStringTok->nextArgument(); // Find third parameter (format string) formatStringTok = formatStringTok->nextArgument(); // Find third parameter (format string)
@ -1536,11 +1536,11 @@ void CheckOther::checkWrongPrintfScanfArguments()
} else if (!scan) { } else if (!scan) {
switch (*i) { switch (*i) {
case 's': case 's':
if (variableInfo && !Token::Match(argListTok, "%str%") && isKnownType(variableInfo, varTypeTok) && (!variableInfo->isPointer() && !variableInfo->isArray())) if (variableInfo && argListTok->type() != Token::eString && isKnownType(variableInfo, varTypeTok) && (!variableInfo->isPointer() && !variableInfo->isArray()))
invalidPrintfArgTypeError_s(tok, numFormat); invalidPrintfArgTypeError_s(tok, numFormat);
break; break;
case 'n': case 'n':
if ((varTypeTok && isKnownType(variableInfo, varTypeTok) && ((!variableInfo->isPointer() && !variableInfo->isArray()) || varTypeTok->str() == "const")) || Token::Match(argListTok, "%str%")) if ((varTypeTok && isKnownType(variableInfo, varTypeTok) && ((!variableInfo->isPointer() && !variableInfo->isArray()) || varTypeTok->str() == "const")) || argListTok->type() == Token::eString)
invalidPrintfArgTypeError_n(tok, numFormat); invalidPrintfArgTypeError_n(tok, numFormat);
break; break;
case 'c': case 'c':
@ -1554,7 +1554,7 @@ void CheckOther::checkWrongPrintfScanfArguments()
varTypeTok = varTypeTok->next(); varTypeTok = varTypeTok->next();
if ((varTypeTok && isKnownType(variableInfo, varTypeTok) && !Token::Match(varTypeTok, "unsigned|signed| bool|short|long|int|char|size_t|unsigned|signed") && !variableInfo->isPointer() && !variableInfo->isArray())) if ((varTypeTok && isKnownType(variableInfo, varTypeTok) && !Token::Match(varTypeTok, "unsigned|signed| bool|short|long|int|char|size_t|unsigned|signed") && !variableInfo->isPointer() && !variableInfo->isArray()))
invalidPrintfArgTypeError_int(tok, numFormat, *i); invalidPrintfArgTypeError_int(tok, numFormat, *i);
else if (Token::Match(argListTok, "%str%")) else if (argListTok->type() == Token::eString)
invalidPrintfArgTypeError_int(tok, numFormat, *i); invalidPrintfArgTypeError_int(tok, numFormat, *i);
break; break;
case 'p': case 'p':
@ -1562,7 +1562,7 @@ void CheckOther::checkWrongPrintfScanfArguments()
varTypeTok = varTypeTok->next(); varTypeTok = varTypeTok->next();
if (varTypeTok && isKnownType(variableInfo, varTypeTok) && !Token::Match(varTypeTok, "unsigned|signed| short|long|int|size_t|unsigned|signed") && !variableInfo->isPointer() && !variableInfo->isArray()) if (varTypeTok && isKnownType(variableInfo, varTypeTok) && !Token::Match(varTypeTok, "unsigned|signed| short|long|int|size_t|unsigned|signed") && !variableInfo->isPointer() && !variableInfo->isArray())
invalidPrintfArgTypeError_p(tok, numFormat); invalidPrintfArgTypeError_p(tok, numFormat);
else if (Token::Match(argListTok, "%str%")) else if (argListTok->type() == Token::eString)
invalidPrintfArgTypeError_p(tok, numFormat); invalidPrintfArgTypeError_p(tok, numFormat);
break; break;
case 'e': case 'e':
@ -1574,7 +1574,7 @@ void CheckOther::checkWrongPrintfScanfArguments()
varTypeTok = varTypeTok->next(); varTypeTok = varTypeTok->next();
if (varTypeTok && ((isKnownType(variableInfo, varTypeTok) && !Token::Match(varTypeTok, "float|double")) || variableInfo->isPointer() || variableInfo->isArray())) if (varTypeTok && ((isKnownType(variableInfo, varTypeTok) && !Token::Match(varTypeTok, "float|double")) || variableInfo->isPointer() || variableInfo->isArray()))
invalidPrintfArgTypeError_float(tok, numFormat, *i); invalidPrintfArgTypeError_float(tok, numFormat, *i);
else if (Token::Match(argListTok, "%str%")) else if (argListTok->type() == Token::eString)
invalidPrintfArgTypeError_float(tok, numFormat, *i); invalidPrintfArgTypeError_float(tok, numFormat, *i);
break; break;
default: default:
@ -1680,7 +1680,7 @@ void CheckOther::checkComparisonOfBoolWithInt()
const SymbolDatabase* const symbolDatabase = _tokenizer->getSymbolDatabase(); const SymbolDatabase* const symbolDatabase = _tokenizer->getSymbolDatabase();
for (const Token *tok = _tokenizer->tokens(); tok; tok = tok->next()) { for (const Token *tok = _tokenizer->tokens(); tok; tok = tok->next()) {
if (Token::Match(tok->next(), ">|>=|==|!=|<=|<") && (!tok->previous() || !tok->previous()->isArithmeticalOp()) && (!tok->tokAt(3) || !tok->tokAt(3)->isArithmeticalOp())) { if (tok->next() && tok->next()->type() == Token::eComparisionOp && (!tok->previous() || !tok->previous()->isArithmeticalOp()) && (!tok->tokAt(3) || !tok->tokAt(3)->isArithmeticalOp())) {
const Token* const right = tok->tokAt(2); const Token* const right = tok->tokAt(2);
if ((tok->varId() && right->isNumber()) || (tok->isNumber() && right->varId())) { // Comparing variable with number if ((tok->varId() && right->isNumber()) || (tok->isNumber() && right->varId())) { // Comparing variable with number
const Token* varTok = tok; const Token* varTok = tok;
@ -2167,7 +2167,7 @@ void CheckOther::checkCharVariable()
charArrayIndexError(tok->next()); charArrayIndexError(tok->next());
} }
else if (Token::Match(tok, "[;{}] %var% = %any% [&|] %any% ;")) { else if (Token::Match(tok, "[;{}] %var% = %any% [&^|] %any% ;")) {
// is a char variable used in the calculation? // is a char variable used in the calculation?
if (!isSignedChar(symbolDatabase->getVariableFromVarId(tok->tokAt(3)->varId())) && if (!isSignedChar(symbolDatabase->getVariableFromVarId(tok->tokAt(3)->varId())) &&
!isSignedChar(symbolDatabase->getVariableFromVarId(tok->tokAt(5)->varId()))) !isSignedChar(symbolDatabase->getVariableFromVarId(tok->tokAt(5)->varId())))
@ -2187,7 +2187,7 @@ void CheckOther::checkCharVariable()
charBitOpError(tok->tokAt(4)); // This is an error.. charBitOpError(tok->tokAt(4)); // This is an error..
} }
else if (Token::Match(tok, "[;{}] %var% = %any% [&|] ( * %var% ) ;")) { else if (Token::Match(tok, "[;{}] %var% = %any% [&^|] ( * %var% ) ;")) {
const Variable* var = symbolDatabase->getVariableFromVarId(tok->tokAt(7)->varId()); const Variable* var = symbolDatabase->getVariableFromVarId(tok->tokAt(7)->varId());
if (!var || !var->isPointer()) if (!var || !var->isPointer())
continue; continue;
@ -2530,7 +2530,7 @@ static bool expressionHasSideEffects(const Token *first, const Token *last)
return true; return true;
// check for inc/dec // check for inc/dec
else if (Token::Match(tok, "++|--")) else if (tok->type() == Token::eIncDecOp)
return true; return true;
// check for function call // check for function call
@ -2960,7 +2960,7 @@ void CheckOther::checkExpressionRange(const std::list<Function> &constFunctions,
break; break;
} }
--brackets; --brackets;
} else if (tok->str() == "++" || tok->str() == "--") { } else if (tok->type() == Token::eIncDecOp) {
valid = false; valid = false;
break; break;
} }

View File

@ -921,9 +921,8 @@ void CheckStl::size()
} }
// check for using as boolean expression // check for using as boolean expression
else if (tok->strAt(-1) == "!" || else if ((Token::Match(tok->tokAt(-2), "if|while (") && end->str() == ")") ||
(Token::Match(tok->tokAt(-2), "if|while (") && end->str() == ")") || (tok->previous()->type() == Token::eLogicalOp && Token::Match(end, "&&|)|,|;|%oror%"))) {
(Token::Match(tok->previous(), "&&|%oror%") && Token::Match(end, "&&|)|%oror%"))) {
if (isStlContainer(varid)) if (isStlContainer(varid))
sizeError(tok1); sizeError(tok1);
} }

View File

@ -509,7 +509,7 @@ private:
return &tok; return &tok;
} }
if (Token::Match(tok.previous(), "++|--") || Token::Match(tok.next(), "++|--")) { if ((tok.previous() && tok.previous()->type() == Token::eIncDecOp) || (tok.next() && tok.next()->type() == Token::eIncDecOp)) {
use(checks, &tok); use(checks, &tok);
return &tok; return &tok;
} }
@ -961,8 +961,8 @@ public:
} else if (indentlevel == 0 && tok3->str() == ";") } else if (indentlevel == 0 && tok3->str() == ";")
break; break;
else if (indentlevel >= 1 && tok3->varId() == varid) { else if (indentlevel >= 1 && tok3->varId() == varid) {
if (Token::Match(tok3->previous(), "++|--") || if (tok3->previous()->type() == Token::eIncDecOp ||
Token::Match(tok3->next(), "++|--")) { tok3->next()->type() == Token::eIncDecOp) {
r = true; r = true;
} }

View File

@ -738,12 +738,12 @@ void CheckUnusedVar::checkFunctionVariableUsage_iterateScopes(const Scope* const
else if (tok->str() == "(") else if (tok->str() == "(")
tok = tok->next(); tok = tok->next();
if (Token::Match(tok, "++|--")) { if (tok->type() == Token::eIncDecOp) {
pre = true; pre = true;
tok = tok->next(); tok = tok->next();
} }
if (Token::Match(tok->next(), "++|--")) if (tok->next()->type() == Token::eIncDecOp)
post = true; post = true;
const unsigned int varid1 = tok->varId(); const unsigned int varid1 = tok->varId();

View File

@ -731,7 +731,7 @@ bool TemplateSimplifier::simplifyCalculations(Token *_tokens)
ret = true; ret = true;
} }
if (tok->str()[0] == '\'' && tok->str().size() == 3 && if (tok->type() == Token::eChar &&
Token::Match(tok->previous(), "(|&&|%oror% %any% ==|!=|<=|<|>=|> %num% &&|%oror%|)")) { Token::Match(tok->previous(), "(|&&|%oror% %any% ==|!=|<=|<|>=|> %num% &&|%oror%|)")) {
tok->str(MathLib::toString(tok->str()[1] & 0xff)); tok->str(MathLib::toString(tok->str()[1] & 0xff));
} }

View File

@ -172,7 +172,7 @@ unsigned int Tokenizer::sizeOfType(const Token *type) const
if (!type || type->str().empty()) if (!type || type->str().empty())
return 0; return 0;
if (type->str()[0] == '"') if (type->type() == Token::eString)
return static_cast<unsigned int>(Token::getStrLength(type) + 1); return static_cast<unsigned int>(Token::getStrLength(type) + 1);
std::map<std::string, unsigned int>::const_iterator it = _typeSize.find(type->str()); std::map<std::string, unsigned int>::const_iterator it = _typeSize.find(type->str());
@ -3315,7 +3315,7 @@ void Tokenizer::simplifySizeof()
} }
// sizeof 'x' // sizeof 'x'
if (tok->next() && tok->next()->str()[0] == '\'') { if (tok->next()->type() == Token::eChar) {
tok->deleteThis(); tok->deleteThis();
std::ostringstream sz; std::ostringstream sz;
sz << sizeof 'x'; sz << sizeof 'x';
@ -3335,7 +3335,7 @@ void Tokenizer::simplifySizeof()
} }
// sizeof "text" // sizeof "text"
if (Token::Match(tok->next(), "%str%")) { if (tok->next()->type() == Token::eString) {
tok->deleteThis(); tok->deleteThis();
std::ostringstream ostr; std::ostringstream ostr;
ostr << (Token::getStrLength(tok) + 1); ostr << (Token::getStrLength(tok) + 1);
@ -3396,7 +3396,7 @@ void Tokenizer::simplifySizeof()
// We are checking a class or struct, search next varname // We are checking a class or struct, search next varname
tempToken = tempToken->next(); tempToken = tempToken->next();
continue; continue;
} else if (Token::Match(tempToken->next(), "++|--")) { } else if (tempToken->next()->type() == Token::eIncDecOp) {
// We have variable++ or variable--, there should be // We have variable++ or variable--, there should be
// nothing after this // nothing after this
tempToken = tempToken->tokAt(2); tempToken = tempToken->tokAt(2);
@ -3497,7 +3497,7 @@ bool Tokenizer::simplifyTokenList()
// Combine wide strings // Combine wide strings
for (Token *tok = _tokens; tok; tok = tok->next()) { for (Token *tok = _tokens; tok; tok = tok->next()) {
while (tok->str() == "L" && tok->next() && tok->next()->str()[0] == '"') { while (tok->str() == "L" && tok->next() && tok->next()->type() == Token::eString) {
// Combine 'L "string"' // Combine 'L "string"'
tok->str(tok->next()->str()); tok->str(tok->next()->str());
tok->deleteNext(); tok->deleteNext();
@ -3510,7 +3510,7 @@ bool Tokenizer::simplifyTokenList()
continue; continue;
tok->str(simplifyString(tok->str())); tok->str(simplifyString(tok->str()));
while (tok->next() && tok->next()->str()[0] == '"') { while (tok->next() && tok->next()->type() == Token::eString) {
tok->next()->str(simplifyString(tok->next()->str())); tok->next()->str(simplifyString(tok->next()->str()));
// Two strings after each other, combine them // Two strings after each other, combine them
@ -4301,7 +4301,7 @@ void Tokenizer::simplifyCompoundAssignment()
for (Token *tok2 = tok->previous(); tok2 && tok2 != tok1; tok2 = tok2->previous()) { for (Token *tok2 = tok->previous(); tok2 && tok2 != tok1; tok2 = tok2->previous()) {
// Don't duplicate ++ and --. Put preincrement in lhs. Put // Don't duplicate ++ and --. Put preincrement in lhs. Put
// postincrement in rhs. // postincrement in rhs.
if (tok2->str() == "++" || tok2->str() == "--") { if (tok2->type() == Token::eIncDecOp) {
// pre increment/decrement => don't copy // pre increment/decrement => don't copy
if (tok2->next()->isName()) { if (tok2->next()->isName()) {
continue; continue;