
形式化方法
文章平均质量分 80
Jtag特工
代码和人工智能老兵
展开
-
面向程序员的Lean 4教程(5) - 从三段论说起
这一节我们复习一下离散数学中的命题逻辑。如果读者大大没有学过命题逻辑也不要紧,我们从更简单的三段论说起。我们可以用Lean4来证明,theorem用来定义定理,intro用来引入前提,apply用来应用前提。我们可以理解为Prop是命题,A → B 是命题A推出命题B。原创 2025-02-10 09:39:10 · 566 阅读 · 0 评论 -
面向程序员的Lean 4教程(4) - 结构体
结构体也是程序员们的老朋友了,它的作用是定义一个数据类型,并给这个数据类型定义一些字段。原创 2025-02-06 05:09:11 · 737 阅读 · 0 评论 -
操作系统形式化验证实践教程(13) - 符号的输入方法
操作系统形式化验证实践教程(13) - 符号的输入方法Isabelle/HOL有一个特别显著的优点也是缺点,就是符号特别多。一方面这给让写好的代码的可读性显著增强,另一方面给大家的输入带来了一定的麻烦。所以我们先把符号及其输入方法总结一下。符号等价表示输入方法‹\›\⟦\⟧\⟹==>\⟶–>\⇒=>\→->\⋀!!\≡==\λ%\∧&原创 2020-12-01 21:53:10 · 624 阅读 · 2 评论 -
符号执行(7) - clang静态扫描进阶
符号执行(7) - clang静态扫描进阶通过前面的学习,我们了解到符号执行技术其实是有很多限制的。为了提高准确率,减少误报,我们有三件事情可以做:第一是收集信息了解内部状态,找到哪里薄弱哪里有限制,我们才好有针对性地去改进第二是了解有哪些checker,根据情况配置合适checker.第三是调整一些参数。比如默认clang分析器为了节省时间,循环只执行4次,我们可以根据情况适当扩展收集更多信息scan-build命令是可以支持很多参数的。stats参数:数据流信息首先我们可以给sca原创 2020-10-30 21:23:44 · 1371 阅读 · 1 评论 -
符号执行(6) - clang静态分析器带你一起读代码
符号执行(6) - clang静态分析器带你一起读代码符号执行除了可以生成较高的覆盖率的测试用例之外,其实还有很多用途,其中最广为人知的可能是静态扫描代码中的问题。clang是一个强大的C++编译前端大家都早就很熟悉了,大家在编译中可能都有很多警告没有处理。其实,编译过程中为了加快编译速度,实现多项式复杂度的时间,并不能覆盖很多路径。数据流分析的时候,有很多时候状态是迭加在一起无法判断的。如果我们愿意花更多的时间去检查代码的质量,可以使用clang提供的静态分析器。据说clang分析器是与行业两大巨原创 2020-10-27 22:45:51 · 956 阅读 · 0 评论 -
符号执行(4) - 幕后英雄SMT
符号执行(4) - 幕后英雄SMT前面几讲,我们基本上了解了klee的主要用法。下面我们进入更深入的原理部分,不仅要掌握搜索方法,还要理解每个分支逻辑的具体内容。为了看到klee背后的逻辑,我们增加–write-smt2s参数,生成每个case对应的smt文件。初识SMT生成SMT文件为了简化理解,我们选取一个判断符号的简单例子:#include "klee/klee.h"char sign2(char a){ if(a>0){ return 1; }e原创 2020-10-26 21:21:39 · 1112 阅读 · 0 评论 -
符号执行(3) - 与库函数和操作系统交互
符号执行(3) - 与库函数和操作系统交互符号执行有两个主要的问题:一个就是爆炸的状态中进行搜索,也就是上节我们讨论过的时间和策略的问题;另一个就是模拟环境的问题。一个应用程序总是要调用库函数和操作系统调用的,如果不对这两部分进行建模,那么对于实际的应用程序的限制就太大了。Klee工具的优势就是不仅在研究上有建树,而且在工程落地上下了很多工夫,比如提供了posix runtime的支持,这样对操作系统的调用就可以被识别出来。编译支持c库函数的klee针对c库函数,klee基于uclibc库进行建模原创 2020-10-23 22:20:21 · 634 阅读 · 0 评论 -
符号执行(2) - 用例搜索时间的控制与优化
符号执行(2) - 用例搜索时间的控制与优化通过上一节,大家对klee符号执行的概念已经有了比较清晰的了解了。但是,一个工具要用起来,面对的是复杂的场景,还有很多困难等着我们去克服。生成用例可能是个很耗时的操作第一个要强调的问题是针对复杂情况,我们对于搜索case的时间要有个明确的概念。以上节的求最大公约数为例。当我们计算short类型的最大公约数时,用时3分32秒,生成测试用例44个。#include "klee/klee.h"short gcd(short a, short b){原创 2020-10-15 20:50:02 · 580 阅读 · 0 评论 -
符号执行(1) - 自动生成覆盖率用例之利器
符号执行(1) - 自动生成覆盖率用例之利器对于安全性要求比较高的软件,为了防止出现安全漏洞,我们不得不花大量时间写更多的测试用例来提升覆盖率。尤其是高可靠性软件需要的修正条件判定覆盖MC/DC(Modified Condition/Decision Coverage),更是要多花不少心思。全靠手工写,工作量太大,而且重复性工作不少。靠模糊测试命中的话效率又比较低。那么,有没有什么办法可以将这些机械的工作做得自动化一点,机器能够帮我们设计一些测试用例呢?符号执行就是一种可用的利器。什么是符号执行为原创 2020-10-14 20:39:51 · 2077 阅读 · 0 评论 -
操作系统形式化验证实践教程(12) - 经典命题逻辑与公式查错方法
操作系统形式化验证实践教程(12) - 经典命题逻辑与公式查错方法第10节我们介绍了直觉一阶逻辑,它是不接受排中律的逻辑。在编程体感上,直觉一阶逻辑IFOL库,不支持auto,不支持sledgehammer,不能使用try0与try,基本上可以使用的就是simp或者手动推理。经典命题逻辑我们使用经典一阶逻辑库FOL,它是继承自IFOL的。经典一阶逻辑库FOL现在我们换成经典一阶逻辑的FOL库,现在可以使用auto了,我们看个例子:theory fol2 imports FOLbeginle原创 2020-09-01 21:15:12 · 770 阅读 · 4 评论 -
操作系统形式化验证实践教程(11) - 结构化证明语言Isar
操作系统形式化验证实践教程(11) - 结构化证明语言Isar结构化证明语言Isar基本语法apply方法和by方法虽然可以完成功能,但是看起来更像是命令式语言。使用Isar语言,还可以写得更加形式化一点。Isar的格式看起来像这样:proof assume "公式1" from “公式1" have "公式2" by 方法 ... from "公式n" show "结论" by 方法qed虽然换了种写法,但是其实核心内容并没有变。直接proof指定方法最简单的写法,就是把原创 2020-08-31 20:21:07 · 738 阅读 · 0 评论 -
操作系统形式化验证实践教程(10) - 一阶直觉逻辑
操作系统形式化验证实践教程(10) - 一阶直觉逻辑前面我们用了九讲的篇幅把seL4验证操作系统的地图给大家迅速过了一遍,基础好的同学已经可以基于前面的知识开始自己的工作了。对于只学过离散数学,而没学过专门数理逻辑的同学,我们稍微补充一点相关的知识。我们在Isabelle中使用的一阶逻辑主要是直觉主义的一阶逻辑,当然我们也支持经典逻辑。直觉主义逻辑直觉主义逻辑intuitionistic logic的主要特点是不接受排中律,即要么命题为真或者为假。也就是说,经典一阶逻辑的定理:“P ∨ ¬P”,原创 2020-08-25 22:12:45 · 876 阅读 · 0 评论 -
操作系统形式化验证实践教程(9) - 规范与证明概述
操作系统形式化验证实践教程(9) - 规范与证明概述规范与证明的主线前面铺垫了这么多,下面我们看一下seL4形式化验证的大图:seL4的证明部分主要分为两大部分:规范部分,对应spec目录;证明部分,对应proof目录。规范分为4种:设计规范:就是从上节所见的haskell代码转换成的,可以运行的对操作系统的建模规范,对应目标ExecSpec抽象规范:是基于硬件规范和设计规范的抽象,对应目标ASpeccapDL规范:capDL是用于运行时建模的语言,用于系统初始化等动态过程的建模,对应目标原创 2020-08-20 18:00:57 · 1081 阅读 · 0 评论 -
操作系统形式化验证实践教程(8) - 用Haskell做系统建模
操作系统形式化验证实践教程(8) - 用Haskell做系统建模到上节为止,我们验证的虽然已经是C语言源代码了,但是跟操作系统的关系还基本没有。从这一节开始,我们开始进入操作系统的部分。操作系统涉及到硬件,也涉及到整体的功能的设计。这部分在seL4中是使用Haskell语言实现的。作为本系列教程的配套,我们有《Haskell快餐教程》,请没有haskell语言基础的同学先移步学习第一节,然后我们回来看Haskell代码。另外说一句,我们也有《Standard ML快餐教程》来介绍Standard ML原创 2020-08-17 18:37:21 · 1092 阅读 · 1 评论 -
操作系统形式化验证实践教程(7) - C代码的自动验证
操作系统形式化验证实践教程(7) - C代码的自动验证上一节教程不知道大家看晕了没有,其实虽然细节很多还没有讲清楚,但是从结构上大家可以看到,其实是很模式化的工作。那么能不能让这个模式化的工作自动化起来,也能降低一点入门的学习门槛?这时就该AutoCorres工具出马了。AutoCorres既然回到人间,不用再看着一排的simp, vcg之类的,咱们的难度又回到第一讲加减法的时代。先实现一个C语言实现加法的函数:unsigned int plus(unsigned int a, unsigned原创 2020-08-11 20:00:35 · 1226 阅读 · 0 评论 -
操作系统形式化验证实践教程(6) - 解析C源代码
操作系统形式化验证实践教程(6) - 解析C源代码从这一讲我们跨出了Isabelle/HOL的领域,开始进入操作系统的领域。目前的操作系统主要是由C语言和汇编语言写成的,所以我们的第一步先从解析C语言代码开始。构造C解析器我们需要一个能够解析C源代码,并且能在HOL操作C源代码的工具。seL4为我们提供了c-parser.我们首先进入l4v/tools/c-parser目录,接着构造c-parser-deps:make c-parser-deps依赖构建好之后,我们就构建c-parser,并原创 2020-08-11 15:48:06 · 1564 阅读 · 5 评论 -
操作系统形式化验证实践教程(5) - 搭建seL4环境
操作系统形式化验证实践教程(5) - 搭建seL4环境尽管我们有太多的基础知识都还没有讲,我们还是要快速进入到验证操作系统的世界中。先知道有什么用,然后再学习,可能是一种比较高效的方法。搭建seL4验证环境关于seL4有多牛,我们就不多介绍了,等我们了解了足够多的细节,回头再看,可能有更加鲜活的印象。基本上,seL4是第一个被完整形式化验证的有商用的操作系统。架构图我们也后面再讲,先搞工程化,搭环境。下载源代码验证seL4需要三部分, seL4源代码,l4v检验脚本代码,以及isabelle。原创 2020-08-07 14:12:03 · 2244 阅读 · 1 评论 -
操作系统形式化验证实践教程(4) - 工具环境
操作系统形式化验证实践教程(4) - 工具环境如前面我们所了解的,Isabelle/HOL是套相当复杂的系统,它的底层基于Standard ML语言,它自己使用HOL和Isar语言,它可以生成ocaml,haskell和scala的代码,它有要使用到很多的自动定理证明工具。除了相当强大的IDE环境,Isabelle也提供了命令行工具和大量的配置。Isabelle环境可以通过isabelle getenv -a命令获取Isabelle的详细配置信息:我们分类列举一些常见的配置项,通过这些大家可以理解原创 2020-08-06 13:54:28 · 2017 阅读 · 0 评论 -
操作系统形式化验证实践教程(3) - 自动证明工具
操作系统形式化验证实践教程(3) - 自动证明工具归纳推理的推广在第一节,我们学习了自然性的归纳法推理。大家都学过数学归纳法,对此应该或清晰或模糊有个概念。其实,大家打破思维限制,归纳推理其实可以应用在更广阔的领域。比如,我们想一想,基于第二节所讲的列表,有哪些定理可以通过归纳法证明?我们举个例子,大家有没有想到,如何证明:将一个列表反转两次,所得的列表与原列表是相等的?我们来试着用之前的apply(induction)和apply(auto)的方法证明一下:lemma "rev (rev x原创 2020-08-05 15:14:26 · 1386 阅读 · 0 评论 -
操作系统形式化验证实践教程(2) - HOL列表与集合
操作系统形式化验证实践教程(2) - HOL列表与集合在进入相对比较烧脑的证明过程之前,我们先熟悉下HOL语言中处理列表和集合数据结构的部分。这部分各种函数式语言其实是大同小异的,学习成本比较低。列表类型HOL的列表类型与别的语言比较像,也是使用[]来表示。类型只要相同就可以,比如我们以整数类型列表为例:value "[uminus int(1),int(0),int(1)]"值和类型如下:"[- 1, 0, 1]" :: "int list"[]是Nil,是空列表。除了用[int原创 2020-08-04 18:09:27 · 1063 阅读 · 0 评论 -
操作系统形式化验证实践教程(1) - 证明第一个定理
操作系统形式化验证实践教程(1) - 证明第一个定理形式化方法分为三个主要部分:系统建模(System Modeling)、形式规约(Formal Specification)和形式化验证(Formal Verification)。其中系统建模用形式化的模型来描述系统及其行为模式。建模完成后,需要用形式规约来精确描述建模出来的需求。有了规约,如何检验是否符合规约呢?这就需要形式化验证方法。形式化验证方法主要分为两类:一类是以穷尽搜索为基础的模型检测,另一类是以逻辑推理为基础的演绎逻辑。相对于前者,后者原创 2020-08-04 11:46:46 · 6282 阅读 · 6 评论