11

最近、いくつかのレガシー コードの単体テストを作成しようとしています。

私はリンカーを使用して、どの関数がリンクエラーを引き起こしているかを示し、ソースをgrepして定義を見つけ、そこからスタブを作成するというアプローチをとってきました。

もっと簡単な方法はありますか?スタブを生成できる、使いやすい形式でクラス定義を提供できる 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など、一部のプロジェクトで使用されています。 ソースを表す XML を生成するために、G++ コンパイラに結び付けられます。そこから、任意の 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 内のすべての関数の基本的な単体テスト ケースを生成できるapi-sanity-checkerツールに関する情報も参照してください。

于 2012-09-22T19:20:54.433 に答える
2

DWARF デバッグ形式 (主に UNIX) を使用するプラットフォームを使用している場合は、libdwarf を使用してデバッグ情報を解析し、すべての情報 (関数プロトタイプ、クラス定義など) を抽出できます。C++ よりもはるかに構造化されており、解析が容易です。

于 2008-10-25T16:45:56.893 に答える
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 に答える
1

Eclipse CDT プロジェクトは、高度な C++ パーサーを提供します。インターフェイスは非常に簡単です。次のコード スニペットで十分なヒントが得られます。

ITranslationUnit tu = CoreModelUtil.findTranslationUnit(ファイル);
ICElement[] 要素 = tu.getChildren();

IStructure 構造 = (IStructure) 要素;
IMethodDeclaration[] メソッド = structure.getMethods();
IField[] フィールド = structure.getFields();

于 2008-12-13T01:54:52.487 に答える
1

MockcppAMOP、およびmockppを見ましたか? C++ をどのように解析するかを見ることができます - それらのどれもがあなたのニーズに合わない場合.

于 2008-12-08T12:28:59.553 に答える
1

doxygen は通常、コードのドキュメントを作成するのに十分な C++ を解析できます。また、XML 出力オプションもあります。

于 2008-10-25T12:09:25.087 に答える
0

Windows プラットフォームを使用している場合は、Microsoft Phoenix プロジェクトを参照してください。これは、コンパイル プロセスの任意の段階にフックできる新しいコンパイラ フレームワークです。

于 2008-10-25T11:25:39.750 に答える