как графики вызовов разрешают указатели функций?


Я реализую программу call graph для C, используя сценарий perl. Интересно, как разрешить графики вызовов для указателей функций с помощью вывода 'objdump'? Как различные приложения графа вызовов разрешают указатели функций? Разрешаются ли указатели функций во время выполнения или они могут быть выполнены статически?

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

2 2

2 ответа:

Легко построить граф вызовов A-calls-B, когда оператор вызова явно упоминает B. Как вы заметили, гораздо сложнее обрабатывать косвенные вызовы.

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

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

Нашинструментарий реинжиниринга программного обеспечения DMS имеетстатический контроль/поток данных/анализ графов точек/вызовов , который был применен к огромным системам (~~25 миллионов строк) кода C и произвел такие графики вызовов. Механизм для этого есть является довольно сложный,но вы можете найти его в расширенных разделах в литературе компилятора. Я сомневаюсь, что вы хотите реализовать это в Perl.

Это проще, когда у вас есть исходный код, потому что вы, по крайней мере, достоверно знаете, что является кодом, а что нет. Вы пытаетесь сделать это на объектном коде, что означает, что вы даже не можете удалить данные.

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

Однако вы можете посмотреть на все функции, которые можно вызвать, и, возможно, показать их каким-то образом. Часто обратные вызовы имеют достаточно уникальную подпись (не всегда).

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