diff --git a/cppcheck.cbp b/cppcheck.cbp index ab0fc293e..599bfbea8 100644 --- a/cppcheck.cbp +++ b/cppcheck.cbp @@ -43,6 +43,7 @@ + diff --git a/src/check.h b/src/check.h index 39b414b8a..f3065bbc6 100644 --- a/src/check.h +++ b/src/check.h @@ -21,6 +21,7 @@ #define checkH #include "settings.h" +#include class Tokenizer; class ErrorLogger; @@ -28,21 +29,26 @@ class ErrorLogger; class Check { public: - - Check(const Tokenizer * const tokenizer, const Settings &settings, ErrorLogger *errorLogger) - : _tokenizer(tokenizer), _settings(settings), _errorLogger(errorLogger) - { } + // This constructor is used when registering the CheckClass + Check() + { + instances().push_back(this); + } virtual ~Check() - { } + { + instances().remove(this); + } + + /** get instances of this */ + static std::list &instances() + { + static std::list _instances; + return _instances; + } /** run checks.. */ - virtual void runChecks() = 0; - -protected: - const Tokenizer * const _tokenizer; - const Settings &_settings; - ErrorLogger *_errorLogger; + virtual void runChecks(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) = 0; }; #endif diff --git a/src/checkstl.cpp b/src/checkstl.cpp index 4d1fc5c20..9acc0b40e 100644 --- a/src/checkstl.cpp +++ b/src/checkstl.cpp @@ -22,6 +22,10 @@ #include "token.h" +// Create a static instance of this +static CheckStl instance; + + void CheckStl::iterators() { for (const Token *tok = _tokenizer->tokens(); tok; tok = tok->next()) diff --git a/src/checkstl.h b/src/checkstl.h index c8c619a9a..625afede0 100644 --- a/src/checkstl.h +++ b/src/checkstl.h @@ -31,14 +31,12 @@ class CheckStl : public Check { public: - CheckStl(const Tokenizer * const tokenizer, const Settings &settings, ErrorLogger *errorLogger) - : Check(tokenizer, settings, errorLogger) + void runChecks(const Tokenizer *tokenizer, const Settings *settings, ErrorLogger *errorLogger) { + _tokenizer = tokenizer; + _settings = settings; + _errorLogger = errorLogger; - } - - void runChecks() - { stlOutOfBounds(); iterators(); erase(); @@ -76,6 +74,10 @@ private: * @param it iterator token */ void eraseCheckLoop(const Token *it); + + const Tokenizer *_tokenizer; + const Settings *_settings; + ErrorLogger *_errorLogger; }; //--------------------------------------------------------------------------- diff --git a/src/cppcheck.cpp b/src/cppcheck.cpp index aa988c4fc..fbf560d1c 100644 --- a/src/cppcheck.cpp +++ b/src/cppcheck.cpp @@ -30,6 +30,8 @@ #include "checkfunctionusage.h" #include "filelister.h" +#include "check.h" + #include #include #include @@ -481,6 +483,11 @@ void CppCheck::checkFile(const std::string &code, const char FileName[]) // Unusual pointer arithmetic if (ErrorLogger::strPlusChar()) checkOther.strPlusChar(); + + for (std::list::iterator it = Check::instances().begin(); it != Check::instances().end(); ++it) + { + (*it)->runChecks(&_tokenizer, &_settings, this); + } } Settings CppCheck::settings() const