Вопрос

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

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

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

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

-Адам

Это было полезно?

Решение

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

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

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

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

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

Ресурсы

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top