Frama-c,非确定性浮点值

Frama-c,非确定性浮点值,c,frama-c,C,Frama C,例如,我使用以下函数: float nondet_float(){ float x; return x; } int main(){ float x = nondet_float(); if(isnan(x)){ some_error(); } } 我想知道如何使用frama-c来模拟非确定性浮动 我想要的是,变量x被认为是任何可能的浮点值,包括-inf、+inf和NaN 如果x是NaN,我想得到某个_error()是可到达的结果 所以我的问题是: 如何模拟非确定

例如,我使用以下函数:

float nondet_float(){
  float x;
  return x;
}

int main(){
  float x = nondet_float();
  if(isnan(x)){
    some_error();
  }
}
我想知道如何使用frama-c来模拟非确定性浮动

我想要的是,变量x被认为是任何可能的浮点值,包括-inf、+inf和NaN

如果x是NaN,我想得到某个_error()是可到达的结果

所以我的问题是:

如何模拟非确定性浮动?
如何测试某些函数调用的可达性?

Frama-C是一个插件集合,对无限/NaN浮点值有不同程度的支持。我相信WP支持NaN和无限;但这可能取决于您选择的数字模型(选项
-wp model

对于抽象解释插件(EVA,以前是Value),NaN和infinites暂时不受支持。分析器假设(并证明)所有浮点值都是有限的。Frama-C硫磺中将添加对非有限硫的支持


此外,
nondet\u float
函数在任何情况下都是无效的。C标准禁止返回未初始化的值,例如EVA将此函数标记为不正确。相反,你应该使用一个没有主体的函数,用子句
assigns\result\from\nothing
作为它的规范。

你能举个例子吗?我不太明白你的意思。答案的哪一部分。另外,你打算使用哪个插件?例如:“相反,你应该使用一个没有主体的函数,以assigns\result\from\nothing子句作为其规范。”最理想的情况是,我需要一个插件,我可以用它证明/反驳一段特定代码的可访问性。在我的示例中,我想知道是否可以访问某个_error()的调用。WP和抽象解释都能做到。还有Aorai,在我理解后,它执行跟踪抽象。由于我需要对NAN/INF的支持,我无法使用我猜的抽象解释,因此我必须使用WP/Aorai插件。函数:
nondet\u float()
返回未初始化局部变量的内容。结果是未定义的行为。建议重新思考,也许可以使用
srand()
rand()
获得浮点值。