О надёжности компьютерного программного обеспечения (original) (raw)

Программизм сейчас создаёт настолько сложные программные продукты, что в их надёжности уже невозможно быть уверенным. Программные дефекты Microsoft Windows стали притчей во языцех, но никакой сколько-нибудь серьёзный программный продукт не может гарантировать, что в нём нет дефектов. По этому поводу шуточная программистская аксиома гласит: "В каждой программе есть по крайней мере одна ошибка." Да и почти у всех приборов есть сзади дырочка, куда нужно засунуть шпильку и сбросить состояние прибора к исходному тогда, когда его программное обеспечение отчаялось выйти из тупика, куда его завели программные дефекты. По этой же причине производители выпускают "сырые" программные продукты с перспективой их периодического обновления, так как полностью их испытать в мириадах сценариев очень часто невозможно или, по крайней мере, непрактично, поскольку очень трудоёмко и никогда не даёт гарантии.

А сейчас я наткнулся на интересное, по существу, признание о том, что некоторые широко распространённые программистские практики считаются слишком рискованными, чтобы их можно было применять в системах, требующих высочайшей надежности:

Besides, I was trained to never use the heap/malloc in embedded systems. Most coding standards for critical aerospace systems http://www2.research.att.com/~bs/JSF-AV-rules.pdf 1 and motor vehicle coding standards like MISRA have statements like this:

MISRA C++ rule 18-4-1, dynamic heap memory allocation cannot be used.

Здесь, по существу, говорится, что динамическое выделение оперативной памяти (RAM) запрещено в аэрокосмических системах и в программном обеспечении автомобилей, а такое выделение -- краеугольный камень пресловутого объектно-ориентированного программирования, например, на языках вроде C++. Проблема с динамическим выделением памяти, то есть с ситуацией, когда программный код сам вычисляет, сколько дополнительной памяти ему требуется в данный момент, состоит в том, что невозможно оценить тот максимум потребной памяти, которая может быть запрошена в процессе исполнения программы, а этот максимум может превысить доступную память, что приведёт к аварийному -- неуправляемому и неисправляемому -- состоянию программы.

Другая проблема с динамическим выделением памяти -- так называемая "утечка памяти", когда процессы занимают память как бы на время, но "забывают" её освобождать, создавая растущее количество сегментов "мертвой" памяти, то есть памяти, выключенной из оборота, что, в свою очередь, может привести к аварийному останову из-за недостатка доступной памяти. Кстати, я сейчас пишу это в браузере Firefox, который с течением времени занимает всё больше и больше памяти, доходя до гигабайтов, что, как минимум, может сильно замедлить другие процессы.