如何解决确定基于C函数的参数之间的依赖关系?
我有一个大型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()
函数中使用,因此它们可以相互依赖:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。