Frama-C:没有if语句的分裂

时间:2016-06-02 11:03:56

标签: frama-c

使用我的插件分析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会导致:

CFG

viewcfg可以在a=(a+b)+cthen - else的路径中找到,我在我的插件中在块语句中取消(以便之后)一个“简单的”if a,该陈述不再依赖于条件了。

是否有可能通过命令行参数阻止if的拆分?

1 个答案:

答案 0 :(得分:3)

存在无证件不支持的解决方案。在编译Frama-C之前,在initCIL的函数cil.ml中,更改

theMachine.useLogicalOperators <- false (* do not use lazy LAND and LOR *);

theMachine.useLogicalOperators <- true;

规范化将使用逻辑||&&运算符而不是gotos。

请注意,这是不合理的。与内核一起打包的Frama-C插件需要一个不使用这些操作符的AST,因此它们可能会崩溃或在程序中做一些不合理的事情。使用风险自负!