• Proj THUDBFuzz Paper Reading: PMFuzz: Test Case Generation for Persistent Memory Programs


    github: https://github.com/Systems-ShiftLab/PMFuzz

    2. Background and Motivation

    2.1 Programming for PM Systems & 2.2 Nontrivial Bugs in PM Programming

    P1: PM(Persistent Memory)介绍,举例Intel-Optane
    强调特性:直接通过Memory总线来读写数据,无需软件中间层
    强调应用场景:数据库,kvstores
    对PM要求:数据能够在发生故障之后仍能恢复

    P2: PM编程难点:需要仔细管理读写来保证crash consistency
    难点例子:
    在presistent链表中添加一个新节点就需要该新节点是尾端指针的persistent prior
    难点在编程上带来的变化:

    1. 为了描述写入顺序(write order),硬件通常会提供writeback和fence 指令,例如CLWB和SFENCE
      此外,还有Intel's PMDK这种支持failure-atomic transaction的PM libraries
    2. coder必须明白自己调用的指令的crash consistency guarantees,并且需要据此设计failure-recovery mechanism。
      该难点带来的bug:
    3. crash consistency bug: 违反了crash consistency guarantee
    • 例如: 错误使用了PM原语或者库函数,该用CLWB或者SFENCE的地方没用,没有及时备份数据
    1. performance bug:
    • 在不必要的地方使用了PM crash consistency相关的功能,或者不必要的backups

    P3: 目前的工具:
    一般方法:跟踪low-level PM operations,检查是否违反了persistence和ordering guarantees
    局限:只能检查执行后的trace,不能检查没触发的
    例如:

    TX_ADD_FIELD() 宏将句柄 o 引用的对象的给定 FIELD 的当前值保存在撤消日志中。 然后应用程序可以自由地直接修改指定的 FIELD。 如果发生故障或中止,将恢复保存的值。
    https://www.mankier.com/3/pmemobj_tx_add_range

    在这个例子中,TX_ADD_FIELD让items[p]可变,但是实际上变的却是items[p-1],形成crash consistency。
    此外,两个函数中各log一次,形成performance bug
    此外,作者还认为条件语句if(!parent && node->n< BTREE_MIN)和 if(lsb && lsb->n > BTREE_MIN)都会导致这个trace不一定被触发

    本文的方式是优化test case generator

    2.3 Requirements for Fuzzing PM Programs

    P1: 介绍fuzzing基本原理

    P2: 例2

    例2是一个简化版的基于PMDK会话而构建的数据库逻辑流程。
    在这个例子中,如果在已经设置TX_ADD_FIELD(line 28)之后,执行D_RW(pm)->ptable[index]->tail->en=newEntry(val))(line 32)时出现故障,那么对应的位已经被标注,但是该数据域本身可能没有成功update,那么就会造成inconsistent。

    PM相关程序对test case提出的额外要求:

    1. PM Image as Input
    • 考虑到PM程序结束后,Persistent状态还会继续存在(一般是通过维护一个PM image),测试用例应当把PM state也考虑进去
    • 加载PM image这一行为本身也会导致crash consistency bugs
    • 挑战(传统fuzzers应对不了的)
      • PM image比较大,一般至少也有十几MB,传统fuzzer没法探索这么大的输入空间
      • 需要符合PM data layout
    1. Crash Image as Input
    • 本文认为PM programs应当能够从crash images中恢复
    1. Targeting PM Operations
    • test case需要集中测试与PM相关的机制

    3. High-level Design of PMFuzz

    1. 为了生成valid PM images,利用程序本身(不同的input commands会生成不同的PM images)生成PM images并记录下来
    2. 考虑到bug触发一般只因为几个key blocks,只生成会影响failure-recovery的控制流的crash images
    • 例如,在undo-logging行为中,程序一般要先备份旧数据,设置undo log位,进行in-placesupdate,然后取消undo log位,在故障发生后,程序一般会先检查the valid bit of undo log来确定是否consistent,对这一逻辑,我们只需要为undo log设为true和false就能测到全部逻辑路径
    1. 对接触PM的程序路径做targeted fuzzing,具体来说,监视PM相关path的统计信息,优先变异能够覆盖更多PM paths的test cases
  • 相关阅读:
    用 Java 通过串口发送手机短信(二)简单使用
    jquery.lazyload.js实现图片延迟加载——wordpress图片随滚动条渐显效果
    java的mysql连接池
    html5客户端本地存储之sessionStorage及storage事件
    flash chart(amCharts的破解)
    实现igoogle效果的两种方法比较
    “SQL Server (SQL2005) 服务因 126 (0x7E) 服务性错误而停止”的解决方法 
    一个超简单的方法验证文本框中内容的数据类型
    我的对联
    Ajax调用后类方法时报”对象未定义“错误解决方法
  • 原文地址:https://www.cnblogs.com/xuesu/p/15076661.html
Copyright © 2020-2023  润新知