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