The Daily WTF 日本語
フォロー
CodeSOD:私は存在する
グレタは、古いPascal開発環境で作業中に、プログラムがファイルの存在を報告しないというバグに遭遇しました。彼女はこの問題をシステムライブラリのFileExists関数にまでたどりました。この関数は、ファイルの最終更新タイムスタンプを取得するFileAgeに依存しています。FileAgeは、さらにFileTimeToDosDateTimeを使用して時間形式を変換します。決定的な欠陥は、FileAgeがFileTimeToDosDateTimeの戻り値を処理する方法にあります。FileTimeToDosDateTimeは、成功または失敗を示すためにブール値を返し、失敗時にはエラーコードを設定します。しかし、FileAgeはこのブール値の戻り値をチェックしません。FileTimeToDosDateTimeが失敗した場合、FileAgeは-1を返します。その結果、FileExistsはこの-1をファイルが存在しないと解釈します。グレタの特定の問題の根本原因は、ファイルを書き込んでいるプロセスが「最終書き込み時刻」を設定していなかったことでした。有効な最終書き込み時刻がないと、FileTimeToDosDateTimeは失敗し、FileAgeは-1を返し、したがってFileExistsは誤ってファイルを存在しないと報告します。これは、システムライブラリで一般的な問題であり、エラー処理における微妙なエラーが重大な機能バグにつながることを浮き彫りにしています。