我一直在使用pycparser开发一个python程序,该程序应该生成一个具有给定函数及其输出的依赖关系的JSON文件。 对于示例函数:
int Test(int testInput)
{
int b = testInput;
return b;
}
我希望 b 依赖于 testInput 。但是当然它可以使结构和if语句等变得更加复杂。我正在测试的文件也具有特定形式的功能,这些功能被视为输入和输出,如下所示:
int Test(int testInput)
{
int anotherInput = DatabaseRead(VariableInDatabase);
int b = testInput;
int c;
c = anotherInput + 1;
DatabaseWrite(c);
return b;
}
此处 c 依赖于 VariableInDatabase , b 与之前相同。 我在pycparser中遇到了这样的分析,因为大多数结构和指针对我来说真的很难处理,而且似乎有更好的方法。我已经阅读过AST和CFG以及其他分析工具,比如Frama-C,但如果这是一件事,我似乎无法找到明确的答案。
是否有一种已知的方法可以进行此类分析,如果有,我应该研究什么? 它应该有数千个文件,并且能够将这些依赖项输出到JSON中,因此编辑器的插件似乎不像我正在寻找的。 p>
答案 0 :(得分:2)
您需要对代码进行数据流分析,然后您希望将数据流从结果向后追溯到其源,直到某个停止点(在您的情况下,您停在一个函数参数但您可能也想要停在任何全局变量上。)
这在文献中称为program slicing。
计算数据流非常困难,特别是如果你有一个复杂的语言(C很有趣:你可以让数据流通过间接称为读取值的函数;现在你需要间接的点分析来支持你的数据流,以及反之亦然。)
以下是一个有趣的例子:
// ocean of functions:
...
int a(){ return b; }
...
int p(){ return q; }
...
void foo( int()* x )
{ return (*x)(); }
foo依赖于b吗?在q?除非你知道,否则你无法知道 foo叫a或b。但foo是一个函数指针...和 那可能是什么意思?
仅使用AST和CFG是必要的,但还不够;数据流分析算法很难,特别是如果你有规模(如你所建议的那样);你需要很多机器才能做到这一点并不容易 [我们已经在1600万行的C程序中完成了这项工作]。请参阅Life After Parsing上的论文。