cppclean attempts to find problems in C++ source that slow development in large code bases, for example various forms of unused code. Unused code can be unused functions, methods, data members, types, etc to unnecessary #include directives. Unnecessary #includes can cause considerable extra compiles increasing the edit-compile-run cycle.
This is a fork of the original cppclean project. The original project home page, which no longer contains code, is at https://code.google.com/p/cppclean/.
cppclean finds the following:
- Classes with virtual methods, no virtual destructor, and no bases
- Global/static data that are potential problems when using threads
- Functions that are declared but not defined
- Unnecessary forward class declarations
- Unnecessary function declarations
- Undeclared function definitions
- Unnecessary #includes in header files
- No direct reference to anything in the header
- Header is unnecessary if classes were forward declared instead
- Inconsistent case in #includes (
foo.h
versusFoo.h
) - (planned) Unnecessary #includes in source files
- (planned) Source files that reference headers not directly #included, ie, files that rely on a transitive #include from another header
- (planned) Unused members (private, protected, & public) methods and data
- (planned)
using namespace std
in header files - (planned) Methods that are declared but not defined
AST is Abstract Syntax Tree, a representation of parsed source code (https://en.wikipedia.org/wiki/Abstract_syntax_tree).
$ pip install --upgrade cppclean
$ cppclean <path>
Multiple include paths can be specified:
$ cppclean --include-path=directory1 --include-path=directory2 <path>
To disable checking for a whole file:
// cppclean-disable # include "foo.h"
To disable checking for a single line:
// cppclean-disable-next-line # include "foo.h"
The parser works pretty well for header files, parsing about 99% of Google's header files. Anything which inspects structure of C++ source files should work reasonably well. Function bodies are not transformed to an AST, but left as tokens.
- Parsing all valid C++ source
- Handling invalid C++ source gracefully
- Compiling to machine code (or anything beyond an AST)