let get_strategies assigns cfg behaviors ki property =
  Wp_parameters.feedback ~level:3
    "[wpAnnot.get_strategies] for behaviors names: %a@."
    (Wp_error.pp_string_list ~sep:" " ~empty:"<none>")
    (match behaviors with None -> ["<all>"| Some l -> l) ;
  let _ = match ki with
    | None -> ()
    | Some Kglobal ->
        Wp_parameters.feedback ~level:3
          "[wpAnnot.get_strategies] select in function properies@."
    | Some (Kstmt s) ->
        Wp_parameters.feedback ~level:3
          "[wpAnnot.get_strategies] select stmt %d properties@." s.sid
  in
  let kf = Cil2cfg.cfg_kf cfg in
  let s_bhvs, def_annot_bhv = internal_function_behaviors cfg in
  let bhvs =
    let f_bhvs = Kernel_function.spec_function_behaviors kf in
    match behaviors with
      | Some bhvs ->
          List.fold_left
            (fun acc b -> (get_asked_bhv_from_name s_bhvs f_bhvs ki b)@acc)
            [] bhvs
      | None ->
          let spec = Kernel_function.get_spec kf in
          (* default behavior name is always added even if it doesn't appear
            * explicitly in spec in order to process internal properties. *)

          let bhvs = get_behavior_names ~with_default:true spec in
          let bhvs = List.map (fun b -> FunBhv b) bhvs in
            List.fold_left
              (fun acc (n,s,b) -> (StmtBhv (n,s,b))::acc) bhvs s_bhvs
  in
    if bhvs = [] then
      Wp_parameters.warning "[wpAnnot.get_strategies] no behaviors found";
  let do_bhv bhv =
    let config = { kf = Cil2cfg.cfg_kf cfg ;
                   cfg = cfg;
                   new_loops = new_loops;
                   cur_bhv = bhv;
                   asked_prop = property;
                   asked_bhvs = bhvs;
                   assigns_filter = assigns;
                   def_annots_info = def_annot_bhv}
    in (* if Wp_parameters.Froms.get () 
    then build_strategy_for_froms config 
    else *)
 [build_bhv_strategy config]
  in List.flatten (List.map do_bhv bhvs)