c - 如何静态获取导致 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 文件中,并且有许多与我感兴趣的变量无关的其他行(它是一个大型软件系统。)
任何提示表示赞赏。
解决方案
我有一个用 C 编写的大型软件系统。我有所有的资源。我正在尝试找到一种工具,可以帮助我确定(最好通过静态分析)可以设置我感兴趣的变量的函数和行号。
这个问题是无解的。见赖斯定理
直觉是,如果你有一些自动变量 x
,你可以将它的地址传递到&x
别处,并且是任意的。你会有复杂的指针别名。
但是,您可以考虑使用Frama-C (在ACSL中手动添加注释)或Clang 静态分析器和调试器。请注意,GDB提供了观察点。
如果您的 C 编译器是最新的GCC,您可以编写自己的GCC 插件来帮助您(并分析程序的GIMPLE表示)。预计几周或几个月的工作。对于旧版本的 GCC,未维护的GCC MELT(我写的)可能有用。
推荐阅读
- jenkins - 当 SonarQube 在不同的服务器上而 Jenkins 在不同的服务器上时,sonar.source 属性无效
- c# - 如何在 WPF 项目的 .cs 文件中使用 Textbox 的控件?
- javascript - 映射嵌套对象
- javascript - 为什么窗口间隔计时器 id 不从 0 开始?
- javascript - React 组件的简单转换
- javascript - 输入日期字段应仅显示月份和年份
- c# - 在 Web api 项目上更改主控制器
- php - 如何在 PHP 中将数值转换为格式化字符串
- python - 在 mouseup 上触发事件,而不是使用面板滑块小部件连续触发事件
- git - git 在部署时忽略 composer.lock 文件