1
char *host;

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

我有一个疑问:指针可以看作是一个“数组”??
使用上面的代码,我是否将 NULL 放入 64 字节?(防止缓冲区溢出)

4

2 回答 2

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");
于 2012-04-24T21:22:11.943 回答
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并不能避免大多数缓冲区溢出。大多数不同类型的缓冲区溢出需要单独处理,因此没有“一种方法”可以防止它们。

缓冲区溢出是一类编程错误,和大多数类错误一样,有很多方法可以制造它们。每个不同的缓冲区溢出只是一段需要修复的错误代码。

术语说明:我更喜欢使用NULLC 中名为“NULL”的无效指针,以及NULASCII 字符串中的零字节。例如,

// 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
于 2012-04-24T21:22:59.050 回答