let slice () =
Options.feedback ~level:2 "beginning slicing";
compute ();
let name = "security slicing" in
let slicing = !Slicing.Project.mk_project name in
let select (n, kf) sel =
Options.debug ~level:2 "selecting %a (of %s)"
(!Pdg.pretty_node false) n
(Kernel_function.get_name kf);
!Slicing.Select.select_pdg_nodes
sel
(!Slicing.Mark.make
~data:true ~addr:true ~ctrl:X.use_ctrl_dependencies)
[ n ]
kf
in
let sel = Nodes.fold select Slicing.Select.empty_selects in
Options.debug "adding selection";
!Slicing.Request.add_persistent_selection slicing sel;
Options.debug "applying slicing request";
!Slicing.Request.apply_all_internal slicing;
!Slicing.Slice.remove_uncalled slicing;
let p = !Slicing.Project.extract name slicing in
Project.copy ~only:(Options.get_selection_after_slicing ()) p;
Options.feedback ~level:2 "slicing done";
p