Skip to content

Commit 63203b1

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 63203b1

20 files changed

+158
-21
lines changed
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
int main(void)
2+
{
3+
int arr[] = {1, 2, 3, 4, 5};
4+
arr[2] = 99;
5+
int arr_0_after_write = arr[0];
6+
int arr_1_after_write = arr[1];
7+
int arr_2_after_write = arr[2];
8+
int arr_3_after_write = arr[3];
9+
int arr_4_after_write = arr[4];
10+
return 0;
11+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
CORE
2+
main.c
3+
--show --variable-sensitivity --vsd-values constants --vsd-arrays every-element
4+
^EXIT=0$
5+
^SIGNAL=0$
6+
main::1::arr_0_after_write \(\) -> 1
7+
main::1::arr_1_after_write \(\) -> 2
8+
main::1::arr_2_after_write \(\) -> 99
9+
main::1::arr_3_after_write \(\) -> 4
10+
main::1::arr_4_after_write \(\) -> 5
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
CORE
2+
main.c
3+
--show --variable-sensitivity --vsd-values constants --vsd-arrays smash
4+
^EXIT=0$
5+
^SIGNAL=0$
6+
main::1::arr_0_after_write \(\) -> TOP
7+
main::1::arr_1_after_write \(\) -> TOP
8+
main::1::arr_2_after_write \(\) -> TOP
9+
main::1::arr_3_after_write \(\) -> TOP
10+
main::1::arr_4_after_write \(\) -> TOP
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
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_0_after_write \(\) -> 1
7+
main::1::arr_1_after_write \(\) -> 2
8+
main::1::arr_2_after_write \(\) -> TOP
9+
main::1::arr_3_after_write \(\) -> TOP
10+
main::1::arr_4_after_write \(\) -> TOP
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
CORE
2+
main.c
3+
--show --variable-sensitivity --vsd-values intervals --vsd-arrays every-element
4+
^EXIT=0$
5+
^SIGNAL=0$
6+
main::1::arr_0_after_write \(\) -> \[1, 1\]
7+
main::1::arr_1_after_write \(\) -> \[2, 2\]
8+
main::1::arr_2_after_write \(\) -> \[63, 63\]
9+
main::1::arr_3_after_write \(\) -> \[4, 4\]
10+
main::1::arr_4_after_write \(\) -> \[5, 5\]
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
CORE
2+
main.c
3+
--show --variable-sensitivity --vsd-values intervals --vsd-arrays smash
4+
^EXIT=0$
5+
^SIGNAL=0$
6+
main::1::arr_0_after_write \(\) -> \[1, 63\]
7+
main::1::arr_1_after_write \(\) -> \[1, 63\]
8+
main::1::arr_2_after_write \(\) -> \[1, 63\]
9+
main::1::arr_3_after_write \(\) -> \[1, 63\]
10+
main::1::arr_4_after_write \(\) -> \[1, 63\]
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
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_0_after_write \(\) -> \[1, 1\]
7+
main::1::arr_1_after_write \(\) -> \[2, 2\]
8+
main::1::arr_2_after_write \(\) -> \[3, 63\]
9+
main::1::arr_3_after_write \(\) -> \[3, 63\]
10+
main::1::arr_4_after_write \(\) -> \[3, 63\]
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
CORE
2+
main.c
3+
--show --variable-sensitivity --vsd-values set-of-constants --vsd-arrays every-element
4+
^EXIT=0$
5+
^SIGNAL=0$
6+
main::1::arr_0_after_write \(\) -> value-set-begin: 1 :value-set-end
7+
main::1::arr_1_after_write \(\) -> value-set-begin: 2 :value-set-end
8+
main::1::arr_2_after_write \(\) -> value-set-begin: 99 :value-set-end
9+
main::1::arr_3_after_write \(\) -> value-set-begin: 4 :value-set-end
10+
main::1::arr_4_after_write \(\) -> value-set-begin: 5 :value-set-end
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
CORE
2+
main.c
3+
--show --variable-sensitivity --vsd-values set-of-constants --vsd-arrays smash
4+
^EXIT=0$
5+
^SIGNAL=0$
6+
main::1::arr_0_after_write \(\) -> value-set-begin: 1, 2, 3, 4, 5, 99 :value-set-end
7+
main::1::arr_1_after_write \(\) -> value-set-begin: 1, 2, 3, 4, 5, 99 :value-set-end
8+
main::1::arr_2_after_write \(\) -> value-set-begin: 1, 2, 3, 4, 5, 99 :value-set-end
9+
main::1::arr_3_after_write \(\) -> value-set-begin: 1, 2, 3, 4, 5, 99 :value-set-end
10+
main::1::arr_4_after_write \(\) -> value-set-begin: 1, 2, 3, 4, 5, 99 :value-set-end
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
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_0_after_write \(\) -> value-set-begin: 1 :value-set-end
7+
main::1::arr_1_after_write \(\) -> value-set-begin: 2 :value-set-end
8+
main::1::arr_2_after_write \(\) -> value-set-begin: 3, 4, 5, 99 :value-set-end
9+
main::1::arr_3_after_write \(\) -> value-set-begin: 3, 4, 5, 99 :value-set-end
10+
main::1::arr_4_after_write \(\) -> value-set-begin: 3, 4, 5, 99 :value-set-end

regression/goto-analyzer/variable-sensitivity-array-constant-access/main.c

Lines changed: 0 additions & 8 deletions
This file was deleted.

regression/goto-analyzer/variable-sensitivity-array-constant-access/test.desc

Lines changed: 0 additions & 7 deletions
This file was deleted.

regression/goto-analyzer/variable-sensitivity-array-nondet-access/main.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ int main(void)
1111
ix = 2;
1212
}
1313

14-
// ix is between 0 and 4
15-
// so this is between 1 and 5
14+
// ix is between 0 and 2
15+
// so this is between 1 and 3
1616
int arr_at_ix = arr[ix];
1717

1818
int write_ix;
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/full_array_abstract_object.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -484,7 +484,7 @@ static eval_index_resultt eval_index(
484484
const namespacet &ns)
485485
{
486486
auto max_array_index = env.configuration().maximum_array_index;
487-
bool overrun = (index > max_array_index);
487+
bool overrun = (index >= max_array_index);
488488

489489
return {true, overrun ? max_array_index : index, overrun};
490490
}

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)