Я использовал 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.
Не могли бы вы помочь мне решить эту проблему?
Если вы можете не понимаю, что я хочу сделать, пожалуйста, скажите это в комментарии. Большое спасибо!