C语言练习使用strcpy()时出现stack smashing错误是什么原因?
报错原因分析
触发stack smashing(栈粉碎)的核心原因是代码存在缓冲区越界写入,具体问题点如下:
- 首先,
sprintf的写入逻辑存在隐式越界sprintf使用%d格式化数字为字符串时,无论数字位数多少,都会自动在末尾追加\0字符串结束符。你定义的str数组长度仅为4,当循环执行到i=3时,sprintf(&str[3],"%d", array[i])会先把数字5转为字符'5'写入str[3],随后追加的\0会直接写入str数组的边界之外,已经属于非法栈内存写入。 - 其次,
strcpy的拷贝规则直接触发栈保护检测strcpy的工作逻辑是:从源内存地址开始逐字节拷贝内容,直到遇到\0才会终止,且终止符\0也会被拷贝到目标地址。你的代码中str数组没有预留\0的存储位置,&str[i]对应的源字符串没有合法结束标记,strcpy会持续往temp数组之后的栈空间写入数据,直接破坏了栈上的栈保护标记(Canary),操作系统检测到栈结构被破坏后就会抛出stack smashing错误。
补充修复建议:如果你的需求只是拷贝单个字符,不需要调用
strcpy,直接通过temp[i] = str[i]赋值即可;如果需要把str作为合法字符串使用,必须至少额外预留1个字节的空间存储\0结束符。
内容的提问来源于stack exchange,提问作者proprogrammer9832
相关产品推荐
相关产品推荐

