- 博客(33)
- 收藏
- 关注
翻译 Introduction to C program proof with Frama-C and its WP plugin(十一)
逻辑函数可以递归地定义,但由于验证器需要执行求值或通过归纳“推理”(这两项任务它们的效率不高),没有更多帮助的情况下,我们很快会受到限制。原因在于,在这种情况下,Z3所采用的启发式方法认为,在函数评估上花费稍多一点时间是值得的。编写一个递归逻辑函数,返回前N个整数的总和,并为C函数编写规范,说明它计算的值与逻辑函数提供的值相同。操作后,数组的第一个值为输入值,并且数组中的每个值都对应于其前一个值加一的结果(使用之前定义的逻辑函数)。请注意,在规范中,计算是使用数学整数进行的。确实,尽管我们的逻辑函数为。
2025-06-12 01:37:49
20
翻译 Introduction to C program proof with Frama-C and its WP plugin(十)
但我们已有足够的细节来确保,即使我们无法证明我们总是得到正确的结果(例如“如果我压入v,栈顶返回v”的行为),我们仍能保证不会产生运行时错误(如果为栈提供正确的谓词,并证明我们的函数实现确保不会发生运行时错误)。此外,它还允许我们将规范进行分解(例如定义什么是有效数组),这带来了两个令人愉悦的结果:我们的规范更加易读且易于理解,并且我们可以重用现有的证明来简化新程序的证明过程。在这些有用的类型中,有一些专门用于数字,允许我们表达属性或函数,而无需考虑由于C语言基本类型在内存中表示的大小所带来的约束。
2025-06-12 00:51:04
26
翻译 Introduction to C program proof with Frama-C and its WP plugin(九)
因此,重要的是要注意到,在前置条件下,我们所考虑的内存状态是我们计算最弱前置条件时的状态,而对于后置条件则并非如此,我们所考虑的内存状态是调用之后的那个状态,而我们需要明确提及旧状态以谈论调用之前的值。当然,在调用该函数之前,我们必须验证其前置条件,因此它是最弱前置条件的一部分。,该值是调用后的值。然而,如果我们想要检查后置条件是否给出了正确的结果,我们不能接受每个被赋值位置的任意值,我们只希望那些能够满足后置条件的值。因此,这些值用于转换函数的后置条件,并验证它是否蕴含着最弱前置条件输入中的后置条件。
2025-06-11 00:47:47
15
翻译 Introduction to C program proof with Frama-C and its WP plugin(八)
然而,这意味着我们必须在我们的一致性方面更加精确:我们不再保证与源数组的值相等,而是与源数组的旧值相等。我们还必须在我们的不变式中更加精确,首先通过也指定与内存之前状态的关系,其次通过添加一个不变式来表明源数组从我们访问的第。首先,我们假设数组的长度为整数,并使用整数值来处理索引。如果我们想要总结这些关键词的使用,我们可以说,在一系列值中,某个属性是成立的,要么是至少其中一个值满足该属性,或者是所有值都满足该属性。的界限,但需要注意的是,对于这两个界限中的每一个,其中一个界限是不需要的。
2025-06-10 01:33:15
17
翻译 Introduction to C program proof with Frama-C and its WP plugin(七)
这是一个有趣的方案。我们必须找到一个在开始执行循环之前为真的特性,并且如果它在某次迭代的开始时为真,那么在迭代的结束时仍然为真(因此在下一次迭代的开始时也为真)。当循环结束时,我们增加了循环条件为假的知识,这应该使我们能够推断出循环的后置条件得到了验证。实际上,在没有循环的情况下,最弱前置条件演算函数可以自动提供我们程序的可验证属性,但对于循环不变式属性,我们却没有计算过程。然而,计算程序中不同变量之间存在的关联关系往往更为困难,例如,我们添加的不变式所表达的等式,这对于证明函数的后置条件是绝对必要的。
2025-06-09 13:17:14
26
翻译 Introduction to C program proof with Frama-C and its WP plugin(六)
例如,如果我们的后置条件过于复杂,可能会生成一个较弱的前置条件,然而该前置条件也可能过于复杂,从而增加了证明器的难度。我们之前已经证明,当一个条件结构具有空的“else”分支时,这意味着前置条件与条件的否定的合取必须足以验证整个条件结构的后置条件。当然,对于两个分支,相同的前置条件(条件语句的)必须成立。当我们有多于两个语句时,可以将最后一个语句视为规则中的第二语句,而将所有前面的语句视为第一语句。前者通常由我们建立,以方便证明器的工作,后者更多地是由工具在计算最弱前置条件的结果时进行验证的。
2025-06-08 23:02:00
18
翻译 Introduction to C program proof with Frama-C and its WP plugin(五)
然而,随着内容的深入,我们的讲解将越来越依赖于工具,特别是在我们开始处理循环时。在C语言中,由于指针的存在,我们可以编写带有别名的程序,这意味着两个指针可以指向同一个内存位置。的不同情况,该函数从给定的后置条件和一个程序(或语句)开始,计算出最弱前置条件,从而确立后置条件的有效性。Hoare逻辑的规则告诉我们,为了证明我们的程序满足其契约,我们必须验证以下括号中所示的性质。这样,我们逐步获得了推理的推导树。来建模内存,并且我们将内存位置的赋值定义为内存的更新,使得现在相应的指针指向被写入的表达式。
2025-06-04 00:53:52
25
翻译 Introduction to C program proof with Frama-C and its WP plugin(四)
当我们当前未在进行某个函数的证明时,我们认为其规范是正确的:在证明另一个函数时,我们不会尝试去证明它,而只是在调用它时验证其前置条件是否正确建立。当然,如果我们的证明依赖于另一个函数的规范,那么该规范必须是可以证明的,以确保程序证明的完备性。首先,用于证明前置条件已验证(从而证明调用是合法的),其次,返回后置条件,这对于在函数调用后证明正确的属性是有用的。然而,由该子句表达的属性不必在调用之前进行验证,它们可以在调用后验证,在这种情况下,我们的行为中指定的后置条件适用。),则行为是互不相交的。
2025-05-29 12:15:49
37
翻译 Introduction to C program proof with Frama-C and its WP plugin(三)
为了证明我们的代码实现了我们所需要的,我们必须能够准确地描述我们的需求。如果我们试图证明交换函数的正确性(包括验证不存在运行时错误),我们的后置条件确实得到了验证,但由于我们在函数的前置条件中未指明某些指针是有效指针的情况下访问了这些指针,因此WP无法证明某些运行时错误不会发生。我们可以在函数的前置条件下看到一个红色和橙色的标记,这意味着如果存在一个可达的调用该函数的方式,前置条件将必然被违反,并且在目标列表中有一个红色的标记,表明证明器成功证明了该前提条件是不一致的。子句,这是函数后置条件的一部分。
2025-05-20 23:56:15
46
翻译 Introduction to C program proof with Frama-C and its WP plugin(二)
函数契约的目标是陈述函数对输入的预期属性,并以此为交换,保证输出的属性。函数对输入的预期称为前置条件。输出的属性称为后置条件。这些属性使用ACSL表示。如果你已经熟悉C语言,那么它的语法相对简单,因为它与C语言中的布尔表达式语法大部分相同。一些逻辑结构和连接词,用于简化规范的编写,这些在C语言中并不存在。内置谓词,用于表达与C程序相关的属性(例如:有效指针)。以及一些比C语言基本类型更通用的逻辑原始类型(例如:数学整数)。本教程将介绍ACSL中可用的大部分符号。
2025-05-19 14:27:19
46
翻译 Introduction to C program proof with Frama-C and its WP plugin(一)
尽管历史悠久,C语言仍然是一种广泛使用的编程语言。事实上,没有其他语言能够声称可以在如此多的不同(硬件和软件)平台上运行,其底层定位以及在优化编译器上投入的大量时间使得它能够生成非常轻量且高效的机器码(当然,前提是代码允许),并且存在大量C语言专家,这是一个重要的知识库。此外,许多系统依赖于历史上用C语言编写的大量代码,这些代码需要维护,有时还需要修复,因为重写这些系统的成本将过于高昂。然而,任何已经使用C语言进行开发的人也都知道,要完全掌握这门语言是非常困难的。
2025-05-19 00:30:25
53
原创 Matplotlib is currently using agg, which is a non-GUI backend, so cannot show the figure
【代码】Matplotlib is currently using agg, which is a non-GUI backend, so cannot show the figure。
2023-11-08 16:21:28
468
原创 dronekit-sitl+MAVproxy+MissionPlanner进行无人机仿真
以下教程为通过dronekit-sitl、MAVproxy和MissionPlanner进行无人机仿真。
2023-05-31 21:59:13
2508
7
原创 openEuler22.03安装zabbix4.0
教程为openEuler22.03安装zabbix4.0,主要原因是openEuler官方和zabbix官方提供的提供的软件源中没有相关软件,因此需要使用zabbix源码进行编译,并且安装过程中会出现一些异常情况,建议先看过整个安装流程再进行
2022-10-22 16:59:01
1794
原创 cloud-init离线安装编程环境
本博客主要介绍通过cloud-init工具实现在Ubuntu16.04操作系统和KVM虚拟化技术下实现创建虚拟机同时离线安装编程环境
2022-04-18 08:58:35
1620
原创 cloud-init中NoCloud配置
本文章主要记录cloud-init工具中NoCloud数据源的使用方法,可以搭配KVM镜像制作系列文章,为用户定制操作系统。文章目录NoCloud使用方法1. 安装并初始化文件2. 修改cloud-init配置文件3. 编写用户数据4. 制作配置镜像5. 挂载镜像6. 重启虚拟机参考链接NoCloud数据源NoCloud允许用户在不运行网络服务的情况下向虚拟机实例提供用户数据user-data和元数据meta-data:可以通过vfat或者iso9660文件系统上的文件为虚拟机的引导提供数据,文
2022-01-18 22:06:20
3093
原创 KVM下Ubuntu18.04打开设置注销问题
在KVM中创建Ubuntu18.04,打开系统设置,发现直接注销(不是锁屏,因为所有程序都退出)
2022-01-18 14:59:19
1988
原创 KVM虚拟机配置静态IP(二):Ubuntu18.04
该系列文章为制作KVM虚拟机镜像的同时配置静态IP,为用户直接提供好固定IP,无需手动配置
2022-01-06 22:04:18
1029
原创 KVM虚拟机配置静态IP(一):Ubuntu16.04
该系列文章为制作KVM虚拟机镜像的同时配置静态IP,为用户直接提供好固定IP,无需手动配置
2022-01-06 21:00:52
3809
原创 KVM安装Windows11系列(一)
本教程系列为KVM安装Windows11,会分成两部分,第一部分会跳过Windows11的硬件要求TPM和安全启动,第二部分会安装TPM模拟器进行模拟。
2021-11-20 19:10:09
13068
原创 ubuntu16.04搭建containerd
本博客具体介绍在ubuntu16.04下安装containerd的过程,有关ctr的命令都要有root权限才能运行搭建过程下载containerd安装包解压containerd安装包到根目录下启动containerd并设置开机自启创建默认配置文件查看版本拉取镜像运行容器下载containerd安装包wget https://github.com/containerd/containerd/releases/download/v1.5.7/cri-containerd-cni-1.5.7-linux-a
2021-10-18 20:57:40
595
原创 银河麒麟下libguestfs-tools中virt工具无法使用情况
银河麒麟下libguestfs-tools中virt工具无法使用情况问题描述:在银河麒麟高级服务器版本V10下安装libguestfs-tools工具包后,使用virt-xx等一系列命令都会出现以下错误:libguestfs: build appliancelibguestfs: error: cannot find any suitable libguestfs supermin, fixed or old-style appliance on LIBGUESTFS_PATH (search pa
2021-09-24 13:01:32
1996
1
原创 Ubuntu16.04搭建gitea1.14.1
以下教程为在Ubuntu16.04上搭建gitea1.14.1,同时附上官方教程链接文章目录1. 数据库准备1.1 登录数据库1.2 创建gitea用户1.3 创建gitea数据库1.4 给gitea用户赋予数据库的权限1.5 测试数据库连接2. 安装gitea2.1 下载gitea二进制文件2.2 服务器配置2.2.1 检查是否安装git2.2.2 添加git用户2.2.3 创建所需的目录2.2.4 将gitea二进制文件复制到指定路径3. 运行gitea3.1 创建gitea.service文件3.2
2021-04-17 16:05:00
829
原创 Ubuntu16.04安装zabbix4.0
以下教程为Ubuntu16.04安装zabbix4.0,需提前自己安装好Mysql数据库。其中第1~7点为主节点安装配置Zabbix-server、Zabbix-agent、Web前端,第8点不用进行;第8点为从节点安装配置Zabbix-agent用于被主节点进行监控,不用进行前7点文章目录1. 安装Zabbix 仓库2. 安装Zabbix server,Web前端, agent3. 创建初始数据库3.1创建Zabbix数据库并进行配置3.2导入初始架构和数据,系统将提示输入新创建的密码4. 为Zabbi
2021-04-15 16:36:08
816
原创 zipimport.ZipImportError: can‘t decompress data; zlib not available
在Ubuntu16.04上通过pyenv安装python3.6.8时出现以下错误,记录一下ubuntu@ubuntu:~$ pyenv install 3.6.8Installing Python-3.6.8...BUILD FAILED (Ubuntu 16.04 using python-build 1.2.19-8-gfec2aa3)Inspect or clean up the working tree at /tmp/python-build.20210415135301.18425
2021-04-15 14:00:28
643
原创 ubuntu20.04安装howdy
ubuntu20.04安装howdyhowdy是一款用于Linux系统的人脸识别身份验证系统,可以看作是Windows中的Windows Hello的替代品,howdy在安装的过程中会去外网下载一些安装包,所以前提条件是有访问外网的手段。howdy官网,安装过程的参考链接安装proxychains用于全局代理,不然只有访问外网的手段在终端中也是无法实现全局代理,最终会在下载包的过程中出现下面的失败情况#错误情况sudo dpkg -i howdy_2.6.1.deb(正在读取数据库 ... 系
2021-04-05 16:54:59
2252
1
原创 go get得到的东西不在$GOPATH中
博主最近在ubuntu20.04上安装oci-image-tool,按照官方文档执行,结果第一步就发现go get得到的东西找不到,后来查阅了link这篇博客,发现了原因,是因为开了goproxy,设置了代理go env -w GO111MODULE=on$ go env -w GOPROXY=https://goproxy.cn,direct需要将其关闭go env -w GO111MODULE=off重新go get的得到的就在$GOPATH里面了...
2021-03-12 17:37:14
826
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人