私はマルチスレッドコードのカバレッジ基準に取り組んでおり、その一環として変数へのアクセスを記録したいと考えています。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);