From b15067dffed8b511a6b543e80225625ccdb16a37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Loi=CC=88c=20Correnson?= <loic.correnson@cea.fr> Date: Mon, 25 Jan 2021 09:42:25 +0100 Subject: [PATCH] [wp] fixup constructor handling --- src/plugins/wp/cfgCalculus.ml | 43 +++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/src/plugins/wp/cfgCalculus.ml b/src/plugins/wp/cfgCalculus.ml index 6f0eb2cfe2d..1142f94be4a 100644 --- a/src/plugins/wp/cfgCalculus.ml +++ b/src/plugins/wp/cfgCalculus.ml @@ -238,27 +238,36 @@ struct (* Compute a single instruction *) and instr env s instr (w : W.t_prop) : W.t_prop = - let do_call res fct args _loc = - match Kernel_function.get_called fct with - | Some kf -> call env s res kf args w - | None -> - match Dyncall.get ~bhv:env.mode.bhv.b_name s with - | None -> - WpLog.warning ~once:true "Missing dynamic-call infos." ; - let ad = WpPropId.mk_stmt_assigns_any_desc s in - W.use_assigns env.we None ad (W.merge env.we w env.wk) - | Some(prop,kfs) -> - let id = WpPropId.mk_property prop in - W.call_dynamic env.we s id fct @@ - List.map (fun kf -> kf, call env s res kf args w) kfs - in match instr with | Skip _ | Code_annot _ -> w | Set(lv,e,_) -> W.assign env.we s lv e w | Local_init(x,AssignInit i,_) -> W.init env.we x (Some i) w - | Local_init(x,ConsInit (fct, args, kind), loc) -> - Cil.treat_constructor_as_func do_call x fct args kind loc - | Call(res,fct,args,loc) -> do_call res fct args loc + | Local_init(x,ConsInit (vf, args, kind), loc) -> + Cil.treat_constructor_as_func + begin fun r fct args _loc -> + match Kernel_function.get_called fct with + | Some kf -> call env s r kf args w + | None -> + WpLog.warning ~once:true "No function for constructor '%s'" + vf.vname ; + let any = WpPropId.mk_stmt_assigns_any_desc s in + W.use_assigns env.we None any (W.merge env.we w env.wk) + end x vf args kind loc + | Call(res,fct,args,_loc) -> + begin + match Kernel_function.get_called fct with + | Some kf -> call env s res kf args w + | None -> + match Dyncall.get ~bhv:env.mode.bhv.b_name s with + | None -> + WpLog.warning ~once:true "Missing dynamic-call infos." ; + let any = WpPropId.mk_stmt_assigns_any_desc s in + W.use_assigns env.we None any (W.merge env.we w env.wk) + | Some(prop,kfs) -> + let id = WpPropId.mk_property prop in + W.call_dynamic env.we s id fct @@ + List.map (fun kf -> kf, call env s res kf args w) kfs + end | Asm _ -> W.use_assigns env.we None (WpPropId.mk_asm_assigns_desc s) w -- GitLab