簡體   English   中英

如何通過LLVM IR檢查溢出

[英]How to check overflow through LLVM IR

我對編譯器一無所知,對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, 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中,我不知道:

  1. 如何查找指令已load

  2. 即使可以找到裝入指令,如何跳轉到%5來比較參數並確定是否溢出?

  1. 要檢查指令是否已加載,可以執行LoadInst* load = dyn_cast<LoadInst>(instruction) if (load != nullptr) {...}

  2. 要獲取%5,請在LoadInst上調用getPointerOperand() ,在這種情況下它將返回%5

我建議您看一下伊利諾伊大學的SAFECode項目。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM