printf 中的伪灵异事件


printf 中的 %c 输出的伪灵异事件

问题描述:

定位到下面代码,unsigned char数组 fqdn 存放一些字符串。如果按照下面代码编译,则可以正常工作,但如果将 problem line 中的 %d 改为 %c,则仿佛芯片被复位了一样,有点像看门狗复位,而且曾经打印过的东西,似乎消失了。

想不通的地方:

  • 1.为何偏偏将 %d 改为 %c 就出现此现象,改为%u 则不会?
  • 2.为何上面 %c 输出没有问题。
  • 3.线程栈足够大,看门狗也被禁止。
  • 4.是不是printf中会产生某个内核中断?
static uint8_t fqdn[MDNS_MAX_NAME_LEN + 1];
//do some thing
定位代码如下:
    for(int i = 0; i < MDNS_MAX_NAME_LEN; ++i)
    {
        printf("%c",fqdn[i]);
    }
    p = dname_put_label(fqdn, hname);
    dname_put_label(p, domname);
    for(int i = 0; i < MDNS_MAX_NAME_LEN; ++i)
    {
        printf("%d ",fqdn[i]);  // Problem line
    }

正确定位过程:

  • 1.尝试 printf(“%c “,fqdn[0]); 没有问题
  • 2.依次尝试 %c 输出 fqdn 每个字符。到 第 11 个字符时候出现问题。
  • 3.printf(“%d “,fqdn[11]); 打印出值 是 ASCII 12
  • 4.查阅 ASCII 表,12 -> \f -> 换页
  • 5.WTF

破案:

fqdn数组中 含有I/O端的控制字符,第一次 %c 由于没有修改 fqdn 中字符内容,可以正确输出。
第二次 输出前 fqdn 被函数 dname_put_label 修改了。其中包含换页控制字符。
第二次 如果 %d 输出仅仅是输出 ASCII 值,不会影响。如果 %c 输出控制字符,则换页控制字符,
在输出终端上就会换到下一页,给人直观感觉像是被清屏了,或者像是被复位了一样。

其实这不是个bug,而是对 %c输出控制字符理解不够深刻造成的伪灵异事件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值