let internal_function_behaviors cfg =
  let def_annot_bhv = HdefAnnotBhv.create 42 in
  let get_stmt_bhv node stmt acc =
    let add_bhv_info acc b =
      if b.b_name = Cil.default_behavior_name then
        begin
          let _, int_edges = Cil2cfg.get_internal_edges cfg node in
          let n = Cil2cfg.Eset.cardinal int_edges in
          let reg e =
            try
              let (_old_s, old_n) = HdefAnnotBhv.find def_annot_bhv e in
                if n < old_n then
                  (* new spec is included in the old one : override. *)
                  raise Not_found
            with Not_found ->
              HdefAnnotBhv.replace def_annot_bhv e (stmt, n)
          in
            Cil2cfg.Eset.iter reg int_edges
        end;
      (node, stmt, b.b_name)::acc
    in
    let spec_bhv_names acc annot = match annot with
      | {annot_content = AStmtSpec spec} ->
          List.fold_left add_bhv_info acc spec.spec_behavior
      | _ -> Wp_parameters.fatal "filter on is_contract didn't work ?"
    in
    let annots = Annotations.get_filter Logic_utils.is_contract stmt in
    let annots = List.map Annotations.get_code_annotation annots in
      List.fold_left spec_bhv_names acc annots
  in
  let get_bhv n ((seen_stmts, bhvs) as l) =
    match Cil2cfg.start_stmt_of_node n with None -> l
    | Some s ->
        if List.mem s.sid seen_stmts then l
        else
          let seen_stmts = s.sid::seen_stmts in
          let bhvs = get_stmt_bhv n s bhvs in
            (seen_stmts, bhvs)
  in
  let _, bhvs = Cil2cfg.fold_nodes get_bhv cfg ([], []) in
    bhvs, def_annot_bhv