我正在寻找一个工具来静态生成 Linux 内核的调用图(对于给定的内核配置)。生成的调用图应该是“完整的”,即包含所有调用,包括潜在的间接调用,我们可以假设在 Linux 内核的情况下只能通过使用函数指针来完成调用。
例如,这可以通过分析函数指针类型来完成:这种方法会导致图中出现多余的边,但这对我来说没问题。
ncc http://students.ceid.upatras.gr/~sxanth/ncc/似乎实现了这个想法,但是我没有成功地使它在 3.0 内核上工作。还有其他建议吗?
我猜测这种方法在使用函数指针转换的情况下也可能导致边缘丢失,所以我也有兴趣知道这是否可能出现在 Linux 内核中。
附带说明一下,似乎还有其他工具能够对源代码进行语义分析以推断潜在的指针值,但据我所知,它们都不是设计用于 Linux 内核等项目的。
任何帮助将非常感激。
我们已经完成了 2600 万行(18,000 个编译单元)的整体 C 系统的全局指向分析(使用间接函数指针)和完整调用图构建。
我们用我们的DMS 软件再造工具包 http://www.semanticdesigns.com/Products/DMS/DMSToolkit.html, its C前端 http://www.semanticdesigns.com/Products/FrontEnds/CFrontEnd.html和它的相关的流动分析机器 http://www.semanticdesigns.com/Products/DMS/FlowAnalysis.html。点分析机制(以及其他分析)是保守的;是的,您会得到一些虚假的指向,因此会调用边缘。这些是很难避免的。
您可以通过提供有关关键功能的某些关键事实以及利用诸如“嵌入式系统[和操作系统]在调用图中往往没有循环”之类的知识来帮助此类分析器,这意味着您可以消除其中的一些。当然,你必须允许例外;我的道德观是:“在大系统中,一切都会发生。”
该特定问题包括使用特定于该特定软件的特殊加载方案动态加载(!)C 模块,但这只是增加了问题。
不应该对函数指针进行强制转换lose边缘;保守的分析应该简单地假设强制转换指针与系统中具有与强制转换结果相对应的签名的任何函数匹配。更成问题的是产生某种兼容签名的强制转换;如果在实际调用的函数接受 int 时将函数指针强制转换为 void* foo(uint),则分析点必然会保守地选择错误的函数。你不能为此责怪分析仪;演员阵容就在这种情况下。是的,我们在2600万行的系统中看到了这种垃圾。
这当然是分析 Linux 的正确规模(我认为只有 800 万行左右:-)。但我们还没有专门在 Linux 上尝试过。
设置此工具很复杂,因为您必须捕获有关编译本身的所有详细信息,特别是要生成的 Linux 内核的配置。因此,您几乎必须拦截编译器调用才能获取命令行开关等。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)