Skip to content

Commit c4426ea

Browse files
committed
Add --vsd-arrays up-to-n-elements option
Default n is 10. Additional --vsd-max-array-elements options gives finer control.
1 parent a78ea94 commit c4426ea

File tree

6 files changed

+54
-3
lines changed

6 files changed

+54
-3
lines changed
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
CORE
2+
main.c
3+
--show --variable-sensitivity --vsd-values constants --vsd-arrays up-to-n-elements --vsd-array-max-elements 3
4+
^EXIT=0$
5+
^SIGNAL=0$
6+
main::1::arr_at_ix \(\) -> TOP @ \[9\]
7+
main::1::arr_0_after_write \(\) -> TOP
8+
main::1::arr_1_after_write \(\) -> TOP
9+
main::1::arr_2_after_write \(\) -> TOP
10+
main::1::arr_3_after_write \(\) -> TOP
11+
main::1::arr_4_after_write \(\) -> TOP
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
CORE
2+
main.c
3+
--show --variable-sensitivity --vsd-values intervals --vsd-arrays up-to-n-elements --vsd-array-max-elements 3
4+
^EXIT=0$
5+
^SIGNAL=0$
6+
main::1::arr_at_ix \(\) -> \[1, 5\] @ \[9\]
7+
main::1::arr_0_after_write \(\) -> \[1, 63\]
8+
main::1::arr_1_after_write \(\) -> \[2, 63\]
9+
main::1::arr_2_after_write \(\) -> \[3, 63\]
10+
main::1::arr_3_after_write \(\) -> \[3, 63\]
11+
main::1::arr_4_after_write \(\) -> \[3, 63\]
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
CORE
2+
main.c
3+
--show --variable-sensitivity --vsd-values set-of-constants --vsd-arrays up-to-n-elements --vsd-array-max-elements 3
4+
^EXIT=0$
5+
^SIGNAL=0$
6+
main::1::arr_at_ix \(\) -> value-set-begin: 1, 3, 4, 5 :value-set-end
7+
main::1::arr_0_after_write \(\) -> value-set-begin: 1, 99 :value-set-end
8+
main::1::arr_1_after_write \(\) -> value-set-begin: 2 :value-set-end
9+
main::1::arr_2_after_write \(\) -> value-set-begin: 3, 4, 5, 99 :value-set-end
10+
main::1::arr_3_after_write \(\) -> value-set-begin: 3, 4, 5, 99 :value-set-end
11+
main::1::arr_4_after_write \(\) -> value-set-begin: 3, 4, 5, 99 :value-set-end

src/analyses/variable-sensitivity/variable_sensitivity_configuration.cpp

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,7 @@ vsd_configt vsd_configt::from_options(const optionst &options)
4747
? flow_sensitivityt::insensitive
4848
: flow_sensitivityt::sensitive;
4949

50-
config.maximum_array_index =
51-
option_to_size(options, "arrays", array_option_size_mappings);
50+
config.maximum_array_index = configure_max_array_size(options);
5251

5352
return config;
5453
}
@@ -105,12 +104,14 @@ const vsd_configt::option_mappingt vsd_configt::struct_option_mappings = {
105104
const vsd_configt::option_mappingt vsd_configt::array_option_mappings = {
106105
{"top-bottom", ARRAY_INSENSITIVE},
107106
{"smash", ARRAY_SENSITIVE},
107+
{"up-to-n-elements", ARRAY_SENSITIVE},
108108
{"every-element", ARRAY_SENSITIVE}};
109109

110110
const vsd_configt::option_size_mappingt
111111
vsd_configt::array_option_size_mappings = {
112112
{"top-bottom", 0},
113113
{"smash", 0},
114+
{"up-to-n-elements", 10},
114115
{"every-element", std::numeric_limits<size_t>::max()}};
115116

116117
const vsd_configt::option_mappingt vsd_configt::union_option_mappings = {
@@ -153,6 +154,17 @@ ABSTRACT_OBJECT_TYPET vsd_configt::option_to_abstract_type(
153154
return selected->second;
154155
}
155156

157+
size_t vsd_configt::configure_max_array_size(const optionst &options)
158+
{
159+
if(options.get_option("arrays") == "up-to-n-elements")
160+
{
161+
size_t max_elements = options.get_unsigned_int_option("array-max-elements");
162+
if(max_elements != 0)
163+
return max_elements - 1;
164+
}
165+
return option_to_size(options, "arrays", array_option_size_mappings);
166+
}
167+
156168
size_t vsd_configt::option_to_size(
157169
const optionst &options,
158170
const std::string &option_name,

src/analyses/variable-sensitivity/variable_sensitivity_configuration.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,8 @@ struct vsd_configt
8787
const option_mappingt &mapping,
8888
ABSTRACT_OBJECT_TYPET default_type);
8989

90+
static size_t configure_max_array_size(const optionst &options);
91+
9092
static size_t option_to_size(
9193
const optionst &options,
9294
const std::string &option_name,

src/analyses/variable-sensitivity/variable_sensitivity_domain.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@
7575
"(vsd-values):" \
7676
"(vsd-structs):" \
7777
"(vsd-arrays):" \
78+
"(vsd-array-max-elements):" \
7879
"(vsd-pointers):" \
7980
"(vsd-unions):" \
8081
"(vsd-flow-insensitive)" \
@@ -88,7 +89,9 @@
8889
" --vsd-structs struct field sensitive analysis - " \
8990
"top-bottom|every-field\n" /* NOLINT(whitespace/line_length) */ \
9091
" --vsd-arrays array entry sensitive analysis - " \
91-
"top-bottom|smash|every-element\n" /* NOLINT(whitespace/line_length) */ \
92+
"top-bottom|smash|up-to-n-elements|every-element\n" /* NOLINT(whitespace/line_length) */ \
93+
" --vsd-array-max-elements the n in --vsd-arrays up-to-n-elements - " \
94+
"defaults 10 if not given" /* NOLINT(whitespace/line_length) */ \
9295
" --vsd-pointers pointer sensitive analysis - " \
9396
"top-bottom|constants|value-set\n" /* NOLINT(whitespace/line_length) */ \
9497
" --vsd-unions union sensitive analysis - top-bottom\n" \
@@ -102,6 +105,7 @@
102105
options.set_option("values", cmdline.get_value("vsd-values")); \
103106
options.set_option("pointers", cmdline.get_value("vsd-pointers")); \
104107
options.set_option("arrays", cmdline.get_value("vsd-arrays")); \
108+
options.set_option("array-max-elements", cmdline.get_value("vsd-array-max-elements")); /* NOLINT(whitespace/line_length) */ \
105109
options.set_option("structs", cmdline.get_value("vsd-structs")); \
106110
options.set_option("unions", cmdline.get_value("vsd-unions")); \
107111
options.set_option("flow-insensitive", cmdline.isset("vsd-flow-insensitive")); /* NOLINT(whitespace/line_length) */ \

0 commit comments

Comments
 (0)