跟着GPT学习——运行时验证(一)

我觉得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)

  1. 指定正式需求(Specify formal requirements):定义系统需要满足的正式需求。
  2. 提取执行信息(Extract information from current executing program):从正在执行的程序中提取必要的信息。
  3. 检查执行(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程序执行情况的工具。它有两个主要目的:

  1. 程序测试:在测试阶段获取关于程序执行的信息。
  2. 安全关键系统:在运行过程中实时监控安全关键系统。

🔍 JPaX的关键特性

  1. 执行检查

    • 在测试过程中,JPaX提供程序执行情况的洞察。
    • 在运行过程中,它帮助监控安全关键系统。
      在这里插入图片描述
  2. 事件提取

    • JPaX从执行中的程序中提取有趣的事件以供进一步分析。
  3. 事件检查

    • 使用基于逻辑的监控和错误模式分析。
    • 特别检查:
      • 死锁:当两个或更多进程因为互相等待资源而无法继续执行的情况。
      • 数据竞争:多个线程同时访问和试图修改共享数据的情况。

🔄 JPaX验证器

JPaX验证器由三个主要模块组成:

  1. 插装模块(提取信息)

    • 负责检查Java字节码。
    • 根据插装规范在指定位置插入代码。
    • 这个过程使得提取必要的信息以进行运行时验证成为可能。
  2. 互连模块

    • 作为插装模块和观察器模块之间的桥梁。
    • 促进提取事件数据流向观察者。
  3. 观察者模块(检查)

    • 包含用于检查不同类型错误的子组件,如死锁和数据竞争。
    • 使用工具如Maude和线性时序逻辑(LTL)进行逻辑分析。
      在这里插入图片描述

📊 详细组件

  1. 插装模块

    • 输入:Java字节码和插装规范。
    • 过程
      • 检查字节码。
      • 在指定点插入基于逻辑或错误模式分析的代码。
      • 将提取的信息发送给观察者。
  2. 观察者模块

    • 组件
      • 分发器:将事件流路由到适当的检查器。
      • 检查器:用于死锁、数据竞争等检查的模块。
      • 工具:包括用于形式分析的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 到观察者。

流程:

  1. 检查命题 P
  2. 使用 x 的当前值评估 P
  3. 根据 P 的值是否变化决定是否发送信息。

📘 图片4:错误模式插装代码

说明:

  • 代替向观察者发送命题,发送特定的错误事件。
  • 事件包括:获取锁(死锁、数据竞争)、释放锁(死锁、数据竞争)、访问变量(数据竞争)。

错误事件:

  • 获取锁时发送事件(检测死锁、数据竞争)。
  • 释放锁时发送事件(检测死锁、数据竞争)。
  • 访问变量时发送事件(检测数据竞争)。

JPaX的功能:

  • 执行检查:在测试和运行过程中监控程序。
  • 事件提取:从执行的程序中提取有趣的事件。
  • 事件检查:使用逻辑监控和错误模式分析检查事件。

插装技术:

  • 在代码中插入监控代码,提取和发送变量变化信息。
  • 优化后通过 eval 函数,只发送必要的状态变化信息。

错误模式分析:

  • 通过监控锁的获取、释放和变量访问来检测死锁和数据竞争。

知识点:

  1. 逻辑插装:插入监控代码,提取并发送变量信息。
  2. 优化插装:只发送命题状态变化,减少不必要的信息传输。
  3. 错误模式插装:监控锁和变量的访问,检测潜在错误。

🔄 互联模块

功能:

  • 从Java程序中提取信息并发送到观察者。
  • 通过套接字、共享内存或文件传输提取的信息。

提取的信息:

  • 事件流。

事件流(Trace):

  • 事件流类似于Kripke结构,用于记录状态变化和事件。

Kripke结构示例:

  • 状态节点:N1, N2
  • 转移:T1, N2

事件流示例:

[A, false], A, A

📊 观察者模块

运行方式:

  • 与Java程序并行运行,实时监控和分析程序执行情况。

组件:

  1. 基于逻辑的监控
    • 使用逻辑规则监控程序执行。
  2. 错误模式分析
    • 检测死锁和数据竞争。

工具:

  • Maude:用于形式分析。
  • LTL:线性时序逻辑,用于验证时序属性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值