首页 > 解决方案 > 如何静态获取导致 C 中变量设置的文件名和行号?

问题描述

我有一个用 C 编写的大型软件系统。我有所有的资源。我正在尝试找到一种工具,可以帮助我确定(最好通过静态分析)可以设置我感兴趣的变量的函数和行号。例子:

void func_a(int q) {
   int z;
   ...
   z = q*2;
   ....
   func_b(z);   //  I NEED TO FIND OUT ALL LINES in ALL FILES that can set "z"
}

int main(int argc, char *argv[]) {
     int x;
     ...
     x = 38;
     ...
     func_a(x);
}

我想被告知:

main()   x = 38;
func_a(x);
void func_a(int q);
func_a() z = q*2;

以上 4 行确定了我将要发送到 func_b() 的 z 值。

我检查了 clang、gtags(使用 --idutils)和其他一些。我无法确定这是否受支持。自然 main() 和 func_a() 可以在不同的 .c 文件中,并且有许多与我感兴趣的变量无关的其他行(它是一个大型软件系统。)

任何提示表示赞赏。

标签: cstatic-analysis

解决方案


我有一个用 C 编写的大型软件系统。我有所有的资源。我正在尝试找到一种工具,可以帮助我确定(最好通过静态分析)可以设置我感兴趣的变量的函数和行号。

这个问题是无解的。见赖斯定理

直觉是,如果你有一些自动变量 x,你可以将它的地址传递到&x别处,并且是任意的。你会有复杂的指针别名

但是,您可以考虑使用Frama-C (在ACSL中手动添加注释)或Clang 静态分析器和调试器。请注意,GDB提供了观察点

如果您的 C 编译器是最新的GCC,您可以编写自己的GCC 插件来帮助您(并分析程序的GIMPLE表示)。预计几周或几个月的工作。对于旧版本的 GCC,未维护的GCC MELT(我写的)可能有用。


推荐阅读