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

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

Чем он отличается от Статического анализа кода (т. Е. Что он может поймать, что может » не попадать в статику)?

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

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

-Адам


person Adam Davis    schedule 08.09.2008    source источник


Ответы (4)


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

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

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

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

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

Ресурсы

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

person Marcio Aguiar    schedule 08.09.2008

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

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

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

person David Schlosnagle    schedule 08.09.2008

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

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

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

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

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

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

person Ira Baxter    schedule 10.03.2011
comment
Подумайте о добавлении некоторых из этих примеров и объяснений к самому ответу, иначе люди могут посчитать это немного спамом. - person Adam Davis; 10.03.2011

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

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

person David Schmitt    schedule 08.09.2008