инструмент для определения того, какие функции могут в конечном итоге вызвать вызов (списка) функций низкого уровня - PullRequest
4 голосов
/ 14 декабря 2011

У меня очень большая программа на C ++, в которой определенные низкоуровневые функции следует вызывать только из определенного контекста или при принятии определенных мер предосторожности. Я ищу инструмент, который показывает мне, какие из этих функций низкого уровня вызываются функциями более высокого уровня. Я бы предпочел, чтобы это было видно в IDE с некоторыми выпадающими списками или надписями, возможно, в выводе с аннотированным источником, но любой более простой метод, чем ручной поиск в графе вызовов, поможет.

Это проблема статического анализа, и мне не помогает профилировщик.

Я в основном работаю на Mac, с Linux все в порядке, и если что-то доступно только в Windows, я могу с этим смириться.

Обновление

Просто наличие графа вызовов не делает его намного быстрее, чтобы ответить на вопрос, "действительно ли foo () может вызвать вызов x () y () или z ()". (или я что-то упускаю из-за инструментов графа вызовов, возможно, мне нужно написать программу, которая обходит ее, чтобы найти решение?)

Ответы [ 2 ]

1 голос
/ 14 декабря 2011

Инструмент Scientific Toolworks "Понимаю" * Инструмент 1002 * должен иметь возможность создавать графики вызовов для C и C ++.

Doxygen также предположительно создает графы вызовов.

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

У меня есть опыт построения достаточно точных графиков вызовов для массивных систем C (25 миллионов строк) с 250000 функций.

Одна проблема, с которой я сталкиваюсь при построении реалистичного графа вызовов, - это косвенные вызовы функций, а для C ++ - перегруженные вызовы функций методов. В больших системах их много. Чтобы определить, что вызывается при вызове FOO, вашему инструменту необходимо глубоко семантическое понимание того, как компилятор / язык разрешает перегруженный вызов, и для косвенных вызовов функций - достаточно точное определение того, на что может указывать указатель функции. в большой системе. Если вы не понимаете это правильно, ваш график вызовов будет содержать много ложных срабатываний (например, фиктивные утверждения о вызовах А из-за А), а ложные срабатывания в масштабе - это катастрофа.

Для C ++ у вас должно быть то, что составляет полный интерфейс компилятора. Ни в Understand, ни в Doxygen этого нет, поэтому я не понимаю, как они на самом деле могут понять правила C ++ по перегрузке / поиску Кенига. Ни Understand, ни Doxygen не предпринимают никаких попыток рассуждать о косвенных вызовах функций.

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

У нас есть точный интерфейс на языке C ++ , и он правильно решает проблему перегрузки (в той мере, в какой с этим согласен комитет C ++, и мы понимаем, что они сказали и что делают отдельные компиляторы [они не всегда согласны]), и у нас есть что-то вроде Doxygen, которое показывает эту информацию. В настоящее время у нас нет анализа указателей на функции для C ++, но мы работаем над этим (у нас есть потоковые графы полного управления в методах, и это большой шаг).

Я понимаю, CLANG имеет некоторую опцию для вычисления графиков вызовов, и я ожидаю, что она будет точной при перегрузках, поскольку Clang по сути является компилятором C ++, реализованным с помощью набора компонентов. Я не знаю, что, если что-то делает Кланг, чтобы анализировать указатели функций.

1 голос
/ 14 декабря 2011

Существует Clang Static Analyzer , который использует LLVM, который также должен присутствовать в OS X. На самом деле я считаю, что это интегрировано в Xcode.В любом случае, существует графический интерфейс.

Кроме того, есть несколько LLVM проходов , где вы можете генерировать графики вызовов, но я не уверен, что это то, что вам нужно.

...