此函数模拟一个函数,该函数返回一个持续上升的值,直到发生溢出。这就像millis()
Arduino 中的函数。
为了证明实现,我需要增加(因此,分配)静态变量以保持调用之间的状态。但是,调用的函数mock_millis()
应该仍然能够assign \nothing
.
有没有办法让 WP 忽略 assigns 子句?
static int64_t milliseconds = 0;
/*@ assigns milliseconds;
behavior normal:
assumes milliseconds < INT64_MAX;
ensures \result == \old(milliseconds) + 1;
ensures milliseconds == \old(milliseconds) + 1;
behavior overflow:
assumes milliseconds == INT64_MAX;
ensures \result == 0;
ensures milliseconds == 0;
complete behaviors normal, overflow;
disjoint behaviors normal, overflow;
*/
int64_t mock_millis() {
if (milliseconds < INT64_MAX) {
milliseconds++;
} else {
milliseconds = 0;
}
return milliseconds;
}
我尝试使用 ghost 变量执行此操作,并注意到分配 ghost 变量的函数不能是assigns \nothing
. 我认为幽灵变量完全独立于程序实现。这有什么特殊原因吗?