形式化验证笔记

2023-10-20 05:44
文章标签 笔记 验证 形式化

本文主要是介绍形式化验证笔记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

参考视频:

  • 形式化验证的原理与新应用
  • 【DatenLord达坦科技】形式化验证入门(我强推!!!!!)

形式化验证:在状态机表征的空间里面进行搜索,验证某个模型是否按规范执行且测试覆盖率达到100%
方法:将规范(可选)和代码变为数学公式,再将公式放入定理证明器
在这里插入图片描述
例子
在这里插入图片描述
第一种作用:生成测试用例
在这里插入图片描述
第二种作用:验证程序是否符合规范
第一步:把控制流程图转成表达式
在这里插入图片描述
第二步:将规范加入表达式
但是该做法会导致只能找到正确值而不是违反规范的路径,所以要将规范取非,以匹配违反规范的情况
在这里插入图片描述
进一步,因为一般程序很复杂,所以是用验证器,让计算机进行计算
在这里插入图片描述
上述只能进行当前场景一次的验证,于是为了考虑时间属性,引入了LTL
比如要限制一个计数器永远小于10,下面的程序确实可以限制单次不会增加超过10,但是多次之后cnt就会超过10
所以我们就要引入G、U、F、X这种时态

int cnt = 0;
void add(num){if(num>=10)报错;else cnt+=num;
}

在这里插入图片描述

模糊测试TODO

在这里插入图片描述
在这里插入图片描述

结合LLM

通过LLM,使用自然语言生成规范
在这里插入图片描述

LTL

LTL主要研究的是trace,每个状态其实就是第一个label的变换
在这里插入图片描述
注意 a b c ∗ abc^* abc的星号表示未知的有限次数, a b c ω abc^\omega abcω的w表示未知的无限次数

LTS的乘积

label transition system
就是两个状态机的乘积
即两边的状态做笛卡尔积
转换关系、原子命题、标签函数取并集

将待检测代码和要检查的属性(注意规范就是定义要满足的属性),两个状态机乘起来
比如把车行灯和人行灯进行乘起来

可以看到2*3=6
在这个状态机里找有没有期待的非法状态出现
然后因为出现了{g,w},即车绿灯时,人穿过马路
在这里插入图片描述

LTP

线性时间属性
形式化方法与数理逻辑不一样的点
即形式化方法引入了时间(离散的)概念
形式化方法因为有无限时间,所以会展开成很大的路径空间
在这里插入图片描述
我们要做的就是找到一条路径,满足我们定义的属性要求(一般就是找非法路径,没有说明程序合理)
在这里插入图片描述

安全性&不变性(safety & invariant)

永远不会发生坏的事情
某些属性应适用于所有可访问状态

所以就是在有限字上找一个坏前缀(有限步骤上会不会有坏状态,如果当前已经坏了,那么后面肯定就不能走了)

活性(liveness)

好事最终会发生(test case不能做到,因为测试时长是有限的)
所以是形式化验证强大的地方

通过一个有环的有限状态自动机表示一个无限序列
所以就是检查环上是否最终会出现这个好事

有几种,比如最终发生一次,会发生多次最终发生一次,每次等待了就一定能发生

LTL

注意LTL定义上只有U和F,但是衍生出了
G的意思是每一跳都要满足
F的意思是最终某一跳会满足
还有O表示下一跳
F( ϕ \phi ϕ) := True U ϕ \phi ϕ
G( ϕ \phi ϕ) := !(F(! ϕ \phi ϕ))
在这里插入图片描述
应用:

  • 安全性:线程P1和P2不会同时进入临界区: G ( ! ( c r i t 1 & c r i t 2 ) ) G(!(crit_1 \& crit_2)) G(!(crit1&crit2))
  • 活性:两个线程最终都能进入临界区,不会饥饿: ( G ( F ( c r i t 1 ) ) & G ( F ( c r i t 2 ) ) ) (G(F(crit_1))\&G(F(crit_2))) (G(F(crit1))&G(F(crit2)))
  • 强活性:只要等待了就最终能进去:
    在这里插入图片描述

例子:下图表示

  • 外面包着G,表示每一跳都保持这个属性
  • 先红灯,然后红灯亮一会,最终变黄灯
  • 黄灯也亮一会,最终变绿灯
    在这里插入图片描述

CTL

computing tree logic
计算树逻辑比LTL多了全称和存在量词,是对全局来看的
LTL就是不能表达存在某条路径,他默认带的是全称量词

将需求规范形式化

在这里插入图片描述

工程实践

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

TLA+

两种代码编写方式:TLA+和PlusCal
用状态机描述代码,有穷尽的状态

demo

在这里插入图片描述
进一步改进
在这里插入图片描述
把or再改下
在这里插入图片描述
TLA真实代码
在这里插入图片描述
在这里插入图片描述

这篇关于形式化验证笔记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/245079

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

数学建模笔记—— 非线性规划

数学建模笔记—— 非线性规划 非线性规划1. 模型原理1.1 非线性规划的标准型1.2 非线性规划求解的Matlab函数 2. 典型例题3. matlab代码求解3.1 例1 一个简单示例3.2 例2 选址问题1. 第一问 线性规划2. 第二问 非线性规划 非线性规划 非线性规划是一种求解目标函数或约束条件中有一个或几个非线性函数的最优化问题的方法。运筹学的一个重要分支。2

【C++学习笔记 20】C++中的智能指针

智能指针的功能 在上一篇笔记提到了在栈和堆上创建变量的区别,使用new关键字创建变量时,需要搭配delete关键字销毁变量。而智能指针的作用就是调用new分配内存时,不必自己去调用delete,甚至不用调用new。 智能指针实际上就是对原始指针的包装。 unique_ptr 最简单的智能指针,是一种作用域指针,意思是当指针超出该作用域时,会自动调用delete。它名为unique的原因是这个

easyui同时验证账户格式和ajax是否存在

accountName: {validator: function (value, param) {if (!/^[a-zA-Z][a-zA-Z0-9_]{3,15}$/i.test(value)) {$.fn.validatebox.defaults.rules.accountName.message = '账户名称不合法(字母开头,允许4-16字节,允许字母数字下划线)';return fal

easyui 验证下拉菜单select

validatebox.js中添加以下方法: selectRequired: {validator: function (value) {if (value == "" || value.indexOf('请选择') >= 0 || value.indexOf('全部') >= 0) {return false;}else {return true;}},message: '该下拉框为必选项'}