суббота, 13 февраля 2010 г.

Важность обратной совместимости кодов ошибок

Это перевод The importance of error code backwards compatibility. Автор: Реймонд Чен.

Я помню баг-отчёт по одной старой программе 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 есть следующие предопределённые описатели файлов:
ОписательИмяЗначение
0stdinстандартный ввод
1stdoutстандартный вывод
2stderrстандартный вывод ошибок
3stdauxстандартный последовательный порт
4stdprnстандартный принтер
Что происходило, когда программа пыталась записать данные на описатель 3?

Она пыталась записать в последовательный порт.

Большинство машин не имеют ничего присоединённого на последовательный порт. Запись останавливалась.

Результат: зависшая программа.

Ребятам, ответственным за файловую систему, пришлось специально менять условия обработки, чтобы функции продолжали возвращать 2 в таких случаях.

1 комментарий:

  1. Чем мне нравятся такие публикации - тем, что они нам кагбэ говорят. Если что-то работает, то это вовсе не означает что оно работает правильно!

    ОтветитьУдалить

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.