4

ユーザーの C++ コードのかなり単純な分析を行い、その情報を使用してコードを計測し (基本的には計測コードを少し使用してコードを再生成します)、ユーザーがコードの動的分析を実行して統計を取得できるようにします。特定の数値型の値の範囲など。

clang は、ユーザーが投げるであろう種類のコードを処理するのに十分な C++ を処理できるようになっているはずです。

では、このように clang をスタンドアロンのパーサーとして使用するにはどうすればよいでしょうか? AST を生成して、追跡したいクラスのオブジェクトを探して AST をたどることができると考えています。LLVM なしで clang を使用している他のユーザーからの連絡に興味があります。

4

2 に答える 2

1

clangモジュール化するように設計されています。そのページから引用:

clang の主要な設計コンセプトは、ライブラリ ベースのアーキテクチャを使用することです。この設計では、フロントエンドのさまざまな部分を別々のライブラリにきれいに分割して、さまざまなニーズや用途に合わせて組み合わせることができます。

libastあなたのニーズに合わせてclangライブラリを見てください。詳細はこちらをご覧ください

于 2010-03-11T04:59:32.653 に答える
1

あなたが示さなかったのは、あなたがやりたかった「分析」の種類です。ほとんどの C++ 分析では、シンボルfooに遭遇したときにそれが何であるかをある程度理解できるように、正確なシンボル テーブル データが必要です。(技術的には、そのようなシンボル テーブルがなければ+が何であるかさえわかりません!) ジェネリック型の情報も必要です。「a*b」という式がある場合、結果の型は何ですか? 「名前と型」の情報を持つことは、分析のために行うほとんどすべてのことの鍵となります。

あなたがclangを主張するなら、ここに他の答えがあります。名前と型の解決を提供するかどうかはわかりません。

名前と型の解決が必要な場合は、別のソリューションとしてDMS Software Reengineering Toolkitがあります。DMS は、解析、分析、変換、および解析解除 (コンパイラ データ構造からソース コードを再生成する) のためのインフラストラクチャのような汎用コンパイラを提供します。DMS の強力な C++ フロント エンド (他の多くの言語のフロント エンドもあります) は、ANSI 標準、GCC および MS VC++ 方言に従って、完全な名前と型の解決を提供します。

コード変換は、DMS によって提供される抽象構文ツリー インターフェイスを介して実装するか、ターゲット言語 (この場合は C++) の表面構文で記述されたパターン指向のプログラム変換規則によって実装できます。ルール言語を使用した簡単な変換を次に示します。

    domain Cpp~GCC3;  -- says we want patterns for C++ in the GCC3 dialect

    rule optimize_to_increment(lhs:left_hand_side):expression -> expression
      " \lhs = \lhs + 1 " ->   " \lhs++"  if no_side_effects(lhs).

これは、DMS によって構築された AST を暗黙的に操作して、AST を変更します。条件を使用すると、パターン変数 (この場合はlhs )の任意のプロパティについて問い合わせることができます。これには、必要に応じて名前と型の制約が含まれます。

DMS は、非常に高度なプログラム分析と C++ コードの変換に何度も使用されてきました。DMS を使用してかなり明白な方法で C++ コードを計測することにより、C++ テスト カバレッジ ツールを構築します。この Web サイトには、DMS を使用して軍用機ミッション ソフトウェアの大規模な製品ラインのアーキテクチャを再構築する方法を説明した論文の参考文献があります。この種の活動は、上記のような多数のパターン指向の変換を適用することにより、文字通り、C++ をあるアーキテクチャーの形に別のアーキテクチャーの形に注ぎ込みます。

インストルメンテーションの実装は非常に簡単です。そして、それが成熟するのを待つ必要はありません。

于 2010-03-11T05:26:00.637 に答える