gpt4 book ai didi

python - 查找函数输出的输入依赖关系

转载 作者:太空宇宙 更新时间:2023-11-04 08:11:48 25 4
gpt4 key购买 nike

我一直在使用 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 中遇到了这种分析,因为大多数结构和指针对我来说真的很难处理,而且似乎有更好的方法。我已经阅读了 ASTs 和 CFGs,以及其他分析工具,如 Frama-C,但我似乎无法找到一个明确的答案,即使这是一回事。

有没有一种已知的方法可以进行这种分析,如果有,我应该研究什么?它应该有数千个文件,并且能够将这些依赖项输出到 JSON 中,因此编辑器插件似乎不是我要找的东西。

最佳答案

您需要对您的代码进行数据流分析,然后您希望跟踪数据流从结果到其来源,直到某个停止点(在您的情况下,您在函数参数处停止,但您可能还想在任何全局变量处停止)。

这叫做 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 是必要的,但还不够;数据流分析算法很难,特别是如果你有规模(正如你建议的那样);你需要很多机器来做这个不容易 build [我们已经在 1600 万行的 C 程序上完成了这项工作]。请参阅我关于 Life After Parsing 的文章.

关于python - 查找函数输出的输入依赖关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38827921/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com