質問: ↓ 下記の質問の結果について、掘り下げて質問させてください。 memcpyで、第二引数が第三引数で指定したコピーサイズより小さい場合、 プログラムがクラッシュするケースとしないケースとがあります。 ``` char szString1[1024]; char szString2[512]; memcpy(szString1, szString2, 1024); ``` クラッシュしたときのダンプファイルを見ると、 「保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。」というメッセージが出ていました。 そこで質問なのですが、クラッシュするケースでは保護されているメモリ空間(他によって確保されている空間など)に不正にアクセスしたから、クラッシュしたという理解をしているのですが、合っていますでしょうか? 他の人から、「C++Builder6の場合は、このようなプログラムを書いてもクラッシュしなかった」と言われ、違いを説明できませんでした。 (今回は、Visual Studio 2010 Professionalを使って開発をしています) そもそも、確保していないメモリサイズを超えたサイズ指定をするようなコードを書くこと自体が間違いなのですが クラッシュする/しない という現象の違いは、 ・動作時のメモリ空間の違い なのか ・コンパイラの違い なのか 考えられるケース、起きる理屈について教えていただけないでしょうか。
回答: > > ・コンパイラの違い なのか > > > Visual Studio の場合スタックが破壊または改竄されたことを検知するための実行コードが埋め込まれたりします。 その検知に引っかかるとクラッシュします。 GuardStack (GS) また、完全にメモリアクセス違反を起こしているとコンパイラが判断した場合、ソースコードを完全に無視して例外をthrowする実行コードが生成されたります。 なぜクラッシュするのか、なぜクラッシュしないのかを確認するにはアセンブリを確認したりデバッガを使って動作を確認する必要があります。