我最近一直在尝试为一些遗留代码创建单元测试。
我一直在使用链接器的方法来向我展示哪些函数会导致链接错误,从而查找源代码以查找定义并从中创建存根。
有更简单的方法吗? 是否有某种C ++解析器能够以易于使用的形式为我提供类定义,我可以从中生成存根?
答案 0 :(得分:5)
您可能需要调查http://os.inf.tu-dresden.de/vfiasco/related.html#parsing。但是C ++解析很难。
另一方面,也许ctags或类似的东西可以提取类定义......
您也可以尝试编写自己的简单(?)解析器,从头文件中生成类存根...
我试着给你一些指示。如你所见,问题并不容易。但希望你能至少自动完成其中的一部分。
答案 1 :(得分:4)
Gcc XML用于某些项目,例如automatic FFI for Common Lisp. 它与G ++编译器相关联,以生成表示源的XML。从那里,任何XML处理工具都可以帮助您实现目标。
答案 2 :(得分: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中的每个函数生成基本单元测试用例。
答案 3 :(得分:2)
http://clang.llvm.org/看起来很有希望但不完整。
http://www.boost.org/doc/libs/1_36_0/libs/python/pyste/index.html使用GCCXML为C ++代码生成包装器以连接python。这证明GCCXML已被用于类似的概念。
答案 4 :(得分:2)
如果您使用的是使用DWARF调试格式(主要是UNIX)的平台,则可以使用libdwarf来解析调试信息并提取有关所有内容的信息(函数原型,类定义等)。比C ++更结构化,更易于解析。
答案 5 :(得分:1)
doxygen通常可以解析足够的C ++来为代码创建文档。它还有一个XML输出选项。
答案 6 :(得分:1)
答案 7 :(得分:1)
Eclipse CDT项目提供了高级C ++解析器。界面非常简单。 以下代码段可以提供足够的提示。
ITranslationUnit tu = CoreModelUtil.findTranslationUnit(file);
ICElement [] elements = tu.getChildren();
IStructure结构=(IStructure)元素;
IMethodDeclaration [] methods = structure.getMethods();
IField [] field = structure.getFields();
答案 8 :(得分:0)
如果您使用的是Windows平台,则可能需要查看Microsoft Phoenix project。它是一个新的编译器框架,可以让您挂钩到编译过程的任何阶段。