【问题标题】:Finding the input dependencies of a functions outputs查找函数输出的输入依赖关系
【发布时间】:2016-08-08 11:20:43
【问题描述】:

我一直在使用 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 中,因此编辑器插件似乎不是我想要的。

【问题讨论】:

  • 您的函数是无效的,但尝试返回一个值。对我来说毫无意义。
  • 你的编译器应该因为你从void函数返回结果而对你大喊大叫!抱歉,请阅读 C 编程的基础知识(“函数”部分)。
  • 是的,有办法。遗憾的是,这需要解决 停机问题
  • 哦,shi-。这些功能应该只是虚拟的,与问题本身没有直接关系。但你是对的。 C不是我写的,我只是分析一下。

标签: python c static-analysis control-flow-graph pycparser


【解决方案1】:

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

这在文献中称为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 上的文章。

【讨论】:

  • 目前我的程序能够仅使用 AST 来检索依赖关系,但不包括结构(目前看起来我有解决方案)和指针。全部用 Python 编写,带有 pycparser。我能指望在这之后遇到问题,这会使这成为不可能吗?编辑:我将继续阅读那篇文章。
  • @Zpooks:是的,你会遇到麻烦。您似乎不喜欢指向函数的文本讨论,所以我添加了一个间接函数调用的示例。你不能用“只是 ASTs”来做到这一点。但是,您可以通过重新发明(自己)计算数据流所需的所有经典分析来做到这一点,但这并不是“仅使用 AST”。
猜你喜欢
  • 2015-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-25
  • 2015-05-30
  • 1970-01-01
  • 2015-05-05
  • 1970-01-01
相关资源
最近更新 更多