16

我最近发现了LLVM(低级虚拟机)项目,据我所知,它可以用来对源代码进行静态分析。我想知道是否可以在程序中通过函数指针(找到调用者函数和被调用者函数)提取不同的函数调用。

我可以在网站上找到那种信息,所以如果你能告诉我这样的库是否已经存在于 LLVM 中,或者你能指出如何自己构建它的好方向(现有源代码,参考,教程,示例...)。

编辑:

通过我的分析,我实际上想提取调用者/被调用者函数调用。在函数指针的情况下,我想返回一组可能的被调用者。调用者和被调用者都必须在源代码中定义(这不包括库中的第三方函数)。

4

5 回答 5

7

我认为 Clang(LLVM 的一部分的分析器)旨在检测错误,这意味着分析器尝试计算某些表达式的可能值(以减少误报)但有时会放弃(在这种情况下,不发出警报以避免大量误报)。

如果您的程序仅为 C,我建议您查看Frama-C中的值分析。它计算程序每个点的任何 l 值的可能值的超集,在此处详细解释的一些假设下。分析程序中的复杂性仅意味着返回的超集更加近似,但它们仍然包含所有可能的运行时值(只要您保持在上述假设范围内)。

编辑:如果您对函数指针的可能值感兴趣以对分析的程序进行切片,您绝对应该查看 Frama-C 中现有的依赖项和切片计算。该网站没有任何好的切片示例,这是来自邮件列表讨论的一个示例

于 2010-03-01T13:32:46.863 回答
5

你应该看看艾尔莎。它相对容易扩展,并且可以让您相当轻松地解析 AST。它处理所有的解析、词法分析和 AST 生成,然后让您使用访问者模式遍历树。

class CallGraphGenerator : public ASTVisitor
{
  //...
  virtual bool visitFunction(Function *func);
  virtual bool visitExpression(Expression *expr);
}

然后,您可以检测函数声明,并可能检测函数指针的使用。最后,您可以检查函数指针的声明并生成可以使用该指针调用的已声明函数的列表。

于 2010-03-03T18:48:42.220 回答
4

llc在我们的项目中,我们通过 LLVM附带的程序将 LLVM 字节码转换为 C 代码来执行静态源代码分析。然后我们用CIL (C Intermediate Language)分析 C 代码,但是对于 C 语言有很多工具可用。生成的代码的缺陷llcAWFUL并且精度损失很大。但是,这仍然是一种方法。

编辑:事实上,我不会推荐任何人喜欢这个。但是,只是为了记录...

于 2010-03-01T16:57:39.930 回答
1

我认为你的问题有缺陷。标题说“静态源代码分析”。然而,您的根本原因似乎是调用图(的一部分)的构造,包括通过函数指针进行的调用。函数指针的本质是您无法在编译时知道它们的值,即在您进行静态源代码分析时。考虑这段代码:

void (*pFoo)() = GetFoo();
pFoo();

静态代码分析无法告诉您 GetFoo() 在运行时返回什么,尽管它可能会告诉您结果随后用于函数调用。

现在,GetFoo() 可能返回什么值?你根本不能说这个一般(相当于解决停机问题)。您将能够猜出一些琐碎的案例。可猜测的百分比当然会上升,具体取决于您愿意投入多少努力。

于 2010-03-01T13:23:32.927 回答
1

DMS Software Reengineering Toolkit为大型 C 代码系统提供各种类型的控制、数据流和全局指向分析器,并使用该全局指向分析构建调用图(具有适当的保守假设)。更多讨论和分析示例可以在网站上找到。

DMS 已经在具有 2500 万行的 C 代码单片系统上进行了测试。(这个怪物的调用图中有 250,000 个函数)。

从基本的 C AST 和符号表设计所有这些机器是一项巨大的工作。去过也做过。如果你的生活有其他事情要做,比如实现其他应用程序,你不想自己做这件事。

于 2010-03-11T05:42:57.233 回答