Что такое статический анализ кода?

Есть много вариантов статического анализа, и это горячая тема, поэтому:

Что такое статический анализ?

Когда вы должны его использовать, а когда не следует использовать?

Каковы потенциальные ошибки в отношении правильного и неправильного использования / применения статического анализа?

Какие языки не имеют хорошего инструмента статического анализа, и что вы делаете, если у вас нет возможности автоматического анализа?

-Адам

7 ответов

Решение

Что такое статический анализ?

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

Когда вы должны его использовать, а когда не следует использовать?

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

Каковы потенциальные ошибки в отношении правильного и неправильного использования / применения статического анализа?

При использовании инструментов статического анализа возникают две распространенные патологии:

  1. Инструмент производит ложные предупреждения / ошибки, которые разработчики не могут заставить замолчать. В конце концов, большинство предупреждений являются ложными, и разработчики перестают обращать внимание на вывод. Вот почему многие команды требуют, чтобы этот код компилировался корректно. Если разработчикам будет удобно игнорировать предупреждения компилятора, фаза компиляции будет в конечном итоге заполнена предупреждением, на которое никто никогда не обращает внимания, даже если они могут быть ошибками.

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

Какие языки не имеют хорошего инструмента статического анализа, и что вы делаете, если у вас нет возможности автоматического анализа?

По ряду причин многие из динамических языков (ruby, python, perl) не имеют инструментов статического анализа, которые были бы столь же сильны, как те, что доступны в статических языках. Стандартный метод поиска ошибок и проверки работоспособности кода на динамических языках - это модульные тесты, которые помогают укрепить уверенность в том, что код действительно работает (подсказка: Chris Conway).

Что такое статический анализ?

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

Каковы потенциальные ошибки в отношении правильного и неправильного использования / применения статического анализа?

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

Когда вы должны его использовать, а когда не следует использовать?

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

Вот пример статического анализа с использованием символьного выполнения, где ключевой идеей является обобщение тестирования с использованием неизвестных символических переменных в оценке, где мы отслеживаем символические состояния. Если путь выполнения зависит от неизвестного, мы форкаем символьного исполнителя. Во время символического выполнения мы пытаемся определить, являются ли определенные формулы выполнимыми (например, достижима ли конкретная точка программы, есть ли доступ к массиву A[i] за пределами границ? И т. Д.).

int a = α, b = β, c = γ;
// symbolic
int x = 0, y = 0, z = 0;
if (a) {
   x = -2;
}
if (b < 5) {
   if (!a && c) { y = 1; }
   z = 2;
}
assert(x+y+z!=3)

И анализ этого простого примера кода: Статический анализ кода

Вот некоторые полезные ссылки для решателей SMT/SAT, которые используются для статического анализа кода:

SAT-решение, SMT-решение и проверка программ

Список инструментов для статического анализа кода

Символическое выполнение, SAT-решение, SMT-решение и проверка программ

Символическое исполнение Гарвард CS252r

Статический анализ ищет исходный код для потенциальных проблем. Он называется статическим, потому что код не выполняется для поиска проблем, источник анализируется аналитически.

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

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

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

  • FindBugs (Java)
  • FXCop (.NET)
  • PyLint (Python)

Я могу рекомендовать их все.

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

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

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

int x, y;
...
x = x / (x - y);

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

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

Помимо обнаружения ошибок в вашем коде (таких как гарантированная разыменование нулевого указателя, бесконечные циклы и т. Д.), Для анализа безопасности кода можно использовать статический анализ. Я очень рекомендую посмотреть презентацию "Безопасное программирование со статическим анализом" от Brian Chess of Fortify.

Проверьте http://www.ouncelabs.com/ если вы ищете инструмент корпоративного класса.

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