5

なぜ私がこれをするとき:

char teststrcpy[5];

strcpy(teststrcpy,"thisisahugestring");

実行時に次のメッセージが表示されます。

Abort trap: 6

teststrcpyのメモリの右側にあるものを上書きするだけではいけませんか?そうでない場合、トラップの中止とはどういう意味ですか?

MACOSXでGCCコンパイラを使用しています

注として、そしていくつかのコメントに答えて、私はCで遊ぶためにこれを行っています、私は本番環境でこれを行うつもりはありません。フォークズを心配しないでください!:)

ありがとう

4

5 に答える 5

2

のメモリの右側にあるものを上書きするだけではいけませんteststrcpyか?

必ずしも、割り当てられたメモリの外部に書き込むことは未定義の動作です。あなたの場合、何かが範囲外の書き込みを検出し、プログラムを中止しました。

于 2013-01-22T19:26:27.353 に答える
2

Cでは、「バッファが小さすぎる」と言う人は誰もいません。小さすぎるバッファにあまりにも多くの文字をコピーすることを主張すると、未定義動作の恐怖に陥ります。

于 2013-01-22T19:28:29.067 に答える
2

私は所有していませんが、Mac OSはオーバーフローを別の方法で処理することを読みました。これにより、メモリのincertianインスタンスを上書きすることはできません。strcpy()それらの1つであること

Linuxマシンでは、このコードは次のスタックを正常に上書きしますが、スタックカナリアのためにmac os(トラップの中止)では防止されます。

あなたはgccオプションでそれを回避することができるかもしれません-fno-stack-protector


わかりました、それから中絶を見ているので、それは__strcpy_chk特にstrcpy(そしておそらく友達)をチェックしていることを意味します。したがって、理論的には次のことができます*:

char teststrcpy[5];
gets(teststrcpy);

次に、本当に長い文字列を入力すると、希望どおりに動作が悪くなるはずです。

gets*この特定のインスタンスでは、OSの保護メカニズムを回避するためにのみアドバイスしています。他の例では、誰もがコードを使用することをお勧めします。gets安全ではありません。

于 2013-01-22T19:32:09.410 に答える
0

teststrcpyの5文字目以降を上書きしたい場合は、怖い人です。サイズ4の文字列をteststrcpyにコピーできます(5番目の文字はNULL用に予約する必要があります)。

于 2013-01-22T19:30:32.640 に答える
0

ほとんどの場合、コンパイラはバッファオーバーフロー保護にカナリアを使用しているため、オーバーフローが発生したときにこの例外が発生し、バッファ外への書き込みができなくなります。

http://en.wikipedia.org/wiki/Buffer_overflow_protection#Canariesを参照してください

于 2013-01-22T19:54:15.833 に答える