Cppcheck:(error) 资源泄漏

4

我正在学习C语言,但是在识别内存泄漏问题上遇到了困难。

当我使用cppcheck检查代码时,出现了错误提示:Resource leak: f。

enum bus_type {
    MEDIA_BUS_UNKNOWN,
    MEDIA_BUS_VIRTUAL,
    MEDIA_BUS_PCI,
    MEDIA_BUS_USB,
};

static enum bus_type get_bus(char *device)
{
        char file[PATH_MAX];
        char s[1024];
        FILE *f;

        if (!strcmp(device, "/sys/devices/virtual"))
                return MEDIA_BUS_VIRTUAL;

        snprintf(file, PATH_MAX, "%s/modalias", device);
        f = fopen(file, "r");
        if (!f)
                return MEDIA_BUS_UNKNOWN;
        if (!fgets(s, sizeof(s), f))       /* <-- (error) Resource leak: f */
                return MEDIA_BUS_UNKNOWN;
        fclose(f);

        if (!strncmp(s, "pci", 3))
                return MEDIA_BUS_PCI;
        if (!strncmp(s, "usb", 3))
                return MEDIA_BUS_USB;

        return MEDIA_BUS_UNKNOWN;
}

我感觉在内存管理方面缺少了一些东西。


1
在第二种情况下返回 MEDIA_BUS_UNKNOWN 之前,你应该先关闭 f - sapi
1个回答

6
你需要在函数中 fopen 文件后,使用 fclose 关闭文件,否则会导致分配并由 FILE* 指向的资源泄漏。
例如:
if (!fgets(s, sizeof(s), f)) {
     fclose(f);
     return MEDIA_BUS_UNKNOWN;
} 

希望这能帮到你!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接