我最近一直在尝试为一些遗留代码创建单元测试。

我一直在使用链接器的方法来向我展示哪些函数会导致链接错误,从而查找源代码以查找定义并从中创建存根。

有更简单的方法吗? 是否有某种C ++解析器能够以易于使用的形式为我提供类定义,我可以从中生成存根?

有帮助吗?

解决方案

您可能需要调查 http://os.inf.tu -dresden.de/vfiasco/related.html#parsing 。但是C ++解析很难。

另一方面,也许ctags或类似的东西可以提取类定义......

您也可以尝试编写自己的简单(?)解析器,从头文件中生成类存根...

我试着给你一些指示。如你所见,问题并不容易。但希望你能至少自动完成其中的一部分。

其他提示

Gcc XML 用于某些项目,例如 Common Lisp的自动FFI。 它与G ++编译器相关联,以生成表示源的XML。从那里,任何XML处理工具都可以帮助您实现目标。

abi-compliance-checker 工具可用作C的解析器/ C ++头文件:

abi-compliance-checker -lib NAME -dump VER.xml -headers-only -xml -stdout > api.xml

VER.xml 输入文件如下:

<version>
  1.0
</version>

<headers>
  /path1/to/header(s)/
  /path2/to/header(s)/
   ...
</headers>

输出 api.xml 文件包含结构化表单中头文件中的函数签名和其他信息:

...
<symbol>
    <id>37348</id>
    <mangled>_ZN7MWidget11qt_metacallEN11QMetaObject4CallEiPPv</mangled>
    <short>qt_metacall</short>
    <class>13749</class>
    <header>mwidget.h</header>
    <line>45</line>
    <return>44</return>
    <spec>virtual</spec>
    <parameters>
        <param>
            <name>p1</name>
            <type>4078</type>
            <algn>4</algn>
            <pos>0</pos>
        </param>
        <param>
            <name>p2</name>
            <type>44</type>
            <algn>4</algn>
            <pos>1</pos>
        </param>
        <param>
            <name>p3</name>
            <type>3905</type>
            <algn>8</algn>
            <pos>2</pos>
        </param>
    </parameters>
</symbol>
...

另请参阅有关 api-sanity-checker 工具的信息,该工具可生成基本信息通过分析头文件中的声明来为API中的每个函数单元测试用例。

http://clang.llvm.org/ 看起来很有前景,但不完整。

http://www.boost.org /doc/libs/1_36_0/libs/python/pyste/index.html 使用GCCXML为C ++代码生成包装器以连接python。这证明GCCXML已被用于类似的概念。

如果您使用的是使用DWARF调试格式(主要是UNIX)的平台,则可以使用libdwarf来解析调试信息并提取有关所有内容的信息(函数原型,类定义等)。比C ++更结构化,更易于解析。

doxygen通常可以解析足够的C ++来为代码创建文档。它还有一个XML输出选项。

你看过 Mockcpp AMOP mockpp ?您可以看到他们如何解析C ++ - 如果它们都不符合您的需求。

Eclipse CDT项目提供了高级C ++解析器。界面非常简单。 以下代码段可以提供足够的提示。

ITranslationUnit tu = CoreModelUtil.findTranslationUnit(file);
ICElement [] elements = tu.getChildren();

IStructure结构=(IStructure)元素;
IMethodDeclaration [] methods = structure.getMethods();
IField [] field = structure.getFields();

如果您使用的是Windows平台,则可能需要查看 Microsoft Phoenix项目。它是一个新的编译器框架,可以让您挂钩到编译过程的任何阶段。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top