leaks 命令未检测到 C 程序中的内存泄漏

leaks command not detecting memory leaks in C program

提问人:Elhazin 提问时间:7/17/2023 最后编辑:Elhazin 更新时间:7/17/2023 访问量:98

问:

我有一个 C 程序,我怀疑内存泄漏的存在

#include <stdio.h>
#include <stdlib.h>

char *f()
{
    return (char *)malloc(10);
}

int main()
{
    f();
    system("leaks a.out");
    return 0;
}

f() 函数使用 malloc 分配 10 字节的内存,但我没有在程序终止之前释放它。尽管在终端中使用了“leaks”命令,但它不会报告任何内存泄漏。

我还尝试在睡眠时添加延迟,希望它能让“泄漏”命令有足够的时间来检测泄漏,但没有检测到泄漏。

为什么在这种情况下,“leaks”命令无法检测到内存泄漏?是否有其他方法或工具可以有效地识别 C 程序中的内存泄漏?

谢谢你的帮助。

c 泄漏 malloc 堆内存

评论

2赞 ad absurdum 7/17/2023
也许你应该对分配做一些事情,以确保对的调用不会被优化。f()
0赞 Elhazin 7/17/2023
这就是我想知道的,在这种情况下是否存在优化。@adabsurdum
1赞 n. m. could be an AI 7/17/2023
我不熟悉泄漏程序,但它不太可能按照您尝试使用它的方式工作。您可能应该通过调用来删除 ine,而是从命令行运行类似的东西。systemleaks ./a.out
0赞 ad absurdum 7/17/2023
@Elhazin -- 检查汇编代码以查看是否被调用。我用 gcc 编译了您的程序,并在调用时进行了优化。或者只是使用分配,例如,在里面放一个字符串并打印出来,以确保它不会被优化掉。f-O2f
0赞 Elhazin 7/17/2023
是的,我在函数中打印了一个字符串,它被打印出来,所以该函数被称为@adabsurdum

答:

0赞 Ted Lyngmo 7/17/2023 #1

编译器可以优化对 的调用(以及对 的调用),因为您从不使用 from 的返回值,并且 in 中的任何内容都不会产生任何其他明显的副作用。例如,GCC 将程序编译为:f()mallocff

f:
        mov     edi, 10
        jmp     malloc
.LC0:
        .string "leaks a.out"
main:
        sub     rsp, 8
        mov     edi, OFFSET FLAT:.LC0
        call    system
        xor     eax, eax
        add     rsp, 8
        ret

...正如你所看到的,没有来自 的调用。fmain

如果你做 ,编译器也可以确保它根本不需要保留在那里并完全删除它:fstaticf

.LC0:
        .string "leaks a.out"
main:
        sub     rsp, 8
        mov     edi, OFFSET FLAT:.LC0
        call    system
        xor     eax, eax
        add     rsp, 8
        ret