Skip to content

Commit 59e340b

Browse files
committed
graphml-witnesses should not use enum values
Make the "clean" configuration produce integers instead.
1 parent 95097a8 commit 59e340b

File tree

3 files changed

+28
-13
lines changed

3 files changed

+28
-13
lines changed

regression/cbmc/graphml_witness1/test.desc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ main.c
4949
<edge source="[0-9\.]*" target="[0-9\.]*">
5050
<data key="originfile">main.c</data>
5151
<data key="startline">15</data>
52+
<data key="assumption">next_field = [01];</data>
5253
<data key="assumption.scope">remove_one</data>
5354
</edge>
5455
<node id="[0-9\.]*">

src/ansi-c/expr2c.cpp

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,8 @@ expr2c_configurationt expr2c_configurationt::default_configuration
4343
true,
4444
"TRUE",
4545
"FALSE",
46-
true
46+
true,
47+
false
4748
};
4849

4950
expr2c_configurationt expr2c_configurationt::clean_configuration
@@ -53,7 +54,8 @@ expr2c_configurationt expr2c_configurationt::clean_configuration
5354
false,
5455
"1",
5556
"0",
56-
false
57+
false,
58+
true
5759
};
5860

5961
// clang-format on
@@ -1709,22 +1711,29 @@ std::string expr2ct::convert_constant(
17091711
if(c_enum_type.id()!=ID_c_enum)
17101712
return convert_norep(src, precedence);
17111713

1712-
const c_enum_typet::memberst &members=
1713-
to_c_enum_type(c_enum_type).members();
1714-
1715-
for(const auto &member : members)
1714+
if(!configuration.print_enum_int_value)
17161715
{
1717-
if(member.get_value() == value)
1718-
return "/*enum*/" + id2string(member.get_base_name());
1716+
const c_enum_typet::memberst &members =
1717+
to_c_enum_type(c_enum_type).members();
1718+
1719+
for(const auto &member : members)
1720+
{
1721+
if(member.get_value() == value)
1722+
return "/*enum*/" + id2string(member.get_base_name());
1723+
}
17191724
}
17201725

1721-
// failed...
1726+
// lookup failed or enum is to be output as integer
17221727
const bool is_signed = c_enum_type.subtype().id() == ID_signedbv;
17231728
const auto width = to_bitvector_type(c_enum_type.subtype()).get_width();
17241729

1725-
mp_integer int_value = bvrep2integer(value, width, is_signed);
1730+
std::string value_as_string =
1731+
integer2string(bvrep2integer(value, width, is_signed));
17261732

1727-
return "/*enum*/"+integer2string(int_value);
1733+
if(configuration.print_enum_int_value)
1734+
return value_as_string;
1735+
else
1736+
return "/*enum*/" + value_as_string;
17281737
}
17291738
else if(type.id()==ID_rational)
17301739
return convert_norep(src, precedence);

src/ansi-c/expr2c.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,19 +39,24 @@ struct expr2c_configurationt final
3939
/// This is the string that will be printed for null pointers
4040
bool use_library_macros;
4141

42+
/// When printing an enum-typed constant, print the integer representation
43+
bool print_enum_int_value;
44+
4245
expr2c_configurationt(
4346
const bool include_struct_padding_components,
4447
const bool print_struct_body_in_type,
4548
const bool include_array_size,
4649
const std::string &true_string,
4750
const std::string &false_string,
48-
const bool use_library_macros)
51+
const bool use_library_macros,
52+
const bool print_enum_int_value)
4953
: include_struct_padding_components(include_struct_padding_components),
5054
print_struct_body_in_type(print_struct_body_in_type),
5155
include_array_size(include_array_size),
5256
true_string(true_string),
5357
false_string(false_string),
54-
use_library_macros(use_library_macros)
58+
use_library_macros(use_library_macros),
59+
print_enum_int_value(print_enum_int_value)
5560
{
5661
}
5762

0 commit comments

Comments
 (0)