这个问题就是典型的缓冲区溢出的问题。书上给了个netbsd中banner的例子以及应该使用的正确函数。
正确的应该使用:strlcpy,strncpy,strlcat,fgets,snprintf,vsnprintf,getcwd;等。如果在vs下开发,则可以利用*_s等。
其中的例子:
char message[MAXMSG];
if (*argv) {
strcpy(message, *argv);
while (*++argv) {
strcat(message, " ");
strcat(message, *argv);
}
nchars = strlen(message);
} else {。。。}
正确的:
char *message;
if (*argv) {
for(i=0, j=0; i < argc; i++)
j += strlen(argv[i]) + 1;
if ((message = malloc((size_t)j)) == NULL)
err(1, "malloc");
strcpy(message, *argv);
while (*++argv) {
strcat(message, " ");
strcat(message, *argv);
}
nchars = strlen(message);
} else {。。。}
其实说起来可能都能知道该怎么用,关键有时候就是写代码的时候偷点懒,默认人家不会输太长,呵呵!其实这种假设是非常不安全的。