我被要求在以下代码中找到两个主要问题。
char* name(char* first_name, char* last_name){
char buff[100];
sprintf (buff, "%s %s", first_name, last_name);
return (buff);
}
我只发现一个问题。buff 数组是在函数范围内声明的。意思是当返回调用这个函数的函数时,它会返回一个指向“空”的指针(不是buff数组)。我找不到第二个问题。你能帮忙吗?谢谢!
我被要求在以下代码中找到两个主要问题。
char* name(char* first_name, char* last_name){
char buff[100];
sprintf (buff, "%s %s", first_name, last_name);
return (buff);
}
我只发现一个问题。buff 数组是在函数范围内声明的。意思是当返回调用这个函数的函数时,它会返回一个指向“空”的指针(不是buff数组)。我找不到第二个问题。你能帮忙吗?谢谢!
一个就是你说的,返回一个局部变量。
一种是如果这个人的名字很长,一个固定的 buff[100] 会溢出。
缓冲区溢出,使用sprintf
而不是snprintf
(有点多余,我知道),参数应该是const char*
,没有空检查,buff 周围不必要的括号,没有缩进,我明白了吗?
first_name
,last_name
所以这会让你容易崩溃和缓冲区溢出黑客攻击。在我看来,还有几件事是错误的。首先, first_name 和 last_name 应该是const char *
因为它们没有被修改......界面应该指定它。其次,对字符串的长度没有错误或边界检查......你很容易在堆栈上出现缓冲区溢出......主要的安全问题。