Анализ программы


В информатике анализ программ [1] — это процесс автоматического анализа поведения компьютерных программ относительно таких свойств, как правильность, надежность, безопасность и живучесть . Анализ программы фокусируется на двух основных областях: оптимизации программы и корректности программы . Первый фокусируется на повышении производительности программы при одновременном сокращении использования ресурсов, а второй фокусируется на обеспечении того, чтобы программа делала то, что должна делать.

Анализ программы может выполняться без выполнения программы ( статический анализ программы ), во время выполнения ( динамический анализ программы ) или в сочетании того и другого.

Что касается корректности программы, статический анализ может обнаружить уязвимости на этапе разработки программы. [2] Эти уязвимости легче исправить, чем обнаруженные на этапе тестирования, поскольку статический анализ позволяет выявить корень уязвимости.

Поскольку многие формы статического анализа неразрешимы с вычислительной точки зрения, механизмы его выполнения не всегда завершаются правильным ответом – либо потому, что они иногда возвращают ложный отрицательный результат («проблем не обнаружено», когда в коде действительно есть проблемы), либо ложное срабатывание или потому, что они никогда не возвращают неправильный ответ, но иногда никогда не завершаются. Несмотря на свои ограничения, первый тип механизмов может уменьшить количество уязвимостей, тогда как второй иногда может дать надежную гарантию отсутствия определенного класса уязвимостей.

Неправильные оптимизации крайне нежелательны. Итак, в контексте оптимизации программы существует две основные стратегии обработки вычислительно неразрешимого анализа:

Однако существует и третья стратегия, которая иногда применима для языков, которые не определены полностью, например C. Оптимизирующий компилятор может генерировать код, который во время выполнения делает что угодно (даже аварийно завершает работу), если он встречает исходный код, семантика которого не определена используемым стандартом языка.