Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用LLVM进行静态源代码分析_C++_C_Static Analysis_Llvm - Fatal编程技术网

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

C++ 使用LLVM进行静态源代码分析,c++,c,static-analysis,llvm,C++,C,Static Analysis,Llvm,我最近发现了这个项目,据我所知,它可以用于对源代码执行静态分析。我想知道是否可以通过程序中的函数指针(查找调用者函数和被调用者函数)提取不同的函数调用 我可以在网站上找到这类信息,如果您能告诉我LLVM中是否已经存在这样的库,或者您能为我指出如何自己构建它的好方向(现有的源代码、参考、教程、示例…),那将非常有帮助 编辑: 通过我的分析,我实际上想要提取调用方/被调用方函数调用。对于函数指针,我想返回一组可能的被调用方。调用方和被调用方都必须在源代码中定义(这不包括库中的第三方函数)。我认为您的

我最近发现了这个项目,据我所知,它可以用于对源代码执行静态分析。我想知道是否可以通过程序中的函数指针(查找调用者函数和被调用者函数)提取不同的函数调用

我可以在网站上找到这类信息,如果您能告诉我LLVM中是否已经存在这样的库,或者您能为我指出如何自己构建它的好方向(现有的源代码、参考、教程、示例…),那将非常有帮助

编辑:


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

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

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

现在,GetFoo()可能返回哪些值?一般来说,你不能这么说(相当于解决停顿问题)。你将能够猜到一些琐碎的案例。可猜测的百分比当然会上升,这取决于您愿意投入多少精力。

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

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


编辑:如果你对用于切片分析程序的函数指针的可能值感兴趣,你一定应该看看Frama-C中的现有和切片计算。该网站没有任何切片的好例子,这里是在我们的项目中,我们通过转换LL来执行静态源代码分析在LLVM附带的
llc
程序的帮助下,将VM字节码转换成C代码。然后,我们使用分析C代码,但对于C语言,有很多工具可用。缺点是,
llc
生成的代码糟糕,精度损失很大。但这仍然是一条路要走

编辑:事实上,我不建议任何人这样做。但是,只是为了记录…

你应该看看。它相对容易扩展,让你相当容易地解析AST。它处理所有解析、词法分析和AST生成,然后让你使用访问者模式遍历树

class CallGraphGenerator : public ASTVisitor
{
  //...
  virtual bool visitFunction(Function *func);
  virtual bool visitExpression(Expression *expr);
}
然后,您可以检测函数声明,可能还可以检测函数指针的使用情况。最后,您可以检查函数指针的声明,并生成可能使用该指针调用的已声明函数的列表。

为大型C代码系统提供了各种类型的函数,并使用这些函数构造调用图全局分析点(采用适当的保守假设)。更多的讨论和分析示例可在网站上找到

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


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

你的意思是你在网站上找不到信息,是吗?我在网站上找到了一些信息ir网站,但还不足以知道LLVM能做什么或不能做什么(更详细)。我知道这一点,如果没有,我计划自己实现它。我想创建一个基于LLVM的切片程序,但我不知道第一个LLVM是否满足我的需要,第二个如何开始编程我的“LLVM扩展”。可能stackoverflow不是最好的提问地点。我将直接尝试LLVM论坛。感谢您的帮助。理论上只是说分析器无法返回
GetFoo()可能返回的精确值集
并终止所有输入程序。这并不是说,只要您愿意将未实际获取的值包含在设定值中,或排除一些本应获取的值,分析仪就不可能在所有情况下终止。这当然不是说不可能为程序返回准确的设定值人们在实践中感兴趣的ams。@帕斯卡:我不需要一个分析器来确定可能返回值的超集;我程序中所有(正确键入的)函数集就是这样一个超集——当然,在没有
dlopen()
的情况下。这才是真正的杀手。@MSalters我不确定你所说的“真正杀手”是什么意思。如果有人对使用dlopen()精确分析程序感兴趣的话,那就已经完成了。这并不是说dlopen正在做的事情比人们感兴趣的代码中已经分析的事情更复杂。