2

なぜ次のことが機能し、ある種のセグメンテーション違反をスローしないのですか?

char *path = "/usr/bin/";
char *random = "012";

// path + random + \0
// so its malloc(13), but I get 16 bytes due to memory alignment (im on 32bit)
newPath = (char *) malloc(strlen(path) + strlen(random) + 1);

strcat(newPath, path);
strcat(newPath, "random");
// newPath is now: "/usr/bin/012\0" which makes 13 characters.

ただし、追加すると

strcat(newPath, "RANDOMBUNNIES");

strcatは割り当てられたよりも多くのメモリを使用するため、この呼び出しは失敗するべきではありませんか?したがって、すべきではありません

free(newPath)

また、16バイトを解放しようとするため失敗しますが、26バイト( "/ usr / bin / 012RANDOMBUNNIES \ 0")を使用しましたか?

よろしくお願いします!

4

9 に答える 9

7

ほとんどの場合、この種のオーバーランの問題によって、プログラムが煙の雲や焦げた硫黄の臭いの中で爆発することはありません。それはもっと微妙です。オーバーラン変数の後に割り当てられる変数が変更され、後でプログラムの説明できない、一見ランダムな動作を引き起こします。

于 2011-07-16T15:46:20.883 に答える
3

プログラムスニペット全体が間違っています。malloc()少なくとも最初のバイトがに設定されているものを返すと想定しています0。これは一般的には当てはまらないので、あなたの「安全」でさえstrcat()間違っています。

しかし、そうでなければ、他の人が言っているように、未定義の動作はあなたのプログラムがクラッシュすることを意味しません。それはそれが何でもできることを意味するだけです(クラッシュを含むが、運が悪ければクラッシュしないことも)。

(また、の戻り値をキャストしないでくださいmalloc()。)

于 2011-07-16T16:03:53.543 に答える
1

mallocedよりも多くの文字を書き込むことは未定義動作です。
未定義の動作とは、何かが発生する可能性があり、動作を説明できないことを意味します。

于 2011-07-16T15:49:32.407 に答える
1

セグメンテーション違反は通常、無効なメモリセクションにアクセスするために発生します。ここでは、メモリにアクセスできるため、エラー(セグメンテーション違反)は発生しません。ただし、未定義の動作である他のメモリ位置を上書きしている場合、コードは正常に実行されます。

于 2011-07-16T20:34:44.207 に答える
0

mallocされたメモリの直後のメモリの可用性に応じて、失敗し、ランダムに失敗することはありません。

また、ランダムに連結したい場合は、引用符で囲むべきではありません。それは

strcat(newPath, random);
于 2011-07-16T15:46:22.407 に答える
0

多くのCライブラリ関数は、オーバーランしているかどうかをチェックしません。割り当てられたメモリを管理するのはプログラマー次第です。プログラムの動作に予測できない影響を与えて、メモリ内の別の変数を上書きしている可能性があります。Cは、プログラミングのエラーを指摘するためではなく、効率を上げるように設計されています。

于 2011-07-16T15:46:43.217 に答える
0

あなたはこの電話で運がいいです。通話はおそらくアドレス空間の割り当てられた部分に留まるため、セグメンテーション違反は発生しません。これは未定義の動作です。書き込まれたものの最後の文字は、上書きされないことが保証されていません。この呼び出しも失敗する可能性があります。

于 2011-07-16T15:46:51.937 に答える
0

バッファオーバーランがセグメンテーション違反を引き起こすことは保証されていません。動作は単純に未定義です。一度は自分のものではないメモリへの書き込みをやめ、別のときにクラッシュを引き起こし、3回目はまったく関係のないものを黙って上書きする可能性があります。これらのいずれが発生するかは、OS(およびOSのバージョン)、ハードウェア、コンパイラ(およびコンパイラフラグ)、およびシステムで実行されている他のほとんどすべてに依存します。

これが、バッファがこのような厄介なバグの原因をオーバーランさせる原因です。多くの場合、明らかな症状は本番環境で表示されますが、デバッガーで実行した場合は表示されません。そして、症状は通常、それらが発生したプログラムの部分には現れません。そしてもちろん、それらはあなた自身のコードを注入するための歓迎すべき脆弱性です。

于 2011-07-16T15:50:04.887 に答える
0

オペレーティングシステムは、私のシステムでは4kbのページサイズ(32ビットマシンでは一般的)である特定の粒度で割り当てます。malloc()が常にOSから新しいページを取得するかどうかは、Cランタイムライブラリによって異なります。

于 2011-07-16T15:51:48.977 に答える