使用LLVM进行静态源代码分析

Pho*_*ong 16 c c++ static-analysis llvm

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

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

编辑:

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

Pas*_*uoq 7

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

如果您的程序仅为C,我建议您查看Frama-C中的值分析.它根据一些在此详细解释的假设,计算程序中每个点的任何l值的可能值的超集.分析程序中的复杂性仅表示返回的超集更接近,但它们仍包含所有可能的运行时值(只要您保持在上述假设中).

编辑:如果您对切片分析程序的函数指针的可能值感兴趣,您一定要看看Frama-C中现有的依赖关系和切片计算.该网站没有任何切片的好例子,这里有一个来自邮件列表的讨论


P S*_*ved 5

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

编辑:事实上,我不会推荐任何人这样做。不过,只是为了记录一下……

  • @WeiHu,它实际上确实编译成汇编程序,但它也可以用 C 编写该代码。它有一个使用选项“-march=c”打开的特殊“架构”。 (2认同)

Gab*_*abe 5

你应该看看艾尔莎.它相对容易扩展,让您可以非常轻松地解析AST.它处理所有解析,lexing和AST生成,然后让您使用Visitor模式遍历树.

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

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

  • 遍历单个解析树距离从整个文件系统收集点到数据以及使用全局点到分析的结果计算调用图还有很长的路要走. (2认同)