2010-12-04 2 views
2

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

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

ответ

2

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

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

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

DMS Software Reengineering Toolkit имеет static control/dataflow/points-to/call graph analysis, который применяется к огромным системам (~ ~ 25 миллионов строк) кода C и создает такие графики вызовов. Оборудование для этого довольно сложно, но вы можете найти его в расширенных разделах в литературе компилятора. Я сомневаюсь, что вы хотите реализовать это в Perl.

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

+0

, если я использую исходный код для поиска графа вызовов, как методы анализа кода C в разных файлах. Например, например: - метод A, определенный в файле A и методе B в файле B, как вызывать граф, проходящий через разные файлы? – prap19 2010-12-04 20:38:20

1

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

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

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

+0

будет objdump разборка выход работа вне в этом случае? – prap19 2010-12-04 17:58:10

Смежные вопросы