diff --git a/Makefile b/Makefile index a9b53ed22..88a98c9db 100644 --- a/Makefile +++ b/Makefile @@ -15,7 +15,6 @@ LIBOBJ = lib/checkautovariables.o \ lib/checkclass.o \ lib/checkdangerousfunctions.o \ lib/checkexceptionsafety.o \ - lib/checkheaders.o \ lib/checkmemoryleak.o \ lib/checkother.o \ lib/checkstl.o \ @@ -109,9 +108,6 @@ lib/checkdangerousfunctions.o: lib/checkdangerousfunctions.cpp lib/checkdangerou lib/checkexceptionsafety.o: lib/checkexceptionsafety.cpp lib/checkexceptionsafety.h lib/check.h lib/token.h lib/tokenize.h lib/classinfo.h lib/settings.h lib/errorlogger.h $(CXX) $(CXXFLAGS) -Ilib -c -o lib/checkexceptionsafety.o lib/checkexceptionsafety.cpp -lib/checkheaders.o: lib/checkheaders.cpp lib/checkheaders.h lib/tokenize.h lib/classinfo.h lib/token.h lib/errorlogger.h lib/settings.h lib/filelister.h - $(CXX) $(CXXFLAGS) -Ilib -c -o lib/checkheaders.o lib/checkheaders.cpp - lib/checkmemoryleak.o: lib/checkmemoryleak.cpp lib/checkmemoryleak.h lib/check.h lib/token.h lib/tokenize.h lib/classinfo.h lib/settings.h lib/errorlogger.h lib/mathlib.h lib/executionpath.h $(CXX) $(CXXFLAGS) -Ilib -c -o lib/checkmemoryleak.o lib/checkmemoryleak.cpp diff --git a/lib/checkheaders.cpp b/lib/checkheaders.cpp deleted file mode 100644 index 47cafc5f5..000000000 --- a/lib/checkheaders.cpp +++ /dev/null @@ -1,269 +0,0 @@ -/* - * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2010 Daniel Marjamäki and Cppcheck team. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -//--------------------------------------------------------------------------- -#include "checkheaders.h" -#include "tokenize.h" -#include "filelister.h" -#include "token.h" - -#include -#include -#include -#include -#include -//--------------------------------------------------------------------------- - - - - -//--------------------------------------------------------------------------- -// HEADERS - No implementation in a header -//--------------------------------------------------------------------------- - -CheckHeaders::CheckHeaders(const Tokenizer *tokenizer, ErrorLogger *errorLogger) -{ - _tokenizer = tokenizer; - _errorLogger = errorLogger; -} - -CheckHeaders::~CheckHeaders() -{ - -} - -void CheckHeaders::warningHeaderWithImplementation() -{ - for (const Token *tok = _tokenizer->tokens(); tok; tok = tok->next()) - { - // Only interested in included file - if (tok->fileIndex() == 0) - continue; - - if (Token::simpleMatch(tok, ") {")) - { - std::ostringstream ostr; - ostr << _tokenizer->fileLine(tok) << ": Found implementation in header"; - - // TODO, this check is currently not used, but if it is some day - // it should give correct id and severity by calling proper function - // from errorLogger. It should not call reportErr directly. -// std::list empty; - // empty.push_back(FileLocation()); - // _errorLogger->reportErr(empty, "severity", ostr.str(), "id"); - // Goto next file.. - unsigned int fileindex = tok->fileIndex(); - while (tok->next() && tok->fileIndex() == fileindex) - tok = tok->next(); - } - } -} -//--------------------------------------------------------------------------- - - - - - - - - -//--------------------------------------------------------------------------- -// HEADERS - Unneeded include -//--------------------------------------------------------------------------- - -void CheckHeaders::warningIncludeHeader() -{ - // Including.. - for (const Token *includetok = _tokenizer->tokens(); includetok; includetok = includetok->next()) - { - if (includetok->str() != "#include") - continue; - - // Get fileindex of included file.. - unsigned int hfile = 0; - const std::string includefile = includetok->strAt(1); - while (hfile < _tokenizer->getFiles()->size()) - { - if (getFileLister()->sameFileName(_tokenizer->getFiles()->at(hfile), includefile)) - break; - ++hfile; - } - if (hfile == _tokenizer->getFiles()->size()) - continue; - - // This header is needed if: - // * It contains some needed class declaration - // * It contains some needed function declaration - // * It contains some needed constant value - // * It contains some needed variable - // * It contains some needed enum - - std::list classlist; - std::list namelist; - - // Extract classes and names in the header.. - int indentlevel = 0; - for (const Token *tok1 = _tokenizer->tokens(); tok1; tok1 = tok1->next()) - { - if (tok1->fileIndex() != hfile) - continue; - - // I'm only interested in stuff that is declared at indentlevel 0 - if (tok1->str() == "{") - ++indentlevel; - - else if (tok1->str() == "}") - --indentlevel; - - if (indentlevel != 0) - continue; - - // Class or namespace declaration.. - // -------------------------------------- - if (Token::Match(tok1, "class %var% {") || Token::Match(tok1, "class %var% :") || Token::Match(tok1, "namespace %var% {")) - classlist.push_back(tok1->strAt(1)); - - // Variable declaration.. - // -------------------------------------- - else if (Token::Match(tok1, "%type% %var% ;") || Token::Match(tok1, "%type% %var% [")) - namelist.push_back(tok1->strAt(1)); - - else if (Token::Match(tok1, "%type% * %var% ;") || Token::Match(tok1, "%type% * %var% [")) - namelist.push_back(tok1->strAt(2)); - - else if (Token::Match(tok1, "const %type% %var% =") || Token::Match(tok1, "const %type% %var% [")) - namelist.push_back(tok1->strAt(2)); - - else if (Token::Match(tok1, "const %type% * %var% =") || Token::Match(tok1, "const %type% * %var% [")) - namelist.push_back(tok1->strAt(3)); - - // enum.. - // -------------------------------------- - else if (tok1->str() == "enum") - { - tok1 = tok1->next(); - while (! Token::Match(tok1, "; %any%")) - { - if (tok1->isName()) - namelist.push_back(tok1->str()); - tok1 = tok1->next(); - } - } - - // function.. - // -------------------------------------- - else if (Token::Match(tok1, "%type% %var% (")) - namelist.push_back(tok1->strAt(1)); - - else if (Token::Match(tok1, "%type% * %var% (")) - namelist.push_back(tok1->strAt(2)); - - else if (Token::Match(tok1, "const %type% %var% (")) - namelist.push_back(tok1->strAt(2)); - - else if (Token::Match(tok1, "const %type% * %var% (")) - namelist.push_back(tok1->strAt(3)); - - // typedef.. - // -------------------------------------- - else if (tok1->str() == "typedef") - { - if (tok1->strAt(1) == "enum") - continue; - int parlevel = 0; - while (tok1->next()) - { - if (Token::Match(tok1, "[({]")) - ++parlevel; - - else if (Token::Match(tok1, "[)}]")) - --parlevel; - - else if (parlevel == 0) - { - if (tok1->str() == ";") - break; - - if (Token::Match(tok1, "%var% ;")) - namelist.push_back(tok1->str()); - } - - tok1 = tok1->next(); - } - } - } - - - // Check if the extracted names are used... - bool Needed = false; - bool NeedDeclaration = false; - for (const Token *tok1 = _tokenizer->tokens(); tok1; tok1 = tok1->next()) - { - if (tok1->fileIndex() != includetok->fileIndex()) - continue; - - if (Token::Match(tok1, ": %var% {") || Token::Match(tok1, ": %type% %var% {")) - { - const std::string classname = tok1->strAt(((tok1->strAt(2) != "{")) ? 2 : 1); - if (std::find(classlist.begin(), classlist.end(), classname) != classlist.end()) - { - Needed = true; - break; - } - } - - if (! tok1->isName()) - continue; - - if (std::find(namelist.begin(), namelist.end(), tok1->str().c_str()) != namelist.end()) - { - Needed = true; - break; - } - - if (! NeedDeclaration) - NeedDeclaration = (std::find(classlist.begin(), classlist.end(), tok1->str().c_str()) != classlist.end()); - } - - - // Not a header file? - if (includetok->fileIndex() == 0) - Needed |= NeedDeclaration; - - // Not needed! - if (!Needed) - { - std::ostringstream ostr; - ostr << _tokenizer->fileLine(includetok) << ": The included header '" << includefile << "' is not needed"; - if (NeedDeclaration) - ostr << " (but a forward declaration is needed)"; - - // TODO, this check is currently not used, but if it is some day - // it should give correct id and severity by calling proper function - // from errorLogger. It should not call reportErr directly. -// std::list empty; - // empty.push_back(FileLocation()); - // _errorLogger->reportErr(empty, "severity", ostr.str(), "id"); // TODO - } - } -} -//--------------------------------------------------------------------------- - - - diff --git a/lib/checkheaders.h b/lib/checkheaders.h deleted file mode 100644 index 31dcf4eea..000000000 --- a/lib/checkheaders.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2010 Daniel Marjamäki and Cppcheck team. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -//--------------------------------------------------------------------------- -#ifndef CheckHeadersH -#define CheckHeadersH -//--------------------------------------------------------------------------- - -#include "tokenize.h" -#include "errorlogger.h" - -/// @addtogroup Checks -/// @{ - - -class CheckHeaders -{ -public: - CheckHeaders(const Tokenizer *tokenizer, ErrorLogger *errorLogger); - ~CheckHeaders(); - void warningHeaderWithImplementation(); - void warningIncludeHeader(); - -private: - const Tokenizer *_tokenizer; - ErrorLogger *_errorLogger; - - std::string name() const - { - return "Headers"; - } -}; -/// @} -//--------------------------------------------------------------------------- -#endif - diff --git a/lib/lib.pri b/lib/lib.pri index 533bd8b49..d708a68d5 100644 --- a/lib/lib.pri +++ b/lib/lib.pri @@ -6,7 +6,6 @@ HEADERS += $$PWD/check.h \ $$PWD/checkclass.h \ $$PWD/checkdangerousfunctions.h \ $$PWD/checkexceptionsafety.h \ - $$PWD/checkheaders.h \ $$PWD/checkmemoryleak.h \ $$PWD/checkother.h \ $$PWD/checkstl.h \ @@ -28,7 +27,6 @@ SOURCES += $$PWD/checkautovariables.cpp \ $$PWD/checkclass.cpp \ $$PWD/checkdangerousfunctions.cpp \ $$PWD/checkexceptionsafety.cpp \ - $$PWD/checkheaders.cpp \ $$PWD/checkmemoryleak.cpp \ $$PWD/checkother.cpp \ $$PWD/checkstl.cpp \