Я помню баг-отчёт по одной старой программе MS-DOS (от компании, которая ещё ведёт дела, так что не просите меня назвать их) о том, что она пыталась открыть файл "". Это файл без имени.
Эта попытка возвращала ошибку номер 2 (file not found - файл не найден). Но программа не проверяла этот код ошибки и считала, что это был описатель файла (при. пер.: как указано в предыдущем посте, функции MS-DOS возвращали коды ошибки так же, как и результат выполнения функции: в регистре AX; признак ошибки устанавливался отдельно, флагом CF). Поэтому дальше она продолжала писать данные в дескриптор 2. В итоге данные оказывались выведенными на экран, потому что дескриптор 2 является описателем стандартного вывода ошибок, который по-умолчанию идёт на экран.
Так получалось, что эта программа изначально хотела выводить на экран при пустом имени файла.
Другими словами, она работала исключительно случайно.
Из-за различных внутренних изменений файловой системы в Windows 95, код ошибки при открытии файла без имени поменялся с 2 (file not found) на 3 (path not found - путь не найден).
Посмотрим, что произошло.
Программа пыталась открыть файл "". Теперь она получала 3, как результат вызова функции открытия файла. Она ошибочно принимала его за файловый описатель и пыталась в него писать.
Но что такое описатель 3?
В MS-DOS есть следующие предопределённые описатели файлов:
Описатель | Имя | Значение |
---|---|---|
0 | stdin | стандартный ввод |
1 | stdout | стандартный вывод |
2 | stderr | стандартный вывод ошибок |
3 | stdaux | стандартный последовательный порт |
4 | stdprn | стандартный принтер |
Она пыталась записать в последовательный порт.
Большинство машин не имеют ничего присоединённого на последовательный порт. Запись останавливалась.
Результат: зависшая программа.
Ребятам, ответственным за файловую систему, пришлось специально менять условия обработки, чтобы функции продолжали возвращать 2 в таких случаях.
Чем мне нравятся такие публикации - тем, что они нам кагбэ говорят. Если что-то работает, то это вовсе не означает что оно работает правильно!
ОтветитьУдалить