【问题标题】:Get the array index variable and its value in value analysis (Frama-C)在值分析中获取数组索引变量及其值(Frama-C)
【发布时间】:2013-07-13 04:43:38
【问题描述】:

我想查询 Frama-C 中的价值分析插件以获取获取其价值的说明。对于每个数组,它返回整个数组的取值范围。例如,如果指令是array[i] = 1;,我从价值分析插件中得到 result = {1} for array[i]。现在,例如array[i],我想通过值分析得到变量名i及其值。

下面是我的代码示例

class print_VA_result out = object 
inherit Visitor.frama_c_inplace
     (**..*)
 method vstmt_aux s = 
  if Db.Value.is_computed () then
     match s.skind with
    | Instr i ->
       begin
         match i with
         | Set(lval,_,_) ->     
            print_value lval s
         |_ -> "<>"   
 ...

有人可以帮我吗?提前非常感谢。

【问题讨论】:

  • 对不起,如果它让你感到困惑。我编辑了这个问题。你现在可以理解了吗?

标签: ocaml static-analysis analysis frama-c


【解决方案1】:

我假设你知道如何编写 print_val 类型的函数 Db.Value.t -&gt; unit 下面的代码,将被放置在Set 指令的匹配之前,将捕获对索引e 处的数组的访问

match i with
(* Access to an array *)
| Set ((_, Index (e, _)), _, _) ->
  let v = !Db.Value.access_expr (Kstmt s) e in
  print_val v 
(* End special case *)
| Set(lval,_,_) ->     
  print_value lval s

或者,如果你知道你的变量的名字,你可以使用函数Globals.Vars.find_from_astinfo找到对应的varinfovi,这段代码查询varinfo的内容。

open Cil_types    

let vi_content stmt vi =
  let lv = (Var vi, NoOffset) in
  !Db.Value.access (Kstmt stmt) lv

【讨论】:

  • 非常感谢,@BorisYakobowski
  • 我按照价值分析GUI的代码来显示结果。它使用Value.get_stmt_state stmt 表示“前值”,使用Value.AfterTable.find stmt 表示“后值”,然后使用 lval 将其映射到偏移图并由该偏移图打印出来。你能指导我如何按照你的建议打印出Db.Value.t -&gt; unit吗?
  • Offsetmap 复制仅适用于非常复杂的情况,或显示结构或数组等结构化事物。对于标量变量,计算 Db.Value.t 类型的东西并打印它更简单。函数let print_val v = Format.printf "%a" Db.Value.pretty v 应该可以完成这项工作。
  • 嗨@BorisYakobowski,非常感谢您的回答。我设法处理了。顺便说一句,我们如何处理右侧数组的索引,例如获取 array1[i] = array2[j] 中 j 的值 ...?谢谢!
  • 处理从数组中读取是类似的,除了您必须匹配 Set 构造函数的第二个参数。此参数的类型为exp,因此您必须寻找一个左值表达式,它本身就是对数组的访问。 | Set (_, {enode = Lval (_, Index (e, _))}, _) -&gt;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-29
  • 1970-01-01
  • 2018-03-24
  • 2014-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多