2008-09-08 5 views
57

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

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

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

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

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

-Adam

ответ

84

What is static analysis?

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

When should you use it, and when shouldn't it be used?

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

What are potential gotchas regarding proper and improper usage/application of static analysis?

Два распространенных патологий возникают при использовании статического анализа:

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

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

Any languages that don't have a good static analysis tool, and what do you do when you don't have an option for automated analysis?

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

+6

«блок-тесты, которые (теоретически) доказывают, что код действительно работает». Не быть педантом (о, хорошо, быть педантом), модульные тесты не «доказывают» что-либо, даже «теоретически». Тесты укрепляют уверенность в правильности, но они не могут охватить каждое поведение – 2008-09-08 14:16:20

+1

«они должны быть интегрированы в процесс сборки». Однако, отладка и выпуск сборок, или тот или другой? – 2009-09-01 15:23:38

+1

@ChrisConway Untrue; если вы используете систематические доказательства или условия до/после, чтобы сузить данную частичную или общую функцию вниз, вы можете использовать модульные тесты для исчерпывающего доказательства этих случаев (и, следовательно, иметь индуктивное доказательство того, что код выполняет то, что он говорит). Хотя это непросто для многих крупных или стоящих функций, это, безусловно, возможно, как теоретически, так и практически. – Alice 2014-08-11 01:15:40

2

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

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

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

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

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

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

0

В дополнение к поиску ошибок в вашем коде (например, гарантированное разубеждение нулевого указателя, бесконечные циклы и т. Д.), Статический анализ может использоваться для анализа безопасности кода. Я очень рекомендую посмотреть презентацию "Secure Programming with Static Analysis" от Brian Chess of Fortify.

1

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

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

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

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

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

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

19

What is static analysis?

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

What are potential gotchas regarding proper and improper usage/application of static analysis?

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

When should you use it, and when shouldn't it be used?

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

Вот пример статического анализа с использованием символического исполнения, где ключевая идея заключается в обобщении тестирования с использованием неизвестных символических переменных в где мы отслеживаем символические состояния. Если путь выполнения зависит от неизвестного, мы выполняем символический исполнитель. Во время символического выполнения мы пытаемся определить, являются ли определенные формулы выполнимыми (например, какая-то конкретная точка программы достижима, является ли доступ к массиву 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) 

И анализ этого простого примера кода: Static code Analysis

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

SAT solving, SMT solving and Program Verification

List of tools for Static Code Analysis

Symbolic Execution, SAT solving, SMT solving and Program Verification

Symbolic Execution Harvard CS252r

Смежные вопросы