Skip to content

Commit

Permalink
[analyzer] exploded-graph-rewriter: Implement a topology-only mode.
Browse files Browse the repository at this point in the history
In this mode the rewriter will only rewrite program points
and omit program states. Useful for understanding
the rough topology of the graph.

Differential Revision: https://reviews.llvm.org/D64264

llvm-svn: 365410
  • Loading branch information
haoNoQ committed Jul 8, 2019
1 parent 78566e4 commit c6b5c5b
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 8 deletions.
32 changes: 32 additions & 0 deletions clang/test/Analysis/exploded-graph-rewriter/topology.dot
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
// RUN: %exploded_graph_rewriter %s \
// RUN: | FileCheck -check-prefixes=NORMAL %s
// RUN: %exploded_graph_rewriter -t %s \
// RUN: | FileCheck -check-prefixes=TOPOLOGY %s

// FIXME: Substitution doesn't seem to work on Windows.
// UNSUPPORTED: system-windows

// NORMAL: Program point
// TOPOLOGY-NOT: Program point
// NORMAL: Checker State
// TOPOLOGY-NOT: Checker State
Node0x1 [shape=record,label=
"{
{ "node_id": 1,
"pointer": "0x1",
"has_report": false,
"is_sink": false,
"state_id": 2,
"program_points": [],
"program_state": {
"environment": null,
"constraints": null,
"dynamic_types": null,
"constructing_objects": null,
"checker_messages": [
{ "checker": "foo", "messages": ["bar"] }
],
"store": null
}
}
\l}"];
21 changes: 13 additions & 8 deletions clang/utils/analyzer/exploded-graph-rewriter.py
Original file line number Diff line number Diff line change
Expand Up @@ -384,11 +384,12 @@ def add_raw_line(self, raw_line):
# A visitor that dumps the ExplodedGraph into a DOT file with fancy HTML-based
# syntax highlighing.
class DotDumpVisitor(object):
def __init__(self, do_diffs, dark_mode, gray_mode):
def __init__(self, do_diffs, dark_mode, gray_mode, topo_mode):
super(DotDumpVisitor, self).__init__()
self._do_diffs = do_diffs
self._dark_mode = dark_mode
self._gray_mode = gray_mode
self._topo_mode = topo_mode

@staticmethod
def _dump_raw(s):
Expand Down Expand Up @@ -766,18 +767,19 @@ def visit_node(self, node):
if node.is_sink:
self._dump('<tr><td><font color="cornflowerblue"><b>Sink Node'
'</b></font></td></tr>')
self._dump('<tr><td align="left" width="0">')
if len(node.points) > 1:
self._dump('<b>Program points:</b></td></tr>')
else:
self._dump('<b>Program point:</b></td></tr>')
if not self._topo_mode:
self._dump('<tr><td align="left" width="0">')
if len(node.points) > 1:
self._dump('<b>Program points:</b></td></tr>')
else:
self._dump('<b>Program point:</b></td></tr>')
self._dump('<tr><td align="left" width="0">'
'<table border="0" align="left" width="0">')
for p in node.points:
self.visit_program_point(p)
self._dump('</table></td></tr>')

if node.state is not None:
if node.state is not None and not self._topo_mode:
prev_s = None
# Do diffs only when we have a unique predecessor.
# Don't do diffs on the leaf nodes because they're
Expand Down Expand Up @@ -868,6 +870,9 @@ def main():
parser.add_argument('-d', '--diff', action='store_const', dest='diff',
const=True, default=False,
help='display differences between states')
parser.add_argument('-t', '--topology', action='store_const',
dest='topology', const=True, default=False,
help='only display program points, omit states')
parser.add_argument('-s', '--single-path', action='store_const',
dest='single_path', const=True, default=False,
help='only display the leftmost path in the graph '
Expand All @@ -889,7 +894,7 @@ def main():
graph.add_raw_line(raw_line)

explorer = SinglePathExplorer() if args.single_path else BasicExplorer()
visitor = DotDumpVisitor(args.diff, args.dark, args.gray)
visitor = DotDumpVisitor(args.diff, args.dark, args.gray, args.topology)

explorer.explore(graph, visitor)

Expand Down

0 comments on commit c6b5c5b

Please sign in to comment.