MISRA C 2004 10.1,printf"%x"的签名

Tho*_*ews 2 c printf type-conversion misra format-specifiers

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

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

错误是:

MISRA-2004规则10.1违规:隐式转换函数参数中的非常量表达式.将"value"与基础类型"unsigned char"(8位,无符号)转换为类型"int"(32位,有符号).

MISRA期望从"%X"说明符获得的签名和位宽是多少?

据说"%X" unsigned int来自cppreference页面.

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

Lun*_*din 5

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

对于MISRA兼容性,只需在将值传递给函数之前将其显式转换为:(uint32_t)value.

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