From dff513aed79cd39fc55d1ed0bb1d459ab2f9ed5e Mon Sep 17 00:00:00 2001
From: Virgile Prevosto <virgile.prevosto@m4x.org>
Date: Wed, 7 Aug 2019 14:56:37 +0200
Subject: [PATCH] [sarif] add statuses of properties to the sarif output

---
 src/plugins/markdown-report/sarif_gen.ml | 32 ++++++++++++++++++++++++
 1 file changed, 32 insertions(+)

diff --git a/src/plugins/markdown-report/sarif_gen.ml b/src/plugins/markdown-report/sarif_gen.ml
index 72ae96507c2..31047d9fb9b 100644
--- a/src/plugins/markdown-report/sarif_gen.ml
+++ b/src/plugins/markdown-report/sarif_gen.ml
@@ -50,6 +50,37 @@ let gen_results remarks =
   let _, content = Alarms.fold treat_alarm (0, []) in
   List.rev content
 
+let is_alarm = function
+  | Property.IPCodeAnnot (_,_,ca) -> Extlib.has_some (Alarms.find ca)
+  | _ -> false
+
+let level_of_status =
+  let open Property_status.Feedback in
+  let open Sarif.Result_level in
+  function
+  | Never_tried -> notApplicable
+  | Considered_valid | Valid | Valid_under_hyp | Valid_but_dead -> pass
+  | Unknown | Unknown_but_dead -> warning
+  | Invalid | Invalid_under_hyp | Invalid_but_dead -> error
+  | Inconsistent -> note
+
+let make_ip_message ip =
+  let text = Format.asprintf "@[%a@]" Property.short_pretty ip in
+  Message.plain_text ~text ()
+
+let gen_status ip =
+  let status = Property_status.Feedback.get ip in
+  let level = level_of_status status in
+  let locations = [ Location.of_loc (Property.location ip) ] in
+  let message = make_ip_message ip in
+  Sarif_result.create ~level ~locations ~message ()
+
+let gen_statuses () =
+  let f ip content =
+    if is_alarm ip then content else (gen_status ip) :: content
+  in
+  List.rev (Property_status.fold f [])
+
 let gen_files () =
   let add_src_file f =
     let key = Filename.chop_extension (Filename.basename f) in
@@ -64,6 +95,7 @@ let gen_run remarks =
   let tool = frama_c_sarif in
   let invocations = [gen_invocation ()] in
   let results = gen_results remarks in
+  let results = results @ (gen_statuses ()) in
   let files = gen_files () in
   Run.create ~tool ~invocations ~results ~files ()
 
-- 
GitLab