@ -412,8 +412,7 @@ module Stats = struct
 
			
		
	
		
		
			
				
					
					    ;  mutable  ntimeouts :  int 
    ;  mutable  ntimeouts :  int 
 
			
		
	
		
		
			
				
					
					    ;  mutable  nverified :  int 
    ;  mutable  nverified :  int 
 
			
		
	
		
		
			
				
					
					    ;  mutable  nwarnings :  int 
    ;  mutable  nwarnings :  int 
 
			
		
	
		
		
			
				
					
					    ;  mutable  saved_errors :  string  list 
    ;  mutable  saved_errors :  string  list  } 
 
			
				
				
			
		
	
		
		
			
				
					
					    ;  mutable  events_to_log :  EventLogger . event  list  } 
 
			
		
	
		
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  let  create  ()  = 
  let  create  ()  = 
 
			
		
	
		
		
			
				
					
					    {  files =  Hashtbl . create  3 
    {  files =  Hashtbl . create  3 
 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -428,8 +427,7 @@ module Stats = struct
 
			
		
	
		
		
			
				
					
					    ;  ntimeouts =  0 
    ;  ntimeouts =  0 
 
			
		
	
		
		
			
				
					
					    ;  nverified =  0 
    ;  nverified =  0 
 
			
		
	
		
		
			
				
					
					    ;  nwarnings =  0 
    ;  nwarnings =  0 
 
			
		
	
		
		
			
				
					
					    ;  saved_errors =  [] 
    ;  saved_errors =  []  } 
 
			
				
				
			
		
	
		
		
			
				
					
					    ;  events_to_log =  []  } 
 
			
		
	
		
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  let  process_loc  loc  stats  = 
  let  process_loc  loc  stats  = 
 
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -517,28 +515,6 @@ module Stats = struct
 
			
		
	
		
		
			
				
					
					    process_loc  ( Specs . get_loc  summary )  stats 
    process_loc  ( Specs . get_loc  summary )  stats 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  let  process_summary_for_logging  _  ( summary :  Specs . summary )  _  stats  = 
 
			
		
	
		
		
			
				
					
					    let  num_preposts  = 
 
			
		
	
		
		
			
				
					
					      match  summary . payload . preposts  with  Some  preposts  ->  List . length  preposts  |  None  ->  0 
 
			
		
	
		
		
			
				
					
					    in 
 
			
		
	
		
		
			
				
					
					    let  lang  =  Specs . get_proc_name  summary  | >  Typ . Procname . get_language  in 
 
			
		
	
		
		
			
				
					
					    stats . events_to_log 
 
			
		
	
		
		
			
				
					
					    <-  EventLogger . AnalysisStats 
 
			
		
	
		
		
			
				
					
					         {  analysis_nodes_visited =  IntSet . cardinal  summary . stats . nodes_visited_re 
 
			
		
	
		
		
			
				
					
					         ;  analysis_status =  summary . stats . stats_failure 
 
			
		
	
		
		
			
				
					
					         ;  analysis_total_nodes =  Specs . get_proc_desc  summary  | >  Procdesc . get_nodes_num 
 
			
		
	
		
		
			
				
					
					         ;  clang_method_kind = 
 
			
		
	
		
		
			
				
					
					             (  if  Language . equal  lang  Language . Clang  then 
 
			
		
	
		
		
			
				
					
					                 Some  ( Specs . get_attributes  summary ) . clang_method_kind 
 
			
		
	
		
		
			
				
					
					             else  None  ) 
 
			
		
	
		
		
			
				
					
					         ;  lang =  Language . to_explicit_string  lang 
 
			
		
	
		
		
			
				
					
					         ;  method_location =  Specs . get_loc  summary 
 
			
		
	
		
		
			
				
					
					         ;  method_name =  Specs . get_proc_name  summary  | >  Typ . Procname . to_string 
 
			
		
	
		
		
			
				
					
					         ;  num_preposts 
 
			
		
	
		
		
			
				
					
					         ;  symops =  summary . stats . symops  } 
 
			
		
	
		
		
			
				
					
					       ::  stats . events_to_log 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  let  num_files  stats  =  Hashtbl . length  stats . files 
  let  num_files  stats  =  Hashtbl . length  stats . files 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					  let  pp  fmt  stats  = 
  let  pp  fmt  stats  = 
 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -557,6 +533,31 @@ module Stats = struct
 
			
		
	
		
		
			
				
					
					    List . iter  ~ f : ( fun  s  ->  F . fprintf  fmt  " %s@ \n "  s )  ( List . rev  stats . saved_errors ) 
    List . iter  ~ f : ( fun  s  ->  F . fprintf  fmt  " %s@ \n "  s )  ( List . rev  stats . saved_errors ) 
 
			
		
	
		
		
			
				
					
					end end  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					module  StatsLogs  =  struct  
			
		
	
		
		
			
				
					
					  let  process  _  ( summary :  Specs . summary )  _  _  = 
 
			
		
	
		
		
			
				
					
					    let  num_preposts  = 
 
			
		
	
		
		
			
				
					
					      match  summary . payload . preposts  with  Some  preposts  ->  List . length  preposts  |  None  ->  0 
 
			
		
	
		
		
			
				
					
					    in 
 
			
		
	
		
		
			
				
					
					    let  proc_name  =  Specs . get_proc_name  summary  in 
 
			
		
	
		
		
			
				
					
					    let  lang  =  Typ . Procname . get_language  proc_name  in 
 
			
		
	
		
		
			
				
					
					    let  stats  = 
 
			
		
	
		
		
			
				
					
					      EventLogger . AnalysisStats 
 
			
		
	
		
		
			
				
					
					        {  analysis_nodes_visited =  IntSet . cardinal  summary . stats . nodes_visited_re 
 
			
		
	
		
		
			
				
					
					        ;  analysis_status =  summary . stats . stats_failure 
 
			
		
	
		
		
			
				
					
					        ;  analysis_total_nodes =  Specs . get_proc_desc  summary  | >  Procdesc . get_nodes_num 
 
			
		
	
		
		
			
				
					
					        ;  clang_method_kind = 
 
			
		
	
		
		
			
				
					
					            (  if  Language . equal  lang  Language . Clang  then 
 
			
		
	
		
		
			
				
					
					                Some  ( Specs . get_attributes  summary ) . clang_method_kind 
 
			
		
	
		
		
			
				
					
					            else  None  ) 
 
			
		
	
		
		
			
				
					
					        ;  lang =  Language . to_explicit_string  lang 
 
			
		
	
		
		
			
				
					
					        ;  method_location =  Specs . get_loc  summary 
 
			
		
	
		
		
			
				
					
					        ;  method_name =  Typ . Procname . to_string  proc_name 
 
			
		
	
		
		
			
				
					
					        ;  num_preposts 
 
			
		
	
		
		
			
				
					
					        ;  symops =  summary . stats . symops  } 
 
			
		
	
		
		
			
				
					
					    in 
 
			
		
	
		
		
			
				
					
					    EventLogger . log  stats 
 
			
		
	
		
		
			
				
					
					end  
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					module  Report  =  struct module  Report  =  struct  
			
		
	
		
		
			
				
					
					  let  pp_header  fmt  ()  = 
  let  pp_header  fmt  ()  = 
 
			
		
	
		
		
			
				
					
					    F . fprintf  fmt  " Infer Analysis Results -- generated %a@ \n @ \n "  Pp . current_time  ()  ; 
    F . fprintf  fmt  " Infer Analysis Results -- generated %a@ \n @ \n "  Pp . current_time  ()  ; 
 
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -728,7 +729,7 @@ let pp_calls_in_format (format_kind, (outfile_opt: Utils.outfile option)) =
 
			
		
	
		
		
			
				
					
					      let  outf  =  get_outfile  outfile_opt  in 
      let  outf  =  get_outfile  outfile_opt  in 
 
			
		
	
		
		
			
				
					
					      CallsCsv . pp_calls  outf . fmt 
      CallsCsv . pp_calls  outf . fmt 
 
			
		
	
		
		
			
				
					
					  |  Json  |  Tests  |  Text  |  Logs  -> 
  |  Json  |  Tests  |  Text  |  Logs  -> 
 
			
		
	
		
		
			
				
					
					      L . ( die  InternalError )  " Printing calls in json/tests/text /logs  is not implemented" 
      L . ( die  InternalError )  " Printing calls in json/tests/text  is not implemented" 
 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					
 
			
		
	
		
		
			
				
					
					let  pp_stats_in_format  ( format_kind ,  _ )  = let  pp_stats_in_format  ( format_kind ,  _ )  =  
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -736,7 +737,7 @@ let pp_stats_in_format (format_kind, _) =
 
			
		
	
		
		
			
				
					
					  |  Csv  -> 
  |  Csv  -> 
 
			
		
	
		
		
			
				
					
					      Stats . process_summary 
      Stats . process_summary 
 
			
		
	
		
		
			
				
					
					  |  Logs  -> 
  |  Logs  -> 
 
			
		
	
		
		
			
				
					
					      Stats . process _summary_for_logging 
      Stats Logs . process 
 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					  |  Json  |  Tests  |  Text  -> 
  |  Json  |  Tests  |  Text  -> 
 
			
		
	
		
		
			
				
					
					      L . ( die  InternalError )  " Printing stats in json/tests/text is not implemented " 
      L . ( die  InternalError )  " Printing stats in json/tests/text is not implemented " 
 
			
		
	
		
		
			
				
					
					
 
			
		
	
	
		
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
					@ -952,8 +953,8 @@ let init_files format_list_by_kind =
 
			
		
	
		
		
			
				
					
					          let  outfile  =  get_outfile  outfile_opt  in 
          let  outfile  =  get_outfile  outfile_opt  in 
 
			
		
	
		
		
			
				
					
					          IssuesJson . pp_json_open  outfile . fmt  () 
          IssuesJson . pp_json_open  outfile . fmt  () 
 
			
		
	
		
		
			
				
					
					      |  Csv ,  ( Calls  |  Summary ) 
      |  Csv ,  ( Calls  |  Summary ) 
 
			
		
	
		
		
			
				
					
					      |  Json ,  ( Procs  |  Stats  |  Calls  |  Summary ) 
 
			
		
	
		
		
			
				
					
					      |  Logs ,  Stats 
      |  Logs ,  Stats 
 
			
		
	
		
		
			
				
					
					      |  Json ,  ( Procs  |  Stats  |  Calls  |  Summary ) 
 
			
		
	
		
		
			
				
					
					      |  Tests ,  _ 
      |  Tests ,  _ 
 
			
		
	
		
		
			
				
					
					      |  Text ,  _  -> 
      |  Text ,  _  -> 
 
			
		
	
		
		
			
				
					
					          () 
          () 
 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
						
					 
					@ -967,16 +968,16 @@ let finalize_and_close_files format_list_by_kind (stats: Stats.t) =
 
			
		
	
		
		
			
				
					
					  let  close_files_of_report_kind  ( report_kind ,  format_list )  = 
  let  close_files_of_report_kind  ( report_kind ,  format_list )  = 
 
			
		
	
		
		
			
				
					
					    let  close_files_of_format  ( format_kind ,  ( outfile_opt :  Utils . outfile  option ) )  = 
    let  close_files_of_format  ( format_kind ,  ( outfile_opt :  Utils . outfile  option ) )  = 
 
			
		
	
		
		
			
				
					
					      (  match  ( format_kind ,  report_kind )  with 
      (  match  ( format_kind ,  report_kind )  with 
 
			
		
	
		
		
			
				
					
					      |  Logs ,  ( Issues  |  Procs  |  Calls  |  Summary )  -> 
 
			
		
	
		
		
			
				
					
					          L . ( die  InternalError )  " Logging these reports is not implemented " 
 
			
		
	
		
		
			
				
					
					      |  Csv ,  Stats  -> 
      |  Csv ,  Stats  -> 
 
			
		
	
		
		
			
				
					
					          let  outfile  =  get_outfile  outfile_opt  in 
          let  outfile  =  get_outfile  outfile_opt  in 
 
			
		
	
		
		
			
				
					
					          F . fprintf  outfile . fmt  " %a@? "  Report . pp_stats  stats 
          F . fprintf  outfile . fmt  " %a@? "  Report . pp_stats  stats 
 
			
		
	
		
		
			
				
					
					      |  Json ,  Issues  -> 
      |  Json ,  Issues  -> 
 
			
		
	
		
		
			
				
					
					          let  outfile  =  get_outfile  outfile_opt  in 
          let  outfile  =  get_outfile  outfile_opt  in 
 
			
		
	
		
		
			
				
					
					          IssuesJson . pp_json_close  outfile . fmt  () 
          IssuesJson . pp_json_close  outfile . fmt  () 
 
			
		
	
		
		
			
				
					
					      |  Logs ,  Stats  -> 
 
			
		
	
		
		
			
				
					
					          List . iter  ~ f : EventLogger . log  stats . events_to_log 
 
			
		
	
		
		
			
				
					
					      |  Csv ,  ( Issues  |  Procs  |  Calls  |  Summary ) 
      |  Csv ,  ( Issues  |  Procs  |  Calls  |  Summary ) 
 
			
		
	
		
		
			
				
					
					      |  Logs ,  ( Issues  |  Procs  |  Calls  |  Summary ) 
      |  Logs ,  Stats 
 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					      |  Json ,  ( Procs  |  Stats  |  Calls  |  Summary ) 
      |  Json ,  ( Procs  |  Stats  |  Calls  |  Summary ) 
 
			
		
	
		
		
			
				
					
					      |  Tests ,  _ 
      |  Tests ,  _ 
 
			
		
	
		
		
			
				
					
					      |  Text ,  _  -> 
      |  Text ,  _  ->