From 63f85c069d23cb418185c398ddd74cc131d4feca Mon Sep 17 00:00:00 2001 From: Basile Desloges <basile.desloges@cea.fr> Date: Wed, 29 Apr 2020 15:13:09 +0200 Subject: [PATCH] [eacsl:analyses] Complete `Interval.infer` to support remaining bitwise operations --- src/plugins/e-acsl/src/analyses/interval.ml | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/plugins/e-acsl/src/analyses/interval.ml b/src/plugins/e-acsl/src/analyses/interval.ml index 54d7f8e5af4..91043aca76a 100644 --- a/src/plugins/e-acsl/src/analyses/interval.ml +++ b/src/plugins/e-acsl/src/analyses/interval.ml @@ -253,7 +253,10 @@ let ikind_of_ival iv = | None, None -> raise Cil.Not_representable (* GMP *) (* TODO: do not raise an exception, but returns a value instead *) | None, Some _ | Some _, None -> - Kernel.fatal ~current:true "unexpected ival: %a" Ival.pretty iv + (* Semi-open interval that can happen when computing the interval of shift + operations if the computation overflows *) + (* TODO: do not raise an exception, but returns a value instead *) + raise Cil.Not_representable (* GMP *) (* function call profiles (intervals for their formal parameters) *) module Profile = struct @@ -456,9 +459,18 @@ let rec infer t = let i1 = infer t1 in let i2 = infer t2 in lift_binop ~safe_float:false Ival.c_rem i1 i2 - | TBinOp (Shiftlt , _, _) -> Error.not_yet "right shift" - | TBinOp (Shiftrt , _, _) -> Error.not_yet "left shift" - | TBinOp (BAnd, _, _) -> Error.not_yet "bitwise and" + | TBinOp (Shiftlt, t1, t2) -> + let i1 = infer t1 in + let i2 = infer t2 in + lift_binop ~safe_float:false Ival.shift_left i1 i2 + | TBinOp (Shiftrt, t1, t2) -> + let i1 = infer t1 in + let i2 = infer t2 in + lift_binop ~safe_float:false Ival.shift_right i1 i2 + | TBinOp (BAnd, t1, t2) -> + let i1 = infer t1 in + let i2 = infer t2 in + lift_binop ~safe_float:false Ival.bitwise_and i1 i2 | TBinOp (BXor, t1, t2) -> let i1 = infer t1 in let i2 = infer t2 in -- GitLab