52

C/C++ コードの解析と解析をすばやく開始するための優れたツールは何ですか?

特に、C/C++ プリプロセッサと言語を処理するオープン ソース ツールを探しています。できれば、これらのツールは文法に lex/yacc (または flex/bison) を使用し、複雑すぎないようにする必要があります。最新の ANSI C/C++ 定義を処理する必要があります。

ここに私がこれまでに見つけたものがありますが、それらを詳細に見ていません (考え?):

  • CScope - 古い学校の C アナライザー. ただし、完全な解析は行わないようです。C 関数を見つけるための美化された「grep」として説明されています。
  • GCC - みんなのお気に入りのオープン ソース コンパイラ。非常に複雑ですが、すべてを実行しているようです。GEMと呼ばれる GCC 拡張機能を作成するための関連プロジェクトがありますが、GCC 4.1 (2006) 以降更新されていません。
  • PUMA - ピュア マニピュレーター。(ページから: 「このプロジェクトの目的は、C/C++ ソースの分析と操作のためのクラスのライブラリを提供することです。この目的のために、PUMA はスキャン、解析、そしてもちろん C/C++ ソースの操作のためのクラスを提供します。」) . これは有望に見えますが、2001 年以降更新されていません。明らかに PUMA はAspectC++に組み込まれていますが、このプロジェクトでさえ 2006 年以降更新されていません。
  • さまざまな C/C++ 生の文法。c-c++-grammars-1.2.tar.gzを入手できますが、これは 1997 年以降維持されていません。少し Google で検索すると、出発点として役立つ他の基本的な lex/yacc 文法が引き出されます。
  • 他のもの?

これを、C/C++ ソースを新しい玩具言語に翻訳するための出発点として使用したいと考えています。

ありがとう!-マット

(2/9 追加): 明確化: C/C++ コード自体に加えて、プリプロセッサからセマンティック情報を抽出したいと考えています。「#define foo 42」が整数「42」に消えないようにしたいのですが、「foo」という名前に付けたままにしておきます。残念ながら、これにより、最初にプリプロセッサを実行し、C/C++ 解析ツリーのみを提供するいくつかのソリューションが除外されます)。

4

14 に答える 14

35

文法が決定できないため、C++ の解析は非常に困難です。Yossi Kreininを引用するには:

極めて複雑な文法

C++ には決定不能な文法があるのに対し、すべての一般的な言語には文脈自由(または「ほぼ」文脈自由) 文法があるため、「卓越した」は文字どおりに解釈する必要があります。コンパイラとパーサーが好きなら、おそらくこれが何を意味するか知っているでしょう。この種のことに興味がない場合は、C++ の解析に関する問題を示す簡単な例があります: オブジェクト定義または関数宣言ですか? 答えは、ステートメントの前のコード、つまり「コンテキスト」に大きく依存することがわかりました。これは、(直感的なレベルで) C++ 文法が非常に文脈依存であることを示しています。AA BB(CC);

于 2009-02-09T01:38:25.173 に答える
21

解析にllvmを使用するclangを見ることができます。

C++を完全にサポートするようになりました

于 2009-02-09T10:04:52.990 に答える
17

ANTLRパーサジェネレータには、プリプロセッサだけでなくC /C++の文法もあります。私はこれを使用したことがないので、C++の解析がどれほど完全になるかはわかりません。ANTLR自体は、はるかに単純な言語を解析するための2、3の機会で私にとって便利なツールでした。

于 2009-02-09T03:05:44.760 に答える
16

問題によっては、GCCXMLが答えになる場合があります。基本的には、GCCを使用してソースを解析し、解析ツリーの簡単に消化できるXMLを提供します。GCCXMLを使用すると、すべてが完了します。

于 2009-02-09T01:25:52.130 に答える
14

pycparserは、Python で書かれた C (C99) 用の完全なパーサーです。完全に構成可能な AST バックエンドを備えているため、必要なあらゆる種類の言語処理の基礎として使用されています。

ただし、C++ はサポートしていません。確かに、C よりもはるかに難しいです。


更新 (2012) : 現時点では、間違いなく答えはClangです。これはモジュラーであり、完全な C++ (多くの C++-11 機能を含む) をサポートし、比較的使いやすいコード ベースを備えています。また、高水準言語 (つまりPython 用) へのバインド用の C API もあります。

于 2009-03-14T06:38:01.230 に答える
8

doxygenがどのように機能するかを見てください。完全なソースコードが利用可能で、フレックスベースです。

誤解を招く候補は、翻訳者を明示的に作成するための無料のWindowsベースのパーサーツールキットであるGOLDです。サポートされている言語のリストは、サポートされている解析文法のリストではなく、パーサーを実装できる言語を参照しています。

CとC#の文法のみがあり、C++はありません。

于 2009-02-09T01:03:38.220 に答える
7

C++ の解析は非常に複雑な課題です。

Boost/Spirit フレームワークがあり、数年前に彼らはC++ パーサーを実装するというアイデアで遊んでいました、完全には程遠いです。

ISO C++ を完全かつ適切に解析することは簡単なことではなく、実際、関連する多くの取り組みが行われました。しかし、これは本質的に複雑な作業であり、C++とプリプロセッサのすべてを理解する完全なコンパイラ フロントエンドを書き直さない限り、簡単には達成できません。「wave」と呼ばれるプリプロセッサの実装は、Spirit の人々から入手できます。

とはいえ、ソース コード変換の目的で使用することを特に意図した C++ パーサー ツールキットである、poke/oink (elsa ベース)を見たいと思うかもしれません。Mozilla プロジェクトで大規模な変換を行うために使用されています。静的ソースコード分析と自動コード書き換えの最も興味深い部分は、C++ の大部分をサポートするだけでなく、プリプロセッサ自体もサポートすることです!

一方、利用可能な独自のソリューションが 1 つあります。それは、ほとんどすべての C++ 関連の作業に使用できる EDG フロントエンドです。

個人的には、Mozilla で使用されている elsa ベースのpoke/oink スイートをチェックアウトします。それとは別に、FSF は現在、ランタイム ライブラリ ライセンスを使用したgcc プラグインの作業を承認しているため、状況が変わると思います。バイナリ プラグインを使用して、そのような目的で gcc ベースの C++ パーサーを簡単に活用できるようになると、急速に.

つまり、一言で言えば: もしお金があれば: EDG、今すぐフリー/オープンソースが必要な場合: else/oink はかなり有望です。時間があれば、プロジェクトに gcc を使用することをお勧めします。

C コード専用の別のオプションはcscoutです。

于 2009-03-13T20:02:29.840 に答える
6

C ++の文法は、悪名高いほど毛深いものです。Lambdaにはそれについての良いスレッドがありますが、要点は、C++文法は任意に多くの先読みを必要とする可能性があるということです。

あなたがしていると思うようなことについては、GnuCCまたはSplintのいずれかをハッキングすることを考えます。特にGnuCCは言語生成の部分をかなり完全に分離しているので、新しいg++バックエンドを構築するのが最善かもしれません。

于 2009-02-09T00:55:24.077 に答える
4

実際、PUMA と AspectC++ は現在も積極的に保守および更新されています。私は AspectC++ の使用を検討していましたが、更新がないことに疑問を抱いていました。AspectC++ と PUMA の両方がまだ開発中であると述べた著者に電子メールを送りました。SVN https://svn.aspectc.org/repos/からソース コードを取得するか、 http://akut.aspectc.orgで通常のバイナリ ビルドを取得できます。最近の多くの優れた C++ プロジェクトと同様に、作成者には Web ページのメンテナンスについていく時間がありません。あなたがフルタイムの仕事と人生を持っているなら、それは理にかなっています.

于 2010-08-30T20:46:48.490 に答える
3

Elsaは、100%準拠していなくても、C++解析で私が知っている他のすべてのものを打ち負かします。ファンです。C ++を出力するモジュールがあるので、おもちゃプロジェクトの出発点として適しているかもしれません。

于 2009-02-09T10:02:22.730 に答える
2

tiny-CSmallCのように理解しやすいものはどうですか

于 2009-02-09T00:59:41.443 に答える
1

しばらく前に、cファイルの単体テストを自動的に生成するツールを作成しようとしました。

事前処理のために、GCCを介してファイルを配置しました。出力は見苦しいですが、前処理されたファイルから元のコードのどこを簡単に追跡できます。しかし、あなたのニーズのためにあなたは何か他のものを必要とするかもしれません。

私はCパーサーのベースとしてMeterを使用しました。これはオープンソースであり、lexとyaccを使用します。これにより、lexとyaccを完全に理解していなくても、短時間で簡単に起動して実行できるようになりました。

lex&yaccソリューションでは、関数全体の機能をトレースし、関数全体の構造を1回のパスで解析することができなかったため、Cアプリも作成しました。短時間でメンテナンスができなくなり、放棄されました。

于 2009-02-09T09:55:21.390 に答える
1

GNU のCFlowのようなツールを使用して、コードを分析し、コールグラフのチャートを作成するのはどうでしょうか。オープングループ(man ページ) が cflow について述べていることは次のとおりです。cflow の GNU バージョンにはソースが付属しており、オープン ソースも ...

これがお役に立てば幸いです。よろしくお願いします、トム。

于 2010-01-24T12:00:15.293 に答える