1

正如标题所说,REDLIB 将 INT8_MIN 定义为 (-0x80)。这在使用 QAC 检查 MISRA-C 兼容性时发出警告:(INT16 和 INT32 也是如此,分别为 -0x8000 和 -0x80000000)

Msg(4:1281) Integer literal constant is of an unsigned type but does not include a "U" suffix.
MISRA-C:2004 Rule 10.6; REFERENCE - ISO:C90-6.1.3.2 (Integer Constants)

Msg(4:3101) Unary '-' applied to an operand of type unsigned int or unsigned long gives an unsigned result.
MISRA-C:2004 Rule 12.9; REFERENCE - ISO:C90-6.3.3.3 Unary Arithmetic Operators - Semantics

Msg(4:2850) Constant: Implicit conversion to a signed integer type of insufficient size.
MISRA-C:2004 Rule 3.1; REFERENCE - ISO:C90-6.2.1.2 Conversions (to Signed Integers)
4

1 回答 1

3

C 标准 (C11 6.4.4.1) 中有一条关于整数文字(“整数常量”)的微妙规则指出,如果您编写一个纯整数文字,例如70000没有任何UL后缀,则文字的类型确定如下:

  • 如果字面量大到可以存储在 int 中,那么它就是 int 类型。
  • 否则,如果字面量大到可以存储在 long 中,那么它就是 long 类型。
  • (否则在 C99/C11 的情况下,文字是 long long 类型)。

所以70000在 16 位系统上将是 long 类型。

但是,当您编写十六进制整数文字(或八进制文字)时,适用不同的规则。相反,编译器按以下顺序检查:

int
unsigned int
long int
unsigned long int
long long int
unsigned long long int

因此,当您0x8000在 int 为 16 位的系统上编写代码时,编译器会检查:它是否适合 int?不,它可以放入无符号整数吗?是的。因此of 的类型0x8000是 unsigned int 并且类似地0x80000000是 unsigned long 类型。

这就是你得到 and 的 MISRA 错误的0x8000原因,因为将一元应用于无符号类型0x80000000根本没有任何意义。-因此该库不符合 MISRA-C。

但是,整数文字0x80始终是int任何系统上的类型。如果您在该行收到 MISRA 错误,则说明您的静态分析工具因该规则而损坏。向 PRQA 提交错误报告。

于 2014-07-03T07:31:56.760 回答