0

在 C++/C 中,您可以这样做:

unsigned char A[12];
unsigned int *B;
int *C;
B = malloc(sizeof(unsigned int));
C = malloc(2*sizeof(int));
A[0] = *B;
A[4] = *C;
//Then go on to access A byte by byte.

我想知道这在 LLVM-IR 中是否可行,或者它会立即抱怨类型问题。正要深入研究这个,但我想看看是否有人尝试过这个特定的例子。我会将 GEP A 的第 0 个位置作为 i8*,然后将 B 和 C 作为 i32*。如果可能的话,我对如何进行有点困惑。

提前谢谢。

更新:

好的,如果我改为为 *B 和 C[0]、C[1] 添加初始化,LLVM-IR /C / C++ 的答案会改变吗?

4

2 回答 2

1

不,这在 C/C++ 中也是不可能的。您不应将未初始化的变量分配给另一个变量。它调用未定义的行为*B并且*c未初始化。

于 2014-01-13T22:17:07.293 回答
0

LLVM 具有bitcast通常用于将一种类型的指针转​​换为另一种类型的指针的指令 - 例如,i32*转换为i8*.

因此,例如,如果您想访问 4 字节数字的第 3 个字节,则执行以下操作是完全合法的:

%bytes = bitcast i32* %num to i8*
%third_byte = getelementptr i8* %bytes, i32 2

当你做这样的事情时,请记住字节顺序。

是的,您可以使用这种技术来获取指向数组中特定位置的指针storeload那里的值,从而使您能够复制整个示例。

于 2014-01-13T22:47:50.887 回答