9.4. Качество кода
171
реакторе? Или о парашютисте, который одевает запасной парашют на тре-
нировках, но снимает его, когда выпрыгивает из самолета? Зачем кому-то
вообще понадобилось отключать проверку утверждений в готовом продук-
те — ведь это, по сути, единственное место, где она нужна? Если в процессе
функционирования реальной системы произойдет нарушение утверждения,
мы всего-навсего получим ошибку программирования. Игнорирование ошиб-
ки, в свою очередь, может привести (и, скорее всего, приведет) к выдаче
неверного ответа, потому что по крайней мере одно предположение, сделан-
ное кодом, будет неправильным. Выдача неверных ответов — это, пожалуй,
худшее, что может сделать программа. Гораздо лучше проинформировать
пользователя о возникновении ошибки программирования, чтобы он не дове-
рял ошибочным результатам, выданным программой. Никогда не отключайте
проверку ошибок!
9.4.4
Переполнение буфера
Современной IT-индустрии должно быть стыдно за появление в нашей
книге раздела с таким заголовком.
Проблемы переполнения буферов пресле-
дуют нас на протяжении уже 40 лет. Все это время в мире существовали
и решения для борьбы с ними. Некоторые из ранних языков программиро-
вания высокого уровня, например Algol 60, полностью решали эту проблему
путем введения обязательной проверки границ массива. К сожалению, даже
несмотря на наличие массы поистине замечательных решений, переполнение
буферов до сих пор является причиной более половины всех
проблем безопас-
ности, возникающих в Internet. Устранять же эти
проблемы никто не собира-
ется. Мы считаем это преступной халатностью. Что бы мы подумали, если бы
производитель автомобилей сделал бензобак из оберточной бумаги? Конечно
же, при определенной доле везения машина могла бы прекрасно ездить и с та-
ким бензобаком, но руководство компании-производителя все равно угодило
бы за решетку. Между тем целые отрасли IT-индустрии ведут себя так, буд-
то не являются ответственными за последствия своих действий. (Возможно,
наши юристы разрешают им свободно отказываться от своих обязательств,
что было бы неприемлемо в любой другой области.) Наблюдая подобное от-
ношение к программному обеспечению, мы часто задумываемся: а стоит ли
вообще пытаться внедрять что-нибудь такое сложное, как криптография?
К сожалению, мы не в состоянии изменить текущее положение дел. Мы
можем лишь посоветовать вам, как написать хороший криптографический
код. Откажитесь от языков программирования, которые допускают перепол-
нение буфера. В частности, не используйте C или C++. И никогда не от-
ключайте проверку границ массива, какой бы язык вы не использовали. Это,