2012-04-24 66 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