☰
  • 首页
  • 规则分类
  • 项目介绍
search
•••

避免有符号整型与无符号整型相互转换

12.3 ID_signChangeCast
目录 › next › previous

有符号整型与无符号整型相互转换易导致意料之外的错误。

整型转换规则:

  • 如果向布尔型以外的其他整数类型转换,且值在新类型取值范围内,值不变
  • 否则,如果新类型为无符号整型,将值不断加减 M + 1 直至进入新类型取值范围,M 为新类型最大值
  • 否则,如果新类型为有符号整型,相关转换由实现定义

负数转为无符号整数往往会得到意料之外的结果,无符号整数转为有符号整数也可能导致移植相关的问题,所以应避免有符号整型与无符号整型之间的隐式转换,相关显式转换也应在合理的条件下完成。

示例:

signed s = -1;
unsigned u = 1;
printf("%d\n", s < u);   // Non-compliant

例中有符号整数 s 的值为 -1,无符号整数 u 的值为 1,s 理应小于 u,但由于“类型提升”,s 会被转为无符号整数,值为无符号整数的最大值,s < u 的实际结果为 0。

配置

allowSmallUnsignedTypes: 是否允许 unsigned char、unsigned short 隐式转为 int 或更大取值范围的类型 allowPtrdiffTypeToSizeType: 是否允许 ptrdiff_t 隐式转为 size_t

相关

ID_negativeUnsignedCast ID_inconsistentSignComparison

依据

ISO/IEC 9899:1999 6.3.1.3 ISO/IEC 9899:2011 6.3.1.3 ISO/IEC 14882:2003 4.7 ISO/IEC 14882:2011 4.7

参考

CWE-195 C++ Core Guidelines ES.100 MISRA C 2012 10.4 MISRA C++ 2008 5-0-4 SEI CERT INT02-C
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.