获取数组索引变量及其值分析(Frama-C)

时间:2013-07-12 16:30:37

标签: ocaml static-analysis analysis frama-c

我想查询Frama-C中的值分析插件,以获取获取其值的说明。对于每个数组,它返回整个数组的值范围。例如,如果指令为array[i] = 1;,则我从值分析插件获得{1}的结果= 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
         |_ -> "<>"   
 ...

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

1 个答案:

答案 0 :(得分:7)

我假设您知道如何编写print_val类型的函数Db.Value.t -> 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查找相应的varinfo vi,并使用此代码查询varinfo的内容。

open Cil_types    

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