我正在尝试使用frama-c值分析器来评估C-Code,它实际上是线程化的。 我想忽略可能发生的任何线程问题,而只是检查单个线程的可能值。到目前为止,这通过设置线程开始的入口点来工作。
现在我的问题:在一个线程中我读取了由另一个线程写的值,因为frama-c没有(并且不应该?)考虑线程(当前)它假设我的变量在某个宽范围内,但是我知道范围实际上要小得多。 是否可以告诉值分析器这个变量的值范围?
示例:
volatile int x = 0;
void f() {
while(x==0)
sleep(100);
...
}
这里frama-c检测到x是易失性的,因此具有范围[--..--],但是我知道其他线程会写入x,我想告诉分析器x只能是0或1。 这可能与frama-c有关,特别是在gui?
提前致谢 基督教
答案 0 :(得分:3)
目前无法自动执行此操作。值分析认为volatile变量始终包含其基础类型中包含的所有值。然而,存在一个专有插件,它将对volatile变量的访问转换为对用户提供的函数的调用。在您的情况下,您的代码将基本上转换为:
int x = 0;
void f() {
while(1) {
x = f_volatile_x();
if (x == 0)
sleep(100);
...
}
通过正确指定f_volatile_x
,您可以确保它仅返回介于0和1之间的值。
答案 1 :(得分:2)
如果在你正在研究的主题中没有修改变量'x',你也可以在'main'函数的开头用它初始化它:
x = Frama_C_interval (0, 1);
这是Frama-C在...../share/frama-c/builtin.c
中定义的函数,因此您在使用它时必须将此文件添加到输入中。