В чем разница между реализацией статического анализа и символьным выполнением?
Статический анализ против символьного выполнения в реализации
Ответы (2)
Статический анализ — это любое автономное вычисление, которое проверяет код и дает заключения о его качестве. Вы можете применить это к исходному коду, к коду виртуальной машины для наборов инструкций виртуальной машины Java/C#/... и даже к двоичному объектному коду. Не существует «одного» статического анализа (хотя классическое управление компилятором и поток данных часто занимают видное место в качестве основного механизма для SA); этот термин в совокупности применяется ко всем типам механизмов, которые могут использоваться в автономном режиме.
Символьное выполнение — это особый вид офлайн-вычислений, который вычисляет некоторое приближение к тому, что на самом деле делает программа, путем построения формул, представляющих состояние программы в различных точках. Он называется «символическим», потому что аппроксимация обычно представляет собой какую-то формулу, включающую программные переменные и ограничения на их значения.
Статический анализ может использовать символьное выполнение и проверять результирующую формулу. Или он может использовать какой-то другой метод (регулярные выражения, классический анализ потока компилятора,...) или некоторую комбинацию. Но статический анализ не обязательно должен использовать символьное выполнение.
Символьное выполнение может использоваться только для демонстрации ожидаемого символьного результата вычисления. Это не статический анализ в соответствии с приведенным выше определением, потому что нет никакого мнения о том, насколько хорош этот результат. Или формула может быть подвергнута анализу, после чего она станет частью статического анализа. С практической точки зрения можно использовать другие методы анализа программы для поддержки символьного выполнения («эта формула для переменной распространяется на то, какое чтение переменной x?» — вопрос, на который обычно хорошо отвечает анализ потока).
Вы можете настаивать на том, что статический анализ — это любое автономное вычисление вашего исходного кода, и в этом случае символьное выполнение является лишь особым случаем. Я не нахожу это определение полезным, потому что оно недостаточно хорошо различает варианты использования.
Мне очень нравится этот слайд из доклада Джулиана Коэна "Современный автоматический анализ программ". Короче говоря, люди любят делить программный анализ на две широкие категории: статический и динамический анализ. Но на самом деле существует широкий спектр методов анализа программ, от статических до динамических, от ручных до полностью автоматических. Символьное выполнение — интересный метод, который находится где-то между статическим и динамическим анализом и обычно применяется как полностью автоматический подход.