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

移位数量不应超过相关类型比特位的数量

10.2.10 ID_illShiftCount
目录 › next › previous

如果移位数量为负数、大于或等于相关类型比特位的数量,会导致标准未定义的行为。

示例:

uint32_t foo(uint16_t a) {
    return a << 16;         // Non-compliant, unportable
}

uint64_t bar(uint32_t b) {
    return b << 32;         // Non-compliant, undefined behavior
}

例中变量 a 为 16 位整数,是否会被提升为 32 位整型由实现定义,参见“类型提升”;变量 b 为 32 位整数,将其左移 32 位并不能得到 64 位整数,反而会导致标准未定义的行为。

应改为:

uint32_t foo(uint16_t a) {
    return uint32_t(a) << 16;   // Compliant
}

uint64_t bar(uint32_t b) {
    return uint64_t(b) << 32;   // Compliant
}

依据

ISO/IEC 9899:1999 6.5.7(3)-undefined ISO/IEC 9899:2011 6.5.7(3)-undefined ISO/IEC 14882:2003 5.8(1)-undefined ISO/IEC 14882:2011 5.8(1)-undefined ISO/IEC 14882:2017 8.8(1)-undefined

参考

MISRA C 2012 12.2 MISRA C++ 2008 5-8-1
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.