Инструменты для обратного проектирования C++ (т.е. для просмотра классов C++)

У меня есть большой объем рукописного исходного кода C++ (например, WebKit и другой открытый исходный код).

Я хочу инструмент, который будет:

  • Let me see the inter-class relationships for each and any class:
    • Containment relationships: i.e. which other classes contain this class, or are contained by it (the header files declare templated smart pointer types as member data)
    • Объявленные зависимости (т. е. использование типа в сигнатурах методов, хотя я могу это довольно хорошо увидеть, используя «найти в файлах»)
    • Иерархии подклассов и суперклассов
  • Работайте в Windows или Linux (или даже в веб-решении)
  • Желательно иметь пользовательский интерфейс (или это слишком много?)
  • Необязательно быть плагином в IDE

В отличие от связанного с этим вопроса, C++ to UML (обратный инжиниринг/циклический инжиниринг), мне НЕ нужно:

  • Разобрать определения/реализации (файлы cpp и c)
  • Поддержка редактирования или «обхода» источника

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

Я бы предпочел, чтобы он мог обрабатывать определения препроцессора (особенно #include и #if), но я могу выполнить предварительную обработку, если это необходимо; и/или дайте ему make или файлы проекта в различных форматах.


person ChrisW    schedule 29.11.2011    source источник
comment
Пожалуйста, сделайте свой вопрос автономным и определите, что вы подразумеваете под обратным проектированием исходного кода C++.   -  person Kerrek SB    schedule 29.11.2011
comment
Возможно, используйте doxygen для автоматического создания графика использования. Это, по крайней мере, даст вам некоторую информацию об отношениях классов. Примечание. Я никогда не использовал эту функцию, но имел в виду, что это возможно.   -  person Nobody moving away from SE    schedule 29.11.2011
comment
@KerrekSB - надеюсь, я определил это. Пожалуйста, задавайте конкретный вопрос, если что-то непонятно.   -  person ChrisW    schedule 29.11.2011
comment
Похоже, вам может понадобиться генерация графа зависимостей. Я сам не знаю никаких инструментов, но это, возможно, стоит поискать.   -  person Kerrek SB    schedule 29.11.2011
comment
Вы хотите очистить выполнение программы и получить инструмент, который преобразует двоичный код в отношения внутри исходного кода, который его сгенерировал?   -  person Ian Medeiros    schedule 29.11.2011
comment
@IanMedeiros - у меня есть исходный код. Я хочу, чтобы он обрабатывал исходный код (а не декомпилировал двоичный файл).   -  person ChrisW    schedule 29.11.2011
comment
Я не уверен, что реверс-инжиниринг — правильное слово. Revere Engineering — это получение некоторых знаний, которые скрыты (в двоичном коде). Вот вам и весь исходный код, и вам нужно в нем разобраться. Рефакторинг, или исходная навигация, или исходные метрики — более подходящая терминология.   -  person Basile Starynkevitch    schedule 29.11.2011


Ответы (2)


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

person TurnsCoffeeIntoScripts    schedule 29.11.2011
comment
doxygen предоставит вам эту информацию, даже если комментарии отсутствуют. - person Alessandro Pezzato; 29.11.2011
comment
Doxygen действительно может найти ключевое слово (например, класс, ...), поэтому вы сможете что-то извлечь из него. - person TurnsCoffeeIntoScripts; 29.11.2011

другой возможностью является настройка собственного инструмента путем расширения существующего компилятора C++.

Есть два компилятора, которые вы можете расширить:

  • LLVM и Clang (но я не могу помочь, потому что я мало их знаю).
  • GCC (пожалуйста, версия 4.6) расширяется с помощью плагинов. или написав расширение MELT MELT — это высокоуровневый доменный язык для расширения компилятор GCC; ваше расширение проще написать на MELT, чем плагин на C. [Я главный автор MELT]

Расширение GCC, на мой (предвзятый) взгляд, является хорошим способом сделать это. Но я признаю, что (даже с помощью MELT) это нетривиально, потому что вам нужно частично понимать основные внутренние представления GCC (Gimmple, Tree) и внутренние проходы. (Я предполагаю, что у вас такая же проблема с LLVM/Clang: чтобы расширить его, вам нужно его понять).

Расширения GCC (в MELT) или плагины (в C) в основном работают с представлениями Gimple (после расширения шаблона).

Если вы заинтересованы в использовании MELT, не стесняйтесь спрашивать меня больше.

Существуют некоторые дорогостоящие проприетарные инструменты, такие как, например. coverity - но там такие дорогие, что я понятия не имею, на что они способны.

person Basile Starynkevitch    schedule 29.11.2011
comment
Я хочу что-то удобное для пользователя, с пользовательским интерфейсом: может быть, плагин IDE. - person ChrisW; 29.11.2011
comment
Я слышал, что Coverity — это дорогостоящий проприетарный инструмент с пользовательским веб-интерфейсом. - person Basile Starynkevitch; 29.11.2011
comment
@Basile: меня очень интересует MELT, см. мой вопрос: stackoverflow.com/questions/15042991/ Способен ли MELT делать то, что я хочу? Спасибо! - person kakyo; 23.02.2013
comment
MELT — это инфраструктура и предметно-ориентированный язык для расширения GCC (возможно, я должен сказать, что это awk или perl внутренних представлений GCC). Таким образом, вы можете расширить GCC с помощью MELT, но вам нужно написать небольшой код MELT, чтобы удовлетворить ваши потребности. Список [email protected] — лучшее место для вопросов. - person Basile Starynkevitch; 23.02.2013