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

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

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

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

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

-Адам

4 ответа

Решение

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

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

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

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

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

Ресурсы

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

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам