问题描述
我有一个大型C程序,我试图找出哪些函数(给定一个函数列表)在参数方面相互依赖。
#include <stdio.h>
#include <string.h>
#define MAX_PEOPLE 100
typedef struct
{
int id;
char name[50];
} person_t;
static person_t people[MAX_PEOPLE];
void addobject(int id,const char *name);
void incrementID(int id);
int main(void)
{
addobject(1,"bob");
incrementID(1);
printf("ID: %i\n",people[1].id);
printf("Name: %s\n",people[1].name);
}
void addobject(int id,const char *name)
{
people[id].id = id;
strcpy(people[id].name,name);
}
void incrementID(int id)
{
people[id].id++;
}
addobject和增量ID相互依赖,因为它们的参数之一(id)保存到同一数组。因此,一个人的功能将取决于另一个人的功能。
我的想法是分析使用-g标志编译的二进制文件,并确定每个函数将修改哪些内存区域。修改相同内存区域的任何功能都是“相关的”。我不确定这种启发式方法是否可行,或者从哪里开始。有什么想法吗?
解决方法
我希望能够自动生成这些依赖项。
您可能要放弃:您的问题等同于halting problem。
对于具有足够功能的跟踪器的目标程序的任何特定执行,您可以得出函数A()
和B()
是否访问/修改相同的内存。
但这只会告诉您有关该特定执行的事实,而不是有关程序一般的事实。输入参数的任何更改都可能会修改执行,因此也会推断出事实。
,对于这种问题,GDB可能是错误的工具。您想为程序构建一个调用图,以分析函数之间的依赖关系。一种方法是使用Eclipse CDT Indexer显示people
数组的调用方。您可以选择people
变量并为其打开调用层次。您将看到它在addObject()
和incrementID()
函数中使用,因此它们可以相互依赖: