116 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			116 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|  | Goal: | ||
|  | ----- | ||
|  |   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. | ||
|  | 
 | ||
|  |   The project home page is:   http://code.google.com/p/cppclean/ | ||
|  | 
 | ||
|  | 
 | ||
|  | Features: | ||
|  | --------- | ||
|  |  * Find and print C++ language constructs: classes, methods, functions, etc. | ||
|  |  * Find classes with virtual methods, no virtual destructor, and no bases | ||
|  |  * Find global/static data that are potential problems when using threads | ||
|  |  * Unnecessary forward class declarations | ||
|  |  * Unnecessary function declarations | ||
|  |  * Undeclared function definitions | ||
|  |  * (planned) Find unnecessary header files #included | ||
|  |    - No direct reference to anything in the header | ||
|  |    - Header is unnecessary if classes were forward declared instead | ||
|  |  * (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) Store AST in a SQL database so relationships can be queried | ||
|  | 
 | ||
|  | AST is Abstract Syntax Tree, a representation of parsed source code. | ||
|  | http://en.wikipedia.org/wiki/Abstract_syntax_tree | ||
|  | 
 | ||
|  | 
 | ||
|  | System Requirements: | ||
|  | -------------------- | ||
|  |  * Python 2.4 or later (2.3 probably works too) | ||
|  |  * Works on Windows (untested), Mac OS X, and Unix | ||
|  | 
 | ||
|  | 
 | ||
|  | How to Run: | ||
|  | ----------- | ||
|  |   For all examples, it is assumed that cppclean resides in a directory called | ||
|  |   /cppclean. | ||
|  | 
 | ||
|  |   To print warnings for classes with virtual methods, no virtual destructor and | ||
|  |   no base classes: | ||
|  | 
 | ||
|  |       /cppclean/run.sh nonvirtual_dtors.py file1.h file2.h file3.cc ... | ||
|  | 
 | ||
|  |   To print all the functions defined in header file(s): | ||
|  | 
 | ||
|  |       /cppclean/run.sh functions.py file1.h file2.h ... | ||
|  | 
 | ||
|  |   All the commands take multiple files on the command line.  Other programs | ||
|  |   include: find_warnings, headers, methods, and types.  Some other programs | ||
|  |   are available, but used primarily for debugging. | ||
|  | 
 | ||
|  |   run.sh is a simple wrapper that sets PYTHONPATH to /cppclean and then | ||
|  |   runs the program in /cppclean/cpp/PROGRAM.py.  There is currently | ||
|  |   no equivalent for Windows.  Contributions for a run.bat file | ||
|  |   would be greatly appreciated. | ||
|  | 
 | ||
|  | 
 | ||
|  | How to Configure: | ||
|  | ----------------- | ||
|  |   You can add a siteheaders.py file in /cppclean/cpp to configure where | ||
|  |   to look for other headers (typically -I options passed to a compiler). | ||
|  |   Currently two values are supported:  _TRANSITIVE and GetIncludeDirs. | ||
|  |   _TRANSITIVE should be set to a boolean value (True or False) indicating | ||
|  |   whether to transitively process all header files.  The default is False. | ||
|  | 
 | ||
|  |   GetIncludeDirs is a function that takes a single argument and returns | ||
|  |   a sequence of directories to include.  This can be a generator or | ||
|  |   return a static list. | ||
|  | 
 | ||
|  |       def GetIncludeDirs(filename): | ||
|  |           return ['/some/path/with/other/headers'] | ||
|  | 
 | ||
|  |       # Here is a more complicated example. | ||
|  |       def GetIncludeDirs(filename): | ||
|  |           yield '/path1' | ||
|  |           yield os.path.join('/path2', os.path.dirname(filename)) | ||
|  |           yield '/path3' | ||
|  | 
 | ||
|  | 
 | ||
|  | How to Test: | ||
|  | ------------ | ||
|  |   For all examples, it is assumed that cppclean resides in a directory called | ||
|  |   /cppclean.  The tests require | ||
|  | 
 | ||
|  |   cd /cppclean | ||
|  |   make test | ||
|  |   # To generate expected results after a change: | ||
|  |   make expected | ||
|  | 
 | ||
|  | 
 | ||
|  | Current Status: | ||
|  | --------------- | ||
|  |   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.  Much work is still needed on finding unused header files | ||
|  |   and storing an AST in a database. | ||
|  | 
 | ||
|  | 
 | ||
|  | Non-goals: | ||
|  | ---------- | ||
|  |  * Parsing all valid C++ source | ||
|  |  * Handling invalid C++ source gracefully | ||
|  |  * Compiling to machine code (or anything beyond an AST) | ||
|  | 
 | ||
|  | 
 | ||
|  | Contact: | ||
|  | -------- | ||
|  |   If you used cppclean, I would love to hear about your experiences | ||
|  |   cppclean@googlegroups.com.  Even if you don't use cppclean, I'd like to | ||
|  |   hear from you.  :-)  (You can contact me directly at:  nnorwitz@gmail.com) |