当我在模型上的Verifier中运行A[] not deadlock
查询时,验证会停止并显示错误:
验证因错误而中止。最有可能的是,这是 由超出范围的赋值或超出范围的数组查找引起的。
这是否意味着我的模型是无死锁的,直到"超出范围的赋值或超出范围的数组查找"会发生什么?
答案 0 :(得分:0)
如果能够回答查询,UPPAAL继续搜索状态空间是没有意义的。所以我认为你可以假设UPPAAL的状态空间部分设法搜索是无死锁的。
请记住,可能会通过多条跟踪达到错误状态,但这依赖于您的模型。
听起来你已经知道为什么会出现这个错误。您可以尝试通过向模型添加保护!willCauseError()
来修复它,以确保您永远不会处于此错误状态。这本身可能会导致僵局。为避免这种情况,您可以使用相反的警卫willCauseError()
添加从相关位置到自身的转换。这会强制程序进入活锁而不是死锁。
答案 1 :(得分:-1)
解决方案是在检查死锁时使用索引变量扩展查询,例如
A[] not deadlock || indexVarble => 24
因此,如果存在死锁,则应该在我们超出范围时。 (在示例中,范围是[0-23])