MISRA C 2004 10.1,printf“%x”的签名

MISRA C 2004 10.1, signedness of printf "%x"

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

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 Rule 10.1 violation: implicitly converting a non-constant expression in a function argument. Converting "value", with underlying type "unsigned char" (8 bits, unsigned), to type "int" (32 bits, signed).

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

据说 "%X" 从 cppreference page 中取出一个 unsigned int

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

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

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

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