Список функций C/С++ (анализ кода в Unix)

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

Вот общий пример того, как он может помочь. Чтобы найти определение функции PHP, которое меня интересует, я могу ввести ее в командной строке:

grep -r "function myfunc" .

Это может быть очень быстро адаптировано к C или С++, если мы знаем тип возвращаемого значения, но все усложняется, если, скажем, я хочу перечислить каждый метод, который предоставляет мой класс:

grep "function " ./src/mine.class.php

Так как нет единственного ключевого слова, которое обозначает функцию или метод в С++ и потому что это обычно более сложный синтаксис, я думаю, мне нужен какой-то инструмент для анализа статического кода, умное использование препроцессора C или слепая вера, которую следовал кодер строгие правила кода (# пробелов, положение колючек и т.д.), чтобы получить такие результаты.

Что вы порекомендовали бы?

Ответ 1

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

Doxygen

Ответ 2

Exuberant Ctags http://ctags.sourceforge.net/

Я использовал его время от времени некоторое время назад и из текстового редактора, но ознакомьтесь со списком утилит/инструментов, которые могут его использовать:

http://ctags.sourceforge.net/tools.html

Ответ 3

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

Лично я использую grep;)

Ответ 4

cscope очень хорош для такого рода вещей. В отличие от ctags, cscope обеспечивает интерфейс, подходящий для поиска (ctags требует редактора).

Просто запустите cscope в корневом каталоге кода, который вы хотите проверить. Он будет: создавать базу данных, если ее там нет, обновлять базу данных, если она есть, и открывать curses gui, где вы можете запросить всевозможные полезные сведения

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

ctags только делает первый, "все ссылки на символ".

Ответ 5

grep '^[a-zA-Z0-9][ *]+ {[a-zA-Z0-9_]+}\([a-zA-Z0-9\,\.\-\>]\*\)$'

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

Эта общая форма (return, name, (param)) должна работать, если у вас нет разрывов строк в объявлении функции.

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