使用我的插件分析if-conditions时出现以下问题。当我分析像
这样的代码时created_at
Frama-C创建如下代码:
if ((a && b) || c)
对于我的分析,我希望在不分离条件的情况下获得控制流,因此仍然存在一个语句。我想要这个,因为通过拆分条件,_LOR的到达仅取决于or-part。
示例:在开发者指南的if (a) {
if (b){
goto _LOR;
}
else{
goto _LAND;
}
}
else{
_LAND: ;
if (c) {
_LOR: //....
插件中创建CFG会导致:
viewcfg
可以在a=(a+b)+c
和then
- else
的路径中找到,我在我的插件中在块语句中取消(以便之后)一个“简单的”if a
,该陈述不再依赖于条件了。
是否有可能通过命令行参数阻止if
的拆分?
答案 0 :(得分:3)
存在无证件和不支持的解决方案。在编译Frama-C之前,在initCIL
的函数cil.ml
中,更改
theMachine.useLogicalOperators <- false (* do not use lazy LAND and LOR *);
到
theMachine.useLogicalOperators <- true;
规范化将使用逻辑||
和&&
运算符而不是gotos。
请注意,这是不合理的。与内核一起打包的Frama-C插件需要一个不使用这些操作符的AST,因此它们可能会崩溃或在程序中做一些不合理的事情。使用风险自负!