最近、いくつかのレガシー コードの単体テストを作成しようとしています。
私はリンカーを使用して、どの関数がリンクエラーを引き起こしているかを示し、ソースをgrepして定義を見つけ、そこからスタブを作成するというアプローチをとってきました。
もっと簡単な方法はありますか?スタブを生成できる、使いやすい形式でクラス定義を提供できる C++ パーサーはありますか?
最近、いくつかのレガシー コードの単体テストを作成しようとしています。
私はリンカーを使用して、どの関数がリンクエラーを引き起こしているかを示し、ソースをgrepして定義を見つけ、そこからスタブを作成するというアプローチをとってきました。
もっと簡単な方法はありますか?スタブを生成できる、使いやすい形式でクラス定義を提供できる C++ パーサーはありますか?
http://os.inf.tu-dresden.de/vfiasco/related.html#parsingを調査することをお勧めします。しかし、C++ の構文解析は難しいものです。
一方、おそらくctagsまたは同様のものでクラス定義を抽出できます...
独自の単純な (?) パーサーを作成して、ヘッダー ファイルからクラス スタブを生成することもできます...
私はあなたにいくつかの指針を与えようとしました。ご覧のとおり、問題は簡単ではありません。しかし、うまくいけば、少なくともその一部を自動化できます。
Gcc XMLは、Common Lisp の自動 FFIなど、一部のプロジェクトで使用されています。 ソースを表す XML を生成するために、G++ コンパイラに結び付けられます。そこから、任意の 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 内のすべての関数の基本的な単体テスト ケースを生成できるapi-sanity-checkerツールに関する情報も参照してください。
DWARF デバッグ形式 (主に UNIX) を使用するプラットフォームを使用している場合は、libdwarf を使用してデバッグ情報を解析し、すべての情報 (関数プロトタイプ、クラス定義など) を抽出できます。C++ よりもはるかに構造化されており、解析が容易です。
http://clang.llvm.org/は有望に見えますが、不完全です。
http://www.boost.org/doc/libs/1_36_0/libs/python/pyste/index.htmlは、GCCXML を使用して C++ コードのラッパーを生成し、python とやり取りします。これは、GCCXML が同様の概念に使用されていることを証明しています。
Eclipse CDT プロジェクトは、高度な C++ パーサーを提供します。インターフェイスは非常に簡単です。次のコード スニペットで十分なヒントが得られます。
ITranslationUnit tu = CoreModelUtil.findTranslationUnit(ファイル);
ICElement[] 要素 = tu.getChildren();
IStructure 構造 = (IStructure) 要素;
IMethodDeclaration[] メソッド = structure.getMethods();
IField[] フィールド = structure.getFields();
doxygen は通常、コードのドキュメントを作成するのに十分な C++ を解析できます。また、XML 出力オプションもあります。
Windows プラットフォームを使用している場合は、Microsoft Phoenix プロジェクトを参照してください。これは、コンパイル プロセスの任意の段階にフックできる新しいコンパイラ フレームワークです。