2016-05-02 117 views
1

我工作的一个邮资-C插件,应该可以解决各种可变因素的值。我设法取消引用指针和结构和typedefs并打印相应的值。邮资-C插件:解决阵列值

现在我有得到一个数组的值挣扎。

这里是我的方法,到目前为止,以下的描述:

| TArray (typ, exp, bitsSizeofTypCache, attributes) -> (
    let len = Cil.lenOfArray exp in 
    let rec loc_rec act max = 
     if act < max then(    
      let packed = match exp with 
      | Some x -> x 
      in 
      let inc = Cil.increm packed act in  
      let new_offset = (Index(inc, offset)) in 
      rec_struct_solver typ (vi_name^"["^(string_of_int act)^"]") (lhost, new_offset); 
      loc_rec (act+1) max 
     ); 
    in 
     loc_rec 0 len 
) 

我管理通过匹配类型时使用Cil.lenOfArray用表达选项,以获得阵列的长度。现在

我的方法是去在阵列的长度,递增描述表达和修改的偏移,然后处理这样的局部变量的变量(在下一递归步骤)。

我觉得这个想法基本上是有道理的,但我不知道,如果增量做正确(值确定,或由某些尺寸或乘的东西),或其他事情不工作。

该程序编译(警告匹配不包括所有情况,这是无关紧要的,因为我只能使用表达式,而不是NONE),但不输出(正确的)结果。

这是近正确的做法,还是我这样做完全错了吗?有人可以给我一些关于如何获得数组值的提示吗?

如果有任何不明白(因为它是很难描述我想要什么),请让我知道,我会修改我的问题。

编辑

这样

int arr[3]; 
arr[0]=0; 
arr[1]=1; 
arr[2]=2; 
arr[0]=3; 

守则的预期结果应该是类似的东西:

arr[0]=0;3 
arr[1]=1 
arr[2]=2 

我只是希望每一个索引来获取所有的值在程序上的数组。 虽然我只得到空的结果,如arr[1]={ }(也用于其他Indizes),所以我根本没有得到我使用的这种访问类型的结果。

+0

您能否至少解释什么是“正确的结果”以及脚本的输出与他们的不同? – Virgile

+0

我编辑了我的问题! –

回答

1

我想出如何做到这一点:

诀窍是,与Cil.integer,一个新的常数EXP可以建!我建立了一个新的exp

有了这个exp,我能够建立索引偏移量。然后我将这个新的偏移量添加到数组的实际偏移量。这个新的抵消被用来建立一个新的Lval。

通过这样做,我得到了访问数组的指标。

现在我的输出看起来不错:

arrayTest:arr[0]--->  0; 3 
arrayTest:arr[1]--->  1 
arrayTest:arr[2]--->  2 
1

原密码查询值的指数Index(inc, offset),其中incCil.increm packed actact是当前索引,packed是数组的大小。所以你基本上正在查询size+0,size+1 ...... size-+(size-1)。所有这些补偿都是无效的,因为它们是超出界限的。这就是为什么你获得价值Cvalue.V.bottom哪些相当打印为

对原始代码最简单的修复方法是用Cil.zero Cil_datatype.Location.unknown来代替packed,但是你自己的修复方法很好。