let local_scope env vars scope_kind p =
    let m_here = mem_at env Clabels.Here in
    let vmh = valloc_of_mem m_here in
    let mh = F.var vmh in
    let do_var p v =
      let t = Ctypes.object_of v.vtype in
      let alloc v p =
        Wp_parameters.debug ~level:3 "[local_scope] alloc %s@." v.vname;
        let sz = sizeof_c_object t in
        let sz = Tint.term_of_xsize sz in
        let ma = RtLib.alloc mh (name_of_var v) sz in
        let p = D.subst vmh ma p in
        p
      in
      let init v p = (* initialize parameter : v@Here = v@Pre *)
        let m_pre = mem_at env Clabels.Pre in
        let v_loc = cvar m_here v in
        let v_pre = load m_pre t v_loc in
        let p = subst_lval env t v_loc v_pre p in
        p
      in
        let p = match scope_kind with
        | Mcfg.SC_Function_in -> 
            (* let p = alloc v p in p  *)
            let p = match logic_of_mem (mem_at env Clabels.Prewith
              | None -> p
              | Some tbl ->
                try let lv = Varinfo.Hashtbl.find tbl v in
                  D.forall [lv] p
                with Not_found -> p
            in p
        | Mcfg.SC_Function_frame ->
            let p = init v p in 
            let p = alloc v p in
            p
        | Mcfg.SC_Block_in ->
            let p = alloc v p in
            (*let h = add_int_format_hyp (name_of_var v) t F.p_true in
             F.p_implies h p 
             *)
 p
        | Mcfg.SC_Block_out | Mcfg.SC_Function_out ->
            Wp_parameters.debug ~level:3 "[local_scope] free %s@." v.vname;
            D.subst vmh (RtLib.free mh (name_of_var v)) p 
        | Mcfg.SC_Global -> (* nothing to do *) p
      in p
    in List.fold_left do_var p vars