Skip to content

Commit f0f57f1

Browse files
committed
Generalize positive def_exc ranges to not include 0
1 parent 8f84f7c commit f0f57f1

2 files changed

Lines changed: 11 additions & 3 deletions

File tree

‎src/cdomain/value/cdomains/int/defExcDomain.ml‎

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,10 +110,11 @@ struct
110110
| `Bot -> None
111111

112112
let in_range r i =
113-
if Z.compare i Z.zero < 0 then
113+
(* if Z.compare i Z.zero < 0 then *)
114114
let lowerb = Exclusion.min_of_range r in
115115
Z.compare lowerb i <= 0
116-
else
116+
&&
117+
(* else *)
117118
let upperb = Exclusion.max_of_range r in
118119
Z.compare i upperb <= 0
119120

@@ -269,6 +270,9 @@ struct
269270
* just DeMorgans Law *)
270271
| `Excluded (x,r1), `Excluded (y,r2) ->
271272
let r' = R.meet r1 r2 in
273+
if R.is_bot r' then
274+
`Bot
275+
else
272276
let s' = S.union x y |> S.filter (in_range r') in
273277
`Excluded (s', r')
274278

‎src/cdomain/value/cdomains/intDomain0.ml‎

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -471,6 +471,10 @@ module Size = struct (* size in bits as int, range as int64 *)
471471
in
472472
if sign x = `Signed then
473473
size (min_for x)
474+
else if Z.compare x Z.zero > 0 then (
475+
let n = Int64.of_int (Z.numbits x) in
476+
(Int64.pred n, n)
477+
)
474478
else
475479
let a, b = size (min_for x) in
476480
if b <= 64L then
@@ -487,7 +491,7 @@ module Size = struct (* size in bits as int, range as int64 *)
487491
let max_from_bit_range pos_bits = Z.(pred @@ shift_left Z.one (to_int (Z.of_int64 pos_bits)))
488492

489493
(* From the number of bits used to represent a non-positive value, determines the minimal representable value *)
490-
let min_from_bit_range neg_bits = Z.(if neg_bits = 0L then Z.zero else neg @@ shift_left Z.one (to_int (neg (Z.of_int64 neg_bits))))
494+
let min_from_bit_range neg_bits = Z.(if neg_bits = 0L then Z.zero else if neg_bits < 0L then neg @@ shift_left Z.one (to_int (neg (Z.of_int64 neg_bits))) else max_from_bit_range neg_bits)
491495

492496
end
493497

0 commit comments

Comments
 (0)