zoukankan      html  css  js  c++  java
  • 一个凶险的BUG

      c格式符用来输入单个字符(scanf()函数)。
      char ch;
      scanf("%3c",&ch);
      如果从键盘连续输入3个字符“abc”,由于ch只能容纳一个字符,系统就把第一个字符'a'赋给字符变量ch。

    果真如此么?考察一下下面的代码

    #include <stdio.h>
    #include <stdlib.h>

    int main( void )
    {
      char __ch = 'E', _ch = 'R' , ch = 'R' ;
     
      printf("最初__ch,_ch,ch为%c%c%c\n", __ch , _ch , ch); 
     
      printf("输入3个字符:"); 
      scanf ("%3c",&ch);
     
      printf("最后__ch,_ch,ch为%c%c%c\n", __ch , _ch , ch); 
     
      system("PAUSE"); 
      return 0;
    }

    运行的结果是:

    最初__ch,_ch,ch为ERR
    输入3个字符:abc
    最后__ch,_ch,ch为cba
    请按任意键继续. . .

    不难发现,输入的abc三个字符都被写入了内存。意外地改变内存中的数据,这是非常危险的事情。就如同
    int *p ;
    *p = 3 ;
    一样凶险。

    事实上,scanf()函数中的%c并非是用来输入单个字符的,而是用来输入一组字符的。例如
    char c_a[3];
    scanf("%3c" , c_a );
    其中的3规定了输入数据的宽度。
    当然,宽度为1的时候,%c确实可以用来输入单个字符。但是认为%c这个格式转换只是“用来输入单个字符”却是大错特错,而且可能会产生一个很严重的潜在的BUG。

  • 相关阅读:
    python 安装Crypto.Ciphe
    ProxyPool 爬虫代理IP池配置采坑
    2020渗透测试面试问题大全
    Windows Server 2016抓取明文密码
    应用安全 – 端口漏洞整理
    .net core docker+ gogs + jenkins 自动化部署
    .net HttpClient 回传实体帮助类
    .net list转树状结构
    ABP 临时禁用TenantId IsDelete过滤
    ABP 使用cache缓存
  • 原文地址:https://www.cnblogs.com/pmer/p/1866235.html
Copyright © 2011-2022 走看看