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

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

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

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

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

Адам

4 ответов


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

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

  • способен обнаруживать зависимости, которые невозможно обнаружить в статическом анализе. Бывший.: динамические зависимости с использованием отражения, инъекции зависимостей, полиморфизма.
  • может собирать временные информация.
  • имеет дело с реальными входными данными. В ходе статического анализа трудно определить, какие файлы будут переданы в качестве входных, какие веб-запросы придут,какой пользователь нажмет и т.д.

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

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

ресурсы

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


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

из Википедии определение динамической программы анализ:

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


вы попросили хорошее объяснение проблем "проверки границ и анализа памяти".

наши Проверка Безопасности Памяти инструмент инструменты ваше приложение, чтобы смотреть во время выполнения для ошибок доступа к памяти (переполнения буфера, ошибки индекса массива, плохие указатели, аллок/бесплатные ошибки). Ссылка содержит подробное объяснение с примерами.

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

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

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

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


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

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