c++ - 在 C/C++ 中监视变量访问

标签 c++ c clang code-coverage

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

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

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

目前,当我找到一条语句时,我会检查它是否是 BinaryOperator、UnaryOperator、Cast 或 DeclRefExpr。 (一旦我掌握了基础知识,我将扩展它的功能。)如果它是 BinaryOperator、UnaryOperator 或 Cast,我会检查表达式的子表达式。如果它是 DeclRefExpr,我可以检查表达式是左值还是右值(再次,现在简化),但是一旦我找到 DeclRefExpr,它们总是左值。为了确定它们是被用作左值还是右值,我必须检查它的父级,如果它是一个 lvaluetorvalue cast,它是否被用作右值。

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

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

谢谢

编辑

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

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

最佳答案

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

动态分析是您实际需要回答您最有可能感兴趣的问题。多线程软件的动态分析已经有很大的市场。

关于c++ - 在 C/C++ 中监视变量访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15252137/

相关文章:

c++ - alDeleteBuffers 函数的“名称无效”错误

c++ - 如何获取set bit中的相对位置

c++ - 具有多个参数的 boost::static_visitor

c - Atmel Studio 7.0 错误 0 x 104567910

c - libuv : src port of response not same as port on which process is listening

c++ - C++Builder "__property"的数据传递

android r11 ndk 缺少 clang 工具链

C++ Visual Studio-运算符重载中的空循环会导致调试错误?

macos - 获取Apple clang版本和对应的上游LLVM版本

c - 在附加 header 中包含 header 包含路径