Benjamin Smedberg wrote:
I should note that my class hierarchy tool is very primitive, and I think its use of the Dehydra API is a little behind. I've attached the files you can look at them.Bo Yang wrote:Hi, I think my question has something to do with statically analysis, so I post here. Along with my reading of Mozilla code, I find it is very helpful if I can gain a part of classes hierarchy graph from the C++ source code. Could anybody please help me and give me some advice about with which tools under Linux I can achieve my purpose? Thanks in advance!dmandelin already wrote a tool to do this, see the first paragraph of http://blog.mozilla.com/dmandelin/2008/02/28/a-few-notes-on-string-apis/I think we would dearly love to actually run the analysis every time you build with static analysis, because it's cheap to do... then it wouldn't be hard to implement a "make classgraph" target to build an SVG/HTML/something version of the result.
classtree.js -- The Dehydra script. (See http://wiki.mozilla.org/Dehydra_GCC.) This prints out the class hierarchy in a text form that's easy to read from Python. Some lines contain just a string, and are the name of a class. Others contain a pair, and represent an inheritance relationship.
classtree.py -- Python script to postprocess the results. The input to this file is a file containing the output of classtree.js on one or more C++ files (just cat'd together). It will collect the relationships and output a single Graphviz dot graph.
It's necessary to do this in multiple parts because each run of Dehydra will be over one source code file (as Dehydra runs within g++), but the desired final output can only be produced by looking at data from all the C++ files.
Dave
classtree.js
Description: JavaScript source
import sys
classmap = {}
edges = set()
for line in sys.stdin:
if line.startswith('#'): continue
v = eval(line)
if isinstance(v, str):
if v in classmap: continue
classmap[v] = len(classmap)
else:
src, dst = v
edges.add((classmap[src], classmap[dst]))
print 'digraph G {'
print ' graph [rankdir="BT"];'
print ' node [shape="rect"];'
for cls, id in classmap.items():
print ' %d [label="%s"];'%(id, cls)
for src, dst in edges:
print ' %d -> %d;'%(src, dst)
print '}'
_______________________________________________ Dev-static-analysis mailing list [email protected] https://lists.mozilla.org/listinfo/dev-static-analysis
