如何通过LLVM IR检查溢出 我对C++和LLVM的编译器和非常有限的知识一无所知,现在我陷入了一个重要的阶段。 强>我的问题是>:如何使用C++的LVVM来检查是否有溢出?

如何通过LLVM IR检查溢出 我对C++和LLVM的编译器和非常有限的知识一无所知,现在我陷入了一个重要的阶段。 强>我的问题是>:如何使用C++的LVVM来检查是否有溢出?,c++,llvm,C++,Llvm,这是源代码: 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, meta

这是源代码:

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

  • 即使我能找到load指令,我如何跳到%5来比较参数并确定它是否溢出

  • 要检查指令是否已加载,可以执行以下操作
    LoadInst*load=dyn\u cast(指令)
    如果(load!=nullptr){…}

  • 要获取%5,请在LoadInst上调用
    getPointerOperand()
    ,在这种情况下,它将返回%5

  • 要检查指令是否已加载,可以执行以下操作
    LoadInst*load=dyn\u cast(指令)
    如果(load!=nullptr){…}

  • 要获取%5,请在LoadInst上调用
    getPointerOperand()
    ,在这种情况下,它将返回%5


  • 我建议你看一下伊利诺伊大学的这个项目。

    < P>我建议你看一下伊利诺伊大学的项目。