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