首页 > 解决方案 > 'sprintf' 输出 9 到 12 个字节到大小为 9 的目标

问题描述

我已经检查过这个问题,但我无法弄清楚它如何适用于我的情况。

使用时

  char time[9];

  sprintf(time, "%2d:%2d:%2d",
          timestamp.Hour(),
          timestamp.Minute(),
          timestamp.Second());

我收到警告 'sprintf' output between 9 and 12 bytes into a destination of size 9

在运行代码的微控制器上随机重启(如果它们以某种方式相关)。

那么,这些额外的 3 个字节是从哪里来的呢?我该如何解决这个问题?

Hour()、Minute() 和 Second() 方法实际上返回uint8_t

标签: cprintf

解决方案


您的编译器显然知道一个uint8_t值可以产生 1 到 3 位数字,但不知道Hour,MinuteSecond函数最多只能返回 2 位数字值。

如果您255使用"%2d"格式传递值,您将获得 3 个字符。如果所有三个参数都为 100 或更大,则将 12 个字节写入目标数组。编译器会警告您在给定参数类型的情况下理论上可能发生的错误,但考虑到传递的实际值可能不会发生。(我对它能够发出这个警告有点印象深刻,并不奇怪它不知道这些函数的语义。)

重新启动可能无关紧要。尝试检查通话time后的内容。sprintf我想你会发现问题并没有在那里发生,并且警告是虚假的。您可以通过定义来使警告静音char time[12];,或者您可以忽略警告。

这个诊断是由 gcc 使用选项生成的-Wformat-overflow=2记录在这里


推荐阅读