CodeSOD:我存在 笔记

CodeSOD:我存在

Greta 在一个古老的 Pascal 开发环境中遇到一个 bug:她的程序报告某些文件不存在,尽管这些文件实际存在。她将该问题追踪至系统库中的 FileExists 函数。该函数依赖于 FileAge,后者用于获取文件的最后修改时间戳。FileAge 又调用 FileTimeToDosDateTime 来转换时间格式。关键缺陷在于 FileAge 对 FileTimeToDosDateTime 返回值的处理方式。FileTimeToDosDateTime 返回一个布尔值以指示成功或失败,并在失败时设置错误代码。然而,FileAge 并未检查该布尔返回值。如果 FileTimeToDosDateTime 失败,FileAge 仍会返回 -1。因此,FileExists 将 -1 解释为文件不存在。Greta 所遇特定 bug 的根本原因是写入文件的进程未设置“最后写入时间”。由于缺乏有效的最后写入时间,FileTimeToDosDateTime 调用失败,导致 FileAge 返回 -1,从而使 FileExists 错误地报告文件不存在。这凸显了系统库中一个常见问题:细微的错误处理缺陷可能导致严重的功能 bug。