我正在研究多线程代码的覆盖率标准,作为它的一部分,我想记录对变量的访问。例如,在下面的代码中,我想记录变量x
被写入y, z, a[i],
和 i 被读取。
x = y * (int)z + a[i]
我一直在考虑使用 Clang 的 RecursiveASTVisitor 并修改源以包含录制功能。但是,我不确定这是否是一种明智的方法,因为我对 Clang 如何工作的理解非常不完整。
目前,当我找到一个语句时,我会检查它是否是BinaryOperator, UnaryOperator, Cast, or DeclRefExpr
. (一旦我掌握了基础知识,我将扩展它的能力。)如果是,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);