如何在给定的C代码中查找每个函数的所有内存访问(全局,局部)?

问题描述 投票:1回答:1

给出C代码和C代码中的变量(函数的全局变量或局部变量),有没有办法找到使用该变量的函数?如果还通过指针访问变量,也应该显示该函数对变量的访问。

试图使用LLVM IR提取信息,但似乎很困难。


int a = 2;
int array1 = {1,2,3};

int function1(int c, int d) {
   return c + d;
}

int function2 (int arg1[], int * p1, int *p2) {
   int a;
   return arg1[2]+ (*p1) +a + (*p2);
}

int main() {
   int e =2, f=3,g;

   g = function1(e,f);

   int array2[] = {1,2,3,4};

   g = function2(array1,&e,array2);

   return 0;
}
变量和使用它们的函数全球:一个-没有,array1-function2,主要局部变量:function2:a-function2,main:e-main,function2,main:f-main,main:g-main,main:array2-main,function2
c pointers variables memory-access
1个回答
0
投票

是否可以找到使用此变量的函数

您最好的选择是使用IDE,其中大多数将能够跟踪对全局变量的引用。

或者,您可以使用静态分析工具,例如cxref(与https://linux.die.net/man/1/cxref匹配的工具)。我很久以前使用过,它很有用。有一个同名的文档工具-可能有用。

万不得已,如果没有其他选择,请注释变量声明,然后尝试构建代码。编译器将在每个错误的引用上引发错误。 (较小的例外:隐藏全局定义的局部范围变量可能不会引发错误)。

如果还访问了变量,则显示该函数对变量的访问通过指针。

这很难通过static分析进行(对于实际程序是不可能的)。通常,这是在运行时完成的。某些调试器(例如gdb监视程序)使您可以识别何时修改变量(包括通过指针)。有了硬件支持,也可以在gdb中设置“ read watch”。请参见gdb rwatchCan I set a breakpoint on 'memory access' in GDB?

© www.soinside.com 2019 - 2024. All rights reserved.