Oovcde User Guide
Created: June 8, 2009 Last update:
April 1, 2015
Contents
- Contents
- Quick Start
- Oovcde
- Setting Up Analysis Projects
- Component Diagrams
- Zone Diagrams
- Class Diagrams
- Class Diagram Symbols
- Class Diagram Display Options
- Portion Diagrams
- Sequence Diagrams
- Include Diagrams
- Editing SVG diagrams
- Complexity Analysis
- Member Usage Analysis
- Duplicate Code Analysis
- Code Test Coverage System
- Build System
- Build Features
- Build Quick Start
- Cross Compiling
- Resolving Include Problems During
Analysis
- Windows Include Problems
- Linux Example
- Windows MFC Example
- Windows GTK Example
- Build Sequence
- Project Limitations
- OovEdit
Quick Start
To work with the examples, see examples.
- Use File/New and create a new Oovcde project using an existing or new
C++ project. There are example source projects in trunk/examples.
- select a new directory for source files, or an existing directory
that is the root directory of existing source files.
- select an output project directory to store oov project files.
- OR: Use File/Open and open the trunk/test/trunk-oovcde-win or
trunk/test/trunk-oovcde-linux directory.
- At this point, it may be possible to view diagrams if the include
paths are set. They are already set if the oovcde project was opened.
Select Analysis/Settings and select the Cpp Arguments tab to change the
include paths and compile and link settings. Note that the include and
library paths can both be set using the External Project Packages
button, or recursive searches using "-ER". See the Build System section
for more information.
- Build a project. These steps are not required for viewing diagrams.
Building Oovcde requires CLang and GTK to be downloaded and to match the
paths in the Analysis/Settings/Cpp Arguments settings.
- Select Build/Settings and set the component type for each component.
For the Oovcde project, the oovCommon and oovGuiCommon components are
static libraries, and all other oov... components are executables.
- Select Build/Build Debug to build a debug version of the project.
Oovcde
The Oovcde program performs many types of analysis on a selected set of
source code. Setting up a new project requires selecting the root
directory that contains the source code. Then Oovcde scans the
directories for include and source files. There are many types of
diagrams to allow viewing different levels of code.
View |
Diagram Type Name |
Description |
Many
Classes |
Zone |
Zone diagrams show all classes in a project and their
relations. Each class can be shown as a dot so that thousands
of classes can be viewed on a single diagram. Filtering can be
applied to view smaller subsets of classes. |
Directories |
Component |
Component diagrams show the relations between components.
Examples of components are libraries or executables. Component
diagrams requires that certain directories have a component type
defined for them. |
Few Classes |
Class |
Class diagrams show a few classes since the interface of each
class is displayed. |
Class Parts |
Portion |
Portion diagrams show member data, and relations between functions
and the member data. |
Class Methods |
Sequence or Operation |
Sequence diagrams show conditionals (if or loop constructs) and
calls to other class methods. |
Include Files |
Include |
Include dependency diagrams show which include files are used by
other include files. |
The Oovcde program also allows collecting analysis information from a
project.
Analysis Tool |
Description |
Code Coverage |
This displays how often each block of code was executed, and the
percentage of code executed in each module. |
Code Complexity |
This displays both McCabe and Oovcde complexity. |
Duplicate Code |
All code is compared to find the number of lines that are similar
to other places in the code. |
Project Statistics |
This displays the number of files, classes, operations, etc. |
Line Counting |
The number of code lines and comment lines are counted for each
module. |
Member Usage |
The usage of each class member is displayed. |
Setting Up
Analysis Projects
Anlyzing projects allows viewing zone, class and sequence diagrams. It is
also the first step towards building projects and running code coverage.
- Start the "oovcde" program
- Use File/New to create a new project
- The Project Settings dialog will appear that allows choosing the
source root of the source files to analyze. The location can be
specified for saving all of the project files for Oovcde. Files can be
excluded from analysis. This can also be changed later.
- Select the Analysis/Settings menu item. Choose the "Cpp Arguments" tab
to change the include paths and other compiler settings. Errors during
compilation are stored in the project directory. If there are errors,
change the compiler settings and restart analysis.See the Build section
for more examples.
To open a previously saved project, select File/Open and specify the
previously saved Oovcde project directory. The build user guide is at Oovcde
Build Help
Component Diagrams
Component diagrams are similar to UML (Unified Modelling Language) component
diagrams. A component diagram displays components such as static or shared
libraries and executables. When the Comp tab is clicked, the component
diagram for a project is generated automatically.
Any component that has the Component Type defined in the Build Settings
dialog will be displayed. In addition, the components that are defined in
the Analysis/Settings Build Arguments dialog using the External Project
Packages will be displayed. The analysis will figure out the dependencies
and the dependency arrows will also be generated automatically.
- The components for a project are displayed in the left pane in the
"Comp" tab. The components list is a list of the source files for the
project.
- After the Component Types have been specified in the Build/Settings
dialog, and the analysis has been run, then clicking on any component in
the components list will update the diagram and show the dependencies
between the run-time components.
- The components can be moved by clicking and dragging the components.
- Right clicking on a component allows:
- Remove Component - Removes the component from the diagram
- Show Implicit Relations - Shows relations between all components
- Relayout - Repositions the components
- Restart - Adds all removed components.
Zone Diagrams
A zone diagram displays all classes in the project in a circle diagram where
all classes are layed out on the circumference of the circle. Any two
classes that are related will have a line drawn between them.
- The zone diagram component (directory) list/tree allows selecting
which components are displayed on the diagram.
- Right clicking on the component list allows:
- Hide All, Show All - Hiding or showing all components
- Hide Children, Show Children - Hiding or showing all components that
are children of the selected component
- Map Path - This allows combining directories into a single directory
for the graph. For example, mapping /usr/include to /inc-lib and
/usr/lib to /inc-lib, will combine both directories into one component
in the graph. Child components with unique names are listed
separately.
- Right clicking on the graph allows:
- Go To Class - Displays the class diagram for the selected class
- View Source - Displays the source code for the selected class
- Show All Classes - Showing all classes or just showing components
- Show Function Relations - Shows classes as related if a class has a
member function that uses another class.
- Show Dependencies - Displays an arrow at the end of a relationship.
The arrow end is the end that is the supplier and the non-arrow end is
the consumer.
- Zoom In/Out - Zoom the diagram
For more zone diagram information, see Zone
Diagrams.
Class Diagrams
Class diagrams are similar to UML (Unified Modelling Language) class
diagrams. They display the members of the classes and relations between
classes.
- The classes for a project are displayed in the left pane in the Class
tab. Left click on a class to display a diagram of related classes with
standard relations. Right click adds the selected class with standard
relations.
- Right clicking on a class will display a popup menu that allows adding
classes with various types of relationships.
- Left click on a class and drag the cursor to the desired location to
move a class.
Right clicking on a class also allows
- Go To Class - Shows the class diagram for the selected class
- View Source - Views the source code
- Add Standard Relations - Adds classes that have relations where the
classes are related either through aggregation or inheritance.
- All All Relations - Adds classes that have standard relations plus
relations where member functions are related to the other classes.
- Zoom - Zooms the diagram.
- Removing class - Removes the selected class
- Remove All Classes - Removes all classes
- Restart - Adds the classes with standard relations
Class Diagram
Symbols
So what are circles and V shapes doing on the drawings? Don't worry, they
can be turned off if desired. These extra Oov symbols are used to provide
quick visibility into other relations that are not displayed on standard UML
diagrams. The goal is to find and show as many relationships as possible on
the diagram for quick understandability and verification of the code.
(See the screenshots to see examples.) The enhanced symbols are:
- the nested circles indicate the private, public, protected scope
relations. Fully empty means public, and fully filled means private,
otherwise it is protected.
- the V shape indicates read only (const)
- the circle standing alone means a relationship with a function
variable
- a small circle next to a circle is a function parameter relationship.
The other symbols are standard UML symbols.
Class Diagram Display
Options
- Select the Analysis/Settings menu item.
- Choose the "Draw Options" tab and check or uncheck the various
options. These options do not change how classes are added to the
diagrams.
Portion Diagrams
Portion diagrams show the data members of a class, and show the
operations that are related to each data member. These diagrams make
it easy to visualize a class's composition to allow for refactoring or for
understandability.
For more portion diagram information, see Portion
Diagrams.
Sequence Diagrams
Sequence or operation diagrams are similar to UML (Unified Modelling
Language) sequence diagrams. They display the member functions of the
classes, and some detail of the members and relations to members in other
classes.
Sequence diagrams are only slightly modified from standard UML diagrams. The
guard conditions are not shown on each arrow, but are instead shown on the
lifeline blocks. This prevents duplication of the condition for each
operation call, and is still very easy to read for someone that is used to
UML.
- Selecting a class in the class list will change the operations in the
Operations (Oper tab) list. Clicking on an operation will display the
sequence diagram for the operation.
- Selecting an operation from the operation list will display the
contents of the operation.
- Right clicking on the sequence diagram depends on whether a class or
operation is clicked on. Right clicking allows:
- Go To Operation - Displays a new diagram for the different
operation.
- Add Calls - Expands the selected call to show the child calls
- Add Callers - Shows the operations that call the selected operation.
Include Diagrams
Include diagrams show the relationships between the include files.
Editing SVG
diagrams
- Use File/Export Drawing As to save an SVG file. An SVG file is a vector
graph that most web browsers can display. Whichever drawing is displayed
will be saved.
- Download Inkscape from inkscape.org
When using File/Export Drawing As, the file's default location will be to
save to the project directory.
Complexity
Analysis
Code complexity is a measure of complexity for each function. The
purpose of the measure is to help to determine the amount of testing
required for various functions. Higher numbers indicate that more
testing must be performed.
- After the analysis has been performed, select Analysis/Complexity to
update the complexity information for each source file.
For more complexity information, see C++
Complexity.
Member Usage
Analysis
- After the analysis has been performed, select Analysis/Member Usage to
save usage information about members. This shows the number of
member functions of a class that use each class member attribute.
Duplicate Code Analysis
- Turn on duplicate code analysis by adding -dups to the
Analysis/Settings/Build Arguments/Analyze/Extra Build Arguments
- Delete any existing analysis directories in the Oovcde project
directory so that a complete analysis is run.
- Run Analysis/Analyze
- Run Analysis/Duplicates
For more information, see Duplicate
Code.
Code Test
Coverage System
- Running Coverage/Instrument will create an "oov-cov" directory that
contains a copy of all source files and modifies them so that they
include coverage counting software. It copies the oovcde build files so
if the project was built previously, the new project files will
automatically build the coverage project when the Coverage/Build menu is
run.
- Running Coverage/Build will build the coverage project.
- Running the coverage project components will update coverage counts.
- Running Coverage/Statistics will output a coverage percentage file.
For more coverage information, see Test
Coverage.
Build System
The build system is not required to view diagrams.
There must be a set of installed build tools such as clang or GNU. The
oovBuilder manages the project source, and is an executable that can be run
from the command line. It can be run from the build menu in the oovcde
program.
Build Features
- Provides a very simple setup for building projects
- Eliminates reasons for "clean". Rarely any out of date dependencies
- Source directories are not cluttered up with build files.
- Fast builds using multitasking. Multitasking is used to analyze and
build multiple object, library, executables files
- Component names are derived from the directory names of directories
that contain C++ source files.
- Directories are scanned to find header files, and generate include
paths.
- Directories are scanned to find libraries, and library symbols are
parsed to determine library link order, and to determine which static
libraries are required for executables and shared libraries.
- Source files are parsed using CLang to find include dependencies.
Include dependencies are used to determine which files need to be built.
Rebuilding will only compile files that need to be rebuilt based on
dependencies.
- External packages can be specified by selecting the package, or the
root path of external projects can be specified for locations of header
and library files. On Linux, the pkg-config system is used to find
available packages. Exclusion criteria can be used to select only one of
many types of library or header files.
- Build tools are determined from paths and installed tools, but can be
specified manually.
- Project information is scanned and stored for different sets of build
arguments. Debug and release configurations will not conflict.
Build Quick Start
The examples are a quick way to understand some basic principles. See Examples.
The build user guide is at Oovcde Build Help
The build details are described in Oovcde
Build Design.
Note that the Oovcde binary packages do not include a compiler for building.
The following steps can be followed:
- Run Oovcde and either create a new project, or open an existing
project. Either the gnu or clang compilers should be installed in the
system. In Windows, Oovcde searches the path and if LLVM is present,
then clang++ is used as the compiler. In Linux, the clang++ compiler is
searched for in the /usr/bin directory, and if found clang++ is used as
the compiler.
- Add some references to external project packages. These are specified
under Analysis/Settings/Build Arguments.
- Use the External Project Packages button to specify a package on the
system. In Linux, this uses pkg-confg, and will define all includes,
flags and libraries. In Windows, there are a few predefined packages
that are defined in a file in the bin directory.
- If the required external packages do not exist, either custom
packages can be created, or add some external project root references.
- An external directory can be specified, and may look like
"-ERC:\ExternalPackage". The full syntax allows excluding some
subdirectories using an exclamation point as a not symbol. This is
required for cases where external project references contain multiple
libraries with the same symbols. For example,
"-ER/home/dave/software/oovcde/2.0/clang+llvm-3.2!libclang_rt" will
prevent using any path with libclang_rt in it.
- Select Build/Settings and specify what type of output to produce for
each component listed in the dialog. If the needed components are not
listed, then Oovcde will not build your type of project. Either
rearrange the directory structure, or contact the Oovcde developers.
- Run Build/Build Debug or Build/Build Release.
The trunk/test/trunk-oovcde directorys show example files for building the
oovcde project. This is a somewhat complex project since it uses both Gtk
and Clang, and has multiple libraries and executables. Early versions of
CLang on Windows required building CLang, and the complex library order for
Clang was able to be determined by the build system.
Cross Compiling
The following example shows the use of Ubuntu for cross compiling to an ARM
hard float platform. This requires that the gcc-arm-linux-gnueabihf package
is installed using apt-get or synaptic:
- Select Analysis/Settings
- Select Debug under Build Configurations, and click the NewConfig
button. Enter "Arm-Debug" as a new configuration.
- Enter arm-linux-gnueabihf-g++ for the Compiler Path
- Add to the Common Build Arguments:
- -fPIC
- -march=armv7-a
- -mfloat-abi=hard
- Add something like the fillowing to the Extra Build Arguments for the
Arm-Debug configuration:
- -lnk-L/target-sysroot/arm-linux-gnueabihf/usr/lib
- -lnk-L/target-sysroot/arm-linux-gnueabihf/lib
- -lnk-Wl,-rpath-link,/target-sysroot/arm-linux-gnueabihf/usr/lib
- -lnk-Wl,-rpath-link,/target-sysroot/arm-linux-gnueabihf/lib
- When compiling, the linker may say, "cannot find", and then list some
library name. If the target files were copied from the device, the links
may contain paths to the directories for the target machine. This files
can be edited and the paths removed so that the local files are found.If
shared libraries are created, there may be some cases where a static
library can be hidden by being renamed to force the shared library to be
used.
Resolving Include
Problems During Analysis
The Oovcde analysis will often produce usable output even when include files
cannot be found, although this may result in missing classes, or methods in
sequence diagrams.
Oovcde uses the OovCppParser to perform the analysis, and the OovCppParser
uses CLang. Clang has hard coded paths compiled into the analysis binary.
Compilers will only search for a certain set of include paths. See the
include problems below for more information.
Oovcde produces analysis directories for each set of build
arguments. This is in case the classes may be different for debug or
release, etc.
The analysis directories are not kept unique for the clang and GCC
compilers. Build argument differences are used to make unique analysis
directories. If they are using the same directory, and different include
paths are needed, set an argument that is different so that different
analysis directories are used.
Windows Include
Problems
Things can be difficult especially on Windows since Oovcde by default uses
CLang for analysis, and can use either CLang or the gnu compiler for builds.
The gnu compiler is available from the MinGW, MinGW-builds or MinGW-W64
projects. The old MinGW-builds project has now been incorporated into
MinGW-W64. MinGW-builds or MinGW-W64 is required to build Oovcde instead of
mingw because it supports C++11 threading.
The gnu compiler will normally find include and library paths since the
compiler searches paths relative to the g++ directory. The CLang compiler
will find many mingw paths, but does not find paths for Mingw-W64.
Switching between the packages often requires nothing more than changing
the path environment variable or setting the compiler name in the Oovcde
Analysis/Settings/Build Arguments dialog.
CLang normally finds mingw by searching for default paths, but does not
find mingw-w64. For this reason, mingw-w64 is defined as a package that
can be included in the Analysis/Settings/ menu in the Build Arguments tab
using the External Project Packages button.
So there are a few usage scenarios:
- Perform Analysis with Oovcde using Mingw - Typically CLang will
require include files to be in \MinGW
- Perform Analysis with Oovcde using Mingw-W64 or Build Oovcde - Use
MinGW-W64 by selecting the package in the project and ensuring the path
is correct
If the compiler cannot find a standard library file, then it isn't finding
the file in its include directories. To view the CLang or GCC compiler
include paths, use the -v option in the Oovcde Analysis/Settings/Build
Arguments.
The typical location for mingw is in the \MinGW directory. CLang
supports the following MinGW installations on Windows.
CLang Version
|
MinGW Versions Supported
|
CLang 3.4 |
4.5.0, 4.5.1, 4.5.2, 4.5.4, 4.6.0, 4.6.1, 4.6.2, 4.6.3, 4.7.0,
4.8.1 |
CLang 3.5 |
4.7.0, 4.7.1, 4.7.2, 4.7.3, 4.8.0, 4.8.1, 4.8.2 |
Linux Example
This is an old Linux example. The best method currently is to load the
required packages in the Analysis/Settings/Build Arguments tab.
For Linux, the following arguments work to build all Oovcde components with
the CLang compiler. These arguments will build the complete oovcde project
on Linux when the component types are set in the components tab. This is how
the arguments may look in the Analysis/Settings/Build Arguments dialog.
-c
-std=c++0x
-ER/usr/include/gtk-3.0
-ER/usr/include/glib-2.0
-I/usr/include/c++
-ER/usr/include/cairo
-ER/usr/include/pango-1.0
-ER/usr/lib/x86_64-linux-gnu/glib-2.0
-ER/usr/include/gdk-pixbuf-2.0
-ER/usr/include/atk-1.0
-ER/usr/lib/x86_64-linux-gnu!libmcheck!libieee
-ER/home/dave/software/oovcde/2.0/clang+llvm-3.2!libclang_rt
-lnk-static-libstdc++
-lnk-Wl,-rpath=./
-lnk-rdynamic
Windows MFC
Example
This example may compile with errors, but allows much of the analysis to
occur correctly. Note that _M_IX86 cannot be used with the CLang compiler
since it does not handle inline assembly. Much of the analysis still works
even though the target is incorrect.
Base Build Arguments
-c
-x
c++
-fms-extensions
-fmsc-version=1500
-ferror-limit=3000
-D_M_IA64=1
-D_WIN32_WINNT=0x0501
-D_MSC_VER=1200
-D"WIN32"=1
-D="_WINDOWS"
-D_ALLOCA_S_MARKER_SIZE=8
-IC:\Program Files\Microsoft Visual Studio 9.0\VC\include
-IC:\Program Files\Microsoft Visual Studio 9.0\VC\atlmfc\include
-IC:\Program Files\Microsoft SDKs\Windows\v6.0A\include
Windows GTK
Example
This is an old Windows example. The best method currently is to load the
required packages in the Analysis/Settings/Build Arguments tab. For Windows,
the following arguments work to build all Oovcde components with the g++
compiler.
Base Build Arguments
-c
-ERC:/Program Files/GTK+-Bundle-3.6.4
-IC:/Program Files/LLVM/include
-lnk-LC:/Program Files/LLVM/lib
-lnk-lpthread
-lnk-lpsapi
-lnk-limagehlp
-lnk-mwindows
-lnk-llibclang
Extra Analysis Arguments
-x
c++
-std=c++11
Extra Debug Arguments
-O0
-g3
-std=c++0x
Extra Release Arguments
-O3
-g3
-std=c++0x
For Windows, the arguments may look something like this when compiling with
clang++ 3.2. The only problem is that clang 3.2 does not export symbols in
the object files, so the link with GTK fails.
-c
-std=c++0x
-ERC:\Program Files\GTK+-Bundle-3.6.1
-ERC:\Dave\Mine\software\oovcde\clang+llvm-3.2
Build Sequence
The detailed sequence of the build is:
- The user specifies the source root directory and output oovcde project
directory. The build system scans the source root directory for include
and source files. Each directory with source files is considered a
component. Each directory with include files is added to the initial
include paths.
- The program tries to determine the compiler and other build tools.
- On Windows, the path is searched for clang, otherwise the build
tools default to the GNU tools. (g++, ar, etc.) The llvm-ar tool is
not used on Windows since it does not work.
- On Linux, the path is checked for /usr/bin/clang++, and if not
present, the build tools default to the GNU tools.
- Manually edit oovcde.txt to change build tools.
- The user specifies additional external project packages or package
roots for includes and libraries. If include files are found, the paths
are added to the initial include paths. If libraries are found, the
paths are added to the initial library paths. The user must specify the
project packages in the correct order. Include paths are scanned in the
order that packages and external references are specified. During the
link, the libraries are scanned in opposite order. Project package order
is determined by the builder.
- The program parses the source files for include dependencies using the
initial include paths. The include dependencies are optimized so only
needed include paths are used to detect dependencies for each component.
- The program generates a list of components that could be built.
- The user specifies the type of component such as static library,
shared library or program.
- The user can start a build.
- The dependencies of external project libraries are determined to
create libraries in the correct order for the linker. The external
project libraries are used in the opposite order that the external
project roots were specified. The library dependencies are optimizes so
only needed libraries are used for each component.
- Only out of date targets are built.
Project
Limitations
There are some limitations on projects. The basic rule is that a directory
can be defined as a component and all source files that are contained in
that directory or other child directories of that directory will be used to
build the component. The include files can be in any child directory, and
will be found automatically.
If multiple directories are used to build a component that are not under one
directory, it is possible to create many static libraries. Oovcde will
determine static library link order automatically.
The following shows a typical project that can be supported.
Root directory of project source code
Sub-directory1 - Component1
*.cpp - All of these files are used for Component1
*.h - These can be used by any component
Sub-directory2
*.h - These can be used by any component
Sub-directory3
Sub-directory4 - Component2
*.cpp - These can only be used for Component2
*.h - These can be used by any component
Sub-directory5 - Component3
Sub-directory6
*.cpp - These can be used for Component3
Sub-directory7
*.cpp - These can be used for Component3
There are also these limitations.
- Only GNU or clang projects. CLang support for MSVC projects is
improving, but unknown.
- External project roots are expected that they will not be changed. In
order to update library information, delete the out/sym files.
- The component names will be created from the directory names.
- Some duplicate filenames (includes) may cause problems for determining
dependencies. Circular dependencies may cause problems. These may be
able to be resolved:
- View oovcde-incdep.txt to see include directory dependencies found
by compiler
- Only C++ is compiled. (No .C or .ASM) Other types of files must be put
into external objects or libraries.
There are some problems using llvm/clang 3.2 on Windows or Linux. The build
tool will attempt to use tools that are known to work. CLang 3.4 may not
have these problems.
- Symbols are not exported. This appears to be a compile time (clang++)
problem.
- The llvm-ar tool will cause a link error
- The llvm-nm tool has no output on Linux, and gives a bad file error on
Windows.
OovEdit
The OovEdit program is a simple text editor. It has the following features.
- C++ syntax highlighting using CLang
- Code completion using CLang
- Debugging using GDB
- Find/Replace
- Find in files
- Undo/Redo
- Copy/Paste
- Find forward or reverse, and case sensitive or insensitive