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

  • 相关阅读:
    职业规划——第1.0章、模拟面试的小记(一)
    菜鸟VUER学习记——零0章、打开新的大门
    职业规划——第0章、哇,原来需要的这么多
    经营自己,愈发强大——《软技能——代码之外的生存指南》读后感
    如何阅读一本书
    Java开发规范
    JVM堆和栈的区别
    2016年7月书单推荐
    web性能优化——代理(nginx)
    web性能优化——浏览器相关
  • 原文地址:https://www.cnblogs.com/liuliuliu/p/3770171.html
Copyright © 2011-2022 走看看