如何获取GetElementPtrInst定义后的值?

问题描述 投票:0回答:1

我用llvm编译了这段代码,意思是如果我发现一个潜在的除以零的故障,我想发送一个消息。

  int main() {
    int x[3];
    int y;
    x[0] = 0;
    x[1] = tainted_input();
    x[2] = 1;
    y = 4 / x[0]; 
}

编译结果是:

define dso_local i32 @main() #0 {
entry:
  %x = alloca [3 x i32], align 4
  %y = alloca i32, align 4
  %arrayidx = getelementptr inbounds [3 x i32], [3 x i32]* %x, i64 0, i64 0
  store i32 0, i32* %arrayidx, align 4
  %call = call i32 (...) @tainted_input()
  %arrayidx1 = getelementptr inbounds [3 x i32], [3 x i32]* %x, i64 0, i64 1
  store i32 %call, i32* %arrayidx1, align 4
  %arrayidx2 = getelementptr inbounds [3 x i32], [3 x i32]* %x, i64 0, i64 2
  store i32 1, i32* %arrayidx2, align 4
  %arrayidx3 = getelementptr inbounds [3 x i32], [3 x i32]* %x, i64 0, i64 0
  %0 = load i32, i32* %arrayidx3, align 4
  %div = sdiv i32 4, %0
  store i32 %div, i32* %y, align 4
  ret i32 0
}

我发现,两次出现的 x[0]" ,第一次有。

`%arrayidx = getelementptr inbounds [3 x i32], [3 x i32]* %x, i64 0, i64 0`  

但下一次就有了。

`%arrayidx3 = getelementptr inbounds [3 x i32], [3 x i32]* %x, i64 0, i64 0`

所以,我不知道该怎么弄。%arrayidx3的值,并检查它是否 x[0] 等于0。

你能帮我解决这个问题吗?

如果你不明白我想做什么,请在评论中说出来,非常感谢!

llvm-clang
1个回答
0
投票

你使用的是CC++,它是一种静态编译语言。这意味着有很多运行时信息是编译器无法访问的,这些信息包括 zero division 错误。所以检查是否 x[0] 等于0的值在编译时是不可能的,因为这些值还没有加载到实际内存中。

© www.soinside.com 2019 - 2024. All rights reserved.