规范中允许状态变化与字段访问分析
1. 规范中状态变化相关探讨
在规范编写中,当规范不修改程序的可观察状态时,规范可以与程序结合而不改变其含义,这极大地方便了静态和动态分析工具的实现。从理论上来说,将规范中使用的函数与程序中的函数完全分离是可行的,但在实际的面向对象代码中,存在许多纯函数方法,它们仅仅读取状态且在无前置条件下就能正常终止。
对于运行时检查,在规范中使用这些现成的方法显然比为了理论上的优雅而重新实现它们更为合适。而且,要求使用特殊的规范库来处理代码中明显存在的函数,会给程序员编写和使用规范带来不必要的阻碍。
规范通常处于较高的抽象层次,会忽略实时性、功耗甚至内存大小等现象。一旦允许在规范中使用程序函数,那么对于那些在推理层面不可观察的影响(如内存分配)的函数,也自然可以被允许使用。进一步而言,如果封装能够确保这些影响在特定上下文中不可观察,那么在规范的上下文中就可以忽略这些影响。
许多库方法是弱纯的,但也有很多访问器方法,从名称和文档来看它们应该是纯的,但实际上并非弱纯。若能在契约中使用这些方法将十分便利。
下面是一些相关技术在处理规范中函数使用时的情况:
| 技术 | 处理方式 | 存在问题 |
| ---- | ---- | ---- |
| AsmL | 运行时验证不限制规范中函数的使用,提供与实现分离的替代数据空间,使该空间的副作用与实现的数据空间隔离 | 由于允许与任意组件完全互操作,存在不健全性 |
| JML | 采取保守策略,除创建新对象外,禁止所有副作用。有副作用的库方法不能在规范中使用,需使用纯替代方法 | 规范编写者需时刻注意可用和禁止的方法,且并非所有JML工具都
超级会员免费看
订阅专栏 解锁全文
10万+

被折叠的 条评论
为什么被折叠?



