私はgiflibを使用しています。以前のファイルを閉じる前に新しいファイルを開くと、すべての地獄が緩んでしまうことが発見されました。giflib 5.1.2はスレッドセーフではありませんか?
- DGifOpen(ファイルA)
- DGifSlurp(ファイルA)
- DGifOpen(ファイルB)
- DGifSlurp(ファイルB) - 顕著であるD_GIF_ERR_READ_FAILED
で失敗し、以降私は、すべての読み取りが成功し、要求されたバイト数を返すカスタム読み取り関数で確認できます。
しかし...
- DGifOpen(ファイルA)
- DGifSlurp(ファイルA)
- DGifClose(ファイルA)
- DGifOpen(ファイルB)
- DGifSlurp(ファイルB ) - 作品!
ドキュメントには、giflibはre-entrant and thread-safe
と記載されています。
開いているファイルが複数ある場合、どうして問題になりますか? GifFileTypeはすべての状態をカプセル化する必要があります。 giflibが安全に悪質な入力ファイルを処理するためのものであるか、それはそのシナリオのための間違ったツールです。そしてそこに、ファイルAとファイルB
更新&関連する質問に対するユーザ側のデータ構造の間に重複がないのですか?私はテストシステムでvalgrindの自動使用は見られませんし、プロジェクトのCIサーバーを見つけることができないようです。
更新:これは、重複ファイルとは何の関係もありませんが、むしろヒープがゼロになるときgiflib 5.1.2にのみ動作することを事実と - 未初期化は失敗を引き起こしている読み込みます。重複した読み取りは、それをトリガーする単なる方法でした。
は、ダウンロードgiflib 5.1.2、複製、および- 実行
./autogen.sh
- 実行
make check
- その後
cd util && cat ../pic/porsche.gif | valgrind .libs/lt-gifsponge
- ウォッチvalgrindの初期化されていない読み取りを報告します。
ありがとうございました!私は失敗したテストを設定しようとしています。 –
ヒープの破損が関わっているように見えるので、giflibのせいかもしれません。ちょうど偶然です。特定のテストスイートでは特定の順序で100%反復可能ですが、他の場所では繰り返されません。 –
実際にはヒープ破損はありません。 →DGifSetupDecompress、DGifGetImageDesc、DGifSlurpの「条件付きジャンプまたは移動は初期化されていない値に依存します。 –