如何配置cppcheck来检测linux源代码中的内存泄漏

时间:2014-10-10 00:41:38

标签: c++ c linux memory-leaks cppcheck

我想尝试一些开源静态分析工具来检查它们在检测linux源代码泄漏方面的性能。我从cppchecker开始。 在linux中,大多数内存分配调用是通过kmalloc(),kzalloc()等函数进行的,相应的自由函数是kfree()。如何配置cppchecker来跟踪kmalloc调用而不是默认的malloc()调用?有一些叫做创建新配置文件的地方我们可以定义用户首选项但是我无法弄清楚如何做到这一点。

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

2 个答案:

答案 0 :(得分: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信息以及函数是否为“leak-ignore”。

您可以查看我们的官方std.cfg文件,例如在strcmp()的配置中。这个配置明确地说strcmp()不是noreturn。配置还有一个“leak-ignore”属性 - 因为如果你可以将指向已分配内存的指针传递给strcmp(),那么泄漏检查器应该忽略这一点,因为strcmp()不会导致任何重新分配等。

如果您对其运作方式有疑问,请告诉我们。

答案 1 :(得分:0)

您是否确定cppcheck尚未检查内核分配泄漏?源代码看起来非常像它对待kmalloc等,就像malloc一样。例如,查看cppcheck存储库中的testmemleak.cpp文件,您会看到运行错误kmalloc的测试用例。

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