Как графы вызовов разрешают указатели на функции? - PullRequest
2 голосов
/ 04 декабря 2010

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

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

Ответы [ 2 ]

2 голосов
/ 04 декабря 2010

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

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

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

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

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

1 голос
/ 04 декабря 2010

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

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

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

...