zoukankan      html  css  js  c++  java
  • 类似sprintf这类变参可能出现的bug

      中午吃完饭照例去云风大神的blog上去逛一圈,果然有新发现,如题:

    1     char buff[3];
    2     char data;
    3     sprintf(buff, "%02x", data);

      咋一看,data最大等于0xff应该不会错,可以如果编译器默认char为signed char,而且data = -1,以十六进制看应该为0xff,这么看也没有错。

      关键在于变参,在C语言的变参中,小于int长度的数据压栈时一律扩展为int型, 那么问题来了,符号型数据在进行类型扩展时是会扩展符号的,这么看其实

    data = -1;
    sprintf(buff, "%02x", data);
    //(int)-1的16进制等效于0xffffffff,因此等效于下面这句话
    sprintf(buff, "%02x", 0xffffffff);

    如此看来,溢出了,这种问题极易出现,而且不易发现。

  • 相关阅读:
    Python--day72--ajax简介
    Python基础1 介绍、基本语法
    10-Python-字符编码
    09-Python-集合
    07-Python-字符串操作
    99-Python-深浅拷贝
    06-Python-字典
    05-Python-判断语句
    04-Python-元组
    03-Python-操作列表
  • 原文地址:https://www.cnblogs.com/findstr/p/3523184.html
Copyright © 2011-2022 走看看