8

ヘッダー ファイルで定義されたプロシージャの空の実装を生成したいと考えています。理想的には、ポインターの場合は NULL、整数の場合は 0 などを返し、理想的な世界では、どの関数が呼び出されたかを stderr にも出力する必要があります。

これの動機は、複雑な既存の API (ヘッダー ファイル) のサブセットを別のライブラリに適合させるラッパーを実装する必要があることです。API で委任する必要があるプロシージャはごくわずかですが、どのプロシージャかは明確ではありません。そこで、この自動生成されたラッパーに対して実行し、呼び出されたものを確認し、委任を使用してそれを実装し、繰り返す反復的なアプローチを使用したいと考えています。

ヘッダーから C++ ファイルを自動的に生成しますか? しかし、答えはC++固有のようです。

では、質問を簡単な言葉で説明する必要がある人のために、ヘッダー ファイルを指定してそのような実装の生成を自動化するにはどうすればよいでしょうか? 私は既存のツールを好むでしょう-単純な解決策での私の現在の最良の推測はpycparserを使用することです.

更新ありがとうみんな。どちらも良い答えです。私の現在のハックも投稿しました。

4

3 に答える 3

2

したがって、EA の提案を「回答」としてマークします。これがおそらく一般的には最良のアイデアだと思うからです。cmockの提案は、ライブラリ開発がテストの失敗によって引き起こされたtddアプローチで非常にうまく機能すると思いますが、それを試すことになるかもしれません。しかし今のところ、インタラクティブな方法で動作する、より迅速で汚れたアプローチが必要です (問題のライブラリは、別のインタラクティブなプログラム用に動的にロードされるプラグインであり、API 呼び出しのシーケンスをリバース エンジニアリングしようとしています...)

だから私がやったことは、pycparseを呼び出すpythonスクリプトを書くことでした。他の人に役立つ場合に備えてここに含めますが、一般的ではありません(たとえば、すべての関数がintを返し、typedef内のfunc定義を回避するためのハックがあると仮定します)。

from pycparser import parse_file
from pycparser.c_ast import NodeVisitor


class AncestorVisitor(NodeVisitor):

    def __init__(self):
        self.current = None
        self.ancestors = []

    def visit(self, node):
        if self.current:
            self.ancestors.append(self.current)
        self.current = node
        try:
            return super(AncestorVisitor, self).visit(node)
        finally:
            if self.ancestors:
                self.ancestors.pop(-1)


class FunctionVisitor(AncestorVisitor):

    def visit_FuncDecl(self, node):
        if len(self.ancestors) < 3: # avoid typedefs
            print node.type.type.names[0], node.type.declname, '(',
            first = True
            for param in node.args.params:
                if first: first = False
                else: print ',',
                print param.type.type.names[0], param.type.declname,
            print ')'
            print '{fprintf(stderr, "%s\\n"); return 0;}' % node.type.declname


print '#include "myheader.h"'
print '#include <stdio.h>'
ast = parse_file('myheader.h', use_cpp=True)
FunctionVisitor().visit(ast)
于 2012-12-11T15:12:14.283 に答える
1

UMLモデリングツールは、選択した言語でデフォルトの実装を生成することができます。通常、ソースコード(Cヘッダーを含む)のインポートもサポートされています。ヘッダーをインポートして、そこからソースコードを生成することができます。私は個人的にEnterpriseArchitectの経験があり、これらの両方の操作をサポートしています。

于 2012-12-10T14:42:14.700 に答える
1

警告: これは自分で経験したことがないため、未調査の回答です。

単体テスト用に設計されたモッキング フレームワークを使用すると、運が良くなる可能性があると思います。このようなフレームワークの例: cmock

プロジェクト ページは、ヘッダーからコードを生成することを示唆しています。その後、コードを取得して微調整できます。

于 2012-12-10T14:22:26.037 に答える