Я думаю, что ваш вопрос ошибочен. В заголовке написано «Статический анализ исходного кода». Тем не менее, ваша основная причина заключается в построении (части) графа вызовов, включая вызовы через указатель на функцию. Суть указателей на функции заключается в том, что вы не можете знать их значения во время компиляции, то есть в тот момент, когда вы выполняете статический анализ исходного кода. Рассмотрим этот бит кода:
void (*pFoo)() = GetFoo();
pFoo();
Статический анализ кода не может сказать вам, что GetFoo () возвращает во время выполнения, хотя может сказать, что результат впоследствии используется для вызова функции.
Теперь, какие значения может вернуть GetFoo ()? Вы просто не можете сказать это в целом (эквивалентно решению проблемы остановки). Вы сможете угадать несколько тривиальных случаев. Вероятный процент, конечно, возрастет в зависимости от того, сколько усилий вы готовы инвестировать.