【问题标题】:How to configure cppcheck to detect memory leaks in linux souce code如何配置 cppcheck 以检测 linux 源代码中的内存泄漏
【发布时间】:2014-12-05 01:53:38
【问题描述】:

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

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

【问题讨论】:

  • 在 Linux 上,valgrind 似乎是最流行的静态分析工具。我已经用它找到了非常好的结果的泄漏。
  • @SamVarshavchik Valgrind 是动态分析工具,不适用于静态分析..

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


【解决方案1】:

我是一名 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() 不会导致任何释放等。

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

【讨论】:

  • 感谢您的信息。我正在 linux 上尝试 cppcheck 来解决内存泄漏问题,你能告诉我 cppcheck 如何在函数指针、指针算术或转义到全局变量的情况下跟踪分配的变量吗?
  • 指针算法:cppcheck 在这里不是很聪明。只要分配的指针没有被重新分配,它就应该可以工作,例如 'p=malloc(10);免费(p+1);'。如果它变得太复杂,cppcheck 就会退出。
  • 转义到全局变量:cppcheck 退出。一般来说,cppcheck 不会跟踪全局变量,因为它们可能会被其他线程等异步使用。
  • 函数指针:这行不通。检查器只会看到调用了未知函数。如果分配的指针作为参数传递给函数,则检查器假定函数释放内存并退出。所以可以有FN。
  • 显然,Cppcheck 不是灵丹妙药。存在未检测到的泄漏。据我所知,没有灵丹妙药——使用不同的工具/方法,你会发现不同的漏洞。我相信 Cppcheck 的优势在于检测不太可能且相对简单的路径中的泄漏。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-18
    • 1970-01-01
    • 2015-05-03
    • 2013-03-21
    • 2018-09-01
    • 1970-01-01
    • 2011-08-21
    相关资源
    最近更新 更多