2015-11-04 439 views
6

我有一個是這樣的代碼:爲什麼VS2013抱怨「使用未初始化的內存」?

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

typedef struct { 
    char *a; 
    char *b; 
    int c; 
} my_type; 

void free_my_type(my_type *p) { 
    if (p) { 
     if (p->a) free(p->a); // line 12 
     if (p->b) free(p->b); // line 13 
     free(p); 
    } 
} 

int main(void) { 
    my_type *p = malloc(sizeof(*p)); 

    p->a = malloc(10); 
    p->b = malloc(10); 
    p->c = 10; 

    free_my_type(p); 

    return 0; 
} 

VS代碼分析是抱怨我:

"C6001 Using uninitialized memory '*p'" 

     '*p' is not initialized        12 
     Skip this branch, (assume 'p->b' is false)   13 
     '*p' is used, but may not have been initialized  13 

我的意思是,這是一個指針,我檢查,看它是否是NULL。我將如何知道* p是否已初始化?奇怪的是,如果結構中只有一個其他指針 - 例如char *a,則警告不會觸發。如果我在free(p->a)之前free(p->b)(交換行12和13),它也不會顯示出來。

+2

此代碼看起來好像沒什麼問題,也許代碼分析竊聽。 –

+4

'如果(p-> a)'是多餘的,如'free'執行此檢查本身 –

+0

OOC,確實轉換爲'my_type * p = calloc(1,sizeof(* p));'停止警告?這應該不重要,但我想知道是否會壓制警告。有可能它會假定異常提升行爲或其他情況,並不是所有的指針都會在特定的條件下被初始化(在代碼中不是很明顯,但是很小的變化,比如分配'p-> b'成功分配' p-> a')可能會引發這種情況。 – ShadowRanger

回答

3

這似乎是與Visual Studio 2013

的分析工具有問題如下解釋:

https://randomascii.wordpress.com/2011/07/25/analyze-for-visual-studiothe-ugly-part-1/

https://randomascii.wordpress.com/2011/07/29/analyze-for-visual-studiothe-ugly-part-2/

https://randomascii.wordpress.com/2011/08/06/analyze-for-visual-studiothe-ugly-part-3-false-positives/

https://randomascii.wordpress.com/2011/08/20/analyze-for-visual-studiothe-ugly-part-4-false-negatives/

https://randomascii.wordpress.com/2011/09/13/analyze-for-visual-studio-the-ugly-part-5/

如部分5的更新,我們可以看到這一點:

更新:幸運的是VC++ 2013已經解決了許多問題,但__analysis_assume的問題依然存在。

所以即使他們解決了許多論文警告問題與最新的Visual Studio版本,還有一些缺陷發生在分析工具。

測試與VS2015企業:給出了同樣的問題

enter image description here

+1

我刪除了ifs(現在我知道免費做檢查自己),它抑制了這個特定情況下的警告。還有其他一些誤報,tho。 – sthiago

相關問題