0

私はコードを持っています:

unsigned char *myArray = new unsigned char[40000];

char pixelInfo[3];
int c = 0;
while(!reader.eof()) //reader is a ifstream open to a BMP file
{
    reader.read(pixelInfo, 3);
    myArray[c] = (unsigned char)pixelInfo[0];
    myArray[c + 1] = (unsigned char)pixelInfo[1];
    myArray[c + 2] = (unsigned char)pixelInfo[2];
    c += 3;
}
reader.close();

delete[] myArray; //I get HEAP CORRUPTION here

いくつかのテストの後、while ループのキャストが原因であることがわかりました。signed char myArrayを使用するとエラーは発生しませんが、残りのコードでは unsigned char を使用する必要があります。pixelInfo を unsigned char にキャストすると、同じエラーが発生します。

これに対する解決策はありますか?

4

3 に答える 3

1

これはあなたがすべきことです:

reader.read((char*)myArray, myArrayLength); /* note, that isn't (sizeof myArray) */

if (!reader) { /* report error */ }

ループ内で処理が行われている場合、

int c = 0;
while (c + 2 < myArraySize) //reader is a ifstream open to a BMP file
{
    reader.read(pixelInfo, 3);
    myArray[c] = (unsigned char)pixelInfo[0];
    myArray[c + 1] = (unsigned char)pixelInfo[1];
    myArray[c + 2] = (unsigned char)pixelInfo[2];
    c += 3;
}

最後まで読んだ後に読み込もうとしても問題ありません。配列の残りの部分にジャンクが入りますが、最後にそれを処理することができます。

配列がファイル全体を保持するのに十分な大きさであると仮定すると、バッファの破損が発生します。慎重に作成された不正なメタデータを含む画像ファイルが関与するバッファ オーバーラン攻撃は、非常によく知られています。

計算されたバッファ サイズにファイル コンテンツ全体が収まることに依存しないでください。

于 2012-12-28T21:25:17.700 に答える
0

reader.eof()前回の読み取りがファイルの終わりに達した場合にのみ通知されます。これにより、最後の反復で配列の終わりを超えて書き込みが行われます。代わりに必要なのは、現在の読み取りがファイルの終わりに到達するかどうかを確認することです。whileループを次のように変更します。

while(reader.read(pixelInfo, 3)) //reader is a ifstream open to a BMP file
{
  // ...
}
于 2012-12-28T21:21:43.097 に答える
0

一度に 3 バイトを読み取っていることに注意してください。合計バイト数が 3 で割り切れない (3 の倍数ではない) 場合、実際には pixelInfo 配列の一部だけが正しいデータで満たされ、プログラムでエラーが発生する可能性があります。次のテストされていないコードを試すことができます。

while(!reader.eof()) //reader is a ifstream open to a BMP file
{
   reader.read(pixelInfo, 3);
   for (int i = 0; i < reader.gcount(); i++) {
       myArray[c+i] = pixelInfo[i];
   }
   c += 3;
}

eof ビットは不完全な読み取りの後に設定されるため、コードは cplusplus.com のドキュメントに非常によく従っていますが、このコードは最後の読み取り後に終了しますが、前に述べたように、問題の原因として考えられるのは、割り当てているという事実です3 バイトが読み取られなかった場合、pixelInfo[x] が必ずしも設定されない可能性があるため、ヒープへのジャンク データの可能性があります。

于 2012-12-28T21:38:23.377 に答える