c++ - 如果不知道数组的大小,LLVM GEP 安全吗?

标签 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)。

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

最佳答案

首先,您编写的整个代码相当于:

%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

关于c++ - 如果不知道数组的大小,LLVM GEP 安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18824501/

相关文章:

.net - 为什么 GetWindowThreadProcessId 有时会返回 0?

c++ - 使用 STL 将大型 STL vector 写入文件的最快方法

c++ - 获取剪贴板数据(CF_TEXT)

c++ - 如何在基本 block 中插入LLVM StoreInst

c++ - 如何从 LLVM 中的 CallInst 获取间接调用的函数名称

c++ - 在带有 GCC 的生产环境中使用 C++11

c++ - 如何根据数组参数项类型重载 IDL 中的函数?

objective-c - 如何找到无意的对象指针比较?

objective-c - clang 3 中不再需要消息和函数原型(prototype)了吗?

c++ - LLVM万花筒教程JIT编译问题