我用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。
你能帮我解决这个问题吗?
如果你不明白我想做什么,请在评论中说出来,非常感谢!
你使用的是CC++,它是一种静态编译语言。这意味着有很多运行时信息是编译器无法访问的,这些信息包括 zero division
错误。所以检查是否 x[0]
等于0的值在编译时是不可能的,因为这些值还没有加载到实际内存中。