我正在开发一个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),所以我根本无法获得此类访问的结果。
答案 0 :(得分:2)
您的原始代码会查询索引Index(inc, offset)
的值,其中inc
为Cil.increm packed act
,act
为当前索引,packed
为大小数组。因此,您基本上是对size+0
,size+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();
}
}
}