let iter (inspector:inspector) =
  begin
    (* Collect noticeable properties (tried + their pending) *)
    let properties = ref Property.Set.empty in
    Property_status.iter
      (fun ip -> if not (never_tried ip) then add_property properties ip) ;
    let globals = ref Property.Set.empty in
    let functions = ref Kernel_function.Map.empty in
    (* Dispatch properties into globals and per-function map *)
    Property.Set.iter
      (fun ip ->
         match Property.get_kf ip with
           | None -> globals := Property.Set.add ip !globals
           | Some kf ->
               if not (Ast_info.is_frama_c_builtin (Kernel_function.get_name kf))
                 then try
                    let fips = Kernel_function.Map.find kf !functions in
                   fips := Property.Set.add ip !fips
                 with Not_found ->
                   let ips = Property.Set.singleton ip in
                   functions := Kernel_function.Map.add kf (ref ips) !functions)
      !properties ;
    (* Report a set of ip in a section *)
    let report s f ips = if not (Property.Set.is_empty ips) then
      ( s () ; Property.Set.iter (fun ip -> f ip (Consolidation.get ip)) ips ) 
    in
    if Property.Set.is_empty !globals && Kernel_function.Map.is_empty !functions then
      inspector#empty
    else
      begin
        inspector#started ;
        report (fun () -> inspector#global_section) inspector#property !globals ;
        Kernel_function.Map.iter
          (fun kf ips -> 
             report (fun () -> inspector#function_section kf) inspector#property !ips) 
          !functions ;
        inspector#finished ;
      end
  end