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)
