char *host;
host = malloc(64 * sizeof(char)); /* spazio per 64 caratteri */
memset(host,0x00,host[63]);
我有一个疑问:指针可以看作是一个“数组”?? 使用上面的代码,我把NULL放入64字节? (防止缓冲区溢出)
答案 0 :(得分: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");
答案 1 :(得分: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]
中存储的值作为 length 传递给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