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

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

РЕДАКТИРОВАТЬ Как графы вызовов разрешают циклы в статической оценке программы?

2 ответа

Решение

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

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

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

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

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

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

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

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

Другие вопросы по тегам