@@ -172,7 +172,9 @@ class goto_checkt
172
172
173
173
using conditionst = std::list<conditiont>;
174
174
175
- void bounds_check (const index_exprt &, const guardt &);
175
+ void bounds_check (const exprt &, const guardt &);
176
+ void bounds_check_index (const index_exprt &, const guardt &);
177
+ void bounds_check_clz (const count_leading_zeros_exprt &, const guardt &);
176
178
void div_by_zero_check (const div_exprt &, const guardt &);
177
179
void mod_by_zero_check (const mod_exprt &, const guardt &);
178
180
void mod_overflow_check (const mod_exprt &, const guardt &);
@@ -1321,9 +1323,7 @@ std::string goto_checkt::array_name(const exprt &expr)
1321
1323
return ::array_name (ns, expr);
1322
1324
}
1323
1325
1324
- void goto_checkt::bounds_check (
1325
- const index_exprt &expr,
1326
- const guardt &guard)
1326
+ void goto_checkt::bounds_check (const exprt &expr, const guardt &guard)
1327
1327
{
1328
1328
if (!enable_bounds_check)
1329
1329
return ;
@@ -1335,6 +1335,16 @@ void goto_checkt::bounds_check(
1335
1335
return ;
1336
1336
}
1337
1337
1338
+ if (expr.id () == ID_index)
1339
+ bounds_check_index (to_index_expr (expr), guard);
1340
+ else if (expr.id () == ID_count_leading_zeros)
1341
+ bounds_check_clz (to_count_leading_zeros_expr (expr), guard);
1342
+ }
1343
+
1344
+ void goto_checkt::bounds_check_index (
1345
+ const index_exprt &expr,
1346
+ const guardt &guard)
1347
+ {
1338
1348
typet array_type = expr.array ().type ();
1339
1349
1340
1350
if (array_type.id ()==ID_pointer)
@@ -1510,6 +1520,19 @@ void goto_checkt::bounds_check(
1510
1520
}
1511
1521
}
1512
1522
1523
+ void goto_checkt::bounds_check_clz (
1524
+ const count_leading_zeros_exprt &expr,
1525
+ const guardt &guard)
1526
+ {
1527
+ add_guarded_property (
1528
+ notequal_exprt{expr.op (), from_integer (0 , expr.op ().type ())},
1529
+ " count leading zeros argument" ,
1530
+ " bit count" ,
1531
+ expr.find_source_location (),
1532
+ expr,
1533
+ guard);
1534
+ }
1535
+
1513
1536
void goto_checkt::add_guarded_property (
1514
1537
const exprt &asserted_expr,
1515
1538
const std::string &comment,
@@ -1729,7 +1752,7 @@ void goto_checkt::check_rec(const exprt &expr, guardt &guard)
1729
1752
1730
1753
if (expr.id ()==ID_index)
1731
1754
{
1732
- bounds_check (to_index_expr ( expr) , guard);
1755
+ bounds_check (expr, guard);
1733
1756
}
1734
1757
else if (expr.id ()==ID_div)
1735
1758
{
@@ -1766,6 +1789,10 @@ void goto_checkt::check_rec(const exprt &expr, guardt &guard)
1766
1789
{
1767
1790
pointer_primitive_check (expr, guard);
1768
1791
}
1792
+ else if (expr.id () == ID_count_leading_zeros)
1793
+ {
1794
+ bounds_check (expr, guard);
1795
+ }
1769
1796
}
1770
1797
1771
1798
void goto_checkt::check (const exprt &expr)
0 commit comments