高完整性系统工程(四):Formal Verification and Validation

news2024/11/16 8:57:01

目录

1. Specification Process

1.1 State Invariants

1.2 Exceptional Behaviour

1.3 Framing

1.4 Summary

2. V&V FOR SPECS

2.1 V&V for formal specs

2.2 Proof

2.3 Proof Assistants

2.4 Model Checking


1. Specification Process

Specification Process关注如何编写用于描述系统状态的断言和谓词。

1.1 State Invariants

这部分主要解释了状态机(State Machine)和状态断言的概念。这里的状态(State)指的是系统在给定时间点的状态。每一个操作都可能导致系统状态的改变。我们通常用一种称为断言(assertion)的方式来验证状态的性质。

例如,一个状态机可以用如下的方式进行描述:S0 (Init) --Opi-> S1 --Opj-> S2 ... --Opk-> Sn,其中S0, S1, S2...Sn代表不同的状态,Opi, Opj, Opk等代表可能的操作。

其中的Inv[s]是一个谓词(predicate),它用于描述系统状态s是否满足某种性质。验证Inv[s]是否对所有状态s都成立,可以通过以下两个断言:

assert invInit { all s : State | Init[s] => Inv[s] }
assert invOpi { always all s : State | Inv[s] and Opi[s] => after Inv[s] }

其中invInit确保所有初始状态都满足Inv[s]invOpi确保在执行操作Opi后,新的状态依然满足Inv[s]。这里的"always"和"after"关键词分别表示所有状态和操作后的状态。

1.2 Exceptional Behaviour

Distinguishing normal and exceptional behaviour in models

//Add a password for a *new* user/url pair
pred addNormal [pb : PassBook, url : URL, user : Username, 
			   pwd: Password, report : one Report] {
	addPre [pb, url, user]
	addPost [pb, url, user, pwd]
	report in Success
}

//Fail to add a password that already exists
pred addExceptional [pb : PassBook, url : URL, user : Username,
				report : one Report] {
	not addPre [pb, url, user]
	pb.password' = pb.password
	report in Failed
}

//Add a password for a *new* user/ url, otherwise, add nothing 
pred add [pb : PassBook, url : URL, user: Username, pwd: Password,
		report :one Report]s
	addNormal [pb, url, user, pwd, report]
	 or
	addExceptional [pb, url, user, report]
}

The point is to constrain what the system is meant to do in exceptional cases

//Fail to add a password that already exists
pred addExceptional [pb : PassBook, url : URL, user : Username,
				report : one Report] {
	not addPre [pb, url, user]
	pb.password' = pb.password
	report in Failed
}

Model it separately from normal behaviour
Where does it come from?
e.g. Hazard Analysis (HAZOP) etc

这部分讲述了正常和异常行为的区分以及如何在模型中描述这两种行为。

对于每个操作,我们都需要描述其正常情况下的预期行为以及异常情况下的行为。例如,在以下的密码添加示例中,addNormal定义了正常情况下的预期行为,而addExceptional定义了异常情况下的行为。

异常行为的来源可以通过危害分析(Hazard Analysis,如HAZOP)等方法进行识别。

1.3 Framing

这部分主要讨论了命题(predicate)的范围问题。

例如,在以下两个addExceptional的定义中,第二个版本去掉了pb.password' = pb.password这一句,因此在后续状态中,pb.password的值可以是任何值,这使得异常行为可以是任意的。

How are these two predicates different?

//Fail to add a password that already exists
pred addExceptional [pb : PassBook, url : URL, user : Username,
				report : one Report] {
	not addPre [pb, url, user]
	pb.password' = pb.password
	report in Failed
}


//Fail to add a password that already exists
pred addExceptional [pb : PassBook, url : URL, user : Username,
				report : one Report] {
	not addPre [pb, url, user]
	//pb.password' = pb.password
	report in Failed
}

Second allows pb.password in the post-state to be anything, and so allows add’s exceptional behaviour to be arbitrary

What does this spec say?

Imagine that Objs have two variable fields, x and y

Allows the y field to change arbitrarily. It should be:

另外一个例子展示了如何通过限制字段的变化来约束系统的行为。例如,addToX的第一个版本只限制了x字段的变化,而y字段可以随意变化。然而在第二个版本中,我们增加了o.y’ = o.y以确保y字段在执行addToX操作时保持不变。

1.4 Summary

  • State: 在理解状态机的时候,重要的是要知道状态和转换。状态表示系统的某一特定情况,而转换则表示从一个状态到另一个状态的动作或条件。在软件工程中,状态机经常用于建模系统的行为。

  • Exceptional Behaviour: 异常行为通常指系统的非正常或错误行为。在设计系统时,特别是关键系统(如医疗或航空系统),处理异常行为是非常重要的。如果未能妥善处理,异常行为可能会导致系统故障或更严重的后果。

  • Framing: Framing是指在进行操作时,明确指定哪些变量或属性应该发生变化,哪些应该保持不变。这是一个重要的概念,因为如果不进行framing,系统的行为可能会超出预期。在某些情况下,我们希望某些属性在执行操作时保持不变,这就需要使用framing来明确指定。

2. V&V FOR SPECS

2.1 V&V for formal specs

V&V代表验证与确认,是一个对系统或产品进行评估,确保其满足特定需求、功能和性能的过程。在我们的规格中,我们使用各种方法进行V&V,包括动画、模型检查、实现与测试、审查与检查、以及证明。

  1. Animation & Model Checking (以Alloy为例)
  • 动画(如Alloy的run命令):Alloy是一个轻量级的形式方法工具,能用于创建和分析模型。动画就是通过命令将模型实例化并进行模拟,让开发者可以看到模型的运行情况,对模型进行验证。

  • 模型检查(如Alloy的check命令):模型检查是一种自动化的技术,可以全面地检查一个系统的所有可能状态是否满足某个特性。在Alloy中,check命令用于验证一个模型是否满足一个或多个断言。

2.2 Proof

  • 证明是一个重要的V&V方法。幻灯片中的例子展示了如何使用证明来验证add操作。这个操作有两种情况,addNormaladdExceptional,对应着添加密码的正常和异常情况。

  • 对每一种情况,都需要证明在执行add操作后,系统的状态依然满足某种属性(即Inv[pb])。这个证明过程被分解成了几个步骤,包括原始情况(Case 1)和变化情况(Case 2)。

  • 幻灯片中使用的是一种称为Hoare逻辑的方法,其中的assert语句形式为{P}C{Q},其中P是程序C执行前的条件,Q是程序C执行后的条件。这种方法用于证明在满足某些条件的情况下,程序的执行会导致另一些条件的满足。

add[pb, user, url, pwd, res] =
    addNormal[pb, user, url, pwd, res] or
    addExceptional[pb, user, url, res]

在这里,我们有一个add函数,这个函数接收五个参数:pb(密码本),user(用户),url(地址),pwd(密码)和res(结果)。这个函数定义为addNormaladdExceptional两个函数的并集。也就是说,add函数要么按照正常情况添加密码(即addNormal),要么按照异常情况添加密码(即addExceptional)。

Invariants and Operation

all pb, user, url, pwd, res |
Inv[pb] and add[pb,user,url,pwd,res] =>
after Inv[pb]

这是一个表达式,表示的是对于所有的密码本(pb),用户(user),地址(url),密码(pwd)和结果(res)的组合,如果满足初始状态Inv[pb]并且执行了add操作,那么就会满足结束状态after Inv[pb]。这就是形式化验证中常见的前置条件和后置条件的写法。

在这一部分,我们看到两种添加密码的情况,addNormaladdExceptional。我们要对这两种情况进行分别考虑。

Case 1中,我们看到addNormal函数的定义和行为。

Case 1
addNormal[pb, user, url pwd, res] =
 no pb.password[user][url]
 pb.password’ = pb.password + (user->url->pwd)
 res in Success

all pb, user, url, pwd, res |
 Inv[pb] and addNormal[pb, user, url, pwd, res]) =>
after Inv[pb]

这表明,在正常添加情况下,首先确认密码本中没有该用户在此地址的密码(no pb.password[user][url])。然后,我们将新的密码添加到密码本中(pb.password’ = pb.password + (user->url->pwd)),并返回成功结果。

随后,我们有一系列的表达式,来证明如果在满足初始状态Inv[pb]并执行了addNormal操作后,我们依然满足after Inv[pb]

Case 1

addNormal[pb, user, url pwd, res] =
 no pb.password[user][url]
 pb.password’ = pb.password + (user->url->pwd)
 res in Success

all pb, user, url, pwd, res |
 Inv[pb] and no pb.password[user][url] and
 pb.password’ = pb.password + (user->url->pwd) =>
after Inv[pb]
Case 1

Inv[pb] = all user, url | lone pb.password[user][url]

all pb, user, url, pwd, res |
 Inv[pb] and no pb.password[user][url] and
 pb.password’ = pb.password + (user->url->pwd) =>
after Inv[pb]
Case 1

Two cases to consider: user2, url2 are user, url or not

all pb, user, url, pwd, res |
 (all user1, url1 | lone pb.password[user1][url1]) and
 no pb.password[user][url] and
 pb.password’ = pb.password + (user->url->pwd) =>
(all user2, url2 | lone pb.password’[user2][url2])

Case 1.1Case 1.2中,我们进一步考虑了用户和地址是否在密码本中的两种情况。

Case 1.1

user2, url2 are user, url

all pb, user, url, pwd, res |
 (all user1, url1 | lone pb.password[user1][url1]) and
 no pb.password[user][url] and
 pb.password’ = pb.password + (user->url->pwd) =>
(lone pb.password’[user][url])
Case 1.2

user2, url2 are not user, url

all pb, user, url, pwd, res |
 (all user1, url1 | lone pb.password[user1][url1]) and
 no pb.password[user][url] and
 pb.password’ = pb.password + (user->url->pwd) =>
(all user2, url2 | lone pb.password’[user2][url2])

Case 2中,我们看到了一个与Case 1类似的情况,但这次是对addExceptional函数的处理。也就是说,在异常情况下,我们也要保证如果在满足初始状态Inv[pb]并执行了addExceptional操作后,我们依然满足after Inv[pb]

Case 2

Similar.

all pb, user, url, pwd, res |
 Inv[pb] and addExceptional[pb, user, url, pwd, res]) =>
after Inv[pb]

2.3 Proof Assistants

  • 证明助手是一种工具,可以帮助自动化证明过程。例如,Isabelle,Coq,HOL4等是一些著名的定理证明工具,它们可以帮助程序员更高效地完成证明任务。

  • 另外,还有一些自动化的证明工具,如SAT和SMT求解器,例如MiniSAT和Z3。这些工具可以自动地找到满足某些条件的解,或者证明这样的解不存在。

2.4 Model Checking

  • 模型检查是另一种V&V方法,用于自动检查系统的所有状态是否满足某种属性。当检查失败时,模型检查工具可以给出一个反例,即一个使得属性不成立的状态。

  • 模型检查在硬件验证和安全协议验证等领域有很多成功的应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/594788.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1128 N Queens Puzzle(21行代码)

分数 20 全屏浏览题目 切换布局 作者 CHEN, Yue 单位 浙江大学 The "eight queens puzzle" is the problem of placing eight chess queens on an 88 chessboard so that no two queens threaten each other. Thus, a solution requires that no two queens sha…

QTranslator Class

QTranslator Class QTranslator 类公共成员函数类说明查找翻译使用多种翻译成员函数使用说明 QTranslator 类 QTranslator类为文本输出提供国际化支持。多国语言 Header: #include <QTranslator> qmake: QT core Inherits: QObject公共成员函数 构造函数QTranslator(…

代码随想录算法训练营15期 Day 7 | 454.四数相加II 、 383. 赎金信 、15. 三数之和 、18. 四数之和

昨天看了一下别的东西&#xff0c;导致昨天没有练习打卡&#xff0c;今天补上昨天的学习知识。 454.四数相加II 建议&#xff1a;本题是 使用map 巧妙解决的问题&#xff0c;好好体会一下 哈希法 如何提高程序执行效率&#xff0c;降低时间复杂度&#xff0c;当然使用哈希法 会…

AURIX TC3XX Cached PFLASH与Non-Cached PFLASH的区别

Cached ? Non-Cached&#xff1f; 在阅读TC3XX的用户手册时&#xff0c;在内存映射表中&#xff0c;有两个segment都是Program Flash&#xff0c;而且大小都一样是3M&#xff0c;一个是segment 8 另一个是segment10 这难免让人产生疑惑&#xff0c;二者区别在哪&#xff1f; …

高程实验 二分算法

学校的ppt把相等也考虑到大于上面去了&#xff0c;所以是错误的 1. (程序题) 有n(1<n<1000005)个整数&#xff0c;已经按照从小到大顺序排列好&#xff0c;现在另外给一个整数x&#xff0c;请找出序列中第1个大于x的数的下标&#xff01; 输入&#xff1a; 输入数据包含多…

4. 垃圾收集器ParNewCMS底层三色标记算法详解

JVM性能调优 1. 垃圾收集算法1.1 分代收集理论1.2 标记-复制算法1.3 标记-清除算法1.4 标记-整理算法 2. 垃圾收集器2.1 Serial收集器(-XX:UseSerialGC -XX:UseSerialOldGC)2.2 Parallel Scavenge收集器(-XX:UseParallelGC(年轻代)&#xff0c;-XX:UseParallelOldGC(老年代))2.…

浅谈MySQL主键

常用主键 常用主键 1&#xff09;自增 int、bigint等&#xff0c;顺序递增。 2&#xff09;雪花 雪花算法是因为有时间参数&#xff0c;所以是有序地&#xff0c;而且都是由数字组成。雪花id最大为64位,符合java中long的长度64位&#xff0c;适用于大规模分布式场景。 3&#…

docker基础操作与进阶 - 搭建基于pm2的node环境

1、为什么要使用docker 最近遇到一台机器需要部署两个不同版本node的情况&#xff0c;首先就想起了docker&#xff0c;想必还有其他类似环境问题的情况&#xff0c;需要进行项目隔离&#xff0c;而docker正是用来解决这个问题的。 docker的优势就在于环境隔离&#xff0c;相当…

第九篇、基于Arduino uno,用LCD1602(带IIC的)显示屏显示字符——结果导向

0、结果 说明&#xff1a;可以在LCD1602屏幕上面显示字符&#xff0c;实时的变量&#xff0c;也可以设置是否背光&#xff0c;如果是你想要的&#xff0c;可以接着往下看。 1、外观 说明&#xff1a;注意是带IIC通讯的LCD屏幕&#xff0c;外形如下。 2、连线 说明&#xff…

Hexo写文章不方便?用上GitHub Actions真的是泰裤辣

对于做个人博客的小伙伴来说 HEXO 大家肯定都是非常熟悉的吧,这是一个静态的个人博客程序,通过 HEXO + GitHub Pages 搭建免费个人博客也是很多博主的选择。但相信肯定也会有些困恼,比如博客的渲染维护太麻烦了,我要在一台新设备上写博客并推送到 GitHub Pages 还要先安装 …

【Redis】聊一下哨兵集群

上一篇中&#xff0c;介绍了哨兵机制可以减少主库实例下线的误判率&#xff0c;但是如果只有一个哨兵实例&#xff0c;出现宕机后没有办法保证服务的高可用&#xff0c;所以一般实际的生产环境都是搭建3个哨兵实例构建的集群进行运行。但是具体的运行机制是什么。其实主要就是三…

使用langchain及llama_index实现基于文档(长文本)的相似查询与询问

文章目录 1. 引言2. 简介3. 带关键字的查询方案4. 不带关键字的总结询问5. 实现代码 1. 引言 在调用ChatGPT接口时&#xff0c;我们常常受到4096个字符&#xff08;token&#xff09;的限制。这种限制对于处理长文本或者需要对文档进行相似查询和询问的场景来说是一个挑战。然…

如何复制投票链接投票怎样链接到公众号投票链接如何生成

关于微信投票&#xff0c;我们现在用的最多的就是小程序投票&#xff0c;今天的网络投票&#xff0c;在这里会教大家如何用“活动星投票”小程序来进行投票。 我们现在要以“妙趣拾光”为主题进行一次投票活动&#xff0c;我们可以在在微信小程序搜索&#xff0c;“活动星投票”…

【Python开发】FastAPI 03:请求参数—请求体

除了路径参数和查询参数&#xff0c;还有请求体&#xff0c;其用于传递 JSON、XML 或其他格式的数据&#xff0c;以便服务器能够读取并做出相应的处理&#xff0c;可以说请求体的作用更为强大。试想一下&#xff0c;如果存在七八个参数&#xff0c;路径参数和查询是不是就招架不…

Camera | 10.linux驱动 led架构-基于rk3568

前面文章我们简单给大家介绍了如何移植闪光灯芯片sgm3141&#xff0c;该驱动依赖了led子系统和v4l2子系统。 V4L2可以参考前面camera系列文章&#xff0c;本文主要讲述led子系统。 一、LED子系统框架 Linux内核的 led 子系统主要功能&#xff1a; 为每个设备在/sys/class/le…

《Linux内核源码分析》(2)进程原理及系统调用

《Linux内核源码分析》(2)进程原理及系统调用 一、进程 操作系统的作用&#xff1a;作为硬件的使用层&#xff0c;提供使用硬件资源的能力&#xff0c; 进程的作用&#xff1a;作为操作系统使用层&#xff0c;提供使用操作系统抽象出的资源层的能力 进程、线程和程序的区别&…

【计算机视觉】Segment Anything 安装配置及代码测试(含源代码)

文章目录 一、前言二、安装2.1 基本要求2.2 Install Segment Anything 三、代码使用示例3.1 Automatically generating object masks with SAM3.2 Environment Set-up3.3 显示标注3.4 图像示例3.5 Automatic mask generation3.6 Automatic mask generation options 一、前言 目…

客户体验:响应速度是他们的 No.1 Pick么?

服务响应速度在为消费者提供服务时极为重要&#xff0c;那么&#xff0c;在消费者整体体验中&#xff0c;响应速度是否是消费者最在意的呢&#xff1f; 无论是对企业还是消费者来说&#xff0c;时间都至关重要。消费者在寻求客户服务时&#xff0c;不喜欢等待。根据《客户服务受…

【Python asyncio】零基础也能轻松掌握的学习路线与参考资料

Python asyncio是一个强大而易于使用的库&#xff0c;让Python程序员能够编写高效的异步IO应用程序。它为程序员提供了一种简单而优雅的方法来避免使用 Python GIL&#xff08;全局解释器锁&#xff09;&#xff0c;同时允许他们轻松地处理高并发的网络通信和并发任务执行。下面…

蓝桥杯数论总结:快速幂和矩阵快速幂

本文先是给出快速幂的原理&#xff0c;又由一道例题明确快速幂的Python代码模版&#xff1b;而后给出矩阵快速幂的原理&#xff08;介绍了矩阵相乘&#xff0c;对没学过线代者友好&#xff09;&#xff0c;和矩阵快速幂的模版。再给出快速幂和矩阵快速幂相关的题单。 目录 快…