在下面,当相关的C代码被注释掉时,行为neg_limit的后置条件如何被证明是真实的?确保证明代码有缺陷?
安全 - >检查算术溢出之一是不可证明的,如预期的,但它似乎像neg_limit也应该是无法证明的。
语境:我使用的邮资-C-硼,杰西,并通过gWhy,按住Alt键人体工程学,以学习如何编写规范和证明功能的满足他们。任何关于规范策略,工具等的提示,RTFMing等也是值得赞赏的。到目前为止,我正在阅读ACSL 1.7实施手册(这是更近期的-Boron's)和Jessie教程& ref。手册。
谢谢!
/*@ behavior non_neg:
assumes v >= 0;
ensures \result == v;
behavior neg_in_range:
assumes INT32_MIN < v < 0;
ensures \result == -v;
behavior neg_limit:
assumes v == INT32_MIN;
ensures \result == INT32_MAX;
disjoint behaviors;
complete behaviors;
*/
int32_t my_abs32(int32_t v)
{
if (v >= 0)
return v;
//if (v == INT32_MIN)
// return INT32_MAX;
return -v;
}
这是第一个后置条件的gWhy目标:
goal my_abs32_ensures_neg_limit_po_1:
forall v_2:int32.
(integer_of_int32(v_2) = ((-2147483647) - 1)) ->
(integer_of_int32(v_2) >= 0) ->
forall __retres:int32.
(__retres = v_2) ->
forall return:int32.
(return = __retres) ->
("JC_13": (integer_of_int32(return) = 2147483647))
和第二:
goal my_abs32_ensures_neg_limit_po_2:
forall v_2:int32.
(integer_of_int32(v_2) = ((-2147483647) - 1)) ->
(integer_of_int32(v_2) < 0) ->
forall result:int32.
(integer_of_int32(result) = (-integer_of_int32(v_2))) ->
forall __retres:int32.
(__retres = result) ->
forall return:int32.
(return = __retres) ->
("JC_13": (integer_of_int32(return) = 2147483647))
是的,这个昵称为“硼”的版本相当古老。它是http://frama-c.com/上可用的Windows二进制文件的最新版本。这可能是你使用它的原因。您是否尝试过StéphaneDuprat(http://lists.gforge.inria.fr/pipermail/frama-c-discuss/2012-February/003040.html)编写的说明以获得两个版本? –
@ pascal-cuoq,我现在要做,谢谢,现在正在与WP合作。如果其他人发现这一点,alt-ergo-0.94-mingw.exe似乎是必需的。 Niton-over-Boron指令指出它,但似乎并不需要它。要安装:下载它,重命名为alt-ergo.exe,然后将它放在你的PATH之前的Boron仓中。我避免使用alt-ergo-0.95-mingw.exe,因为它的网站表示它与Frama-C-Oxygen不兼容,已知0.94与Nrogen一起使用。另外:按照该链接的说明设置全部三个FRAMAC_ * env。瓦尔; INSTALL.txt只提到一个。谢谢! –