0

セグメンテーション違反を生成するコードを実行しようとしています。ただし、セグメンテーション違反は発生しません。

int main()
{

char *variable;

strcpy(variable,"hello");

}

プログラムはクラッシュしますが、セグメンテーション違反が発生したというメッセージは表示されません。

セグメンテーション違反を処理するシグナル ハンドラを作成しても、シグナルが捕捉されません。

なぜこれが起こっているのか知っていますか?カーネルによる SIGSEGV シグナルの処理が無効になっている可能性はありますか...

ありがとう、

4

2 に答える 2

1

私の場合、gccコンパイラを使用してセグメンテーション違反が発生しました(出力:セグメンテーション違反)。しかし、あなたのケースでそれが来ない場合は、strace ./a.out(say) のように strace を使用してバイナリを実行してみてください。コンソールで実行されたシステム レベルのコマンドが表示されます。これからアイデアが得られるかもしれません

于 2012-07-20T05:04:20.883 に答える
0

gcc -Wallまず、そのような間違いに対して警告を発するようにコンパイルする習慣を身につける必要があります。

実際に何が起こっているのかを理解するには、デバッガーを使用しgdbてコードを段階的に実行します。straceor betterを使用することもできますltrace (これにより、引数が に表示されますstrcpy)。

次に、考えられる説明 (単なる推測) は次のようになります。

  • あなたvariableは初期化されていません

  • variable そのため、レジスタ(またはスタックスロット)が以前に格納した「値」を保持します

  • mainによって呼び出され、crt0.o意味のあるもの (有効なポインター) でその場所を初期化します。おそらくargv[0] シェルmain 環境変数の

( x86-64 ABIの詳細を読んでcrt0.o、スタックの設定方法を理解することができます)

初期化variable=NULL; すると、SIGSEGV

于 2012-07-20T05:04:34.567 に答える