在ACSL中指定参照透明性

时间:2018-11-12 07:51:58

标签: frama-c acsl

我想找到一些可以应用于函数或函数指针的ACSL注释,以指示其具有引用透明性。用某种方式说“当给定相同的参数时,此函数将始终返回相同的值”。到目前为止,我还没有找到任何这样的方法。谁能指出我的表达方式?

也许可以通过某种方式引用任意逻辑函数?如果我可以命名一个未知的logic boolean uknown_function(void* a, void* b) = /* this is unkown */;,那么我可以将一个函数记录为具有\result等于此任意/未知逻辑函数的后置条件?

更大的上下文正在尝试进行类型擦除的比较。我通常要表达这样的概念:“用户给了我void*个可以使用的对象,还有一个bool (*)(void const*, void const*)与它们进行比较,并且用户向我保证所提供的功能确实是严格的那些指针指向的部分顺序。”如果有的话,例如,我可以开始描述这些已排序的类型擦除对象的属性。

1 个答案:

答案 0 :(得分:1)

在ACSL中确实没有这样做的直接可能性:功能约定仅指定在单次调用函数期间发生的情况。您确实可以依赖于已声明但未定义的逻辑函数,并带有reads子句,该子句指定函数需要计算其结果的C内存状态部分,例如

/*@ logic boolean unknown_function{L}(int* a, int* b) reads a[0 .. 1], b[2 .. 3]; */

但是如果您使用void *,而又不知道底层对象的大小,则指定该选项可能会比较棘手:除非unknown_function的结果仅取决于指针的值,而不是指向对象的内容,在这种情况下,您不需要使用reads技巧。

请注意,还不支持基于函数指针的协定,如果我正确理解最后一段的话,这可能是您打算做的事情。

最后,您可能对即将到来的插件RPP感兴趣,该插件提出了一种指定,证明和使用与一个或多个C函数的多个调用相关的属性的方法。 herehere中对此进行了描述,并且公开发布应该在不久的将来发生。