Какое подмножество проблем не может охватить статический анализ?

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

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

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

Может ли кто-нибудь дать простое объяснение с конкретными примерами того, где статический анализ дает сбой, и динамический анализ будет необходим?

1 ответ

Статический анализ никогда не может быть завершен для всех программ с заданным полным входным форматом Тьюринга (включая почти все языки программирования), так как в общем случае невозможно определить, выполняется ли когда-либо фрагмент кода или нет: вы не можете определить, останавливается ли код перед его остановкой. - т.е. завершает выполнение (если он входит в бесконечный цикл, то любая "проблема" за его пределами является фиктивной, поскольку она недостижима) - проблема, известная как проблема остановки.

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

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

Другие вопросы по тегам