我有一個是這樣的代碼:爲什麼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),它也不會顯示出來。
此代碼看起來好像沒什麼問題,也許代碼分析竊聽。 –
'如果(p-> a)'是多餘的,如'free'執行此檢查本身 –
OOC,確實轉換爲'my_type * p = calloc(1,sizeof(* p));'停止警告?這應該不重要,但我想知道是否會壓制警告。有可能它會假定異常提升行爲或其他情況,並不是所有的指針都會在特定的條件下被初始化(在代碼中不是很明顯,但是很小的變化,比如分配'p-> b'成功分配' p-> a')可能會引發這種情況。 – ShadowRanger