Skip to content

Commit f485e14

Browse files
committed
Fix bitfield _Bool casts
1 parent 9d87796 commit f485e14

File tree

2 files changed

+28
-9
lines changed

2 files changed

+28
-9
lines changed

src/cdomain/value/cdomains/int/bitfieldDomain.ml

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,25 @@ module BitfieldFunctor (Ints_t : IntOps.IntOps): Bitfield_SOverflow with type in
281281
let overflow_info = if suppress_ovwarn then {underflow=false; overflow=false} else {underflow=underflow; overflow=overflow} in
282282
(norm ~suppress_ovwarn:(suppress_ovwarn) ~ov:(underflow || overflow) ik (z,o), overflow_info)
283283

284+
let cast_to ?(suppress_ovwarn=false) ?torg ?(no_ov=false) ik (z,o) =
285+
if ik = GoblintCil.IBool then (
286+
let may_zero =
287+
if Ints_t.equal z BArith.one_mask then (* zero bit may be in every position (one_mask) *)
288+
BArith.zero
289+
else
290+
bot () (* must be non-zero, so may not be zero *)
291+
in
292+
let may_one =
293+
if Ints_t.equal o BArith.zero_mask then (* one bit may be in no position (zero_mask) *)
294+
bot () (* must be zero, so may not be one *)
295+
else
296+
BArith.one
297+
in
298+
(BArith.join may_zero may_one, {underflow=false; overflow=false})
299+
)
300+
else
301+
cast_to ~suppress_ovwarn ?torg ~no_ov ik (z,o)
302+
284303
let join ik b1 b2 = norm ik @@ (BArith.join b1 b2)
285304

286305
let meet ik x y = norm ik @@ (BArith.meet x y)

tests/regression/83-bitfield/14-bool.c

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,23 +12,23 @@ int main() {
1212

1313
// assigning constant from other variable instead of integer constant, because integer constant swallows implicit cast to _Bool
1414
_Bool b1 = i1;
15-
_Bool b123 = i123; // TODO NOWARN (overflow)
16-
_Bool bm123 = im123; // TODO NOWARN (underflow)
17-
_Bool b128 = i128; // TODO NOWARN (overflow)
18-
_Bool bm128 = im128; // TODO NOWARN (underflow)
15+
_Bool b123 = i123; // NOWARN (overflow)
16+
_Bool bm123 = im123; // NOWARN (underflow)
17+
_Bool b128 = i128; // NOWARN (overflow)
18+
_Bool bm128 = im128; // NOWARN (underflow)
1919
_Bool bf = i0;
20-
_Bool brand = irand; // TODO NOWARN (underflow, overflow)
20+
_Bool brand = irand; // NOWARN (underflow, overflow)
2121

2222
__goblint_check(b1);
2323
__goblint_check(b1 == 1);
2424
__goblint_check(b123);
2525
__goblint_check(b123 == 1);
2626
__goblint_check(bm123);
2727
__goblint_check(bm123 == 1);
28-
__goblint_check(b128); // TODO
29-
__goblint_check(b128 == 1); // TODO
30-
__goblint_check(bm128); // TODO
31-
__goblint_check(bm128 == 1); // TODO
28+
__goblint_check(b128);
29+
__goblint_check(b128 == 1);
30+
__goblint_check(bm128);
31+
__goblint_check(bm128 == 1);
3232
__goblint_check(!bf);
3333
__goblint_check(bf == 0);
3434
__goblint_check(brand); // UNKNOWN!

0 commit comments

Comments
 (0)