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。
我从我们的静态分析工具中收到关于以下片段的错误:
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。