1

我一直在使用 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将依赖于VariableInDatabaseb和以前一样。我在 pycparser 中进行了这种分析,因为大多数结构和指针对我来说真的很难处理,而且似乎有更好的方法。我已经阅读了 AST 和 CFG,以及其他分析工具,如 Frama-C,但如果这是一件事,我似乎无法找到明确的答案。

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

4

1 回答 1

3

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

这在文献中称为程序切片

计算数据流是相当困难的,特别是如果你有一种复杂的语言(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 程序上完成了这个]。请参阅我关于解析后的生活的文章。

于 2016-08-08T11:57:11.180 回答