11

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

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

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

4

9 回答 9

5

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

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

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

我试图给你一些指示。如您所见,问题并不容易。但希望您至少可以自动化其中的一部分。

于 2008-10-25T09:15:54.393 回答
4

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

于 2008-10-25T09:31:15.597 回答
3

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 中的每个函数生成基本的单元测试用例。

于 2012-09-22T19:20:54.433 回答
2

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

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

于 2008-10-25T11:45:46.517 回答
2

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

于 2008-10-25T16:45:56.893 回答
1

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

于 2008-10-25T12:09:25.087 回答
1

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

于 2008-12-08T12:28:59.553 回答
1

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

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

IStructure结构=(IStructure)元素;
IMethodDeclaration[] 方法 = 结构.getMethods();
IField[] 字段 = 结构.getFields();

于 2008-12-13T01:54:52.487 回答
0

如果您使用的是 Windows 平台,您可能想看看Microsoft Phoenix 项目。这是一个新的编译器框架,可让您进入编译过程的任何阶段。

于 2008-10-25T11:25:39.750 回答