我最近发现了LLVM (low level virtual machine)项目,从我听到过它可以用来对源代码进行静态分析。我想知道是否可以通过函数指针(在函数中找到调用函数和被调用函数)来提取不同的函数调用。
我可以在网站上找到那种信息,所以如果你能告诉我LLVM中是否已存在这样的图书馆,或者你能指出我自己如何构建它的好方向,那将会非常有用(现有资源)代码,参考,教程,示例......)。
修改
通过我的分析,我实际上想要提取调用者/被调用者函数调用。在函数指针的情况下,我想返回一组可能的被调用者。必须在源代码中定义调用者和被调用者(这不包括库中的第三方函数)。
答案 0 :(得分:7)
我认为Clang(作为LLVM一部分的分析器)适用于检测错误,这意味着分析器会尝试计算某些表达式的可能值(以减少误报),但有时会放弃(在这种情况下,不会发出任何警报以避免误报。)
如果您的程序仅限C,我建议您查看Frama-C中的值分析。它根据一些长度here解释的假设计算程序中每个点的任何l值的可能值的超集。分析程序中的复杂性仅表示返回的超集更接近,但它们仍包含所有可能的运行时值(只要您保持在上述假设中)。
编辑:如果您对切换分析程序的函数指针的可能值感兴趣,那么您一定要查看Frama-C中现有的dependencies和切片计算。该网站没有任何切片的好例子,这里是one from a discussion on the mailing-list
答案 1 :(得分:5)
你应该看看Elsa。它相对容易扩展,让您可以非常轻松地解析AST。它处理所有解析,lexing和AST生成,然后让您使用访问者模式遍历树。
class CallGraphGenerator : public ASTVisitor
{
//...
virtual bool visitFunction(Function *func);
virtual bool visitExpression(Expression *expr);
}
然后,您可以检测函数声明,并可能检测函数指针的使用情况。最后,您可以检查函数指针的声明,并生成可以使用该指针调用的声明函数的列表。
答案 2 :(得分:4)
在我们的项目中,我们通过在LLVM附带的llc
程序的帮助下将LLVM字节码转换为C代码来执行静态源代码分析。然后我们用CIL (C Intermediate Language)分析C代码,但是对于C语言,可以使用很多工具。由llc
生成的代码的pitfail是 AWFUL ,并且会严重损失精度。但是,这仍然是一种方法。
编辑:事实上,我不建议任何人这样做。但仍然只是为了纪录...
答案 3 :(得分:1)
我认为你的问题存在缺陷。标题写着“静态源代码分析”。然而,你的潜在原因似乎是构建(部分)调用图,包括通过函数指针调用。函数指针的本质是您无法在编译时知道它们的值,即在您进行静态源代码分析时。考虑一下这段代码:
void (*pFoo)() = GetFoo();
pFoo();
静态代码分析无法告诉您GetFoo()在运行时返回的内容,尽管它可能会告诉您结果随后用于函数调用。
现在,GetFoo()可能会返回什么值?你根本不能说这一点(相当于解决暂停问题)。你将能够猜出一些微不足道的案例。可猜测的百分比当然会上升,具体取决于您愿意投入多少精力。
答案 4 :(得分:1)
DMS Software Reengineering Toolkit为大型C代码系统提供各种类型的control, data flow, and global points-to analyzers,并使用全局点分析构建调用图(使用适当的保守假设)。可以在网站上找到更多讨论和分析示例。
已经在具有2500万行的C代码的单片系统上测试了DMS。 (这个怪物的调用图中有250,000个函数)。从基本的C AST和符号表中设计所有这些机器是一项巨大的工作;去过也做过。如果你有其他与生活有关的事情,你不想自己这样做,比如实施其他应用程序。