The Daily WTF на русском
Подписаться
CodeSOD: Я существую
Грета, работая в старой среде разработки на Pascal, столкнулась с ошибкой, из-за которой ее программа сообщала о несуществовании файлов, несмотря на их наличие. Она отследила проблему до функции FileExists из системной библиотеки. Эта функция полагается на FileAge, которая извлекает временную метку последней модификации файла. FileAge, в свою очередь, использует FileTimeToDosDateTime для преобразования форматов времени. Критическая ошибка заключается в том, как FileAge обрабатывает возвращаемое значение FileTimeToDosDateTime. FileTimeToDosDateTime возвращает булево значение для индикации успеха или неудачи и устанавливает код ошибки при неудаче. Однако FileAge не проверяет это булево возвращаемое значение. Если FileTimeToDosDateTime терпит неудачу, FileAge продолжает возвращать -1. Следовательно, FileExists интерпретирует это -1 как отсутствие файла. Первопричиной конкретной ошибки Греты было то, что процесс, записывающий файлы, не устанавливал "время последней записи". Без действительного времени последней записи FileTimeToDosDateTime терпит неудачу, заставляя FileAge возвращать -1, и таким образом FileExists ошибочно сообщает об отсутствии файла. Это подчеркивает распространенную проблему в системных библиотеках, где незначительные ошибки в обработке ошибок приводят к значительным функциональным сбоям.