在我最近的工作中,我需要在基本块的入口和出口处插入检测代码以获取变量的值,因此可以基于源代码的DFA对其进行检查。另一个任务是当根据检测代码执行可执行文件时,将在函数调用和系统调用或变量访问之前或变量更新之后触发异常。
我已阅读有关如何编写通行证的LLVM手册。但是,它并没有告诉我如何获取变量的最新值。
有人提供了包含LLVM传递基本用法的链接,但它太简单了-----------①https://github.com/SumedhArani/LLVM
②https://www.cs.cornell.edu/~asampson/blog/llvm.html
#include <stdio.h>
int main(){
int old_valud,new_value;
int *p=&old_value,*q=&new_value;
int connect_limit=100;
char buf[64];
while(connect_limit--){
read(0,buf);
*p=*q;
}
return 0;
}
define i32 @main() #0 {
%1 = alloca i32, align 4
%old_value = alloca i32, align 4
%new_value = alloca i32, align 4
%p = alloca i32*, align 8
%q = alloca i32*, align 8
%connect_limit = alloca i32, align 4
%buf = alloca [64 x i8], align 16
store i32 0, i32* %1
store i32* %old_value, i32** %p, align 8
store i32* %new_value, i32** %q, align 8
store i32 100, i32* %connect_limit, align 4
br label %2
; <label>:2 ; preds = %6, %0
%3 = load i32, i32* %connect_limit, align 4
%4 = add nsw i32 %3, -1
store i32 %4, i32* %connect_limit, align 4
%5 = icmp ne i32 %3, 0
br i1 %5, label %6, label %12
; <label>:6 ; preds = %2
%7 = getelementptr inbounds [64 x i8], [64 x i8]* %buf, i32 0, i32 0
%8 = call i32 (i8*, ...) @__isoc99_scanf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i32 0, i32 0), i8* %7)
%9 = load i32*, i32** %q, align 8
%10 = load i32, i32* %9, align 4
%11 = load i32*, i32** %p, align 8
store i32 %10, i32* %11, align 4
br label %2
; <label>:12 ; preds = %2
ret i32 0
}
有人可以提供一些相关的源代码和指导吗?