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

时间:2013-03-06 16:00:03

标签: c++ c clang code-coverage

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

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

我一直在尝试使用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);

2 个答案:

答案 0 :(得分:1)

正如其他人所指出的,别名使得这是不可能的。静态分析代码以回答您感兴趣的问题是不可能的。如果以某种方式可以获取源代码文件并仅通过分析语法来确定输出,则编译器将生成结果程序的输出,而不是编译的程序。简而言之,您正在尝试回答halting problem

动态分析是您实际需要回答的问题。您已经对多线程软件进行了动态分析。

答案 1 :(得分:0)

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

但在这种情况下,一个简单的表达式AST访客是主要的方式。但Clang的RecursiveASTVisitor应该从内存中为你剪掉垃圾并允许你直接访问最终的变量节点。毕竟,它应该访问每个AST节点。