From 04f9186c54b31a56802463307b0adb0477d2e269 Mon Sep 17 00:00:00 2001
From: Virgile Prevosto <virgile.prevosto@m4x.org>
Date: Tue, 24 Oct 2017 09:54:33 +0200
Subject: [PATCH] eva coverage, first version

---
 src/plugins/markdown-report/eva_coverage.ml | 21 ++++++++++++++++++---
 1 file changed, 18 insertions(+), 3 deletions(-)

diff --git a/src/plugins/markdown-report/eva_coverage.ml b/src/plugins/markdown-report/eva_coverage.ml
index 4b241b45ce1..7ad300b45e7 100644
--- a/src/plugins/markdown-report/eva_coverage.ml
+++ b/src/plugins/markdown-report/eva_coverage.ml
@@ -8,7 +8,7 @@ let empty_stats =
   { total_stmts = 0;
     covered_stmts = 0 }
 
-class eva_coverage_vis _syntactic_calls = object(self)
+class eva_coverage_vis syntactic_calls = object(self)
   inherit Visitor.frama_c_inplace
   val mutable stats = empty_stats
   val indirect_calls = Cil_datatype.Varinfo.Hashtbl.create 17
@@ -43,8 +43,23 @@ class eva_coverage_vis _syntactic_calls = object(self)
     | _ -> Cil.SkipChildren (* No need to go further. *)
 
   method compute () =
-    (* WRITEME: start from direct calls and iter
-       if there are some indirect calls not visited yet. *)
+    let treat_vi vi already_seen =
+      if not already_seen then begin
+        let kf = Globals.Functions.get vi in
+        ignore (Visitor.visitFramacKf (self:>Visitor.frama_c_visitor) kf)
+      end
+    in
+    let treat_indirect_call vi already_seen reached =
+      Cil_datatype.Varinfo.Hashtbl.replace indirect_calls vi true;
+      treat_vi vi already_seen;
+      reached && not already_seen
+    in
+    let check_fixpoint () =
+      Cil_datatype.Varinfo.Hashtbl.fold treat_indirect_call indirect_calls true
+    in
+    let direct_call vi = treat_vi vi false in
+    Cil_datatype.Varinfo.Set.iter direct_call syntactic_calls;
+    while not (check_fixpoint ()) do () done;
     (Cil_datatype.Varinfo.Hashtbl.fold
        (fun k _ s -> Cil_datatype.Varinfo.Set.add k s)
        indirect_calls Cil_datatype.Varinfo.Set.empty,
-- 
GitLab