Skip to content

Commit abb12fd

Browse files
authored
Merge pull request diffblue#180 from diffblue/feature/symbol_table_detailed_irept_dump
SEC-46: Extended HTML dump of symbols table (irept structure for types and initial values).
2 parents a86c870 + 0fb2f90 commit abb12fd

File tree

4 files changed

+90
-2
lines changed

4 files changed

+90
-2
lines changed

src/summaries/summary_dump.cpp

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include <util/file_util.h>
88
#include <util/msgstream.h>
99
#include <util/simplify_expr.h>
10+
#include <util/unique_name.h>
1011
#include <algorithm>
1112
#include <fstream>
1213
#include <sstream>
@@ -471,13 +472,60 @@ std::string dump_symbol_table_symbols_in_html(
471472
<< to_html_text(symbol.location.as_string_with_cwd()) << "</td>\n";
472473
ostr << " </tr>\n";
473474
ostr << " <tr>\n";
474-
ostr << " <td>Type of symbol</td>\n";
475+
476+
const std::string &output_directory=fileutl_concatenate_file_paths(
477+
fileutl_parse_path_in_pathname(pathname), "IREP");
478+
fileutl_create_directory(output_directory);
479+
480+
struct localt
481+
{
482+
static bool exists_check(
483+
const std::string &file_name_base,
484+
const std::string &output_directory)
485+
{
486+
return fileutl_file_exists(fileutl_concatenate_file_paths(
487+
output_directory, file_name_base+".txt"));
488+
}
489+
};
490+
const auto exists_checker=std::bind(
491+
&localt::exists_check,
492+
std::placeholders::_1,
493+
std::cref(output_directory));
494+
495+
std::string irep_dump_fname=get_unique_name(
496+
as_string(symbol.name)+"__TYPE", exists_checker)+".txt";
497+
{
498+
std::fstream irep_out(
499+
fileutl_concatenate_file_paths(output_directory, irep_dump_fname),
500+
std::ios_base::out);
501+
dump_irept(symbol.type, irep_out, "");
502+
}
503+
504+
ostr << " <td>Type of symbol ["
505+
"<a href=\"./IREP/"
506+
<< irep_dump_fname
507+
<< "\">details</a>"
508+
"]</td>\n";
475509
ostr << " <td>"
476510
<< to_html_text(from_type(namespacet(symbol_table), "", symbol.type))
477511
<< "</td>\n";
478512
ostr << " </tr>\n";
479513
ostr << " <tr>\n";
480-
ostr << " <td>Initial value of symbol</td>\n";
514+
515+
irep_dump_fname=get_unique_name(
516+
as_string(symbol.name)+"__INIT", exists_checker)+".txt";
517+
{
518+
std::fstream irep_out(
519+
fileutl_concatenate_file_paths(output_directory, irep_dump_fname),
520+
std::ios_base::out);
521+
dump_irept(symbol.value, irep_out, "");
522+
}
523+
524+
ostr << " <td>Initial value of symbol ["
525+
"<a href=\"./IREP/"
526+
<< irep_dump_fname
527+
<< "\">details</a>"
528+
"]</td>\n";
481529
ostr << " <td>";
482530
if(symbol.value.id()==ID_code)
483531
ostr << "&lt;function-body&gt;";

src/util/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
SRC = json_serializer.cpp \
2+
unique_name.cpp \
23
# No more source files
34

45
INCLUDES= -I .. -I ../../cbmc/src

src/util/unique_name.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// Copyright 2016-2017 DiffBlue Limited. All Rights Reserved.
2+
3+
/// \file
4+
/// Utility for construction of a unique name (like file name).
5+
6+
#include <util/unique_name.h>
7+
8+
std::string uniqueify(const std::string &base, unsigned long uniqueness)
9+
{
10+
return uniqueness==0UL?base:base+'_'+std::to_string(uniqueness);
11+
}
12+
13+
std::string get_unique_name(
14+
const std::string &base_name,
15+
std::function<bool(const std::string &)> exists)
16+
{
17+
unsigned long uniqueness=0UL;
18+
while(exists(uniqueify(base_name, uniqueness)))
19+
++uniqueness;
20+
return uniqueify(base_name, uniqueness);
21+
}

src/util/unique_name.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// Copyright 2016-2017 DiffBlue Limited. All Rights Reserved.
2+
3+
/// \file
4+
/// Utility for construction of a unique name (like file name).
5+
6+
#ifndef CPROVER_SECURITY_SCANNER_UTIL_UNIQUE_NAME_H
7+
#define CPROVER_SECURITY_SCANNER_UTIL_UNIQUE_NAME_H
8+
9+
#include <string>
10+
#include <functional>
11+
12+
std::string uniqueify(const std::string &base, unsigned long uniqueness);
13+
14+
std::string get_unique_name(
15+
const std::string &base_name,
16+
std::function<bool(const std::string &)> exists);
17+
18+
#endif

0 commit comments

Comments
 (0)