在 viper 中乘以通配符有什么意义吗?
Does multiplying a wildcard in viper mean anything?
VerCors 中的一个错误生成了一些看起来像这样的银:
field f: Int
method test(n: Int, x: Ref)
requires n == 100
requires acc(x.f, wildcard * n)
{}
Viper 似乎接受了这一点,但我不明白这意味着什么。
直觉上,这意味着被调用者获得了一个很小的(但 non-zero)许可量——乘以 n。实际上,这应该与仅获得少量(即 acc(x.f, wildcard)
)没有什么不同,尽管可以设计人为的情况,可能涉及 perm
,其中它有所不同。
底线:这个例子确实有点令人困惑,语义也不是很明显,但一切都很明确。
VerCors 中的一个错误生成了一些看起来像这样的银:
field f: Int
method test(n: Int, x: Ref)
requires n == 100
requires acc(x.f, wildcard * n)
{}
Viper 似乎接受了这一点,但我不明白这意味着什么。
直觉上,这意味着被调用者获得了一个很小的(但 non-zero)许可量——乘以 n。实际上,这应该与仅获得少量(即 acc(x.f, wildcard)
)没有什么不同,尽管可以设计人为的情况,可能涉及 perm
,其中它有所不同。
底线:这个例子确实有点令人困惑,语义也不是很明显,但一切都很明确。