如果不知道数组的大小,LLVM GEP是否安全?

时间:2013-09-16 09:22:24

标签: c++ llvm

我正在尝试使用GEP从数组中获取i32的指针。

但问题是:我不知道数组的大小。

llvm.org上的IR文档说GEP只是通过静默包装二进制补码算法将偏移量添加到基址。

所以,我想问一些建议。 这样安全吗:

%v1 = alloca i32
store i32 5, i32* %v1
%6 = load i32* %v1
%7 = bitcast i32* %v0 to [1 x i32]*
%8 = getelementptr [1 x i32]* %7, i32 0, i32 %6
%9 = load i32* %8
store i32 %9, i32* %v0

%v0的类型是i32 *,我知道%v0指向mem中的数组,但大小为9,而不是1。 然后我将来自%7的“GEP”我将其视为[1 x i32] ,而不是[9 x i32] ,但“偏移”为5(%6)。

那么,有什么问题吗?不安全,或者只是不好但基本上没问题?

1 个答案:

答案 0 :(得分:3)

首先,您编写的整个代码等同于:

%x = getelementptr i32* %v0, i32 5
%y = load i32* %x
store i32* %y, %v0

没有理由将指针指向[1 x i32]*,只是按原样使用它。

关于你的问题 - 使用gep来获取指针总是安全的(从某种意义上说它定义明确并且永远不会崩溃),然而没有什么能阻止它评估超出数组边界的指针;在这种情况下,访问内存(就像在后续的load指令中一样)是未定义的。

此外,此链接可能很有用:http://llvm.org/docs/GetElementPtr.html#what-happens-if-an-array-index-is-out-of-bounds