是否可以在 ACSL 中为通常在使用 -lm 编译时调用的函数实现规范,如 sqrt ?我将它用于 Frama-C 的插件 WP。
这是一个小例子来说明我想要做什么。
/*@ requires sqrt_spec: \forall float x;
\model(sqrt(x)) * \model(sqrt(x)) == \model(x);
ensures [...] */
void f (...) {
double y = sqrt x;
[...]
}
显然,如果我这样做 WP 会哭,因为当我在注释中使用 sqrt 时它不存在。
[内核] 用户错误:注释中未绑定函数 sqrt
所以我想定义一个抽象的 sqrt,但我的测试都没有工作:
#define sqrt(x) (...)
对于这个,我看不到我可以放入什么(...),因为我想要一个抽象定义而不是重新实现整个 float sqrt。
/*@ axiomatic SqrtSpec {
logic real sqrt (real x);
} */
而这个并不能解决我的问题:
函数 sqrt 的代码和规范都没有,从原型生成默认分配。