我觉得GPT老师的语言功底比大多数的博客主要好(包括我自己),阅读起来更易理解,而且哪里不明白还可以直接问gpt老师,孜孜不倦,尽心尽责,全天待命,究极贴心。有这么厉害的一个老师,不学习简直暴殄天物。
于是乎我准备立一个flag,挑战跟着GPT老师学习365天,每天我都会整理自己的学习心得和脉络(文字大部分都是GPT直接生成的,我觉得比我自己写肯定好多了)感谢gpt老师!跪谢
运行时验证
1. 软件开发过程(Software Development Process)
需求捕获和分析(Requirements Capture and Analysis)
- 过程描述:需求捕获和分析是软件开发的初始阶段,目标是理解和定义系统的功能和非功能需求。这一过程包括将非正式的需求逐步转换为正式的规格说明,并确定应用特定的属性。
- 关键活动:
- 从非正式到正式的转换(Informal to formal)
- 确定应用特定的属性(Application-specific properties)
- 使用的语言:计算树逻辑(CTL, Computational Tree Logic)
设计规格和分析(Design Specifications and Analysis)
- 过程描述:设计规格和分析阶段旨在创建系统的详细设计模型,并使用各种分析技术验证设计的正确性。
- 关键活动:
- 使用正式建模记号(Formal modeling notations)
- 应用分析技术(Analysis techniques)
- 使用的建模语言:CCS,CSP,Kripke
- 验证技术:模型检查(Model Checking)
实现(Implementation)
- 过程描述:实现阶段将设计转化为实际的代码,可以通过手动或自动化工具生成,并进行代码的验证和测试。
- 关键活动:
- 手动/自动代码生成(Manual/automatic code generation)
- 代码验证(Validation)
- 使用的编程语言:Java, C, C++等
- 验证技术:测试生成(Test Generation),运行时验证(Runtime Verification)
2. 动机(Motivation)
- 当前验证技术的局限性:
- 模型检查(Model Checking):尽管模型检查在提供设计保证方面非常有效,但它在处理大型系统时面临扩展性问题。
- 测试(Testing):测试可以直接验证实现,但通常是不完整的,不能提供全系统的保证。
3. 模型检查(Model Checking)
优点(Pro)
- 形式化(Formal):使用严格的数学方法验证系统。
- 完整性(Complete):提供系统设计阶段的完整性保证。
缺点(Con)
- 扩展性差(Doesn’t scale well):在大型系统中应用效果不佳。
- 仅检查设计(Checks design, not implementation):主要集中在设计阶段,而不是实际实现。
4. 测试(Testing)
优点(Pro)
- 良好的扩展性(Scales well):适用于大规模系统。
- 直接测试实现(Tests an implementation directly):对实际代码进行测试。
缺点(Con)
- 非形式化(Informal):测试通常不是基于严格的数学模型。
- 不完整(Incomplete):不能提供全系统的保证。
5. 运行时验证(Runtime Verification)
验证过程(Verification Process)
- 指定正式需求(Specify formal requirements):定义系统需要满足的正式需求。
- 提取执行信息(Extract information from current executing program):从正在执行的程序中提取必要的信息。
- 检查执行(Check the execution against formal requirements):将提取的信息与正式需求进行比较,检查系统是否满足需求。
运行时验证流程图(Runtime Verification Flowchart)
- 程序(Program):执行并生成信息。
- 验证器(Verifier):检查执行信息,判断系统是否满足需求。
- 用户(User):根据验证结果(满足/不满足)进行调整和反馈。

运行时验证特点(Runtime Verification Characteristics)
- 形式化(Formal):基于正式的验证方法。
- 实施阶段进行(Done at implementation):在系统实现阶段进行验证。
- 不完整(Not complete):只针对当前执行提供保证,而不是全系统的保证。
通过以上讲义内容,学生们可以深入了解软件开发过程中的不同验证技术,包括模型检查和测试的优缺点,以及运行时验证的工作原理和特点。希望这些内容能够帮助你在课堂上更好地理解和应用这些验证技术。
JPaX
📜 JPaX简介
JPaX 是一个设计用来监控和分析Java程序执行情况的工具。它有两个主要目的:
- 程序测试:在测试阶段获取关于程序执行的信息。
- 安全关键系统:在运行过程中实时监控安全关键系统。
🔍 JPaX的关键特性
-
执行检查:
- 在测试过程中,JPaX提供程序执行情况的洞察。
- 在运行过程中,它帮助监控安全关键系统。

-
事件提取:
- JPaX从执行中的程序中提取有趣的事件以供进一步分析。
-
事件检查:
- 使用基于逻辑的监控和错误模式分析。
- 特别检查:
- 死锁:当两个或更多进程因为互相等待资源而无法继续执行的情况。
- 数据竞争:多个线程同时访问和试图修改共享数据的情况。
🔄 JPaX验证器
JPaX验证器由三个主要模块组成:
-
插装模块(提取信息):
- 负责检查Java字节码。
- 根据插装规范在指定位置插入代码。
- 这个过程使得提取必要的信息以进行运行时验证成为可能。
-
互连模块:
- 作为插装模块和观察器模块之间的桥梁。
- 促进提取事件数据流向观察者。
-
观察者模块(检查):
- 包含用于检查不同类型错误的子组件,如死锁和数据竞争。
- 使用工具如Maude和线性时序逻辑(LTL)进行逻辑分析。

📊 详细组件
-
插装模块:
- 输入:Java字节码和插装规范。
- 过程:
- 检查字节码。
- 在指定点插入基于逻辑或错误模式分析的代码。
- 将提取的信息发送给观察者。
-
观察者模块:
- 组件:
- 分发器:将事件流路由到适当的检查器。
- 检查器:用于死锁、数据竞争等检查的模块。
- 工具:包括用于形式分析的Maude和用于时序逻辑验证的LTL。
- 组件:
JPaX的动机
当前技术的局限性:
-
模型检查:
- 有效但不适用于大规模系统。
- 集中于设计而非实现。
-
测试:
- 适用性广但不正式。
- 不完整,只提供部分系统保证。
🛠️ JPaX 插装和验证过程详解
📘 图片1:逻辑插装代码
原始代码:
class C {
int x;
main() {
x = -1;
x = -2;
x = 1;
x = -3;
}
}
插装后的代码:
class C {
int x;
main() {
x = -1;
send(x, -1);
x = -2;
send(x, -2);
x = 1;
send(x, 1);
x = -3;
send(x, -3);
}
}
说明:
- 插装过程通过向代码中插入监控代码来提取变量
x的变化信息。 - 插装规范中定义了监控对象
C.x,并检查命题A是否满足C.x > 0。 - 每次变量
x变化时,都会通过send(x, value)函数发送当前的值到观察者。
发送到观察者的信息:
[(x, -1), (x, -2), (x, 1), (x, -3)]
📘 图片2:不需要发送所有信息
优化后的插装代码:
class C {
int x;
main() {
x = -1;
eval(x, -1);
x = -2;
eval(x, -2);
x = 1;
eval(x, 1);
x = -3;
eval(x, -3);
}
}
说明:
- 通过使用
eval(x, value)函数,只发送命题A是否为真的信息,而不是所有变量变化信息。 - 观察者只会接收到命题
A的状态变化。
发送到观察者的信息:
[(A, false), A, A]
📘 图片3: eval(x, value) 函数解析
作用:
- 检查与变量
x相关的所有命题P。 - 评估命题
P的值(真或假)。 - 如果
P没有值,发送事件(P, P_val)到观察者。 - 否则,如果
P的值发生变化,发送P到观察者。
流程:
- 检查命题
P。 - 使用
x的当前值评估P。 - 根据
P的值是否变化决定是否发送信息。
📘 图片4:错误模式插装代码
说明:
- 代替向观察者发送命题,发送特定的错误事件。
- 事件包括:获取锁(死锁、数据竞争)、释放锁(死锁、数据竞争)、访问变量(数据竞争)。
错误事件:
- 获取锁时发送事件(检测死锁、数据竞争)。
- 释放锁时发送事件(检测死锁、数据竞争)。
- 访问变量时发送事件(检测数据竞争)。
JPaX的功能:
- 执行检查:在测试和运行过程中监控程序。
- 事件提取:从执行的程序中提取有趣的事件。
- 事件检查:使用逻辑监控和错误模式分析检查事件。
插装技术:
- 在代码中插入监控代码,提取和发送变量变化信息。
- 优化后通过
eval函数,只发送必要的状态变化信息。
错误模式分析:
- 通过监控锁的获取、释放和变量访问来检测死锁和数据竞争。
知识点:
- 逻辑插装:插入监控代码,提取并发送变量信息。
- 优化插装:只发送命题状态变化,减少不必要的信息传输。
- 错误模式插装:监控锁和变量的访问,检测潜在错误。
🔄 互联模块
功能:
- 从Java程序中提取信息并发送到观察者。
- 通过套接字、共享内存或文件传输提取的信息。
提取的信息:
- 事件流。
事件流(Trace):
- 事件流类似于Kripke结构,用于记录状态变化和事件。
Kripke结构示例:
- 状态节点:
N1, N2 - 转移:
T1, N2
事件流示例:
[A, false], A, A
📊 观察者模块
运行方式:
- 与Java程序并行运行,实时监控和分析程序执行情况。
组件:
- 基于逻辑的监控:
- 使用逻辑规则监控程序执行。
- 错误模式分析:
- 检测死锁和数据竞争。
工具:
- Maude:用于形式分析。
- LTL:线性时序逻辑,用于验证时序属性。
&spm=1001.2101.3001.5002&articleId=139775627&d=1&t=3&u=82c52b2beba84c80a0156f91628d6a90)
1522

被折叠的 条评论
为什么被折叠?



