2

以下のようなコードがあります。

    int foo (unsigned int a)
    {

    struct tid{
        int id;
        char abd[8];
        };
    int ret = 0;
    struct tid arr[256];

    ret = arr[a];
    ...

    }

foo に渡される a の値は 0xFFFFFFFF です。ここで、スタック外のメモリ ロケーションにアクセスしているので、システムに障害が発生すると思いますが、そうではありません。これがどのように機能するかを調べるために、私が見ることができる方向性を知りたい. 検討中のマシンは、32 ビットのアドレス指定と 256 MB の RAM を備えた MIPS 4K です。gccを使用してx86 PCでコードをクロスコンパイルしています。

4

1 に答える 1

4

ここで、スタック外のメモリ位置にアクセスしているので、システムに障害が発生すると思いますが、そうではありません。

スタックに割り当てたメモリの範囲外への書き込みは、未定義の動作です。この未定義の動作を呼び出すと、通常 (常にではありません)、segfault が発生します。ただし、セグメンテーション違反が発生するかどうかはわかりません。

ウィキペディアのリンクはそれを非常にうまく説明しています:

未定義の動作のインスタンスが発生した場合、言語仕様に関する限り、何も発生しない可能性があります。

したがって、この場合、セグメンテーション違反が発生したり、プログラムが中止されたり、場合によっては正常に実行されたりする可能性があります。または、何でも。結果を保証する方法はありません。

これがどのように機能するかを調べるために、私が見ることができる方向性を知りたい.

ここで何を尋ねているのかわかりません。「仕事」の意味を明確にできますか?このプログラムで何をしたいですか?

于 2013-09-08T08:10:56.513 に答える