Как получить значение GetElementPtrInst после его определения? - PullRequest
0 голосов
/ 02 мая 2020

Я использовал 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.

Не могли бы вы помочь мне решить эту проблему?

Если вы можете не понимаю, что я хочу сделать, пожалуйста, скажите это в комментарии. Большое спасибо!

1 Ответ

0 голосов
/ 03 мая 2020

Вы используете C / C ++, который является статически скомпилированным языком. Это означает, что есть много информации времени выполнения, к которой у компилятора нет доступа, и они включают zero division ошибки. Поэтому проверка, равняется ли x[0] 0, во время компиляции невозможна, поскольку значения еще не были загружены в фактическую память.

...