Выясните, вызвана ли функция в проекте С++?

Я пытаюсь удалить функции, которые не используются в проекте С++. Со временем он становится раздутым, и я ищу, чтобы удалить функции, которые не используются вообще.

У меня есть все проекты в файле решений в Visual Studio, но я использую cmake, чтобы при необходимости генерировать файлы проекта для другой IDE (поэтому это не помечено visual-studio).

Есть ли что-то подобное? Где он проанализирует источник и скажет, какие функции не вызываются. Я видел, что PC-Lint упоминается в нескольких вопросах здесь, но это, похоже, не делает этого.

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

8 ответов

Используйте __declspec(deprecated) перед объявлением функции, из которого вы хотите избавиться. Это вызовет компиляцию предупреждений, если эта функция фактически используется во время компиляции.


Отличный (и бесплатный) инструмент статического анализа Source Monitor, от http://www.campwoodsw.com/, может подсчитывать количество вызовов на метод, который, как я думаю, вам нужен.

Изменить: Кажется, мой вечер закручивается. Метрика вызовов на самом деле не делает то, что я думал. Тем не менее, SM - отличный инструмент, поэтому я надеюсь, что привлечение внимания людей принесло бы пользу!


Похоже, вам нужен инструмент для покрытия кода. Там есть список из них в статье в википедии.


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

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


Если ваш код достаточно прост, статический анализ может работать. Однако С++ очень контекстно-зависим:/. Поэтому я лично даже не попытался бы найти инструмент в этом районе. По крайней мере, пока CLANG не будет полностью совместим с С++: D

Я надеюсь, что у вас есть модульные тесты, я бы получил визуальную студию для компиляции кода, который генерирует профиль времени выполнения, а затем сфабрирует имена функций (с языком сценариев) из сгенерированного профиля. Если вы включили все приложения (как вручную, так и с помощью модульных тестов) в своем приложении, вы сможете определить наименее используемые (или никогда не используемые) функции. Затем вы можете использовать знак-один глазной яблоко, чтобы обрезать исходную базу.

Нет ничего лучше, чем делать это вручную: D


Если вы хотите динамически знать, какие функции используются, вы можете заставить компилятор (vС++) вставлять крючки callcap, а затем использовать их для выгрузки информации об использовании.

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

См. http://msdn.microsoft.com/en-us/library/ms254291(VS.80).aspx для информации о крючках профиля профиля в visual studio.


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

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


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

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

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

licensed under cc by-sa 3.0 with attribution.