2

GEP を使用して、配列から i32 のポインターを取得しようとしています。

しかし、問題は次のとおりです。配列のサイズがわかりません。

llvm.org の IR ドキュメントによると、GEP は 2 の補数演算を静かにラップしてベース アドレスにオフセットを追加するだけです。

そこで、アドバイスをお願いしたいです。このように安全ですか:

%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 内の配列を指していることはわかっていますが、サイズは 1 ではなく 9 です。次に、%7 から "GEP" し、それを [1 x i32] として扱います。 [9 x i32]ではありませんが、「オフセット」は 5(%6) です。

それで、何か問題はありますか?安全ではない、または良くないだけで基本的には大丈夫ですか?

4

1 に答える 1

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

于 2013-09-16T10:43:15.400 に答える