确定基于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()函数中使用,因此它们可以相互依赖:

enter image description here