Skip to content

Commit bf87420

Browse files
authored
Merge pull request diffblue#91 from diffblue/marek/enabling_slicer_PR
Enabling slicer.
2 parents bbb2cf8 + 815775d commit bf87420

File tree

7 files changed

+78
-17
lines changed

7 files changed

+78
-17
lines changed

src/Makefile

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1-
DIRS = driver pointer-analysis summaries taint-analysis util
1+
DIRS = driver pointer-analysis summaries taint-analysis taint-slicer util
22

33
all: driver.dir
44

5-
pointer-analysis.dir summaries.dir taint-analysis.dir: cbmc.dir
5+
pointer-analysis.dir summaries.dir taint-analysis.dir taint-slicer.dir: cbmc.dir
66

7-
driver.dir: cbmc.dir pointer-analysis.dir summaries.dir taint-analysis.dir util.dir
7+
driver.dir: cbmc.dir pointer-analysis.dir summaries.dir taint-analysis.dir \
8+
taint-slicer.dir util.dir \
9+
# No more directories
810

911
# building for a particular directory
1012

@@ -17,7 +19,8 @@ $(patsubst %, %.dir, $(DIRS)):
1719
cbmc.dir:
1820
$(MAKE) $(MAKEARGS) -C ../cbmc/src \
1921
languages linking.dir big-int.dir goto-programs.dir analyses.dir \
20-
pointer-analysis.dir langapi.dir json.dir assembler.dir util.dir miniz.dir
22+
pointer-analysis.dir langapi.dir json.dir assembler.dir util.dir miniz.dir \
23+
goto-instrument.dir cbmc.dir symex.dir
2124

2225
# generate source files
2326

src/driver/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ OBJ += ../../cbmc/src/ansi-c/ansi-c$(LIBEXT) \
1717
../pointer-analysis/sec_pointer_analysis$(LIBEXT) \
1818
../taint-analysis/sec_taint_analysis$(LIBEXT) \
1919
../util/sec_util$(LIBEXT) \
20+
../taint-slicer/taint-slicer$(LIBEXT) \
2021
# No more library files
2122

2223
INCLUDES= -I .. \

src/taint-analysis/taint_security_scanner.cpp

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,14 @@ The root module of the security scanner (a.k.a. the taint analyser).
2222
#include "taint_tokens_propagation_graph.h"
2323
#include "taint_summary_dump.h"
2424
#include "taint_statistics_dump.h"
25+
#include <taint-slicer/slicer.h>
2526
#include <util/config.h>
2627
#include <util/msgstream.h>
2728
#include <util/json_map_serializer.h>
2829
#include "taint_serializer_traits.h"
2930
#include <memory>
31+
#include <chrono> // NOLINT(*) : Google has its own time library.
32+
// So they suppress chrono.
3033

3134

3235
bool taint_do_security_scan(
@@ -39,6 +42,9 @@ bool taint_do_security_scan(
3942
{
4043
logger.status() << "Starting the security scanner." << messaget::eom;
4144

45+
const std::chrono::high_resolution_clock::time_point start_time=
46+
std::chrono::high_resolution_clock::now();
47+
4248
taint_statisticst statistics;
4349

4450
logger.status() << "Loading config files." << messaget::eom;
@@ -150,6 +156,51 @@ bool taint_do_security_scan(
150156
&statistics,
151157
&logger);
152158

159+
const float consumed_time_after_summarising=
160+
std::chrono::duration<float>(
161+
std::chrono::high_resolution_clock::now() - start_time).count();
162+
if(config.get_timeout_in_seconds() > consumed_time_after_summarising)
163+
{
164+
const auto remaining_timeout=
165+
config.get_timeout_in_seconds() - consumed_time_after_summarising;
166+
167+
logger.status()
168+
<< "Starting slicer on the analysed GOTO program (timeout="
169+
<< std::fixed << std::setprecision(1)
170+
<< remaining_timeout
171+
<< "s)." << messaget::eom;
172+
173+
taint_slicert slicer(
174+
&program,
175+
&numbering,
176+
&named_tokens,
177+
&taint_summaries,
178+
tokens_propagation_graph_ptr.get(),
179+
remaining_timeout,
180+
config.get_slicer_root_directory(),
181+
fileutl_concatenate_file_paths(
182+
config.get_temp_root_directory(),
183+
"SLICER"),
184+
&statistics,
185+
&logger);
186+
slicer.compute_slice();
187+
}
188+
189+
if(config.is_html_dump_of_program_slice_enabled())
190+
{
191+
logger.status()
192+
<< "Saving tokens propagation graph (see '"
193+
<< fileutl_concatenate_file_paths(
194+
config.get_slicer_root_directory(),
195+
"tokens_propagation_graph.svg")
196+
<< "')." << messaget::eom;
197+
taint_dump_as_svg(
198+
*tokens_propagation_graph_ptr,
199+
fileutl_concatenate_file_paths(
200+
config.get_slicer_root_directory(),
201+
"tokens_propagation_graph.svg"));
202+
}
203+
153204
if(config.is_html_dump_of_summaries_enabled())
154205
{
155206
statistics.begin_dump_of_taint_html_summaries();

src/taint-analysis/taint_summary_dump.cpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -395,21 +395,21 @@ bool taint_functions_for_dumping_taint_summary_in_htmlt::
395395
bool first_and=true;
396396
for(const auto& set : props.get_sink_conditions())
397397
{
398-
if(!first_and)
398+
if(first_and)
399+
first_and=false;
400+
else
399401
ostr << " and ";
400402
if(props.get_sink_conditions().size()>1U && set.size()>1U)
401403
ostr << " ( ";
402-
bool first_or=true;
403-
for(const auto& cond : set)
404-
{
405-
if(!first_or)
406-
ostr << " or ";
407-
ostr << html_encoding() << cond.dump(named_tokens);
408-
first_or=false;
409-
}
404+
const taint_tokent::named_tokenst * const named_tokens_ptr=
405+
&named_tokens;
406+
ostr << html_encoding()
407+
<< join(set | boost::adaptors::transformed(
408+
[named_tokens_ptr](const taint_subject_conditiont &cond)
409+
{ return cond.dump(*named_tokens_ptr); }),
410+
std::string(" or "));
410411
if(props.get_sink_conditions().size()>1U && set.size()>1U)
411412
ostr << " ) ";
412-
first_and=false;
413413
}
414414
ostr << ".";
415415
}

src/taint-analysis/taint_tokens_propagation_graph.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,13 @@ std::ostream &taint_to_dot(
209209
<< " node [fontsize=12];\n\n";
210210
for(const taint_tokent::namet &token : graph.get_tokens())
211211
ostr << " \"" << token
212-
<< "\" [shape="
212+
<< "\" [label=\""
213+
<< (token == taint_tokens_propagation_grapht::get_source_token() ?
214+
taint_tokens_propagation_grapht::get_source_token().name :
215+
token == taint_tokens_propagation_grapht::get_sink_token() ?
216+
taint_tokens_propagation_grapht::get_sink_token().name :
217+
(msgstream() << token).get())
218+
<< "\", shape="
213219
<< (token==graph.get_source_token() ? "octagon" :
214220
(token==graph.get_sink_token() ? "doubleoctagon" :
215221
"ellipse"))

src/taint-slicer/slicer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ taint_slicert::taint_slicert(
4141
, named_tokens(named_tokens)
4242
, summaries(summaries)
4343
, tokens_propagation_graph(tokens_propagation_graph)
44-
, timeout(timeout)
44+
// , timeout(timeout)
4545
, results_dir(results_dir)
4646
, temp_dir(temp_dir)
4747
, statistics(statistics)

src/taint-slicer/slicer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ class taint_slicert
7373
const taint_tokent::named_tokenst *named_tokens;
7474
const taint_summaryt::dbt * const summaries;
7575
const taint_tokens_propagation_grapht *tokens_propagation_graph;
76-
float timeout;
76+
// float timeout;
7777
std::string results_dir;
7878
std::string temp_dir;
7979
taint_statisticst *statistics;

0 commit comments

Comments
 (0)