开发者社区> 问答> 正文

缓冲溢出,为什么不报错? ?报错

#include
#include

#include
using namespace std;

int main()
{
char a[]={'1','2','3'};
cout<<sizeof(a)<<endl;
strcpy(a,"hel1234567891113");
cout<<a<<endl;
}

上面的代码可以顺利执行,并输出hel1234567891113,为什么不报错呢?

展开
收起
爱吃鱼的程序员 2020-06-23 20:20:19 467 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    这个跟编译器优化有关系的我在vs里工作在debug模式时是会报异常的

    但工作在release模式时就不会报异常了

    strcpy本身就不会做检查,所以就会有缓冲区溢出的问题,自然不会报错。你用strcpy_sAPI就会有运行时错误。

    因为数组后面的内存不是很“重要”。
    好比在马路上开车,有的马路旁边有绿化带,有的马路边上就是墙。如果你碰巧在有绿化带的马路上开车,开出了界,那么可能问题不是很大。但是这显然是危险的。因为未必每次都没事。

    strcpy不会检查缓冲区溢出,需要用安全函数strcpy_s,缓存溢出问题可以通过valgrind等工具检测定位出来

    strcpy函数不会检查长度,所以存在栈溢出风险。至于能够运行是编译优化选项有关。

    有些程序在运行过程当中,会自动跳过一些错误的编程代码,也有可能是编程软件自身的问题。

    溢出在输出框里显示的是烫

    chara[]={'1','2','3'}是用指针处理的,strcpy只是将dest放到src,不做长度判断

    溢出错误是运行时错误,编译不会报错的,只有运行的时候才会出错,可以通过仿真来诊断出问题

    2020-06-23 20:20:35
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载