如何使用此函数 Db.Slicing.Select.select_stmt 和 frama-C

How to use this function Db.Slicing.Select.select_stmt with frama-C

标题中的函数具有以下签名:

val select_stmt :
 (set -> spare:bool -> Cil_types.stmt -> Cil_types.kernel_function -> set)
   Pervasives.ref

我想使用这个函数,但我的问题是关于类型为 type set = SlicingTypes.Fct_user_crit.t Cil_datatype.Varinfo.Map.t 的参数 set。我不知道如何初始化这个参数,然后我想打印结果。

就在 select_stmt 上方,您有值 empty_selects,其文档表明它代表一个空选择。在那之后,切片的 API 有点神秘,但如果我没记错的话,你应该能够通过以下几行(未测试)获得切片:

let prj =
 Db.Slicing.(
  let sp = !Project.mk_project "my slicing project" in
  let selection = Select.(!select_stmt empty_selects s kf) in
  let () = Request.add_selection sp selection in
  Project.extract "my frama-c project" sp)
in
File.pretty_ast ~prj ()

基本上,您必须创建一个切片项目,您可以在其中设置一定数量的选项,尤其是您想要的切片标准。当您对切片项目的状态感到满意时,您可以从中提取一个新的 Frama-C 项目,并正常打印这个新项目(当然您也可以对其进行其他分析)。