假设在用C编写的项目中,有一个名为A
的函数和一个名为B
的函数。
如何验证功能A是否可以出现在功能B的调用树中?就像B-> C-> D-> ...-> A 。
当我考虑哪个libvirt
API可以调用qemu qmp“ query-block”时,就会出现此问题。由于qmp“查询块”仅由函数qemuMonitorJSONQueryBlock
调用。因此,这个特定的问题变成:如何找到哪个libvirt
API可以调用qemuMonitorJSONQueryBlock
?
我认为动态分析很难回答这个问题,因为需要大量测试。这应该是静态分析的问题。但是我可以找到适当的工具或方法来解决它。最后,我将问题概括为第一段。
答案 0 :(得分:1)
您可以尝试使用CppDepend及其代码查询语言来创建有关依赖项的一些高级查询,在这种情况下,您可以使用类似这样的查询
from m in Methods
let depth0 = m.DepthOfIsUsedBy("__Globals.B()")
where depth0 >= 0 && m.SimpleName=="A" orderby depth0
select new { m, depth0 }
答案 1 :(得分:0)
您可以使用GNU cflow实用程序,该实用程序分析用C编程语言编写的源文件的集合,并输出图表来绘制各种功能之间的依赖关系
答案 2 :(得分:0)
我认为动态分析很难回答这个问题,因为需要大量测试。这应该是静态分析的问题。但是我可以找到适当的工具或方法来解决它。最后,我将问题概括为第一段。
是真的,基本上是因为您可以调用从未在程序中链接的函数。与dlopen(3)
函数和朋友一起,您可以将一个完全未知的函数动态链接到您的程序并能够调用它。无法检查指向函数的指针是否实际上存储了有效的指针,因此无法查看是否将调用该指针(或者是否在某些初始函数的调用图中)
答案 3 :(得分:0)
我发现cscope可以帮助解决问题。它是一个
是开发人员用于浏览源代码的工具。它可以通过以下方法获取函数的调用者:
1.转到源代码目录,然后生成名为 cscope.out
str = input('Enter the string: ')
if str == str[::-1]:
print('Palindrome')
else
print('Not')
cd libvirt
cscope -bR
,然后第二列是此函数的调用方。例如:cscope -d -f cscope.out -L3 func1
结果:
cscope -d -f./cscope.out -L3 qemuMigrationDstPrepareDirect
请注意:cscope将错误地将函数属性声明 ATTRIBUTE _ * 视为调用方。我们应该跳过它们。
然后递归地找到a函数的调用者。最后,选择目标 B-> ...-> A 通话记录。
答案 4 :(得分:0)
doxygen 可以生成调用图和调用者图。如果您为图表中的无限数量的呼叫配置了此功能,则可以获取所需的信息。