2012-04-24 65 views
1
char *host; 

host = malloc(64 * sizeof(char)); /* spazio per 64 caratteri */ 
memset(host,0x00,host[63]); 

我有疑問:指針可以看作是一個「數組」嗎?
用上面的代碼我把NULL放入64字節? (以防止緩衝區溢出)c malloc防止緩衝區溢出

+1

使用'memset的(主機,0,64)' - 'memset的()'希望大小爲你傳遞什麼樣的第三個參數存在未初始化的數據(所以,廢話換句話說)。 – 2012-04-24 21:23:44

+0

'sizeof(char)'總是1,'0x00'是一個相當複雜的古老'0'表示。 – 2012-04-24 21:34:01

回答

2

即使您的代碼是正確的(請參閱@ Dietrich的答案),它並不會阻止緩衝區溢出。我可以這樣做:

strcpy(host, "A very large string that's definitely a lot longer than 64 characters, so it will cause you a great deal of misery"); 
+0

所以保護它的最好方法是這樣做的: – polslinux 2012-04-24 21:50:22

+0

if((strlen(host)+1)> 64){fdef(stderr,「\ n - > ERRORE:buffer overflow \ n」); \t \t return EXIT_FAILURE; \t} – polslinux 2012-04-24 21:50:39

+0

@polslinux:不,那樣做不會有用。一旦你完成了'strcpy',它已經太晚了! – 2012-04-24 21:53:33

2

指針可以看作是一個數組,在C中。但是,你的代碼是錯誤的。

正確的版本:

char *host; 
host = malloc(64); // sizeof(char) == 1, guaranteed by the standard 
if (!host) abort(); // malloc can return NULL if it fails 
host[63] = '\0';  // put NUL byte into the last element of array 

當你運行memset(host, 0x00, host[63]),它通過儲存在host[63]作爲長度到memset的價值。這是一個錯誤,因爲host未初始化,host[63]是垃圾,您不應將垃圾傳遞給memset。如果你非常幸運,你的程序將立即崩潰。如果你不走運,它不會。

\0字節放入host的最後一個插槽不會避免大部分緩衝區溢出。大多數不同類型的緩衝區溢出需要單獨處理,因此沒有「單向」來阻止它們。

緩衝區溢出是一類編程錯誤,像大多數類錯誤一樣,有很多方法可以使它們失效。每個不同的緩衝區溢出只是一段不正確的代碼,需要修復。

術語注:我更喜歡使用NULL指在C名爲「NULL」無效的指針,NUL指零字節的ASCII字符串。例如,

// Initialize ptr to a NULL ptr... 
char *ptr; 
ptr = NULL; 
ptr = 0; // equivalent to above 

ptr = xmalloc(15); 
// Set *ptr to the NUL byte... 
*ptr = '\0'; 
*ptr = 0; // equivalent to above 
+1

「一個指針可以看作是一個數組」 - 因爲一個指針可以指向數組的第一個元素,因此「代表」該數組。 – 2012-04-24 21:24:03

+0

此外,也許,說一些關於NULL與0 – Morpfh 2012-04-24 21:24:35

+0

@Rune:0是NULL,至少作爲一個文字... – 2012-04-24 21:29:38