From ea6292535e5478a0a2c6be93eba985b99d1ed868 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20B=C3=BChler?= <david.buhler@cea.fr> Date: Fri, 10 Jan 2020 14:51:11 +0100 Subject: [PATCH] [Eva] Emits pointer downcasts alarms according to option -warn-pointer-downcast. --- src/plugins/value/engine/evaluation.ml | 31 +++++++++++++++----------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/src/plugins/value/engine/evaluation.ml b/src/plugins/value/engine/evaluation.ml index 43eb4404fe6..ab391eb3546 100644 --- a/src/plugins/value/engine/evaluation.ml +++ b/src/plugins/value/engine/evaluation.ml @@ -665,7 +665,7 @@ module Make in cast_integer Alarms.Signed_downcast expr ~src ~dst value - let cast_int_to_int expr ~src ~dst value = + let cast_int_to_int expr ~ptr ~src ~dst value = (* Regain some precision in case a transfer function was imprecise. This should probably be done in the transfer function, though. *) let value = @@ -675,16 +675,19 @@ module Make in if Eval_typ.range_inclusion src dst then return value (* Upcast, nothing to check. *) - else if dst.i_signed then (* Signed downcast. *) - if Kernel.SignedDowncast.get () - then cast_integer Alarms.Signed_downcast expr ~src ~dst value - else if Value_parameters.WarnSignedConvertedDowncast.get () + else + let overflow_kind, warn = + if ptr + then Alarms.Pointer_downcast, Kernel.PointerDowncast.get + else if dst.i_signed + then Alarms.Signed_downcast, Kernel.SignedDowncast.get + else Alarms.Unsigned_downcast, Kernel.UnsignedDowncast.get + in + if warn () + then cast_integer overflow_kind expr ~src ~dst value + else if dst.i_signed && Value_parameters.WarnSignedConvertedDowncast.get () then relaxed_signed_downcast expr ~src ~dst value else return (Value.rewrap_integer dst value) - else (* Unsigned downcast. *) - if Kernel.UnsignedDowncast.get () - then cast_integer Alarms.Unsigned_downcast expr ~src ~dst value - else return (Value.rewrap_integer dst value) (* Re-export type here *) type scalar_typ = Eval_typ.scalar_typ = @@ -728,15 +731,17 @@ module Make | Some src_type, Some dst_type -> let value, alarms = match src_type, dst_type with - | (TSInt src | TSPtr src), (TSInt dst | TSPtr dst) -> - cast_int_to_int ~src ~dst expr value + | TSPtr src, TSInt dst -> + cast_int_to_int ~ptr:true ~src ~dst expr value + | TSInt src, (TSInt dst | TSPtr dst) -> + cast_int_to_int ~ptr:false ~src ~dst expr value | TSFloat src, (TSInt dst | TSPtr dst) -> restrict_float ~reduce:true ~assume_finite:true expr src value >>= truncate_float src dst expr | (TSInt _ | TSPtr _), TSFloat _ -> (* Cannot overflow with 32 bits float. *) - `Value value, Alarmset.none - | TSFloat _, TSFloat _ -> `Value value, Alarmset.none + return value + | TSFloat _, TSFloat _ | TSPtr _, TSPtr _ -> return value in value >>- Value.forward_cast ~src_type ~dst_type, alarms -- GitLab