【问题标题】:Tools to reverse engineer C++ ( i.e. to view C++ classes )逆向工程 C++ 的工具(即查看 C++ 类)
【发布时间】:2012-01-08 21:14:41
【问题描述】:

我有大量的手写 C++ 源代码(即 WebKit 和其他开源)。

我想要一个工具:

  • 让我看看每个类的类间关系:
    • 包含关系:即哪些其他类包含这个类,或者被它包含(头文件将模板化智能指针类型声明为成员数据)
    • 声明的依赖关系(即在方法签名中使用类型;虽然我可以使用“在文件中查找”很好地看到这一点)
    • 子类和超类层次结构
  • 在 Windows 或 Linux(甚至基于 Web 的解决方案)上运行
  • 最好有一个用户界面(或者要求太多?)
  • 可以选择成为 IDE 中的插件

与相关问题C++ to UML (Reverse engineer / Round-trip engineering) 不同,我不需要它:

  • 解析定义/实现(cpp 和 c 文件)
  • 支持编辑或“往返”源代码

相反,解析应用程序和系统头文件中的类型声明(包括模板类型和 typedef)就足够了。我有所有头文件的列表。

我更喜欢它,如果它可以处理预处理器定义(尤其是#include 和#if),但如果有必要我可以预处理;和/或给它制作或项目各种格式的文件。

【问题讨论】:

  • 请让您的问题自成一体,并定义“逆向工程 C++ 源代码”的含义。
  • 也许使用 doxygen 来自动生成使用图。这至少会给你一些关于类关系的信息。注意:我从未使用过此功能,但请记住这是可能的。
  • @KerrekSB - 我希望我已经定义了它。如果有不清楚的地方,请提出具体问题。
  • 听起来你可能想要一些依赖图生成。我自己不知道任何工具,但这可能值得搜索。
  • 您想减少程序的执行并获得一个工具,将二进制代码转换为生成它的源代码中的关系?

标签: c++ webkit reverse-engineering


【解决方案1】:

您总是可以使用 doxygen,它会为您提供有关您的标头集的完整文档(继承、使用...)它还可以从类层次结构中生成图表。

【讨论】:

  • 即使没有可用的 cmets,doxygen 也会为您提供这些信息。
  • Doxygen 确实能够找到关键字(如 class,...),因此您应该能够从中得到一些东西
【解决方案2】:

另一种可能性是自定义您自己的工具,方法是扩展现有的 C++ 编译器

您可以扩展两个编译器:

  • LLVM & Clang(但我帮不上忙,因为我不太了解他们)。
  • GCC(请为 4.6 版本)可通过 插件 或通过编写 MELT 扩展 进行扩展 MELT 是一种高级域特定语言扩展 GCC 编译器;在 MELT 中编写扩展程序比在 C 中编写插件更容易。[我是 MELT 的主要作者]

在我(有偏见的)看来,扩展 GCC 是一种好方法。但我确实承认(即使在 MELT 的帮助下)这并非易事,因为您需要部分了解 GCC 主要内部表示(Gimple、Tree)和内部传递。 (我猜你对 LLVM/Clang 也有同样的问题:要扩展它,你需要理解它)。

GCC 扩展(在 MELT 中)或插件(在 C 中)主要用于 Gimple 表示(在模板扩展之后)。

如果对使用 MELT 感兴趣,请随时向我提问。

存在一些昂贵的专有工具,例如coverity - 但是它们太贵了,我不知道它们能做什么。

【讨论】:

  • 我想要一些用户友好的,带有 UI 的东西:也许是一个 IDE 插件。
  • 我听说 Coverity 是一个昂贵的专有工具,带有网络用户界面。
  • @Basile:我对 MELT 很感兴趣,请看我的问题:stackoverflow.com/questions/15042991/… MELT 有能力做我想做的事吗?谢谢!
  • MELT 是扩展 GCC 的基础设施和领域特定语言(也许我应该说它是 GCC 内部表示的“awk”或“perl”)。所以你可以用 MELT 扩展 GCC,但是你必须编写一些小的 MELT 代码来实现你的需求。 gcc-melt@googlegroups.com 列表是一个更好的提问场所。
猜你喜欢
  • 2012-05-01
  • 2010-10-12
  • 2010-12-15
  • 2015-08-15
  • 2011-01-17
  • 1970-01-01
  • 2011-05-14
  • 2012-03-15
  • 1970-01-01
相关资源
最近更新 更多