• ベストアンサー

バッファーオーバラン

MFC初心者です。 以下のように変数を宣言 (1) WCHAR AA; WCHAR BB[512] これを↓のようにAAを配列の後に宣言の順番を変える (2) WCHAR BB[512] WCHAR AA; BBを初期化、サイズ指定して値を代入、AAを呼び出しAAに値を代入後、エディタコントロールに文字を表示させようとするとバッファーオーバランが出ます。 AAの宣言の順番を変えただけでバッファーオーバランが出ます。 (1)の時にはバッファーオーバランが出ない、と言うことはBBの配列で問題があるのでしょうか? それとも配列の後に宣言を追加しないほうがよいのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.4

>BBを初期化、サイズ指定して値を代入、AAを呼び出しAAに値を代入後、エディタコントロールに文字を表示させようとするとバッファーオーバランが出ます。 「AAを呼び出し」とか「AAに値を代入後」とか……どういうコードなんです? AAには文字しか入りませんが、文字列をコピーしようとしている…とかそういうことはありませんか? AAをサイズを超えてアクセスしていた場合、 WCHAR AA; WCHAR BB[512]; なら、意図しないままBBを破壊し、バッファオーバーランは検出できません。 WCHAR BB[512]; WCHAR AA; なら、AAの直後に置かれているであろうデバッグ用のチェック領域を破壊してめでたく検出されるようになる。 ということもありましょう。 必ずしもBBへのアクセスでオーバーランしているとは限りませんのでご注意を。

marugori
質問者

お礼

AAの直後に置かれているであろうデバッグ用のチェック領域を破壊してめでたく検出されるようになる。 ありがとうございます。 AA直後は考えてなかったので改めて調べます。

その他の回答 (3)

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.3

> (1)の時にはバッファーオーバランが出ない、と言うことはBBの配列で問題があるのでしょうか? > それとも配列の後に宣言を追加しないほうがよいのでしょうか? どちらの認識にも問題があります。 正しい認識は、「BBに格納しようとしている文字列が長すぎる」です。 以下の点を確認してください。 ・BBに値を設定している場所を洗い出し、その長さがどうなっているかを確認してください。 ・そもそも、BBに格納する文字列の長さが最長511文字であるという前提は正しいですか?

marugori
質問者

お礼

>BBに格納しようとしている文字列が長すぎる ありがとうございます。BBの長さを疑って調べていましたが・・・ もうしばらく調べます。

marugori
質問者

補足

すみません WCHAR BB[128]で宣言し、値の代入は10文字に固定しています。

回答No.2

> (1)の時にはバッファーオーバランが出ない、と言うことはBBの配列で問題があるのでしょうか? 他のコードを変えていないのであれば、バッファオーバーランが出ないのではなく、検出されなかっただけでしょう。バッファオーバーランが起こっても、他の変数の領域を破壊しているだけなら、検出されないことがほとんどです。変数の領域を超えて、管理領域などを破壊すると、検出されます。 バッファオーバーランが行ないようなコードを書くことが重要です。

marugori
質問者

お礼

>バッファオーバーランが出ないのではなく、検出されなかっただけでしょう。 やはりその可能性がありますか・・・ 全部を調べなおします。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

全体的に何をしているのかわからないので「BBの配列で問題があるのでしょうか?」と聞かれても答えられないよね.... さておき, 本質的には もともと存在していた問題が, 順序を変えることによって顕在化した だけでしょう.

marugori
質問者

お礼

>存在していた問題が, 順序を変えることによって顕在化した だけでしょう. ありがとうございます。はじめから調べます。

関連するQ&A