- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 Frama-C 的新手,我正在尝试验证 C 代码。代码非常基础,但不知何故我无法验证它。
总而言之,我试图证明该函数或循环是否曾经运行过。为此,我在开始时给一个变量一个值 (4)。在函数中,我将值更改为“5”,并尝试确保最后的变量为 5。
代码:
#include <stdio.h>
int x=4;
/*@
ensures x ==5;
*/
int abs(int val){
int accept=0;
int count=3;
/*@
loop invariant 0 <= count <= \at(count, Pre);
loop assigns accept,x,count;
loop variant count;
*/
while (count !=0){
x=5;
accept =1;
count--;
}
return x;
}
我将命令作为“frama-c-gui -wp -rte testp4.c”发送给 CLI 以启动 frama-c。
结果: Frama-1
但是“*@ ensures x ≡ 5; */”仍然未知。
有没有人可以帮我解决这个问题?如果我将 "x=5;"
带到 while 循环之外(在返回之前),它会验证 /*@ 确保 x ==5; */
提前感谢所有做出贡献的人!
最佳答案
这里的大部分问题都与内置标签的使用有关。这里是我们需要的标签:
要事第一。我不知道您使用的是哪个版本的 Frama-C,但我建议您更新 ;)。您将收到以下错误消息以防止出错:
[kernel:annot-error] file.c:11: Warning:
unbound logic variable count. Ignoring loop annotation
为什么?因为您在不存在的前提下谈论 count
。请注意,在旧版本的 Frama-C 中,WP 可能对此没有问题,因为在某些情况下合并了局部变量的预状态和初始化。
我们想要的可能是“count
的当前值介于 0 和我们开始循环时它的值之间的某处”,因此:
loop invariant 0 <= count <= \at(count, LoopEntry);
which is:
loop invariant 0 <= \at(count, Here) <= \at(count, LoopEntry);
现在我们有了这个(已证明的)不变量,我们想将循环的行为与后置条件联系起来(目前,我们的循环不变量没有说明任何关于 x
的信息,WP 不使用循环体。这意味着我们需要另一个不变量,即“当 count
不等于它在开始循环时的值时,x
是 5`” .
因此:
loop invariant count != \at(count, LoopEntry) ==> x == 5 ;
这允许完全证明程序 :) 。最终注释程序:
#include <stdio.h>
int x=4;
/*@
ensures x ==5;
*/
int abs(int val){
int accept=0;
int count=3;
/*@
loop invariant 0 <= count <= \at(count, LoopEntry);
loop invariant count != \at(count, LoopEntry) ==> x == 5 ;
loop assigns accept,x,count;
loop variant count;
*/
while (count !=0){
x=5;
accept =1;
count--;
}
return x;
}
关于为什么 \at(count, Pre) != 0 ==>\at(x, Post) == 5
(在评论中)不起作用的一些说法:
\at(count, Pre)
是 count
在 function 的前置条件中的值,\at(count, Post)
是函数的后置条件 中 count
的值。因此,这不是我们在这里需要的。关于c - Frama-C 用 "/*@ ensures"证明 While 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72731376/
我的模型中有一个在私有(private)方法中运行的简单方法: def with_time_zone(zone) @old_time_zone = Time.zone Time.zone =
我想了解如何在代码中使用 Ensures()。正如 example 中给出的那样,如果我尝试使用 Ensures() 如下... int main(void) { int result = 0
当一个方法结束工作时我们也许需要进行清理工作.也许一个打开的文件需要关闭,缓冲区的数据应清空等等.如果对于每一个方法这里永远只有一个退出点,我们可以心安理得地将我们的清理代码放在一个地方并知道它会被
问题 我想检查 R 中的函数工厂是否“安全”。这里的“安全”意味着工厂创建的函数的结果仅取决于它们的参数,而不取决于全局变量。 描述 这是一个不安全的工厂: funfac_bad = function
如果我们有不同的由 webpack 创建的包并且我们 require.ensure在稍后的时间点动态传输+评估它的东西,它通过 jsonPadding 和一些 webpack js 魔法发生。如果我们
我正在开发一个小型 REST API。当我开始分析所有可能的故障场景(我必须处理这些故障场景以创建可靠且稳定的系统)时,我开始思考如何使我的 API 原子化。 如果我们采用通过 POST API 创建
我在 Xor 上有这段代码猫的对象 Xor.right(data).ensure(List(s"$name cannot be blank"))(_.nonEmpty) 现在由于 Xor 已被删除,我
我有一个带有 out 参数的方法,我想使用 Contract.Ensures() 指定当方法返回时,参数不会是 空。 基本上,这是: void M(out object o) { Contra
我开始使用 Code Contracts,虽然 Contract.Requires 非常简单,但我很难理解 Ensures 的实际作用。 我试过创建一个像这样的简单方法: static void Ma
我有一个问题 当我添加一些依赖项时,例如 github.com/jmoiron/sqlx 这个依赖项,我必须等待很长时间,然后它什么都不做,只显示消息“Fetching Sources” 我已经等了
我正在构建一个依赖预定作业的 Heroku 应用程序。我们以前使用 Heroku Scheduler,但时钟进程似乎更加灵活和健壮。所以现在我们使用时钟进程在特定时间/间隔将后台作业排入队列。 Her
我在 Scala 中有一个打字问题的小问题。在 Haskell 中,我可以这样做: add :: (Num a) => (a,a) -> (a,a) -> (a,a) 这样,我就可以扔进add任何支持
这是一个负责与服务器通信的类: public abstract class AbstractCommunicationChannel implements Runnable { static
我不明白为什么静态检查器说这个方法一切正常: public static int GetNonNegativeValue() { Contract.Ensures(Contract.Resul
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
我有一个在 eventmachine react 器中运行的服务器,它监听用户的心跳以判断他们是否在线。当它开始/停止接收心跳时,它会适本地将用户标记为在线和离线。 我想将它全部包装在一个 ensur
我正在使用假设来测试将两个等长列表作为输入的函数。 import hypothesis.strategies as st from hypothesis import assume, given @g
假设我有这个: [Pure] public static TimeSpan Seconds(this int i) { Contract.Ensures(Contract.Result() =
这个问题在这里已经有了答案: How to specify types not allowed in a .NET Generics constraint? (4 个答案) 关闭 8 年前。 我有一
我的 .Net 4 应用程序中有以下代码: static void Main(string[] args) { Func(); } static string S = "1"; static
我是一名优秀的程序员,十分优秀!