-6

以下は、未定義の動作を理解するためのプログラムです。私は 10 *4 = 40 バイトのメモリで ptr を割り当てており、アクセスしようとしています。そのため、40 バイトを超えている *(ptr+0x100) が完了すると、セグ フォールトが発生する必要があります。コードから観察されるのは、*(ptr+0xc000) で seg fault が発生することです。ヒープのサイズを超えるとセグフォルトになるということですか?ptr が割り当てられた 40 バイトの境界外にある ptr+100 にアクセスしようとしたときに、セグ フォールトが発生しないのはなぜですか。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

main()
{
        int * ptr = malloc(10 * sizeof(int) );

        *ptr = 0x100;
        printf(" Done 1\n");

        *(ptr+0x9) = 0x90;
        printf(" Done 2\n");

        *(ptr+0x100) = 0x400;
        printf(" Done 3\n");

        *(ptr + 0x1000) = 0x4000;
        printf(" Done 4\n");

        *(ptr + 0x4000) = 0x4000;
        printf(" Done 5\n");

        *(ptr + 0x8000) = 0x8000;
        printf(" Done 6\n");

        *(ptr + 0xc000) = 0xc000;
        printf(" Done 7\n");
}
4

3 に答える 3

1

ご存じのとおり、プログラムは未定義の動作を呼び出します。未定義は、「すべての状況で segfault が保証される」という意味ではありません。undefinedは、「C コンパイラの適合する実装が、何でも行うプログラムを出力できる」ことを意味します。

于 2013-09-11T03:25:47.437 に答える
1

有効な malloc された場所を超えてヒープに書き込むと、未定義の動作が発生します。セグメント障害が発生する場合と発生しない場合があります。ヒープの場所にあるものと、それがプログラムの残りの部分でどのように使用されるかによって異なります。

あなたのプログラムはまったく失敗しないかもしれません。ただし、ヒープが破損するため、最終的には、プログラムが長くなると問題が発生します。問題を見つけにくい。

于 2013-09-11T03:21:24.517 に答える
0

未定義の動作を理解しようとしないでください。それを未定義と呼ぶのは、何でも起こり得ることを明確にするためです。

実際、UB の最も厄介な側面は、UB が時々機能することです。少なくとも一貫して失敗した場合、バグのクラス全体がフィールドにヒットすることはありません.

UB を理解しようとすることは、猫 (または一部の元ガールフレンド) を理解しようとするようなものです。あなたはそれを整理したと思うかもしれませんが、彼らはあなたをオンにします:-)

理解するのではなく、単に避けるべきです。

于 2013-09-11T03:26:52.997 に答える