【发布时间】:2015-04-27 23:59:12
【问题描述】:
我从我们的静态分析工具中收到关于以下 sn-p 的错误:
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”从cppreference page 中获取unsigned int。
IAR 编译器的 MISRA C 2004 检查器没有错误。
这个来自 Coverity。
【问题讨论】:
-
snprintf采用可变参数列表,因此value将进行整体提升。您应该可以通过投射(unsigned)value来消除警告 -
@Praetorian,这并不能解释签名问题。我可以将相同的签名提升到更大的类型,但是这个“int32_t”类型来自哪里?它是可变参数列表吗?我在任何 C 语言资源中都没有看到任何参数定义。
-
如果你在可变参数列表中传递一个小于
int的类型,它会被提升为int。阅读默认转化部分here。 -
你有那个来源的链接吗,pdf?
-
stackoverflow.com/q/1255775/995714 比 int 窄的类型将被提升为 int
标签: c printf type-conversion format-specifiers misra