@@ -41,9 +41,10 @@ static const slicet normalize_to_slice(const exprt &expr, const namespacet &ns)
41
41
size.has_value (),
42
42
" `sizeof` must always be computable on l-value assigns clause targets." );
43
43
44
- return {typecast_exprt::conditional_cast (
45
- address_of_exprt{expr}, pointer_type (char_type ())),
46
- typecast_exprt::conditional_cast (size.value (), signed_size_type ())};
44
+ return {
45
+ typecast_exprt::conditional_cast (
46
+ address_of_exprt{expr}, pointer_type (char_type ())),
47
+ typecast_exprt::conditional_cast (size.value (), signed_size_type ())};
47
48
}
48
49
49
50
UNREACHABLE;
@@ -72,9 +73,11 @@ assigns_clauset::conditional_address_ranget::conditional_address_ranget(
72
73
validity_condition_var(
73
74
generate_new_symbol (" __car_valid" , bool_typet(), location).symbol_expr()),
74
75
lower_bound_address_var(
75
- generate_new_symbol (" __car_lb" , slice.first.type(), location).symbol_expr()),
76
+ generate_new_symbol (" __car_lb" , slice.first.type(), location)
77
+ .symbol_expr()),
76
78
upper_bound_address_var(
77
- generate_new_symbol (" __car_ub" , slice.first.type(), location).symbol_expr())
79
+ generate_new_symbol (" __car_ub" , slice.first.type(), location)
80
+ .symbol_expr())
78
81
{
79
82
}
80
83
@@ -90,9 +93,12 @@ assigns_clauset::conditional_address_ranget::generate_snapshot_instructions()
90
93
location_no_checks.add_pragma (" disable:pointer-primitive-check" );
91
94
location_no_checks.add_pragma (" disable:pointer-overflow-check" );
92
95
93
- instructions.add (goto_programt::make_decl (validity_condition_var, location_no_checks));
94
- instructions.add (goto_programt::make_decl (lower_bound_address_var, location_no_checks));
95
- instructions.add (goto_programt::make_decl (upper_bound_address_var, location_no_checks));
96
+ instructions.add (
97
+ goto_programt::make_decl (validity_condition_var, location_no_checks));
98
+ instructions.add (
99
+ goto_programt::make_decl (lower_bound_address_var, location_no_checks));
100
+ instructions.add (
101
+ goto_programt::make_decl (upper_bound_address_var, location_no_checks));
96
102
97
103
instructions.add (goto_programt::make_assignment (
98
104
lower_bound_address_var,
@@ -104,7 +110,8 @@ assigns_clauset::conditional_address_ranget::generate_snapshot_instructions()
104
110
location_no_checks));
105
111
106
112
goto_programt skip_program;
107
- const auto skip_target = skip_program.add (goto_programt::make_skip (location_no_checks));
113
+ const auto skip_target =
114
+ skip_program.add (goto_programt::make_skip (location_no_checks));
108
115
109
116
const auto validity_check_expr = and_exprt{
110
117
all_dereferences_are_valid (source_expr, parent.ns ),
@@ -118,14 +125,16 @@ assigns_clauset::conditional_address_ranget::generate_snapshot_instructions()
118
125
instructions.add (goto_programt::make_assignment (
119
126
lower_bound_address_var, slice.first , location_no_checks));
120
127
128
+ source_locationt location_overflow_check = location;
129
+ location_overflow_check.add_pragma (" enable:pointer-overflow-check" );
130
+
121
131
instructions.add (goto_programt::make_assignment (
122
132
upper_bound_address_var,
123
133
minus_exprt{
124
134
plus_exprt{slice.first , slice.second },
125
135
from_integer (1 , slice.second .type ())},
126
- // TODO activate pointer-overflow checks
127
- // keeping checks since the pointer addition can overflow
128
- location));
136
+ // activate pointer-overflow checks to guard against overflow on this addition
137
+ location_overflow_check));
129
138
instructions.destructive_append (skip_program);
130
139
return instructions;
131
140
}
@@ -137,8 +146,8 @@ assigns_clauset::conditional_address_ranget::generate_unsafe_inclusion_check(
137
146
return conjunction (
138
147
{validity_condition_var,
139
148
same_object (lower_bound_address_var, lhs.lower_bound_address_var ),
140
- // should become redudant if they are derived from the same object and no pointer overflow
141
- same_object (lhs.upper_bound_address_var , upper_bound_address_var),
149
+ // redudant now that we guard against pointer overflow
150
+ // same_object(lhs.upper_bound_address_var, upper_bound_address_var),
142
151
less_than_or_equal_exprt{
143
152
pointer_offset (lower_bound_address_var),
144
153
pointer_offset (lhs.lower_bound_address_var )},
0 commit comments