监视C/C++中的变量访问

tgt*_*tgt 8 c c++ code-coverage clang

我正在研究多线程代码的覆盖标准,并且它希望记录对变量的访问.例如,在下面的代码中,我想记录该变量x被写入y, z, a[i],并且我被读取.

x = y * (int)z + a[i]
Run Code Online (Sandbox Code Playgroud)

我一直在使用Clang的RecursiveASTVisitor并修改源代码以包含录制功能.但是,我不确定这是否是一种明智的方法,因为我对Clang如何工作的理解是非常不完整的.

目前,当我找到一个声明时,我会检查它是否是一个BinaryOperator, UnaryOperator, Cast, or DeclRefExpr.(一旦我掌握了基础知识,我将扩展其能力.)如果是,BinaryOperator, UnaryOperator, or Cast我检查表达式的子表达式.如果它是DeclRefExpr我可以检查表达式是左值还是右值(再次,现在简化),但是一旦我找到DeclRefExpr它们总是左值.为了确定它们是否被使用,因为lvalues or rvalues我必须检查它的父项,如果它是一个lvaluetorvalue,它被用作右值.

我非常觉得我对这个问题采取了错误的方法,因为我只能看到它变得更加复杂,因为我必须考虑更复杂的代码.

有没有更好的方法来解决这个问题?

谢谢

编辑

我不打算静态记录这些信息.我打算找到变量的使用和插入代码,这些代码将在代码运行时记录对这些变量的访问.

例如,给定上面的代码(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);
Run Code Online (Sandbox Code Playgroud)

Pup*_*ppy 0

这里的主要问题是您没有考虑别名。您将只能记录简单、直接的访问。

但在这种情况下,简单的表达式 AST 访问者是主要的方法。但是根据记忆,Clang 的 RecursiveASTVisitor 应该能够为您减少废话,并允许您直接访问最终的变量节点。毕竟,它应该访问每个 AST 节点。