|
|
|
| /* Русский Вариант */ |
| « Бессмысленность | Пожалуйста, переверните на страницу F% » |
Билл С. написал, чтобы поделиться с нами фрагментом кода из одной древней биллинговой системы, которая используется по сей день...
Моим первым заданием было исправление ошибки 2000-го года в биллинге. К счастью руководство предоставило нам для этого прорву времени - целых два месяца.
Хорошие новости заключались в том, что там не так уж много всего надо было сделать. На самом деле так мало, что я решил попробовать исправить спонтанно возникающую в системе ошибку. Она гласила "Ошибка в налоговой ставке. Программа завершается."
Биллинг изначально был перенесен с COBOL-а на C и мог компилироваться только при помощи Borland 4.5. И это было только одной из его многочисленных специфических функций. Другая особенность заключалась в том, что, так как приложение было переписано с COBOL-а, большинство переменных были глобальными, а все файлы и память инициализировались вначале работы программы и закрывались по её завершении.
Я выяснил, что налоговая ставка берется из конфигурационного файла и используется в приложении всего в одном месте. Вот фрагмент из начала программы:
vtaxrate = valf(buf); vtaxrate /= 100.00000;А вот основной цикл работы программы (по каким-то неведомым причинам это бесконечный цикл for):
for (;;) { ... if (vtaxrate != 0.06) { cputs("Ошибка в налоговой ставке. Программа завершается."); exit(0); } taxtot = (invtot + reimbtot) * vtaxrate; ... }Сначала я подумал, что это противоестественно, проверять переменную, которая читается из конфигурационного файла и теоретически не должна изменяться. Все остальные "кофигурируемые" ставки проверялись аналогичным способом. Очевидно, они все же каким-то образом изменялись.
В ходе дальнейшего расследования выяснилось, что, так как все сущее создавалось в самом начале, оно сразу же занимало 50 Кб драгоценной кучи. Borland 4.5 (при medium модели памяти) выделяет для кучи и стека 64 Кб памяти. Стек начинается сверху и спускается вниз, в то время как куча начинается снизу. В какой-то момент стек переписывает часть данных в куче, а программисты обнаружили, что налоговая ставка изменяется. Отсюда и проверка.
Когда я спросил, что же мне с этим делать, руководство просто ответило: "Оно проработало десять лет, и лучше ничего не трогать". Поэтому я исправил ошибку 2000-го года, перекомпилировал программу и установил заново.
Даже сегодня если мы получаем эту "налоговую ошибку", мы просто скрещиваем пальцы и перезапускаем приложение. Довольно любопытно, но обычно ошибка не повторяется. Конечно, никто не знает, какие еще значения изменяются в куче, но хотя бы программа не вылетает с "налоговой ошибкой".
Оригинал:http://worsethanfailure.com/Articles/Unconfigurables-Configurables.aspx
| « Бессмысленность | Пожалуйста, переверните на страницу F% » |