C++中的堆栈溢出校正
Stack overflow correction in C++
我在一本书中读到了下面的代码,其中说这很容易受到堆栈溢出的影响。虽然已经使用了fgets(),但我无法理解,为什么它容易受到攻击?
我的理解是,使用 fgets() 而不是 gets() 通常通过在末尾放置一个 null 来帮助我们摆脱缓冲区溢出。我错过了什么吗?应该用什么代替 fgets() 来纠正堆栈溢出?
void getinp(char *inp, int siz)
{
puts("Input value: ");
fgets(inp, siz, stdin);
printf("buffer3 getinp read %sn", inp);
}
void display(char * val)
{
char tmp[16];
sprintf(tmp, "read val: %sn", val);
puts(tmp);
}
int main(int argc, char *argv[])
{
char buf[16];
getinp(buf, sizeof(buf));
display(buf);
printf("buffer3 donen");
}
Indisplay
tmp
声明为 16char
s 长,但您正在编写(带有sprintf
)不仅有val
(保证为 16 个字符或更少),而且还"read val: "
和最后的n
)。
这意味着,如果用户插入超过 16-11=5 个字符,则display
中会出现缓冲区溢出。
一种解决方案是将buf
声明为足够大display
以存储val
和附加文本,尽管在现实世界中,您只需使用printf
(没有中间缓冲区)写入stdout
。
此外,通常当您有sprintf
并且存在缓冲区溢出的潜在风险时,您可以使用snprintf
代替(实际上,我总是使用它);snprintf
,而不是溢出缓冲区,如果输出太长,则会截断输出,并返回输出缓冲区足够大时将写入的字符数。
在显示中,无法确保 val + 12 字节适合 16 个字符的缓冲区。
相关文章:
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 我的 int main() 中出现堆栈溢出错误
- C++ 对象数组堆栈溢出
- 有没有一种方法可以捕获进程中的堆栈溢出?C++Linux
- 对象接收堆栈溢出异常 c++ 的排序向量
- 将公共递归转换为尾递归,因为大型输入的堆栈溢出
- C++ 中递归期间的堆栈溢出
- 启动 dll 时 C# 环境堆栈溢出
- 在C++中使用数组时如何防止堆栈溢出?
- 如何修复递归函数导致的堆栈溢出错误?C++
- 当我尝试为结构分配新指针时出现堆栈溢出错误
- 为什么析构函数无休止地调用自己(导致堆栈溢出)?
- 为什么堆栈溢出?如有建议,不胜感激
- 主函数执行时C++堆栈溢出异常
- 如何在不导致堆栈溢出的情况下计算非常大的数字和很小的 HCF.我正在使用欧几里得算法
- 递归克隆图时的堆栈溢出
- 防止 CRTP 特征码在"pure virtual"调用中堆栈溢出
- 静态数组溢出堆栈(seg 错误 11)仅在类定义内部时,否则不会..?
- 使用递归的溢出堆栈
- c++中栈溢出和分段错误的危险