diff --git a/lib/checkclass.cpp b/lib/checkclass.cpp index 4c71a0bf7..5958d09c4 100644 --- a/lib/checkclass.cpp +++ b/lib/checkclass.cpp @@ -68,11 +68,11 @@ void CheckClass::constructors() createSymbolDatabase(); - std::list::const_iterator i; + std::list::const_iterator i; for (i = symbolDatabase->spaceInfoList.begin(); i != symbolDatabase->spaceInfoList.end(); ++i) { - const SymbolDatabase::SpaceInfo *info = *i; + const SpaceInfo *info = *i; // only check classes and structures if (!info->isClassOrStruct()) @@ -82,10 +82,10 @@ void CheckClass::constructors() if (info->numConstructors == 0) { // If there is a private variable, there should be a constructor.. - std::list::const_iterator var; + std::list::const_iterator var; for (var = info->varlist.begin(); var != info->varlist.end(); ++var) { - if (var->access == SymbolDatabase::Private && !var->isClass && !var->isStatic) + if (var->access == Private && !var->isClass && !var->isStatic) { noConstructorError(info->classDef, info->className, info->classDef->str() == "struct"); break; @@ -93,14 +93,14 @@ void CheckClass::constructors() } } - std::list::const_iterator func; + std::list::const_iterator func; std::vector usage(info->varlist.size()); for (func = info->functionList.begin(); func != info->functionList.end(); ++func) { - if (!func->hasBody || !(func->type == SymbolDatabase::Func::Constructor || - func->type == SymbolDatabase::Func::CopyConstructor || - func->type == SymbolDatabase::Func::OperatorEqual)) + if (!func->hasBody || !(func->type == Func::Constructor || + func->type == Func::CopyConstructor || + func->type == Func::OperatorEqual)) continue; // Mark all variables not used @@ -110,7 +110,7 @@ void CheckClass::constructors() initializeVarList(*func, callstack, info, usage); // Check if any variables are uninitialized - std::list::const_iterator var; + std::list::const_iterator var; unsigned int count = 0; for (var = info->varlist.begin(); var != info->varlist.end(); ++var, ++count) { @@ -121,7 +121,7 @@ void CheckClass::constructors() continue; // Check if this is a class constructor - if (var->isClass && func->type == SymbolDatabase::Func::Constructor) + if (var->isClass && func->type == Func::Constructor) { // Unknown type so assume it is initialized if (!var->type) @@ -129,12 +129,12 @@ void CheckClass::constructors() // Known type that doesn't need initialization or // known type that has member variables of an unknown type - else if (var->type->needInitialization != SymbolDatabase::SpaceInfo::True) + else if (var->type->needInitialization != SpaceInfo::True) continue; } // It's non-static and it's not initialized => error - if (func->type == SymbolDatabase::Func::OperatorEqual) + if (func->type == Func::OperatorEqual) { const Token *operStart = 0; if (func->token->str() == "=") @@ -155,16 +155,16 @@ void CheckClass::constructors() if (classNameUsed) operatorEqVarError(func->token, info->className, var->token->str()); } - else if (func->access != SymbolDatabase::Private) + else if (func->access != Private) uninitVarError(func->token, info->className, var->token->str()); } } } } -void CheckClass::assignVar(const std::string &varname, const SymbolDatabase::SpaceInfo *info, std::vector &usage) +void CheckClass::assignVar(const std::string &varname, const SpaceInfo *info, std::vector &usage) { - std::list::const_iterator var; + std::list::const_iterator var; unsigned int count = 0; for (var = info->varlist.begin(); var != info->varlist.end(); ++var, ++count) @@ -177,9 +177,9 @@ void CheckClass::assignVar(const std::string &varname, const SymbolDatabase::Spa } } -void CheckClass::initVar(const std::string &varname, const SymbolDatabase::SpaceInfo *info, std::vector &usage) +void CheckClass::initVar(const std::string &varname, const SpaceInfo *info, std::vector &usage) { - std::list::const_iterator var; + std::list::const_iterator var; unsigned int count = 0; for (var = info->varlist.begin(); var != info->varlist.end(); ++var, ++count) @@ -207,17 +207,17 @@ void CheckClass::clearAllVar(std::vector &usage) } } -bool CheckClass::isBaseClassFunc(const Token *tok, const SymbolDatabase::SpaceInfo *info) +bool CheckClass::isBaseClassFunc(const Token *tok, const SpaceInfo *info) { // Iterate through each base class... for (size_t i = 0; i < info->derivedFrom.size(); ++i) { - const SymbolDatabase::SpaceInfo *derivedFrom = info->derivedFrom[i].spaceInfo; + const SpaceInfo *derivedFrom = info->derivedFrom[i].spaceInfo; // Check if base class exists in database if (derivedFrom) { - std::list::const_iterator func; + std::list::const_iterator func; for (func = derivedFrom->functionList.begin(); func != derivedFrom->functionList.end(); ++func) { @@ -234,7 +234,7 @@ bool CheckClass::isBaseClassFunc(const Token *tok, const SymbolDatabase::SpaceIn return false; } -void CheckClass::initializeVarList(const SymbolDatabase::Func &func, std::list &callstack, const SymbolDatabase::SpaceInfo *info, std::vector &usage) +void CheckClass::initializeVarList(const Func &func, std::list &callstack, const SpaceInfo *info, std::vector &usage) { bool Assign = false; unsigned int indentlevel = 0; @@ -302,7 +302,7 @@ void CheckClass::initializeVarList(const SymbolDatabase::Func &func, std::listnext(), "%var% . %var% (")) { - std::list::const_iterator var; + std::list::const_iterator var; for (var = info->varlist.begin(); var != info->varlist.end(); ++var) { if (var->token->varId() == ftok->next()->varId()) @@ -359,10 +359,10 @@ void CheckClass::initializeVarList(const SymbolDatabase::Func &func, std::listprevious()->str() != "::") { // check if member function exists - std::list::const_iterator it; + std::list::const_iterator it; for (it = info->functionList.begin(); it != info->functionList.end(); ++it) { - if (ftok->next()->str() == it->tokenDef->str() && it->type != SymbolDatabase::Func::Constructor) + if (ftok->next()->str() == it->tokenDef->str() && it->type != Func::Constructor) break; } @@ -412,10 +412,10 @@ void CheckClass::initializeVarList(const SymbolDatabase::Func &func, std::list::const_iterator it; + std::list::const_iterator it; for (it = info->functionList.begin(); it != info->functionList.end(); ++it) { - if (ftok->str() == it->tokenDef->str() && it->type != SymbolDatabase::Func::Constructor) + if (ftok->str() == it->tokenDef->str() && it->type != Func::Constructor) break; } @@ -442,7 +442,7 @@ void CheckClass::initializeVarList(const SymbolDatabase::Func &func, std::list::const_iterator i; + std::list::const_iterator i; for (i = symbolDatabase->spaceInfoList.begin(); i != symbolDatabase->spaceInfoList.end(); ++i) { - const SymbolDatabase::SpaceInfo *info = *i; + const SpaceInfo *info = *i; // only check classes and structures if (!info->isClassOrStruct()) @@ -588,13 +588,13 @@ void CheckClass::privateFunctions() // check that the whole class implementation is seen bool whole = true; - std::list::const_iterator func; + std::list::const_iterator func; for (func = info->functionList.begin(); func != info->functionList.end(); ++func) { if (!func->hasBody) { // empty private copy constructors and assignment operators are OK - if ((func->type == SymbolDatabase::Func::CopyConstructor || func->type == SymbolDatabase::Func::OperatorEqual) && func->access == SymbolDatabase::Private) + if ((func->type == Func::CopyConstructor || func->type == Func::OperatorEqual) && func->access == Private) continue; whole = false; @@ -614,8 +614,8 @@ void CheckClass::privateFunctions() for (func = info->functionList.begin(); func != info->functionList.end(); ++func) { // Get private functions.. - if (func->type == SymbolDatabase::Func::Function && - func->access == SymbolDatabase::Private && func->hasBody) + if (func->type == Func::Function && + func->access == Private && func->hasBody) FuncList.push_back(func->tokenDef); } } @@ -834,15 +834,15 @@ void CheckClass::operatorEq() createSymbolDatabase(); - std::list::const_iterator i; + std::list::const_iterator i; for (i = symbolDatabase->spaceInfoList.begin(); i != symbolDatabase->spaceInfoList.end(); ++i) { - std::list::const_iterator it; + std::list::const_iterator it; for (it = (*i)->functionList.begin(); it != (*i)->functionList.end(); ++it) { - if (it->type == SymbolDatabase::Func::OperatorEqual && it->access != SymbolDatabase::Private) + if (it->type == Func::OperatorEqual && it->access != Private) { if (it->token->strAt(-2) == "void") operatorEqReturnError(it->token->tokAt(-2)); @@ -861,7 +861,7 @@ void CheckClass::operatorEqReturnError(const Token *tok) // operator= should return a reference to *this //--------------------------------------------------------------------------- -void CheckClass::checkReturnPtrThis(const SymbolDatabase::SpaceInfo *info, const SymbolDatabase::Func *func, const Token *tok, const Token *last) +void CheckClass::checkReturnPtrThis(const SpaceInfo *info, const Func *func, const Token *tok, const Token *last) { bool foundReturn = false; @@ -879,13 +879,13 @@ void CheckClass::checkReturnPtrThis(const SymbolDatabase::SpaceInfo *info, const if (Token::Match(tok->tokAt(1), "%any% (") && tok->tokAt(2)->link()->next()->str() == ";") { - std::list::const_iterator it; + std::list::const_iterator it; // check if it is a member function for (it = info->functionList.begin(); it != info->functionList.end(); ++it) { // check for a regular function with the same name and a bofy - if (it->type == SymbolDatabase::Func::Function && it->hasBody && + if (it->type == Func::Function && it->hasBody && it->token->str() == tok->next()->str()) { // check for the proper return type @@ -918,20 +918,20 @@ void CheckClass::operatorEqRetRefThis() createSymbolDatabase(); - std::list::const_iterator i; + std::list::const_iterator i; for (i = symbolDatabase->spaceInfoList.begin(); i != symbolDatabase->spaceInfoList.end(); ++i) { - const SymbolDatabase::SpaceInfo *info = *i; + const SpaceInfo *info = *i; // only check classes and structures if (info->isClassOrStruct()) { - std::list::const_iterator func; + std::list::const_iterator func; for (func = info->functionList.begin(); func != info->functionList.end(); ++func) { - if (func->type == SymbolDatabase::Func::OperatorEqual && func->hasBody) + if (func->type == Func::OperatorEqual && func->hasBody) { // make sure return signature is correct if (Token::Match(func->tokenDef->tokAt(-4), ";|}|{|public:|protected:|private: %type% &") && @@ -974,12 +974,12 @@ void CheckClass::operatorEqToSelf() createSymbolDatabase(); - std::list::const_iterator i; + std::list::const_iterator i; for (i = symbolDatabase->spaceInfoList.begin(); i != symbolDatabase->spaceInfoList.end(); ++i) { - const SymbolDatabase::SpaceInfo *info = *i; - std::list::const_iterator it; + const SpaceInfo *info = *i; + std::list::const_iterator it; // skip classes with multiple inheritance if (info->derivedFrom.size() > 1) @@ -987,7 +987,7 @@ void CheckClass::operatorEqToSelf() for (it = info->functionList.begin(); it != info->functionList.end(); ++it) { - if (it->type == SymbolDatabase::Func::OperatorEqual && it->hasBody) + if (it->type == Func::OperatorEqual && it->hasBody) { // make sure return signature is correct if (Token::Match(it->tokenDef->tokAt(-4), ";|}|{|public:|protected:|private: %type% &") && @@ -1151,18 +1151,18 @@ void CheckClass::virtualDestructor() createSymbolDatabase(); - std::list::const_iterator i; + std::list::const_iterator i; for (i = symbolDatabase->spaceInfoList.begin(); i != symbolDatabase->spaceInfoList.end(); ++i) { - const SymbolDatabase::SpaceInfo *info = *i; + const SpaceInfo *info = *i; // Skip base classes and namespaces if (info->derivedFrom.empty()) continue; // Find the destructor - const SymbolDatabase::Func *destructor = info->getDestructor(); + const Func *destructor = info->getDestructor(); // Check for destructor with implementation if (!destructor || !destructor->hasBody) @@ -1179,15 +1179,15 @@ void CheckClass::virtualDestructor() for (unsigned int j = 0; j < info->derivedFrom.size(); ++j) { // Check if base class is public and exists in database - if (info->derivedFrom[j].access != SymbolDatabase::Private && info->derivedFrom[j].spaceInfo) + if (info->derivedFrom[j].access != Private && info->derivedFrom[j].spaceInfo) { - const SymbolDatabase::SpaceInfo *spaceInfo = info->derivedFrom[j].spaceInfo; + const SpaceInfo *spaceInfo = info->derivedFrom[j].spaceInfo; // Name of base class.. const std::string baseName = spaceInfo->className; // Find the destructor declaration for the base class. - const SymbolDatabase::Func *base_destructor = spaceInfo->getDestructor(); + const Func *base_destructor = spaceInfo->getDestructor(); const Token *base = 0; if (base_destructor) base = base_destructor->token; @@ -1211,7 +1211,7 @@ void CheckClass::virtualDestructor() // Make sure that the destructor is public (protected or private // would not compile if inheritance is used in a way that would // cause the bug we are trying to find here.) - if (base_destructor->access == SymbolDatabase::Public) + if (base_destructor->access == Public) virtualDestructorError(base, baseName, derivedClass->str()); } } @@ -1270,22 +1270,22 @@ void CheckClass::checkConst() createSymbolDatabase(); - std::list::const_iterator it; + std::list::const_iterator it; for (it = symbolDatabase->spaceInfoList.begin(); it != symbolDatabase->spaceInfoList.end(); ++it) { - const SymbolDatabase::SpaceInfo *info = *it; + const SpaceInfo *info = *it; // only check classes and structures if (!info->isClassOrStruct()) continue; - std::list::const_iterator func; + std::list::const_iterator func; for (func = info->functionList.begin(); func != info->functionList.end(); ++func) { // does the function have a body? - if (func->type == SymbolDatabase::Func::Function && func->hasBody && !func->isFriend && !func->isStatic && !func->isConst && !func->isVirtual) + if (func->type == Func::Function && func->hasBody && !func->isFriend && !func->isStatic && !func->isConst && !func->isVirtual) { // get last token of return type const Token *previous = func->tokenDef->isName() ? func->token->previous() : func->token->tokAt(-2); @@ -1353,8 +1353,8 @@ void CheckClass::checkConst() if (checkConstFunc(info, paramEnd)) { std::string classname = info->className; - const SymbolDatabase::SpaceInfo *nest = info->nestedIn; - while (nest && nest->type != SymbolDatabase::SpaceInfo::Global) + const SpaceInfo *nest = info->nestedIn; + while (nest && nest->type != SpaceInfo::Global) { classname = std::string(nest->className + "::" + classname); nest = nest->nestedIn; @@ -1378,7 +1378,7 @@ void CheckClass::checkConst() } } -bool CheckClass::isMemberVar(const SymbolDatabase::SpaceInfo *info, const Token *tok) +bool CheckClass::isMemberVar(const SpaceInfo *info, const Token *tok) { const Token *tok1 = tok; @@ -1400,7 +1400,7 @@ bool CheckClass::isMemberVar(const SymbolDatabase::SpaceInfo *info, const Token if (tok->str() == info->className && tok->next()->str() == "::") tok = tok->tokAt(2); - std::list::const_iterator var; + std::list::const_iterator var; for (var = info->varlist.begin(); var != info->varlist.end(); ++var) { if (var->token->str() == tok->str()) @@ -1416,7 +1416,7 @@ bool CheckClass::isMemberVar(const SymbolDatabase::SpaceInfo *info, const Token for (unsigned int i = 0; i < info->derivedFrom.size(); ++i) { // find the base class - const SymbolDatabase::SpaceInfo *spaceInfo = info->derivedFrom[i].spaceInfo; + const SpaceInfo *spaceInfo = info->derivedFrom[i].spaceInfo; // find the function in the base class if (spaceInfo) @@ -1430,9 +1430,9 @@ bool CheckClass::isMemberVar(const SymbolDatabase::SpaceInfo *info, const Token return false; } -bool CheckClass::isConstMemberFunc(const SymbolDatabase::SpaceInfo *info, const Token *tok) +bool CheckClass::isConstMemberFunc(const SpaceInfo *info, const Token *tok) { - std::list::const_iterator func; + std::list::const_iterator func; for (func = info->functionList.begin(); func != info->functionList.end(); ++func) { @@ -1447,7 +1447,7 @@ bool CheckClass::isConstMemberFunc(const SymbolDatabase::SpaceInfo *info, const for (unsigned int i = 0; i < info->derivedFrom.size(); ++i) { // find the base class - const SymbolDatabase::SpaceInfo *spaceInfo = info->derivedFrom[i].spaceInfo; + const SpaceInfo *spaceInfo = info->derivedFrom[i].spaceInfo; // find the function in the base class if (spaceInfo) @@ -1461,7 +1461,7 @@ bool CheckClass::isConstMemberFunc(const SymbolDatabase::SpaceInfo *info, const return false; } -bool CheckClass::checkConstFunc(const SymbolDatabase::SpaceInfo *info, const Token *tok) +bool CheckClass::checkConstFunc(const SpaceInfo *info, const Token *tok) { // if the function doesn't have any assignment nor function call, // it can be a const function.. @@ -1558,7 +1558,7 @@ bool CheckClass::checkConstFunc(const SymbolDatabase::SpaceInfo *info, const Tok //--------------------------------------------------------------------------- // check if this function is defined virtual in the base classes -bool CheckClass::isVirtualFunc(const SymbolDatabase::SpaceInfo *info, const Token *functionToken) const +bool CheckClass::isVirtualFunc(const SpaceInfo *info, const Token *functionToken) const { // check each base class for (unsigned int i = 0; i < info->derivedFrom.size(); ++i) @@ -1566,9 +1566,9 @@ bool CheckClass::isVirtualFunc(const SymbolDatabase::SpaceInfo *info, const Toke // check if base class exists in database if (info->derivedFrom[i].spaceInfo) { - const SymbolDatabase::SpaceInfo *derivedFrom = info->derivedFrom[i].spaceInfo; + const SpaceInfo *derivedFrom = info->derivedFrom[i].spaceInfo; - std::list::const_iterator func; + std::list::const_iterator func; // check if function defined in base class for (func = derivedFrom->functionList.begin(); func != derivedFrom->functionList.end(); ++func) diff --git a/lib/checkclass.h b/lib/checkclass.h index 9a8717720..1d393acf0 100644 --- a/lib/checkclass.h +++ b/lib/checkclass.h @@ -163,18 +163,18 @@ private: } // operatorEqRetRefThis helper function - void checkReturnPtrThis(const SymbolDatabase::SpaceInfo *info, const SymbolDatabase::Func *func, const Token *tok, const Token *last); + void checkReturnPtrThis(const SpaceInfo *info, const Func *func, const Token *tok, const Token *last); // operatorEqToSelf helper functions bool hasDeallocation(const Token *first, const Token *last); bool hasAssignSelf(const Token *first, const Token *last, const Token *rhs); // checkConst helper functions - bool isMemberVar(const SymbolDatabase::SpaceInfo *info, const Token *tok); - bool isConstMemberFunc(const SymbolDatabase::SpaceInfo *info, const Token *tok); - bool checkConstFunc(const SymbolDatabase::SpaceInfo *info, const Token *tok); + bool isMemberVar(const SpaceInfo *info, const Token *tok); + bool isConstMemberFunc(const SpaceInfo *info, const Token *tok); + bool checkConstFunc(const SpaceInfo *info, const Token *tok); /** @brief check if this function is virtual in the base classes */ - bool isVirtualFunc(const SymbolDatabase::SpaceInfo *info, const Token *functionToken) const; + bool isVirtualFunc(const SpaceInfo *info, const Token *functionToken) const; // constructors helper function /** @brief Information about a member variable. Used when checking for uninitialized variables */ @@ -189,7 +189,7 @@ private: bool init; }; - bool isBaseClassFunc(const Token *tok, const SymbolDatabase::SpaceInfo *info); + bool isBaseClassFunc(const Token *tok, const SpaceInfo *info); /** * @brief assign a variable in the varlist @@ -197,7 +197,7 @@ private: * @param info pointer to variable SpaceInfo * @param usage reference to usage vector */ - void assignVar(const std::string &varname, const SymbolDatabase::SpaceInfo *info, std::vector &usage); + void assignVar(const std::string &varname, const SpaceInfo *info, std::vector &usage); /** * @brief initialize a variable in the varlist @@ -205,7 +205,7 @@ private: * @param info pointer to variable SpaceInfo * @param usage reference to usage vector */ - void initVar(const std::string &varname, const SymbolDatabase::SpaceInfo *info, std::vector &usage); + void initVar(const std::string &varname, const SpaceInfo *info, std::vector &usage); /** * @brief set all variables in list assigned @@ -226,7 +226,7 @@ private: * @param info pointer to variable SpaceInfo * @param usage reference to usage vector */ - void initializeVarList(const SymbolDatabase::Func &func, std::list &callstack, const SymbolDatabase::SpaceInfo *info, std::vector &usage); + void initializeVarList(const Func &func, std::list &callstack, const SpaceInfo *info, std::vector &usage); }; /// @} //--------------------------------------------------------------------------- diff --git a/lib/checkmemoryleak.cpp b/lib/checkmemoryleak.cpp index 62d883e11..c60a74e6d 100644 --- a/lib/checkmemoryleak.cpp +++ b/lib/checkmemoryleak.cpp @@ -565,14 +565,14 @@ void CheckMemoryLeakInFunction::parse_noreturn() noreturn.insert("errx"); noreturn.insert("verrx"); - std::list::const_iterator i; + std::list::const_iterator i; for (i = symbolDatabase->spaceInfoList.begin(); i != symbolDatabase->spaceInfoList.end(); ++i) { - const SymbolDatabase::SpaceInfo *info = *i; + const SpaceInfo *info = *i; // only check functions - if (info->type != SymbolDatabase::SpaceInfo::Function) + if (info->type != SpaceInfo::Function) continue; // parse this function to check if it contains an "exit" call.. @@ -2491,14 +2491,14 @@ void CheckMemoryLeakInFunction::checkScope(const Token *Tok1, const std::string //--------------------------------------------------------------------------- void CheckMemoryLeakInFunction::checkReallocUsage() { - std::list::const_iterator i; + std::list::const_iterator i; for (i = symbolDatabase->spaceInfoList.begin(); i != symbolDatabase->spaceInfoList.end(); ++i) { - const SymbolDatabase::SpaceInfo *info = *i; + const SpaceInfo *info = *i; // only check functions - if (info->type != SymbolDatabase::SpaceInfo::Function) + if (info->type != SpaceInfo::Function) continue; // Record the varid's of the function parameters @@ -2644,14 +2644,14 @@ void CheckMemoryLeakInFunction::check() // fill the "noreturn" parse_noreturn(); - std::list::const_iterator i; + std::list::const_iterator i; for (i = symbolDatabase->spaceInfoList.begin(); i != symbolDatabase->spaceInfoList.end(); ++i) { - const SymbolDatabase::SpaceInfo *info = *i; + const SpaceInfo *info = *i; // only check functions - if (info->type != SymbolDatabase::SpaceInfo::Function) + if (info->type != SpaceInfo::Function) continue; const Token *tok = info->classStart; @@ -2701,16 +2701,16 @@ void CheckMemoryLeakInClass::check() { const SymbolDatabase *symbolDatabase = _tokenizer->getSymbolDatabase(); - std::list::const_iterator i; + std::list::const_iterator i; for (i = symbolDatabase->spaceInfoList.begin(); i != symbolDatabase->spaceInfoList.end(); ++i) { - const SymbolDatabase::SpaceInfo *info = *i; + const SpaceInfo *info = *i; // only check classes and structures - if (info->type == SymbolDatabase::SpaceInfo::Class) + if (info->type == SpaceInfo::Class) { - std::list::const_iterator var; + std::list::const_iterator var; for (var = info->varlist.begin(); var != info->varlist.end(); ++var) { if (!var->isStatic && var->token->previous()->str() == "*") @@ -2718,7 +2718,7 @@ void CheckMemoryLeakInClass::check() // allocation but no deallocation of private variables in public function.. if (var->token->tokAt(-2)->isStandardType()) { - if (var->access == SymbolDatabase::Private) + if (var->access == Private) checkPublicFunctions(info, var->token); variable(info, var->token); @@ -2730,7 +2730,7 @@ void CheckMemoryLeakInClass::check() // not derived and no constructor? if (var->type->derivedFrom.empty() && var->type->numConstructors == 0) { - if (var->access == SymbolDatabase::Private) + if (var->access == Private) checkPublicFunctions(info, var->token); variable(info, var->token); @@ -2743,7 +2743,7 @@ void CheckMemoryLeakInClass::check() } -void CheckMemoryLeakInClass::variable(const SymbolDatabase::SpaceInfo *classinfo, const Token *tokVarname) +void CheckMemoryLeakInClass::variable(const SpaceInfo *classinfo, const Token *tokVarname) { const std::string varname = tokVarname->strAt(0); const std::string classname = classinfo->className; @@ -2756,12 +2756,12 @@ void CheckMemoryLeakInClass::variable(const SymbolDatabase::SpaceInfo *classinfo bool deallocInDestructor = false; // Inspect member functions - std::list::const_iterator func; + std::list::const_iterator func; for (func = classinfo->functionList.begin(); func != classinfo->functionList.end(); ++func) { const Token *functionToken = func->token; - const bool constructor = func->type == SymbolDatabase::Func::Constructor; - const bool destructor = func->type == SymbolDatabase::Func::Destructor; + const bool constructor = func->type == Func::Constructor; + const bool destructor = func->type == Func::Destructor; unsigned int indent = 0; bool initlist = false; for (const Token *tok = functionToken; tok; tok = tok->next()) @@ -2879,7 +2879,7 @@ void CheckMemoryLeakInClass::variable(const SymbolDatabase::SpaceInfo *classinfo } -void CheckMemoryLeakInClass::checkPublicFunctions(const SymbolDatabase::SpaceInfo *spaceinfo, const Token *classtok) +void CheckMemoryLeakInClass::checkPublicFunctions(const SpaceInfo *spaceinfo, const Token *classtok) { // Check that public functions deallocate the pointers that they allocate. // There is no checking how these functions are used and therefore it @@ -2891,12 +2891,12 @@ void CheckMemoryLeakInClass::checkPublicFunctions(const SymbolDatabase::SpaceInf // Parse public functions.. // If they allocate member variables, they should also deallocate - std::list::const_iterator func; + std::list::const_iterator func; for (func = spaceinfo->functionList.begin(); func != spaceinfo->functionList.end(); ++func) { - if (func->type != SymbolDatabase::Func::Constructor && - func->access == SymbolDatabase::Public && func->hasBody) + if (func->type != Func::Constructor && + func->access == Public && func->hasBody) { const Token *tok2 = func->token; while (tok2->str() != "{") @@ -3166,14 +3166,14 @@ void CheckMemoryLeakNoVar::check() const SymbolDatabase *symbolDatabase = _tokenizer->getSymbolDatabase(); - std::list::const_iterator i; + std::list::const_iterator i; for (i = symbolDatabase->spaceInfoList.begin(); i != symbolDatabase->spaceInfoList.end(); ++i) { - SymbolDatabase::SpaceInfo *info = *i; + SpaceInfo *info = *i; // only check functions - if (info->type != SymbolDatabase::SpaceInfo::Function) + if (info->type != SpaceInfo::Function) continue; // goto the "}" that ends the executable scope.. diff --git a/lib/checkmemoryleak.h b/lib/checkmemoryleak.h index 961b0d258..3875d2f9d 100644 --- a/lib/checkmemoryleak.h +++ b/lib/checkmemoryleak.h @@ -387,10 +387,10 @@ public: void check(); private: - void variable(const SymbolDatabase::SpaceInfo *spaceinfo, const Token *tokVarname); + void variable(const SpaceInfo *spaceinfo, const Token *tokVarname); /** Public functions: possible double-allocation */ - void checkPublicFunctions(const SymbolDatabase::SpaceInfo *spaceinfo, const Token *classtok); + void checkPublicFunctions(const SpaceInfo *spaceinfo, const Token *classtok); void publicAllocationError(const Token *tok, const std::string &varname); void getErrorMessages(ErrorLogger * /*errorLogger*/, const Settings * /*settings*/) diff --git a/lib/checkother.cpp b/lib/checkother.cpp index ff3f83d23..14c4bc863 100644 --- a/lib/checkother.cpp +++ b/lib/checkother.cpp @@ -1240,14 +1240,14 @@ void CheckOther::functionVariableUsage() // Parse all executing scopes.. const SymbolDatabase *symbolDatabase = _tokenizer->getSymbolDatabase(); - std::list::const_iterator i; + std::list::const_iterator i; for (i = symbolDatabase->spaceInfoList.begin(); i != symbolDatabase->spaceInfoList.end(); ++i) { - const SymbolDatabase::SpaceInfo *info = *i; + const SpaceInfo *info = *i; // only check functions - if (info->type != SymbolDatabase::SpaceInfo::Function) + if (info->type != SpaceInfo::Function) continue; // First token for the current scope.. @@ -1694,7 +1694,7 @@ void CheckOther::functionVariableUsage() if (!start->tokAt(3)->isStandardType()) { // lookup the type - const SymbolDatabase::SpaceInfo *type = symbolDatabase->findVarType(info, start->tokAt(3)); + const SpaceInfo *type = symbolDatabase->findVarType(info, start->tokAt(3)); // unknown type? if (!type) @@ -1702,7 +1702,7 @@ void CheckOther::functionVariableUsage() // has default constructor or // has members with unknown type or default constructor - else if (type->needInitialization == SymbolDatabase::SpaceInfo::False) + else if (type->needInitialization == SpaceInfo::False) allocate = false; } } @@ -1908,14 +1908,14 @@ void CheckOther::checkVariableScope() const SymbolDatabase *symbolDatabase = _tokenizer->getSymbolDatabase(); - std::list::const_iterator i; + std::list::const_iterator i; for (i = symbolDatabase->spaceInfoList.begin(); i != symbolDatabase->spaceInfoList.end(); ++i) { - const SymbolDatabase::SpaceInfo *info = *i; + const SpaceInfo *info = *i; // only check functions - if (info->type != SymbolDatabase::SpaceInfo::Function) + if (info->type != SpaceInfo::Function) continue; // Walk through all tokens.. @@ -2536,14 +2536,14 @@ void CheckOther::checkMisusedScopedObject() const SymbolDatabase * const symbolDatabase = _tokenizer->getSymbolDatabase(); - std::list::const_iterator i; + std::list::const_iterator i; for (i = symbolDatabase->spaceInfoList.begin(); i != symbolDatabase->spaceInfoList.end(); ++i) { - const SymbolDatabase::SpaceInfo *info = *i; + const SpaceInfo *info = *i; // only check functions - if (info->type != SymbolDatabase::SpaceInfo::Function) + if (info->type != SpaceInfo::Function) continue; unsigned int depth = 0; diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index 31bf15a2a..ec0539322 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -249,7 +249,7 @@ SymbolDatabase::SymbolDatabase(const Tokenizer *tokenizer, const Settings *setti // friend class declaration? else if (Token::Match(tok, "friend class| %any% ;")) { - FriendInfo friendInfo; + SpaceInfo::FriendInfo friendInfo; friendInfo.name = tok->strAt(1) == "class" ? tok->strAt(2) : tok->strAt(1); /** @todo fill this in later after parsing is complete */ @@ -411,11 +411,11 @@ SymbolDatabase::SymbolDatabase(const Tokenizer *tokenizer, const Settings *setti // check for default constructor bool hasDefaultConstructor = false; - std::list::const_iterator func; + std::list::const_iterator func; for (func = info->functionList.begin(); func != info->functionList.end(); ++func) { - if (func->type == SymbolDatabase::Func::Constructor) + if (func->type == Func::Constructor) { // check for no arguments: func ( ) if (func->argDef->next() == func->argDef->link()) @@ -745,7 +745,7 @@ void SymbolDatabase::addFunction(SpaceInfo **info, const Token **tok, const Toke func->arg = argStart; } } - else if (func->type == SymbolDatabase::Func::Destructor && + else if (func->type == Func::Destructor && (*tok)->previous()->str() == "~" && func->tokenDef->str() == (*tok)->str()) { @@ -803,7 +803,7 @@ void SymbolDatabase::addFunction(SpaceInfo **info, const Token **tok, const Toke addNewFunction(info, tok); } -void SymbolDatabase::addNewFunction(SymbolDatabase::SpaceInfo **info, const Token **tok) +void SymbolDatabase::addNewFunction(SpaceInfo **info, const Token **tok) { const Token *tok1 = *tok; SpaceInfo *new_info = new SpaceInfo(this, tok1, *info); @@ -853,7 +853,7 @@ const Token *SymbolDatabase::initBaseInfo(SpaceInfo *info, const Token *tok) // check for base classes else if (level == 0 && Token::Match(tok2, ":|,")) { - BaseInfo base; + SpaceInfo::BaseInfo base; tok2 = tok2->next(); @@ -924,7 +924,7 @@ const Token *SymbolDatabase::initBaseInfo(SpaceInfo *info, const Token *tok) //--------------------------------------------------------------------------- -unsigned int SymbolDatabase::Func::argCount() const +unsigned int Func::argCount() const { unsigned int count = 0; @@ -942,7 +942,7 @@ unsigned int SymbolDatabase::Func::argCount() const return count; } -unsigned int SymbolDatabase::Func::initializedArgCount() const +unsigned int Func::initializedArgCount() const { unsigned int count = 0; @@ -960,7 +960,7 @@ unsigned int SymbolDatabase::Func::initializedArgCount() const //--------------------------------------------------------------------------- -SymbolDatabase::SpaceInfo::SpaceInfo(SymbolDatabase *check_, const Token *classDef_, SymbolDatabase::SpaceInfo *nestedIn_) : +SpaceInfo::SpaceInfo(SymbolDatabase *check_, const Token *classDef_, SpaceInfo *nestedIn_) : check(check_), classDef(classDef_), classStart(NULL), @@ -1011,7 +1011,7 @@ SymbolDatabase::SpaceInfo::SpaceInfo(SymbolDatabase *check_, const Token *classD } bool -SymbolDatabase::SpaceInfo::hasDefaultConstructor() const +SpaceInfo::hasDefaultConstructor() const { if (numConstructors) { @@ -1028,7 +1028,7 @@ SymbolDatabase::SpaceInfo::hasDefaultConstructor() const } // Get variable list.. -void SymbolDatabase::SpaceInfo::getVarList() +void SpaceInfo::getVarList() { AccessControl varaccess = type == Class ? Private : Public; const Token *start; @@ -1230,7 +1230,7 @@ const Token* skipPointers(const Token* tok) return ret; } -bool SymbolDatabase::SpaceInfo::isVariableDeclaration(const Token* tok, const Token*& vartok, const Token*& typetok) const +bool SpaceInfo::isVariableDeclaration(const Token* tok, const Token*& vartok, const Token*& typetok) const { const Token* localTypeTok = skipScopeIdentifiers(tok); @@ -1271,17 +1271,17 @@ bool SymbolDatabase::SpaceInfo::isVariableDeclaration(const Token* tok, const To return NULL != vartok; } -bool SymbolDatabase::SpaceInfo::isSimpleVariable(const Token* tok) const +bool SpaceInfo::isSimpleVariable(const Token* tok) const { return Token::Match(tok, "%var% ;"); } -bool SymbolDatabase::SpaceInfo::isArrayVariable(const Token* tok) const +bool SpaceInfo::isArrayVariable(const Token* tok) const { return Token::Match(tok, "%var% [") && tok->next()->str() != "operator"; } -bool SymbolDatabase::SpaceInfo::findClosingBracket(const Token* tok, const Token*& close) const +bool SpaceInfo::findClosingBracket(const Token* tok, const Token*& close) const { bool found = false; if (NULL != tok && tok->str() == "<") @@ -1310,7 +1310,7 @@ bool SymbolDatabase::SpaceInfo::findClosingBracket(const Token* tok, const Token //--------------------------------------------------------------------------- -const SymbolDatabase::SpaceInfo *SymbolDatabase::findVarType(const SpaceInfo *start, const Token *type) const +const SpaceInfo *SymbolDatabase::findVarType(const SpaceInfo *start, const Token *type) const { std::list::const_iterator it; @@ -1352,7 +1352,7 @@ const SymbolDatabase::SpaceInfo *SymbolDatabase::findVarType(const SpaceInfo *st //--------------------------------------------------------------------------- -SymbolDatabase::SpaceInfo * SymbolDatabase::SpaceInfo::findInNestedList(const std::string & name) +SpaceInfo * SpaceInfo::findInNestedList(const std::string & name) { std::list::iterator it; @@ -1366,7 +1366,7 @@ SymbolDatabase::SpaceInfo * SymbolDatabase::SpaceInfo::findInNestedList(const st //--------------------------------------------------------------------------- -const SymbolDatabase::Func *SymbolDatabase::SpaceInfo::getDestructor() const +const Func *SpaceInfo::getDestructor() const { std::list::const_iterator it; for (it = functionList.begin(); it != functionList.end(); ++it) @@ -1379,7 +1379,7 @@ const SymbolDatabase::Func *SymbolDatabase::SpaceInfo::getDestructor() const //--------------------------------------------------------------------------- -unsigned int SymbolDatabase::SpaceInfo::getNestedNonFunctions() const +unsigned int SpaceInfo::getNestedNonFunctions() const { unsigned int nested = 0; std::list::const_iterator ni; diff --git a/lib/symboldatabase.h b/lib/symboldatabase.h index cbfca5b86..f143dc159 100644 --- a/lib/symboldatabase.h +++ b/lib/symboldatabase.h @@ -31,106 +31,104 @@ class Tokenizer; class Settings; class ErrorLogger; -class SymbolDatabase +class SpaceInfo; +class SymbolDatabase; + +/** + * @brief Access control. + */ +enum AccessControl { Public, Protected, Private }; + +/** @brief Information about a member variable. */ +class Var { public: - /** - * @brief Access control. - */ - enum AccessControl { Public, Protected, Private }; - - SymbolDatabase(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger); - ~SymbolDatabase(); - - class SpaceInfo; - - /** @brief Information about a member variable. */ - class Var + Var(const Token *token_, std::size_t index_, AccessControl access_, bool mutable_, bool static_, bool const_, bool class_, const SpaceInfo *type_) + : token(token_), + index(index_), + access(access_), + isMutable(mutable_), + isStatic(static_), + isConst(const_), + isClass(class_), + type(type_) { - public: - Var(const Token *token_, std::size_t index_, AccessControl access_, bool mutable_, bool static_, bool const_, bool class_, const SpaceInfo *type_) - : token(token_), - index(index_), - access(access_), - isMutable(mutable_), - isStatic(static_), - isConst(const_), - isClass(class_), - type(type_) - { - } + } - /** @brief variable token */ - const Token *token; + /** @brief variable token */ + const Token *token; - /** @brief order declared */ - std::size_t index; + /** @brief order declared */ + std::size_t index; - /** @brief what section is this variable declared in? */ - AccessControl access; // public/protected/private + /** @brief what section is this variable declared in? */ + AccessControl access; // public/protected/private - /** @brief is this variable mutable? */ - bool isMutable; + /** @brief is this variable mutable? */ + bool isMutable; - /** @brief is this variable static? */ - bool isStatic; + /** @brief is this variable static? */ + bool isStatic; - /** @brief is this variable const? */ - bool isConst; + /** @brief is this variable const? */ + bool isConst; - /** @brief is this variable a class (or unknown type)? */ - bool isClass; + /** @brief is this variable a class (or unknown type)? */ + bool isClass; - /** @brief pointer to user defined type info (for known types) */ - const SpaceInfo *type; - }; + /** @brief pointer to user defined type info (for known types) */ + const SpaceInfo *type; +}; - class Func +class Func +{ +public: + enum Type { Constructor, CopyConstructor, OperatorEqual, Destructor, Function }; + + Func() + : tokenDef(NULL), + argDef(NULL), + token(NULL), + arg(NULL), + access(Public), + hasBody(false), + isInline(false), + isConst(false), + isVirtual(false), + isPure(false), + isStatic(false), + isFriend(false), + isExplicit(false), + isOperator(false), + retFuncPtr(false), + type(Function) { - public: - enum Type { Constructor, CopyConstructor, OperatorEqual, Destructor, Function }; + } - Func() - : tokenDef(NULL), - argDef(NULL), - token(NULL), - arg(NULL), - access(Public), - hasBody(false), - isInline(false), - isConst(false), - isVirtual(false), - isPure(false), - isStatic(false), - isFriend(false), - isExplicit(false), - isOperator(false), - retFuncPtr(false), - type(Function) - { - } + unsigned int argCount() const; + unsigned int initializedArgCount() const; - unsigned int argCount() const; - unsigned int initializedArgCount() const; - - const Token *tokenDef; // function name token in class definition - const Token *argDef; // function argument start '(' in class definition - const Token *token; // function name token in implementation - const Token *arg; // function argument start '(' - AccessControl access; // public/protected/private - bool hasBody; // has implementation - bool isInline; // implementation in class definition - bool isConst; // is const - bool isVirtual; // is virtual - bool isPure; // is pure virtual - bool isStatic; // is static - bool isFriend; // is friend - bool isExplicit; // is explicit - bool isOperator; // is operator - bool retFuncPtr; // returns function pointer - Type type; // constructor, destructor, ... - }; + const Token *tokenDef; // function name token in class definition + const Token *argDef; // function argument start '(' in class definition + const Token *token; // function name token in implementation + const Token *arg; // function argument start '(' + AccessControl access; // public/protected/private + bool hasBody; // has implementation + bool isInline; // implementation in class definition + bool isConst; // is const + bool isVirtual; // is virtual + bool isPure; // is pure virtual + bool isStatic; // is static + bool isFriend; // is friend + bool isExplicit; // is explicit + bool isOperator; // is operator + bool retFuncPtr; // returns function pointer + Type type; // constructor, destructor, ... +}; +class SpaceInfo +{ +public: struct BaseInfo { AccessControl access; // public/protected/private @@ -144,75 +142,78 @@ public: SpaceInfo *spaceInfo; }; - class SpaceInfo + enum SpaceType { Global, Class, Struct, Union, Namespace, Function }; + enum NeedInitialization { Unknown, True, False }; + + SpaceInfo(SymbolDatabase *check_, const Token *classDef_, SpaceInfo *nestedIn_); + + SymbolDatabase *check; + SpaceType type; + std::string className; + const Token *classDef; // class/struct/union/namespace token + const Token *classStart; // '{' token + const Token *classEnd; // '}' token + std::list functionList; + std::list varlist; + std::vector derivedFrom; + std::list friendList; + SpaceInfo *nestedIn; + std::list nestedList; + AccessControl access; + unsigned int numConstructors; + NeedInitialization needInitialization; + SpaceInfo * functionOf; // class/struct this function belongs to + + bool isClassOrStruct() const { - public: - enum SpaceType { Global, Class, Struct, Union, Namespace, Function }; - enum NeedInitialization { Unknown, True, False }; + return (type == Class || type == Struct); + } - SpaceInfo(SymbolDatabase *check_, const Token *classDef_, SpaceInfo *nestedIn_); + /** + * @brief find if name is in nested list + * @param name name of nested space + */ + SpaceInfo * findInNestedList(const std::string & name); - SymbolDatabase *check; - SpaceType type; - std::string className; - const Token *classDef; // class/struct/union/namespace token - const Token *classStart; // '{' token - const Token *classEnd; // '}' token - std::list functionList; - std::list varlist; - std::vector derivedFrom; - std::list friendList; - SpaceInfo *nestedIn; - std::list nestedList; - AccessControl access; - unsigned int numConstructors; - NeedInitialization needInitialization; - SpaceInfo * functionOf; // class/struct this function belongs to + void addVar(const Token *token_, AccessControl access_, bool mutable_, bool static_, bool const_, bool class_, const SpaceInfo *type_) + { + varlist.push_back(Var(token_, varlist.size(), access_, mutable_, static_, const_, class_, type_)); + } - bool isClassOrStruct() const - { - return (type == Class || type == Struct); - } + /** @brief initialize varlist */ + void getVarList(); - /** - * @brief find if name is in nested list - * @param name name of nested space - */ - SpaceInfo * findInNestedList(const std::string & name); + const Func *getDestructor() const; - void addVar(const Token *token_, AccessControl access_, bool mutable_, bool static_, bool const_, bool class_, const SpaceInfo *type_) - { - varlist.push_back(Var(token_, varlist.size(), access_, mutable_, static_, const_, class_, type_)); - } + /** + * @brief get the number of nested spaces that are not functions + * + * This returns the number of user defined types (class, struct, union) + * that are defined in this user defined type or namespace. + */ + unsigned int getNestedNonFunctions() const; - /** @brief initialize varlist */ - void getVarList(); + bool hasDefaultConstructor() const; - const Func *getDestructor() const; +private: + /** + * @brief helper function for getVarList() + * @param tok pointer to token to check + * @param vartok populated with pointer to the variable token, if found + * @param typetok populated with pointer to the type token, if found + * @return true if tok points to a variable declaration, false otherwise + */ + bool isVariableDeclaration(const Token* tok, const Token*& vartok, const Token*& typetok) const; + bool isSimpleVariable(const Token* tok) const; + bool isArrayVariable(const Token* tok) const; + bool findClosingBracket(const Token* tok, const Token*& close) const; +}; - /** - * @brief get the number of nested spaces that are not functions - * - * This returns the number of user defined types (class, struct, union) - * that are defined in this user defined type or namespace. - */ - unsigned int getNestedNonFunctions() const; - - bool hasDefaultConstructor() const; - - private: - /** - * @brief helper function for getVarList() - * @param tok pointer to token to check - * @param vartok populated with pointer to the variable token, if found - * @param typetok populated with pointer to the type token, if found - * @return true if tok points to a variable declaration, false otherwise - */ - bool isVariableDeclaration(const Token* tok, const Token*& vartok, const Token*& typetok) const; - bool isSimpleVariable(const Token* tok) const; - bool isArrayVariable(const Token* tok) const; - bool findClosingBracket(const Token* tok, const Token*& close) const; - }; +class SymbolDatabase +{ +public: + SymbolDatabase(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger); + ~SymbolDatabase(); /** @brief Information about all namespaces/classes/structrues */ std::list spaceInfoList; diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 6e7441daa..1eee6c69f 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -735,7 +735,7 @@ Token * Tokenizer::deleteInvalidTypedef(Token *typeDef) return tok; } -struct SpaceInfo +struct Space { bool isNamespace; std::string className; @@ -816,7 +816,7 @@ static Token *splitDefinitionFromTypedef(Token *tok) void Tokenizer::simplifyTypedef() { - std::vector spaceInfo; + std::vector spaceInfo; bool isNamespace = false; std::string className; bool hasClass = false; @@ -839,7 +839,7 @@ void Tokenizer::simplifyTypedef() } else if (hasClass && tok->str() == "{") { - SpaceInfo info; + Space info; info.isNamespace = isNamespace; info.className = className; info.classEnd = tok->link(); @@ -7954,13 +7954,13 @@ const Token *Tokenizer::getFunctionTokenByName(const char funcname[]) const if (_symbolDatabase == NULL) getSymbolDatabase(); - std::list::const_iterator i; + std::list::const_iterator i; for (i = _symbolDatabase->spaceInfoList.begin(); i != _symbolDatabase->spaceInfoList.end(); ++i) { - const SymbolDatabase::SpaceInfo *info = *i; + const SpaceInfo *info = *i; - if (info->type == SymbolDatabase::SpaceInfo::Function) + if (info->type == SpaceInfo::Function) { if (info->classDef->str() == funcname) return info->classDef; diff --git a/test/testsymboldatabase.cpp b/test/testsymboldatabase.cpp index 98e80671e..68b565276 100644 --- a/test/testsymboldatabase.cpp +++ b/test/testsymboldatabase.cpp @@ -32,7 +32,7 @@ public: {} private: - const SymbolDatabase::SpaceInfo si; + const SpaceInfo si; const Token* vartok; const Token* typetok; const Token* t;