2

我从我们的静态分析工具中收到有关以下代码段的错误:

uint8_t value = 24U;
char buffer[512];
int chars_printed = snprintf(buffer, sizeof(buffer),
                             "The value in hex is 0x%02hhX\r\n",
                             value);

错误是:

MISRA-2004 违反规则 10.1:隐式转换函数参数中的非常量表达式。将底层类型为“unsigned char”(8 位,无符号)的“值”转换为类型“int”(32 位,有符号)。

MISRA 对“%X”说明符的期望符号和位宽是多少?

据说“%X”unsigned int取自cppreference page

IAR 编译器的 MISRA C 2004 检查器没有错误。
这个来自 Coverity。

4

1 回答 1

5

问题是 printf 系列隐式地将所有小整数类型的参数提升为int. 规则 10.1 不允许此类隐式类型提升,这就是您收到 MISRA 违规错误的原因。它与格式说明符无关。

对于 MISRA 合规性,只需在将值传递给函数之前显式转换值:(uint32_t)value

另请注意,MISRA 不允许您在生产代码中使用 stdio.h。

于 2015-04-28T10:57:00.977 回答