我使用 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。
你能帮我解决这个问题吗?
如果你不明白我想做什么,请在评论中说出来。非常感谢!