Легко построить граф вызовов A-Call-B, когда в операторе вызова явно упоминается B. Как вы заметили, гораздо труднее обрабатывать косвенные вызовы.
Хорошо инструменты статического анализа формируют оценки содержимого переменных-указателей путем распространения назначений / копий / арифметики указателей по потокам данных программы (между и внутрипроцедурными ["глобальными"]) с использованием различных схем, часто консервативных ("вы получаетеслишком много ").
Без такой оценки вы не можете иметь никакого представления о том, что содержит указатель, и поэтому просто не можете сделать полезный прогноз (ну, вы можете использовать окончательную консервативную оценку, что он пойдет куда угодно, ноЯ думаю, что вы уже отклонили это решение).
Наш инструментарий реинжиниринга программного обеспечения DMS имеет статический контроль / поток данных / анализ точек / вызовов графика , который применяется к огромным системам (~ ~ 25 миллионов строк)кода C, и создал такие графы вызовов.Механизм для этого довольно сложный, но вы можете найти его в продвинутых темах литературы по компилятору.Я сомневаюсь, что вы хотите реализовать это в Perl.
Это проще, когда у вас есть исходный код, потому что вы хотя бы надежно знаете, что такое код, а что нет.Вы пытаетесь сделать это с помощью объектного кода, что означает, что вы даже не можете удалить данные.