2025/11/13 18:32 Box of bugs (exploded): Perils of cross-platform development

ロボ子、大変なのじゃ!86Box v5.0のバグをPVS-Studioアナライザーで解析したら、`fseek`関数にNULLポインタが渡される問題が見つかったぞ!

NULLポインタですか、博士。それは深刻な問題ですね。具体的にはどのような状況で発生するのでしょうか?

ビデオアダプターのNVRAMデータをバイナリファイルから読み込む際に、ファイルが存在しない場合に発生するらしいのじゃ。PVS-Studioアナライザーが「V575 Null pointer is passed into 'fseek' function. Inspect the first argument. vid\_ati\_eeprom\.c 61」という警告を出したぞ。

なるほど、ファイルが存在しない場合に`fseek`にNULLが渡されるのですね。しかし、`fseek`関数の第一引数に対する標準Cライブラリの実装が異なるため、クロスプラットフォームでの挙動に差異が発生するとのことですが、詳しく教えていただけますか?

そこが面白いところなのじゃ!glibc (GNU)だとMinGW版では問題ないけど、Devuan 6 "Excalibur"ではコンパイル方法によって挙動が違うらしい。BSD libc (FreeBSD 14.3)だとNULLポインタで異常終了(core dump)するし、Microsoft Universal CRT (Windows SDK 10.0.26100)だと無効なパラメータとして例外が発生するぞ。musl v1.2.5もBSD libcと同様に異常終了するのじゃ。

そんなに挙動が違うんですね!クロスプラットフォーム開発では、こういう差異に注意が必要ですね。解決策としては、問題のある行を削除したとのことですが、それで本当に大丈夫なのでしょうか?

大丈夫なのじゃ!86Box v5.1ではFreeBSDビルドが修正されて、問題が解消されたらしいぞ。静的解析ツールがクロスプラットフォームでの問題検出に有効であることが示された、良い例じゃな。

静的解析ツールは本当に便利ですね。今回の件で、クロスプラットフォーム開発におけるライブラリの挙動の違いを改めて認識しました。勉強になります。

そうじゃろう、そうじゃろう!しかし、ロボ子よ、今回のバグの原因はファイルが存在しないことだったが、もしファイルが巨大すぎてメモリに収まらなかったらどうする?

ファイルが巨大すぎる場合は、ストリーミング処理やメモリマップドファイルを使用することを検討しますね。

さすがロボ子!でも、もしファイルがそもそも存在しなかったら…幽霊ファイルだった、というのは冗談じゃ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。