我正在尝试将Frama-C的价值分析插件作为我项目中的抽象解释后端。特别是,这个项目是关于将带有POSIX线程的并发C程序转换为模拟相应并发程序的等效顺序C程序,并使用顺序分析工具来分析顺序程序(Cseq)。
该插件确实为我的程序中的变量提供了非常好的近似值。但是,为了使后端工作,需要精确跟踪顺序程序中的一组特定变量,这称为显式值分析(本文的影响explicit-value-analysis)。例如,对于表示控制流或上下文切换点的变量,需要在每个语句(特定值)处精确跟踪它们的值,而不仅仅是在枚举或间隔中。我想知道Frama-C是否提供此功能。如果是这样的话,如果有人可以帮助我,我将深表感谢。
答案 0 :(得分:1)
这在Frama-C中并不存在。
首先,下面的讨论假设您已经尝试过Frama-C的-slevel
选项并且您正在使用它。
如果您愿意在每次修改重要变量时添加语句,您可以将程序更改为以下内容:
…
/* original assignment: */
important = important /* already known precisely */ + unimportant;
/* instrumentation: */
tis_variable_split(&important, sizeof important, LIMIT);
…
内置tis_variable_split
获取刚刚为变量important
计算的值,并根据需要传播尽可能多的抽象状态,为每个值分配important
个值。
内置tis_variable_split
在Frama-C(我知道)中没有实现,但可以在TIS Analyzer中使用,TIS Analyzer是一种基于Frama-C的商用静态分析器。您可以联系出售它的公司TrustInSoft,获取许可证。免责声明:我在那里工作。
如果您事先知道important
可以采用的一组值,您可以通过析取来模拟相同的效果:
/*@ assert important == value1 || important == value2 || … ; */
断言可能会很快变得笨拙,但由于我们讨论的是自动检测,因此只需要足够小就可以由框架自动生成和处理。 可以修改框架,以便即使是上面的仪表步骤也是不必要的。这种修改是有效的,所以你必须准备好更详细地解释你的实验需要,这样无论谁做这项工作都不会浪费他们的时间,你必须准备好分享科学学分。最终结果,这将是合作的产物。