diff --git a/lib/checkautovariables.cpp b/lib/checkautovariables.cpp index b24020435..414ae527e 100644 --- a/lib/checkautovariables.cpp +++ b/lib/checkautovariables.cpp @@ -21,6 +21,7 @@ //--------------------------------------------------------------------------- #include "checkautovariables.h" +#include "symboldatabase.h" #include #include @@ -140,6 +141,8 @@ void CheckAutoVariables::autoVariables() // Which variables have an unknown type? std::set unknown_type; + const SymbolDatabase * const symbolDatabase = _tokenizer->getSymbolDatabase(); + for (const Token *tok = _tokenizer->tokens(); tok; tok = tok->next()) { @@ -192,7 +195,7 @@ void CheckAutoVariables::autoVariables() { addVD(tok->next()->varId()); if (!tok->isStandardType() && - NULL == Token::findmatch(_tokenizer->tokens(), ("struct|class " + tok->str()).c_str())) + !symbolDatabase->isClassOrStruct(tok->str())) { unknown_type.insert(tok->next()->varId()); } diff --git a/lib/checkother.cpp b/lib/checkother.cpp index 2caf92f66..a7e955484 100644 --- a/lib/checkother.cpp +++ b/lib/checkother.cpp @@ -2100,6 +2100,8 @@ void CheckOther::checkConstantFunctionParameter() if (!_settings->_checkCodingStyle) return; + const SymbolDatabase * const symbolDatabase = _tokenizer->getSymbolDatabase(); + for (const Token *tok = _tokenizer->tokens(); tok; tok = tok->next()) { if (Token::Match(tok, "[,(] const std :: %type% %var% [,)]")) @@ -2140,8 +2142,7 @@ void CheckOther::checkConstantFunctionParameter() else if (Token::Match(tok, "[,(] const %type% %var% [,)]")) { // Check if type is a struct or class. - const std::string pattern(std::string("class|struct ") + tok->strAt(2)); - if (Token::findmatch(_tokenizer->tokens(), pattern.c_str())) + if (symbolDatabase->isClassOrStruct(tok->strAt(2))) { passedByValueError(tok, tok->strAt(3)); } @@ -2529,18 +2530,10 @@ void CheckOther::checkMisusedScopedObject() return; } - const SymbolDatabase *symbolDatabase = _tokenizer->getSymbolDatabase(); + const SymbolDatabase * const symbolDatabase = _tokenizer->getSymbolDatabase(); std::list::const_iterator i; - // list of classes / structs - std::set identifiers; - for (const Token *tok = _tokenizer->tokens(); tok; tok = tok->next()) - { - if (Token::Match(tok, "class|struct %var% [:{;]")) - identifiers.insert(tok->next()->str()); - } - for (i = symbolDatabase->spaceInfoList.begin(); i != symbolDatabase->spaceInfoList.end(); ++i) { const SymbolDatabase::SpaceInfo *info = *i; @@ -2566,7 +2559,7 @@ void CheckOther::checkMisusedScopedObject() if (Token::Match(tok, "[;{}] %var% (") && Token::Match(tok->tokAt(2)->link(), ") ;") - && identifiers.find(tok->next()->str()) != identifiers.end() + && symbolDatabase->isClassOrStruct(tok->next()->str()) ) { tok = tok->next(); diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index ea1401e7c..f7db79018 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -38,6 +38,13 @@ SymbolDatabase::SymbolDatabase(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) : _tokenizer(tokenizer), _settings(settings), _errorLogger(errorLogger) { + // fill the classAndStructTypes set.. + for (const Token *tok = _tokenizer->tokens(); tok; tok = tok->next()) + { + if (Token::Match(tok, "class|struct %var% [:{;]")) + classAndStructTypes.insert(tok->next()->str()); + } + // find all namespaces (class,struct and namespace) SpaceInfo *info = new SpaceInfo(this, NULL, NULL); spaceInfoList.push_back(info); diff --git a/lib/symboldatabase.h b/lib/symboldatabase.h index 177c981be..b9f54b995 100644 --- a/lib/symboldatabase.h +++ b/lib/symboldatabase.h @@ -24,6 +24,7 @@ #include #include #include +#include class Token; class Tokenizer; @@ -223,6 +224,11 @@ public: bool argsMatch(const SpaceInfo *info, const Token *first, const Token *second, const std::string &path, unsigned int depth) const; + bool isClassOrStruct(const std::string &type) const + { + return bool(classAndStructTypes.find(type) != classAndStructTypes.end()); + } + private: // Needed by Borland C++: @@ -233,6 +239,9 @@ private: const Token *initBaseInfo(SpaceInfo *info, const Token *tok); bool isFunction(const Token *tok, const Token **funcStart, const Token **argStart) const; + /** class/struct types */ + std::set classAndStructTypes; + const Tokenizer *_tokenizer; const Settings *_settings; ErrorLogger *_errorLogger;