• 字符串比较,栈溢出引起的程序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

  • 相关阅读:
    J2SE-反射
    c3p0 连接数据库失败的问题
    c# 调用存储过程
    存储过程使用truncate时
    Parcelable intent传递对象时,需要将该对象实现Parcelable 或者Serializable
    android intent 在打开设置activity的时候在监听事件的内部 适用setclass()方法时 不是直接适用this 关键字
    c# 读取appconfig文件
    Oracle 连接数据库的几种方式
    通过反射获得方法,和绑定事件
    js 验证
  • 原文地址:https://www.cnblogs.com/liuliuliu/p/3770171.html
Copyright © 2020-2023  润新知