Frama-C插件:解析数组值

时间:2016-05-02 10:14:38

标签: arrays frama-c

我正在开发一个frama-c插件,可以解析各种变量的值。我设法取消引用指针和结构以及typedef并打印correspoinding值。

现在我正在努力获取数组的值。

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

| 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),所以我根本无法获得此类访问的结果。

2 个答案:

答案 0 :(得分:2)

您的原始代码会查询索引Index(inc, offset)的值,其中incCil.increm packed actact为当前索引,packed为大小数组。因此,您基本上是对size+0size+1 ... size-+(size-1)进行查询。所有这些偏移都是无效的,因为它们是超出范围的。这就是为什么你得到的值Cvalue.V.bottom漂亮打印为

原始代码的最简单修复方法是通过调用packed替换Cil.zero Cil_datatype.Location.unknown,但您自己的修复很好。

答案 1 :(得分:1)

我想出了怎么做:

诀窍是,使用Cil.integer,可以构建一个新的常量exp!

使用client.setDevice("ios_app:iPhonel"); client.launch("com.netsnapper.connect.Netsnapper-Connect", true, false); client.sleep(10000); client.click("default", "Logoutmenu", 0, 1); client.click("default", "About", 0, 1); String version = client.getTextIn("default", "version", 0, "NATIVE", "Inside", 560, 42); if((client.isElementFound("TEXT", "Key Features", 0)) && !(version != null && !version.isEmpty())){ fail("failed"); } ,我创建了一个新的 Intent resultIntent = new Intent(this, MainActivity.class); resultIntent.putExtra("FINISH",true); PendingIntent resultPendingIntent = PendingIntent.getActivity( this, 0, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT ); builder.setContentIntent(resultPendingIntent); // Build the notification: Notification notification = builder.build(); //rest of your methods to show notification

使用此MainActivity,我能够构建索引偏移量。然后我将这个新的偏移量添加到数组的实际偏移量。这个新的偏移用于构建一个新的lval。

通过这样做,我可以访问数组indizes。

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

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    onNewIntent(getIntent());
}

@Override
public void onNewIntent(Intent intent){
     setContentView(R.layout.activity_main);
    Bundle extras = intent.getExtras();
    if(extras != null){
        if(extras.containsKey("FINISH"))
        {
           finish();
        }
    }


}