E-ACSL编写循环不变量时报guard invalid错误的原因是什么?
报错触发原因
E-ACSL 是 ACSL 规范的运行时验证实现,它要求全称量词\forall的量化域必须是可枚举的连续有限整数区间,不支持在量词的顶层守卫中混入区间外的额外筛选条件。
你原注解的写法将j%2==0的奇偶筛选条件和4<=j<i的区间条件合并作为全称量词的顶层守卫,相当于要求工具遍历所有满足「在4到i区间内且为偶数」的整数,但这类非连续的量化范围无法被E-ACSL识别,因此会抛出invalid guard警告并忽略注解。
修复方案
调整条件的层级,将区间约束单独作为量词的作用域,把奇偶筛选条件移到蕴含式的前件位置,调整后的逻辑和原逻辑完全等价,同时符合E-ACSL的语法要求:
/*@ loop invariant (\forall integer j; 4<=j<i ==> (j%2==0 ==> prime[j]==2)); */ for (int i = 4; i <= n; i += 2) { prime[i] = 2; }
调整后量化的j的范围是连续的[4, i-1]整数区间,E-ACSL可以枚举区间内所有整数逐个校验规则,不会再抛出无效构造警告。
内容的提问来源于stack exchange,提问作者João Teixeira
相关产品推荐
相关产品推荐

