1

我想尝试一些开源静态分析工具来检查它们在检测 linux 源代码泄漏方面的性能。我从 cppchecker 开始。在 linux 中,大多数内存分配调用是通过 kmalloc()、kzalloc() 等函数进行的,相应的 free 函数是 kfree()。如何配置 cppchecker 来跟踪 kmalloc 调用而不是默认的 malloc() 调用?有一种叫做创建新配置文件的东西,我们可以在其中定义用户首选项,但我不知道该怎么做。

此外,作为上述问题的后续行动,cppcheck 是否执行内存泄漏检测的过程间分析?我可以为此目的使用哪些其他开源静态分析工具?

4

2 回答 2

3

我是一名 Cppcheck 开发人员。

确实,kmalloc 等有旧的内置处理。一个好的开始是使用内置知识检查内核。不需要 cfg 文件。

但是,使用 cfg 文件可以增强 cppcheck。

这是一个开始:

<?xml version="1.0"?>
<def format="1">
    <memory>
        <dealloc>kfree</dealloc>
        <alloc init="false">kmalloc</alloc>
        <alloc init="true">kzalloc</alloc>
    </memory>
</def>

将该文本保存在名称为 kernel.cfg 的文件中,然后使用例如 --library=kernel 在 cppcheck 分析期间使用该信息。

在这个 cfg 中有很多缺失的信息。如果您使用 --check-cfg ,当 Cppcheck 在分析过程中感到困惑并想要更多 cfg-info 时,它会抱怨。它主要需要关于函数的 noreturn 信息,以及函数是否“泄漏忽略”。

您可以查看我们的官方 std.cfg 文件,例如查看 strcmp() 的配置。此配置明确表示 strcmp() 不是 noreturn。该配置还具有“泄漏忽略”属性 - 因为如果您可以将指向已分配内存的指针传递给 strcmp() 则泄漏检查器应该忽略这一点,因为 strcmp() 不会导致任何释放等。

如果您对它的工作原理有任何疑问,请告诉我们。

于 2014-10-10T10:15:02.260 回答
0

您确定 cppcheck 还不能检查内核分配泄漏吗?源代码看起来很像对待 kmalloc 等等,就像对待 malloc 一样。例如,查看 cppcheck 存储库中的 testmemleak.cpp 文件,您会看到执行错误 kmalloc 的测试用例。

就过程间分析而言,我不相信 cppcheck 会这样做。我推测 GCC 可能会根据 -flto 标志做一些事情,但我不是专家。

于 2014-10-10T04:06:41.623 回答