Что такое динамический анализ кода? - PullRequest
20 голосов
/ 08 сентября 2008

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

Чем он отличается от Статический анализ кода (то есть, что он может поймать, который не может быть пойман в статическом состоянии)?

Я слышал о проверке границ и анализе памяти - что это?

Какие еще вещи проверяются с помощью динамического анализа?

-Adam

Ответы [ 4 ]

29 голосов
/ 08 сентября 2008

Проще говоря, статический анализ собирает информацию на основе исходного кода , а динамический анализ основан на выполнении системы , часто с использованием контрольно-измерительных приборов.

Преимущества динамического анализа

  • Умеет обнаруживать зависимости, которые невозможно обнаружить при статическом анализе. Пример: динамические зависимости, использующие отражение, внедрение зависимостей, полиморфизм.
  • Может собирать временную информацию.
  • Имеет дело с реальными входными данными. Во время статического анализа трудно или невозможно узнать, какие файлы будут переданы в качестве входных данных, какие веб-запросы будут поступать, какой пользователь нажмет и т. Д.

Недостатки динамического анализа

  • Может отрицательно повлиять на производительность приложения.
  • Невозможно гарантировать полное покрытие исходного кода, так как его выполнение основано на взаимодействии с пользователем или автоматических тестах.

Ресурсы

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

4 голосов
/ 08 сентября 2008

По сути, вы применяете свой код для анализа вашего программного обеспечения во время его работы (динамический), а не просто для анализа программного обеспечения без запуска (статический). Также посмотрите эту презентацию JavaOne, сравнивающую две . Valgrind является одним из примеров инструментов динамического анализа для C. Вы также можете использовать такие инструменты покрытия кода, как Cobertura или EMMA для анализа Java.

Из определения 1011 * динамического анализа программы из Википедии :

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

2 голосов
/ 10 марта 2011

Вы попросили дать хорошее объяснение проблем «проверки границ и анализа памяти».

Наш инструмент проверки безопасности памяти позволяет вашему приложению отслеживать во время выполнения ошибки доступа к памяти (переполнения буфера, ошибки индексации массива, неверные указатели, ошибки выделения / освобождения). Ссылка содержит подробное объяснение с примерами. В этом ответе SO показаны две программы, которые имеют указатели на фрейм стека и как CheckPointer обнаруживает и сообщает об ошибке в исходном коде

Более короткий пример: C (и C ++) печально не проверяют доступ к массивам, чтобы увидеть, находится ли доступ внутри границ массива. Преимущество: хорошо продуманная программа не оплачивает такую ​​проверку в режиме производства. Недостаток: ошибочные программы могут касаться вещей вне массива, и это может вызвать поведение, которое очень трудно понять; таким образом, глючная программа сложна для отладки.

То, что делает инструмент динамического инструментария, например, средство проверки безопасности памяти, связывает некоторые метаданные с каждым указателем (например, тип объекта, на который «указывает» указатель, и, если это массив, границы массива), и затем проверьте во время выполнения любые обращения через указатели на массивы, нарушена ли граница массива. Инструмент изменяет исходную программу для сбора метаданных, в которых они генерируются (например, при входе в области, в которых объявляются массивы, или в результате операции malloc и т. Д.), И изменяет программу при каждой ссылке на массив (записывается как как x [y], где x или y - указатель массива, а значение - некоторый тип целочисленного типа, аналогично * (x + y)!) для проверки доступа. Теперь, если программа запускается и выполняет доступ вне пределов, проверка перехватывает ошибку и сообщает о том, где она может быть обнаружена. [Если вы подумаете об этом, вы поймете, что инструментарий для сбора метаданных и проверки должен быть довольно умным, чтобы справляться со всеми вариантами, которые может иметь язык, подобный Си. На самом деле трудно сделать эту работу полностью).

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

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

1 голос
/ 08 сентября 2008

Проверка границ

Это означает, что во время выполнения проверяется доступ к массиву. В противоположность подходу C laissez-faire к доступу к памяти и арифметике указателей, другие языки, такие как Java или C #, фактически проверяют, есть ли у данного массива элемент, к которому каждый пытается получить доступ.

...