Перечисление функций C / C ++ (анализ кода в Unix) - PullRequest
12 голосов
/ 06 мая 2010

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

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

grep -r "function myfunc" .

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

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

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

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

Ответы [ 5 ]

16 голосов
/ 06 мая 2010

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

Doxygen

10 голосов
/ 06 мая 2010

Обильные Ctags http://ctags.sourceforge.net/

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

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

5 голосов
/ 06 мая 2010

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

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

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

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

5 голосов
/ 06 мая 2010

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

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

2 голосов
/ 06 мая 2010

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

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

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

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

...