Какие проблемы расшифровывает статический анализ графика вызовов?

#fxcop #call-graph #static-code-analysis

#fxcop #вызов-график #статический анализ кода

Вопрос:

Какие проблемы можно было бы надеяться обнаружить, используя статический анализ графика вызовов в программе? FxCop использует статический анализ графика вызовов, какие проблемы он обнаруживает, используя этот метод?

http://msdn.microsoft.com/library/bb429476.aspx
http://en.wikipedia.org/wiki/Callgraph

Прошу прощения за недостаток знаний, я нашел некоторую информацию через Google, но боюсь, что она значительно неполная. Спасибо!

Ответ №1:

Сам по себе график вызовов именно такой; «неправильных» графиков вызовов не существует (если только у вас нет проверки стиля, запрещающей рекурсию).

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

Это приводит ко второй проблеме: как получить точный график вызовов? Если у вас есть прямой вызов B из A, легко записать «A вызывает B» и почувствовать, что это точный факт, связанный с графиком вызовов. Но если A выполняет вызов через косвенный указатель (можете ли вы сказать, отправку виртуальным методом?) внезапно становится не совсем ясно, кому звонит A; в итоге получается A-might-call-B1, A-might-call-B2, … Какой из них A на самом деле вызывает, на самом деле зависит от контекста, в котором A выполняется … упс, вам нужен график вызовов для создания графика вызовов. Хорошей новостью является то, что вы строите график вызовов снизу вверх: «Я знаю, что это, безусловно, верно, так что это, безусловно, должно быть правдой». В тех местах, где анализатор не может это выяснить, он обычно делает осторожное предположение: («Все эти вызовы могут быть возможными, я не могу их исключить»). Этот консерватизм является одной из ключевых причин точности вашего статического анализатора.

Ответ №2:

Это то, что я нашел:

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

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

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