Skip to content

Commit 1b22097

Browse files
author
martin
committed
Add output_json to the dependence_graph abstract domain.
1 parent 8f465ed commit 1b22097

File tree

4 files changed

+91
-12
lines changed

4 files changed

+91
-12
lines changed

src/analyses/dependence_graph.cpp

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ Date: August 2013
1111

1212
#include <cassert>
1313

14+
#include <util/json.h>
15+
1416
#include "goto_rw.h"
1517

1618
#include "dependence_graph.h"
@@ -329,6 +331,54 @@ void dep_graph_domaint::output(
329331
}
330332
}
331333

334+
/*******************************************************************\
335+
336+
Function: dep_graph_domaint::output_json
337+
338+
Inputs: The abstract interpreter and the namespace.
339+
340+
Outputs: The domain, formatted as a JSON object.
341+
342+
Purpose: Outputs the current value of the domain.
343+
344+
\*******************************************************************/
345+
346+
347+
jsont dep_graph_domaint::output_json(
348+
const ai_baset &ai,
349+
const namespacet &ns) const
350+
{
351+
json_arrayt graph;
352+
353+
for(dep_graph_domaint::depst::const_iterator cdi=control_deps.begin();
354+
cdi!=control_deps.end();
355+
++cdi)
356+
{
357+
json_objectt &link=graph.push_back().make_object();
358+
link["location_number"]=
359+
json_numbert(std::to_string((*cdi)->location_number));
360+
link["source_location"]=
361+
json_stringt((*cdi)->source_location.as_string());
362+
link["type"]=json_stringt("control");
363+
}
364+
365+
for(dep_graph_domaint::depst::const_iterator ddi=data_deps.begin();
366+
ddi!=data_deps.end();
367+
++ddi)
368+
{
369+
json_objectt &link=graph.push_back().make_object();
370+
link["location_number"]=
371+
json_numbert(std::to_string((*ddi)->location_number));
372+
link["source_location"]=
373+
json_stringt((*ddi)->source_location.as_string());
374+
link["type"]=json_stringt("data");
375+
}
376+
377+
return graph;
378+
}
379+
380+
381+
332382
/*******************************************************************\
333383
334384
Function: dependence_grapht::add_dep

src/goto-analyzer/goto_analyzer_parse_options.cpp

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,7 @@ void goto_analyzer_parse_optionst::get_command_line_options(optionst &options)
179179
options.set_option("text", false);
180180
options.set_option("json", false);
181181
options.set_option("xml", false);
182+
options.set_option("dot", false);
182183
options.set_option("outfile", "-");
183184

184185
if(cmdline.isset("text"))
@@ -196,6 +197,11 @@ void goto_analyzer_parse_optionst::get_command_line_options(optionst &options)
196197
options.set_option("xml", true);
197198
options.set_option("outfile", cmdline.get_value("xml"));
198199
}
200+
else if (cmdline.isset("dot"))
201+
{
202+
options.set_option("dot", true);
203+
options.set_option("outfile", cmdline.get_value("dot"));
204+
}
199205
else
200206
{
201207
options.set_option("text", true);
@@ -250,6 +256,7 @@ void goto_analyzer_parse_optionst::get_command_line_options(optionst &options)
250256
options.set_option("constants", false);
251257
options.set_option("intervals", false);
252258
options.set_option("non-null", false);
259+
options.set_option("dependence-graph", false);
253260

254261
if(cmdline.isset("intervals") ||
255262
cmdline.isset("show-intervals"))
@@ -259,10 +266,13 @@ void goto_analyzer_parse_optionst::get_command_line_options(optionst &options)
259266
options.set_option("non-null", true);
260267
else if(cmdline.isset("constants"))
261268
options.set_option("constants", true);
262-
263-
if(!(options.get_bool_option("constants") ||
264-
options.get_bool_option("intervals") ||
265-
options.get_bool_option("non-null")))
269+
else if (cmdline.isset("dependence-graph"))
270+
options.set_option("dependence-graph", true);
271+
272+
if (!(options.get_bool_option("constants") ||
273+
options.get_bool_option("intervals") ||
274+
options.get_bool_option("non-null") ||
275+
options.get_bool_option("dependence-graph")))
266276
{
267277
status() << "Domain defaults to --constants" << eom;
268278
options.set_option("constants", true);
@@ -616,11 +626,13 @@ void goto_analyzer_parse_optionst::help()
616626
" --constants constant abstraction\n"
617627
" --intervals interval abstraction\n"
618628
" --non-null non-null abstraction\n"
629+
" --dependence-graph dependency relation between instructions\n"
619630
"\n"
620631
"Output options:\n"
621632
" --text file_name output results in plain text to given file\n"
622633
" --json file_name output results in JSON format to given file\n"
623634
" --xml file_name output results in XML format to given file\n"
635+
" --dot file_name output results in DOT format to given file\n"
624636
"\n"
625637
"Other analyses:\n"
626638
" --taint file_name perform taint analysis using rules in given file\n"

src/goto-analyzer/goto_analyzer_parse_options.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,13 @@ class optionst;
3333
"(gcc)(arch):" \
3434
"(taint):(show-taint)" \
3535
"(show-local-may-alias)" \
36-
"(json):(xml):(text):" \
36+
"(json):(xml):(text):(dot):" \
3737
"(unreachable-instructions)" \
3838
"(intervals)(show-intervals)" \
3939
"(non-null)(show-non-null)" \
4040
"(constants)" \
41-
"(show)(verify)(simplify):" \
41+
"(dependence-graph)" \
42+
"(show)(verify)(simplify):" \
4243
"(flow-sensitive)(concurrent)"
4344

4445
class goto_analyzer_parse_optionst:

src/goto-analyzer/static_show_domain.cpp

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ Author: Martin Brain, [email protected]
1414

1515
#include <analyses/interval_domain.h>
1616
#include <analyses/constant_propagator.h>
17+
#include <analyses/dependence_graph.h>
1718

1819
#include "static_show_domain.h"
1920

@@ -36,18 +37,23 @@ bool static_show_domain(
3637
message_handlert &message_handler,
3738
std::ostream &out)
3839
{
39-
ai_baset *domain=NULL;
40-
40+
ai_baset *domain = NULL;
41+
namespacet ns(goto_model.symbol_table);
42+
4143
if(options.get_bool_option("flow-sensitive"))
4244
{
4345
if(options.get_bool_option("constants"))
44-
domain=new ait<constant_propagator_domaint>();
46+
domain = new ait<constant_propagator_domaint>();
4547

4648
else if(options.get_bool_option("intervals"))
47-
domain=new ait<interval_domaint>();
49+
domain = new ait<interval_domaint>();
50+
51+
//else if(options.get_bool_option("non-null"))
52+
// domain = new ait<non_null_domaint>();
53+
54+
else if(options.get_bool_option("dependence-graph"))
55+
domain = new dependence_grapht(ns);
4856

49-
// else if(options.get_bool_option("non-null"))
50-
// domain=new ait<non_null_domaint>();
5157
}
5258
else if(options.get_bool_option("concurrent"))
5359
{
@@ -75,10 +81,20 @@ bool static_show_domain(
7581
// status() << "Performing analysis" << eom;
7682
(*domain)(goto_model);
7783

84+
7885
if(options.get_bool_option("json"))
7986
out << domain->output_json(goto_model);
8087
else if(options.get_bool_option("xml"))
8188
out << domain->output_xml(goto_model);
89+
else if(options.get_bool_option("dot") && options.get_bool_option("dependence-graph"))
90+
{
91+
dependence_grapht *d = dynamic_cast<dependence_grapht*>(domain);
92+
assert(d != NULL);
93+
94+
out << "digraph g {\n";
95+
d->output_dot(out);
96+
out << "}\n";
97+
}
8298
else
8399
domain->output(goto_model, out);
84100

0 commit comments

Comments
 (0)