2013-06-13 72 views
2

我做一些學習與C,和我有麻煩識別內存泄漏情況Cppcheck:(錯誤)資源泄漏

當我檢查與cppcheck代碼:得到(錯誤)資源泄漏: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

回答

3

您需要fclose文件,該文件在函數前面編輯過,否則您會泄漏FILE*指定的資源。

例如:

if (!fgets(s, sizeof(s), f)) { 
    fclose(f); 
    return MEDIA_BUS_UNKNOWN; 
} 

希望這有助於!