let user_env pdef =
    let context = push_context "user" in
    try
      let frame = user_frame () in
      let lvars = ref Logic_var.Map.empty in
      let laddr = ref Logic_var.Map.empty in 
      let profile = List.map
        (fun lv ->
           if M.userdef_is_ref_param lv then
             begin
               lvars := Logic_var.Map.add lv Logic_byref !lvars ;
               let opt_cx = 
                 if M.userdef_ref_has_cvar lv 
                 then 
                   let x = fresh_addr lv in 
                   laddr := Logic_var.Map.add lv x !laddr ;
                   Some x else None
               in
               UF_references ( lv ,opt_cx, [] ) (* initially empty *)
             end
           else
             begin
               let x = fresh_local lv in
               lvars := Logic_var.Map.add lv (Logic_term (F.var x)) !lvars ;
               UF_logic ( lv , x )
             end
        pdef.l_profile
      in
      let env = {
        formals_in_pre = false ;
        frame = frame ;
        label = user_default_label pdef.l_labels ;
        lvars = !lvars ;
        xvars = Varinfo.Map.empty ;
        laddr = !laddr;
      }
      in ( context , profile , env )
    with err ->
      kill_context "user env" context; raise err