C言語のファイル入出力における50年越しのバグ:レガシーミステリーを解き明かす

2024-12-26

DOSエミュレータの改良中に、開発者はファイル入出力において、一見些細なバグを発見しました。`echo`コマンドでファイルにテキストを追加したところ、予期せぬ結果になったのです。デバッグの結果、Cランタイムライブラリが読み書きの切り替えを処理する方法に欠陥があることが判明しました。この欠陥は、1970年代、さらにはそれ以前のUNIXシステムにまで遡ります。この記事では、初期のK&R Cから現代のC規格まで、歴史的文脈を深く掘り下げ、さまざまなUNIXバージョンとCコンパイラ間の実装の違いを探ります。根本原因は、初期のCライブラリがアップデートモードを処理する際の制限にあると特定され、異なるオペレーティングシステムとコンパイラがこれらの制限をどのように扱ったかという違いが明らかになります。著者は、現在でもポータブルなCコードでは、ファイルの読み書きを切り替える際に、明示的な`fseek`呼び出しが必要であると結論付けています。

続きを読む

DOS APPENDコマンド:古き良き時代と現代の架け橋

2024-12-20

DOS 2.11のソースコードを再構築する際に、著者は課題に直面しました。古いMASM 1.25アセンブラはディレクトリをサポートしておらず、ツリー構造を使用した現代的なファイル構成と衝突しました。単一のディレクトリを避けるために、著者は巧みにDOS APPENDコマンドを使用しました。APPENDはTSR(Terminate and Stay Resident)プログラムであり、ファイルオープンなどのシステムコールをインターセプトし、現在のディレクトリにファイルがない場合、事前に定義されたパスリストを検索します。これにより、MASM 1.25は階層構造内でファイルを見つけることができ、非互換性が解決され、特定のシナリオにおけるAPPENDの驚くべき有用性が強調されました。

続きを読む
開発