8

私はマルチスレッドコードのカバレッジ基準に取り組んでおり、その一環として変数へのアクセスを記録したいと考えています。xたとえば、以下のコードでは、変数が書き込まれ、y, z, a[i],読み取りが行われたことを記録したいと思います。

x = y * (int)z + a[i]

私は、ClangのRecursiveASTVisitorを使用してこれを実行し、記録機能を含むようにソースを変更することを検討してきました。ただし、Clangがどのように機能するかについての私の理解は非常に不完全であるため、これが賢明なアプローチであるかどうかはわかりません。

現在、ステートメントを見つけたら、それがであるかどうかを確認しBinaryOperator, UnaryOperator, Cast, or DeclRefExprます。(基本が機能するようになったら、その機能を拡張します。)それがAの場合BinaryOperator, UnaryOperator, or Castは、式の部分式を確認します。DeclRefExprの場合、式が左辺値か右辺値かを確認できますが(ここでも単純化)、DeclRefExprを見つけると、それらは常に左辺値になります。親をチェックする必要があるため、それらが使用されたかどうかを判断するためにlvalues or rvalues、それが左辺値のキャストである場合は、右辺値として使用されました。

より複雑なコードを検討する必要があるため、問題がさらに複雑になるのを見ることができるだけであるため、この問題に対して間違ったアプローチを取っているように感じます。

これにアプローチするためのより良い方法はありますか?

ありがとうございました

編集

この情報を静的に記録するつもりはありません。変数の使用法を見つけて、コードの実行時にこれらの変数へのアクセスを記録するコードを挿入するつもりです。

たとえば、上記のコード(x = y * (int)z + a[i];)を考えると、次のようなものを作成したいと思います。

x = y * (int)z + a[i];
recordAccess(<file>, <line>, "x",    &x,    WRITE);
recordAccess(<file>, <line>, "y",    &y,    READ);
recordAccess(<file>, <line>, "z",    &z,    READ);
recordAccess(<file>, <line>, "a[i]", &a[i], READ);
recordAccess(<file>, <line>, "i",    &i,    READ);
4

2 に答える 2

1

他の人が指摘したように、エイリアシングはこれを不可能にします。興味のある質問に答えるコードの静的分析は不可能です。ソースコードファイルを取得し、構文を分析するだけで出力を決定できる場合、コンパイラはコンパイルされたプログラムではなく、結果のプログラムの出力を生成します。つまり、停止問題に答えようとしています。

動的解析は、最も関心のある質問に答えるために実際に必要なものです。マルチスレッド ソフトウェアの動的解析には、すでに大きな市場があります。

于 2013-03-09T03:29:44.553 に答える
0

ここでの主な問題は、エイリアシングを考慮していないことです。単純な直接アクセスのみを記録できます。

しかし、その場合、単純な式 AST ビジターが主な方法です。しかし、Clang の RecursiveASTVisitor は、メモリから、がらくたを切り取り、最終的な変数ノードに直接アクセスできるようにする必要があります。結局のところ、すべての AST ノードにアクセスする必要があります。

于 2013-03-06T16:08:04.957 に答える