私は数日間、非常に不思議なバグを追いかけていましたが、これは(ZLIB library)の周りを回っているようです。毎月1回程度、特定の生産環境でのみ発生します。WindowsのZLIB:gzopen/gzwrite/gzcloseは、誤って去勢された出力ファイル/ウイルス対策ソフトウェアを生成しますか?
- プログラムがファイル
X
への書き込みにgzopen
を呼び出します。ここでは、コードが何をするかです。 - プログラムは、ファイルにデータを書き込み、いくつかは
gzwrite
です。 - プログラムは最後にファイルをフラッシュする
gzclose
を呼び出します。
通常、すべて正常に動作し、ファイルX
が有効です。それはCRCとソースストリームの長さで適切に終端されます。
しかし、障害の1つで、X
が壊れていることがわかります。データの先頭は正確ですが、オフセットは0x00302000
から始まり、すべてのバイトがnullです。 CRCと長さを符号化する最後の8バイトもゼロです。ただし、ファイルのサイズは正しいです!さらに悪いことに、同じシステムが数分前に非常に似たファイルを正常に圧縮しました。
注:使用しているZLIB.DLLのバージョンは1.1.3です。はい、私は知っている、それはいくつかのセキュリティホールが含まれていると私たちは最新のZLIB 1.2.3にアップグレードする必要がありますが、私はゼロ設定の原因を見つけるまで私のセットアップで何も変更したくないです。
私はメモリの破損を排除したと思います(ところで、どのように壊れたメモリヒープは、出力ストリームに0しか書き込まないのでしょうか?それは妥当でしょうか?)、 ZLIBは私のアプリケーションのDLLよりも別のCライブラリにリンクされているので、問題はあるかもしれませんが、ストリームは単純でストリームはシンプルであり、私は見つけることができます。私はシステム内の他の要素しか疑うことができません。
私はCライブラリ(CRTDLL.DLL)、Win32 API、NTFSスタック、I/Oスタック、低レベルのデバイスドライバ、ハードディスクとハードディスクのファームウェアに自信を持っています。 Visual C++ 2008は、少なくともこの場合、正しいバイナリを生成すると信じる傾向があります。
このように、ウイルス対策ソフトウェアが原因である可能性がありますか?少なくともKasperskyはDLLを潜在的な脅威と認識しているので、ZLIBには注意が必要です。しかし、感染が(間違って)発見された場合、単にアンチウィルスがデータの代わりにゼロを書き込むことは政治的に正しいでしょうか?あるいは、これはウイルス対策のバグでしょうか?
または、私は完全にポイントを逃していますか?
ヒントの場合よりも。私はすべてをダブルチェックしましたが、あなたが正しいと思います。メモリアロケータを置き換えて、問題が生産現場に現れているかどうかを確認するために数週間してください...私はまた、 copy(A/fopen B/fread A/fwrite B/fclose A/fclose B)は適切なサイズのファイルBを生成します。これは、上記の問題が発生した場合にのみ発生します。 –