如何检查某个特定功能是否可以被另一个特定功能间接调用?

时间:2019-06-22 13:44:14

标签: c static-analysis

假设在用C编写的项目中,有一个名为A的函数和一个名为B的函数。

如何验证功能A是否可以出现在功能B的调用树中?就像B-> C-> D-> ...-> A

当我考虑哪个libvirt API可以调用qemu qmp“ query-block”时,就会出现此问题。由于qmp“查询块”仅由函数qemuMonitorJSONQueryBlock调用。因此,这个特定的问题变成:如何找到哪个libvirt API可以调用qemuMonitorJSONQueryBlock

我认为动态分析很难回答这个问题,因为需要大量测试。这应该是静态分析的问题。但是我可以找到适当的工具或方法来解决它。最后,我将问题概括为第一段。

5 个答案:

答案 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 }

enter image description here

答案 1 :(得分:0)

您可以使用GNU cflow实用程序,该实用程序分析用C编程语言编写的源文件的集合,并输出图表来绘制各种功能之间的依赖关系

答案 2 :(得分:0)

  

我认为动态分析很难回答这个问题,因为需要大量测试。这应该是静态分析的问题。但是我可以找到适当的工具或方法来解决它。最后,我将问题概括为第一段。

是真的,基本上是因为您可以调用从未在程序中链接的函数。与dlopen(3)函数和朋友一起,您可以将一个完全未知的函数动态链接到您的程序并能够调用它。无法检查指向函数的指针是否实际上存储了有效的指针,因此无法查看是否将调用该指针(或者是否在某些初始函数的调用图中)

答案 3 :(得分:0)

我发现cscope可以帮助解决问题。它是一个 是开发人员用于浏览源代码的工具。它可以通过以下方法获取函数的调用者:
1.转到源代码目录,然后生成名为 cscope.out

cscope数据库文件
str = input('Enter the string: ')

if str == str[::-1]:
   print('Palindrome')
else
   print('Not')
  1. 通过cscope查找 func1 呼叫者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 可以生成调用图和调用者图。如果您为图表中的无限数量的呼叫配置了此功能,则可以获取所需的信息。