1

argvを介したユーザー入力によって、セグメンテーションエラーが発生する小さなプログラムを作成したいと思います。私はCにまったく慣れていませんが、次のコードがその役目を果たしていると思います。

int main(int argc, char *argv[])
{
    int bufferSize;
    char * buffer[100];
    unsigned int i;

    if (argc > 1) {
        bufferSize = atoi(argv[1]);
        for (i = 0; i < bufferSize; ++i)
            *( buffer + i ) = i;
    }

    return 0;
}

私の考えは、プログラムが特定のサイズのバッファーへのポインターを初期化(?)することです。次に、ユーザーがバッファサイズよりも大きい数値を入力すると、初期化されていないメモリに書き込まれるため、セグメントが取得されます。障害。この推論はまったく正しいですか?

追伸 コンパイルするとき、I get a assignment makes pointer from integer without a cast警告するとき、誰かがそれがなぜ起こるのか教えてもらえますか?ありがとう

4

3 に答える 3

3

私が見たセグメンテーション違反を意図的に取得する最も伝統的な方法はNULL、たとえば次のようなものに書き込むことです。

*((char *) NULL) = 0;

コマンドライン引数を単純なブール値として使用して、これを実行する必要があるかどうかを確認できます。

書き込みNULLが実際にクラッシュを引き起こすことは保証されていないことに注意してください。これは単に未定義の動作であるため、基本的には何でも起こり得ます(鼻の悪魔を引き起こすことを含む)。

警告は、ポインタの配列があり、配列内のポインタに整数を割り当てようとしているためです。

于 2013-02-07T07:00:16.220 に答える
1

char * buffer[100];デフォルトでいくつかのガベージの場所を指すポインタの配列です。

ここで*( buffer + i ) = i;あなたはあなたに属していないその領域を尊重しようとしています。

私の推測では、あなたはバッファを作成したかったのです。それで

char buffer[100];十分です。

于 2013-02-07T06:55:48.627 に答える
0

セグメンテーション違反を引き起こす書き込みについては心配しません。読書で十分です。バッファがヒープ上にある場合、segfault が発生する可能性が高くなります。このアプリケーションは、-10 未満の負の入力に対してかなり確実にセグメンテーション違反を起こします。

#include "stdio.h"
#include "stdlib.h"
#include "string.h"

int main(int argc, char* argv[])
{
    static const int array[10] = {0,1,2,3,4,5,6,7,8,9};

    int * const heapArray = malloc(sizeof(array));

    memcpy(heapArray,array,sizeof(array));

    const int index = atoi(argv[1]);

    printf("%i\n",heapArray[index]);

    free(heapArray);
    return 0;   
}

問題は、malloc() の結果が、ほとんどのシステムで要求されたサイズよりもはるかに大きくなる可能性があることです。したがって、大きな値の場合でも、セグメンテーション違反は発生せず、メモリ内にあるものを返すだけです。

ericu@eric-phenom-linux:~$ ./segfault -5
Segmentation fault (core dumped)
ericu@eric-phenom-linux:~$ ./segfault 11
0
ericu@eric-phenom-linux:~$ ./segfault 100
0
ericu@eric-phenom-linux:~$ ./segfault 100
0
ericu@eric-phenom-linux:~$ ./segfault 1000
0
ericu@eric-phenom-linux:~$ ./segfault 10000
0
ericu@eric-phenom-linux:~$ ./segfault 100000
Segmentation fault (core dumped)
于 2013-03-09T19:21:05.370 に答える