zoukankan      html  css  js  c++  java
  • 字符串比较,栈溢出引起的程序bug

    需求

      输入密码字符串,与设定的密码“1234567”进行比较,两者相符则输出"congratulations!”,不符则输出“try again!”。

    程序bug

      实际运行过程中发现,输入某些8位字符串,如33333333,也会得到"congratulations!”,这与预期功能不符。

    出现bug的原因

      在程序编写过程中,出现冗余语句(见代码注释),输入的str长度大于buf,导致栈溢出。ret定义在buf之前,往内存里存储数据时,ret被踩,首字节被占用。

      当输入的字符串str与PASSWORD比较,str > PASSWORD时,ret的值为1,内存显示为 10 00 00 00,被踩后首字节变成00,内存显示为 00 00 00 00,则ret的值为0,输出"congratulations!”;

      当输入的字符串str与PASSWORD比较,str < PASSWORD时,ret的值为-1,内存显示为 FF FF FF FF,被踩后首字节变成00,内存显示为 00 FF FF FF,则ret的值不等于0,输出“try again!”。

    什么是栈溢出?

      栈溢出就是缓冲区溢出的一种。 由于缓冲区溢出而使得有用的存储单元被改写,往往会引发不可预料的后果。程序在运行过程中,为了临时存取数据的需要,一般都要分配一些内存空间,通常称这些空间为缓冲区。如果向缓冲区中写入超过其本身长度的数据,以致于缓冲区无法容纳,就会造成缓冲区以外的存储单元被改写,这种现象就称为缓冲区溢出。

    解决办法

      去掉代码中的冗余语句,同时交换ret与buf的定义顺序,避免ret被踩。

    ----------------------------华丽丽的分割线--------------------------代码君要出场了--------------------

     1 #include <stdio.h>
     2 #include <string.h>
     3 
     4 #define PASSWORD "1234567"
     5 
     6 void cmp(char* str);
     7 
     8 int main()
     9 {
    10     char buf[1024];
    11 
    12     printf("please input password:
    ");
    13     scanf("%s", buf);
    14     cmp(buf);
    15 
    16     return 0;
    17 } 
    18 
    19 void cmp(char* str)
    20 {
    21     int ret;                                 //ret定义在buf之前,往内存里存储数据时,ret被踩
    22     char buf[8];
    23 
    24     ret = strcmp(str, PASSWORD);
    25     strcpy(buf, str);                       //冗余语句,输入的str长度大于buf,导致栈溢出
    26     
    27     if(ret == 0)
    28         printf("congratulations!
    ");
    29     else
    30         printf("try again!
    ");
    31 }

    欢迎转载,请备注原始连接http://www.cnblogs.com/liuliuliu/p/3770171.html,并注明转载。

    作者bibibi_liuliu,联系方式395985239@qq.com

  • 相关阅读:
    Android中的AsyncTask异步任务的简单实例
    Cubieboard学习资源
    BZOJ4518: [Sdoi2016]征途(dp+斜率优化)
    BZOJ1096: [ZJOI2007]仓库建设(dp+斜率优化)
    BZOJ1010: [HNOI2008]玩具装箱toy(dp+斜率优化)
    BZOJ4517: [Sdoi2016]排列计数(组合数+错位排列)
    BZOJ4810: [Ynoi2017]由乃的玉米田(莫队+bitset)
    bitset用法小结
    BZOJ3687: 简单题(dp+bitset)
    BZOJ4484: [Jsoi2015]最小表示(拓扑排序乱搞+bitset)
  • 原文地址:https://www.cnblogs.com/liuliuliu/p/3770171.html
Copyright © 2011-2022 走看看