我无法区分ACSL中的各种前提条件和后置条件。据我所知,需要,终止和假设是在前提条件下确保并分配后置条件。但是在哪个集合休息如减少等等?
任何人都可以帮助我搞清楚吗? 提前谢谢
答案 0 :(得分:3)
这是一个棘手的问题。基本上,decreases
将作为递归调用的先决条件:如果您有f
函数decreases x;
,如果碰巧调用自身,则必须证明在此通话网站x<\at(x,Pre)
。此外,当您拨打x>=0
(递归通话或不通话)时,您有f
的前提条件。
关于其他条款(根据ACSL 1.7中的上诉顺序:
complete
和disjoint
子句基本上是合同assumes
子句的逻辑属性,它们并不意味着实现任何内容,而是作为规范的完整性检查。本身。allocates
和frees
是后置条件(例如assigns
,但关于动态分配)exits
(以及returns
,breaks
和continues
)是后置条件(当我们退出函数或语句时会对它们进行评估)。\from
)是后置条件(如assigns
)。答案 1 :(得分:2)
减少子句基本上用于递归函数调用。 如果你用指针变量x指定了reduce子句,那么:reduce * x; 那意味着,每当控制进入与此减少子句相关的函数时,它会检查指针x指向的值是否比函数的预先状态期间x指向的值小1 。在调用该函数时,第一次检查前置条件为:(* x)&gt; = 0,因为函数处于预先状态,因此没有要比较的预状态值。