Additional software analysis tools
Below we provide several links to tools related to this course. Most of this material has been made possible (created) by researchers involved with the lecturer and/or former students of this course.
This material is also demonstrated during the various lectures of this course. A large part of this material is instrumental in completing assignment B.
Structure, dependencies, and metrics visualization
A list of tools and techniques geared at the visual exploration of large sets of call, inherit, and type-use dependencies, such as mined from the source-code of large software projects. Check out the SolidSX tool listed here. SolidSX allows visualizing the structure and dependencies extracted from a code base. SolidSX includes a generic compound-attributed-graph visualizer that scales well to datasets of hundreds of thousands of nodes and/or edges. The current version being distributed here can read information from .pdb (program dependency) files created by Microsoft's Visual Studio, Java class libraries, and .NET assemblies. As such, it can be used to readily visualize the structure and relationships of C, C++, C#, Java, and other .NET programs.
Extracting dependencies from C++
Extracting facts (such as dependencies, classes, functions, and other syntactic and semantic information) from C and C++ source code is very challenging. Doing this efficiently and effectively for large real-world C/C++ projects is even more challenging than the theory. Here we describe a tool that achieves this.
Visualizing evolution of dependencies
Dependencies, such as source code, changes in time. How to visualize these changes? Here we provide a tool that does this, and also explain why analyzing the changes of dependencies of large projects can provide insight into maintenance activities. The tool extracts dependencies such as function calls and type uses from C/C++ code stored in SVN repositories. Dependencies are extracted using the CCCC static analysis tool (described lower on this page). The tool has been implemented by your colleagues having taken this class in 2011 (!)
Code duplicates, or code clones, indicate potential functionality replications in a software project. Finding (and removing) these helps in making the code cleaner, smaller, easier to maintain, and easier to test. We describe here a scalable tool for finding code clones in large C, C++, and Java code bases.
Code clones change in time, just as code dependencies do. Analyzing the evolution of code clones gives insight into the refactoring events a project has gone through, the evolution of quality of the source code, and also points to possible improvement areas. We describe here an easy-to-use tool for visual analysis of code clones on large SVN repositories.
A simple but effective tool for computing some simple code metrics on C and C++ code. The CCCC tool also extracts several dependencies from source code, such as calls and uses relations between classes. The tool can be run from the command-line with virtually no set-up. The data is exported in XML and HTML format. Useful to understand how a (basic) code metrics engine is implemented. The tool is freely available from here.
An easy-to-use, yet professional toolkit for producing layouts and visualizations of complex graphs. GraphViz includes components to perform (simple) analyses on graphs, such as connected components, compute a number of graph layouts, and customize the way nodes and edges are drawn (visualized). GraphViz can be used either as a set of command-line standalone tools or, for finer control, as a library via a C API. Useful to experiment if you look for a simple-to-use dependency visualization. The tool is freely available from here.
Automatic refactoring of C++ code
Besides analyzing of software source code, maintenance is also about changing this code. This activity is called refactoring. Here we describe the implementation of a tool that helps automatic refactoring processes for C++ code based maintained using KDevelop.
Measuring change impact in C projects
Change impact describes the amount of effort needed to be put in refactoring a software product after a given change has been made. Measuring change impact helps in planning changes upfront, in order to streamline development, reduce blockers, and remove redundancy. We describe here a tool and methodology for finding change impact in very large C projects, with the aim of reducing the build time.