From: Artem Dergachev Date: Mon, 8 Jul 2019 23:54:14 +0000 (+0000) Subject: [analyzer] exploded-graph-rewriter: Implement a topology-only mode. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f56bf0c9906f3c56d7f7811400305e5eaf19ecbd;p=clang [analyzer] exploded-graph-rewriter: Implement a topology-only mode. 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 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@365410 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/test/Analysis/exploded-graph-rewriter/topology.dot b/test/Analysis/exploded-graph-rewriter/topology.dot new file mode 100644 index 0000000000..fa1b10f68b --- /dev/null +++ b/test/Analysis/exploded-graph-rewriter/topology.dot @@ -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}"]; diff --git a/utils/analyzer/exploded-graph-rewriter.py b/utils/analyzer/exploded-graph-rewriter.py index 3ff9e5b93f..99f5403189 100755 --- a/utils/analyzer/exploded-graph-rewriter.py +++ b/utils/analyzer/exploded-graph-rewriter.py @@ -384,11 +384,12 @@ class ExplodedGraph(object): # 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): @@ -766,18 +767,19 @@ class DotDumpVisitor(object): if node.is_sink: self._dump('Sink Node' '') - self._dump('') - if len(node.points) > 1: - self._dump('Program points:') - else: - self._dump('Program point:') + if not self._topo_mode: + self._dump('') + if len(node.points) > 1: + self._dump('Program points:') + else: + self._dump('Program point:') self._dump('' '') for p in node.points: self.visit_program_point(p) self._dump('
') - 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 @@ -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 ' @@ -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)