我对编译器一无所知,对C ++和LLVM的知识非常有限,现在我陷入了一个重要的阶段。
我的问题是:如何使用llvm和C ++来检查是否有溢出?
这是源代码:
int
main(int argc, char **argv) {
char buffer[4] = { 0, 0, 0, 0 };
return buffer[2];
}
这是IR代码:
define i32 @main(i32, i8**) #0 !dbg !6 {
%3 = alloca [4 x i8], align 1
call void @llvm.dbg.value(metadata i32 %0, i64 0, metadata !13, metadata !14), !dbg !15
call void @llvm.dbg.value(metadata i8** %1, i64 0, metadata !16, metadata !14), !dbg !17
call void @llvm.dbg.declare(metadata [4 x i8]* %3, metadata !18, metadata !14), !dbg !22
%4 = bitcast [4 x i8]* %3 to i8*, !dbg !22
call void @llvm.memset.p0i8.i64(i8* %4, i8 0, i64 4, i32 1, i1 false), !dbg !22
%5 = getelementptr inbounds [4 x i8], [4 x i8]* %3, i64 0, i64 2, !dbg !23
%6 = load i8, i8* %5, align 1, !dbg !23
%7 = sext i8 %6 to i32, !dbg !23
ret i32 %7, !dbg !24
}
我认为为了做这个检查,需要使用CallSite getInstructions(),似乎答案在load
指令中,但load
在%6中,而参数在%5中,我不知道:
如何查找指令load
即使我能找到加载指令,如何跳转到%5来比较参数并判断它是否溢出?
答案 0 :(得分:0)
要检查指令是否加载,您可以执行此操作
LoadInst* load = dyn_cast<LoadInst>(instruction)
if (load != nullptr) {...}
要获取%5,请在LoadInst上调用getPointerOperand()
,在这种情况下,它将返回%5
答案 1 :(得分:0)
我建议你看一下伊利诺伊大学的SAFECode项目。