LLFI使用步骤
Complie编译生成中间代码
将源文件进行编译生成.ll
格式的中间代码。
- 输入:源程序(
C/C++程序
)
- 输出:编译生成
.ll
文件或者.bc
文件
1 2
| ~/LLFI-master/llvm/bin/clang -emit-llvm -S sample.c -o sample.ll ~/LLFI-master/llvm/bin/clang -emit-llvm -c sample.c -o sample.bc
|
Instrument工具插入回调函数
在生成的中间代码(.ll/.bc
文件)中插入回调函数,以进行分析和故障注入。可以在指定位置进行插入,指定位置是由input.yaml
文件中指定要注入的故障确定。
1 2
| ~/LLFI-master/llfi/bin/Instrucment --readable sample.ll ~/LLFI-master/llfi/bin/Instrucment sample.bc
|
- 输入:编译生成的中间代码
.ll/.bc
,以及带有 compileTime
选项的 input.yaml
文件(没有在命令中体现,只需要将input.yaml
和源代码放在同一目录下即可)
- 输出:两个
.ll
(或 .bc
)文件分别用于分析和故障注入。这些文件将分别称为 sample-profiling.ll
和 sample-faultinjection.ll
。还会生成相应的可执行文件 sample-profiling.exe
和 sample-faultInjection.exe
。
Profiling 分析
为了获取步骤2中标识的.ll
文件中指定位置的动态执行计数。
1
| ~/LLFI-master/llfi/bin/Profile ./llfi/sample-profiling.exe <程序参数>
|
- 输入:分析可执行文件
sample-profiling.exe
,和程序所需要的参数
- 输出:
llfi-stat-profile.txt
,它是一个包含循环总数(即感兴趣的地方的执行实例)的文本文件,以及一个包含程序黄金输出的输出文件
Fault Injection 故障注入
1
| ~/LLFI-master/llfi/bin/injectfault ./llfi/sample-faultinjection.exe <程序参数>
|
- 输入:
fault-injection
可执行文件sample-faultInjection.exe
,输入的yaml
文件填入运行时选项,尤其是fault-injection
运行次数和faultinjector
类型。此外,分析步骤 3 的输出。
- 输出:故障注入实验的结果,以及注入的日志文件和生成的输出文件。应用程序写入 stderr 的任何错误消息也会被记录下来。
inpuy.yaml
各指令含义
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| defaultTimeOut: 500 compileOption: instSelMethod: - insttype: include: - all exclude: - ret
regSelMethod: regloc regloc: dstreg
includeInjectionTrace: - forward - backward
tracingPropagation: True
tracingPropagationOption: maxTrace: 250 debugTrace: True/False generateCDFG: True
runOption: - run: numOfRuns: 3 fi_type: bitflip
|
compileOption
层次结构
定义了LLFI的编译时选项,包括指令选择器、寄存器选择器、跟踪选项等。指令选择器和寄存器选择器可以用于指定故障注入的范围,通过配置这两个选择器,用户可以限制可能发生故障的潜在位置。
1 2 3 4 5 6 7 8 9 10 11 12 13
| compileOption: instSelMethod: <content of inst selector>... regSelMethod: <content of reg selector>...
tracingPropagation: True/False tracingPropagationOption: <content of tracing propagation option> includeInjectionTrace: - forward - backward
|
instSelMethod
定义指令选择器instSelMethod是定义指令选择器的块。它位于compileOption\的字典中。下面是这个块的结构:
1 2 3 4 5 6 7 8
| instSelMethod: - <insttype/funcname/customInstselector>: include: - <inst types/func names/name of custom inst selector> exclude: - <inst types/func names> options: - <command line options for the inst selector>
|