我从静态分析工具中收到有关以下代码段的错误:
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"据说从example pen获取unsigned int
。
IAR编制者的MISRA C 2004检查程序没有错误 这个来自Coverity。
答案 0 :(得分:5)
问题是printf系列隐式地将小整数类型的所有参数提升为int
。规则10.1不允许这种隐式类型促销,这就是您收到MISRA违规错误的原因。它与格式说明符无关。
对于MISRA兼容性,只需在将值传递给函数之前显式转换值:(uint32_t)value
。
请注意,MISRA不允许您在生产代码中使用stdio.h。