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

参与比较的对象之间应具备合理的大小关系

10.5.1 ID_illComparison
目录 › next › previous

对象与超出其类型取值范围的值比较,或与取值范围的边界进行无意义的比较属于逻辑错误。

示例:

void foo(string& txt, string& sub) {
    size_t n = txt.find(sub);
    if (n >= 0) {               // Non-compliant, always true
        ....
    }
}

例中 n 为无符号变量,一定大于或等于 0,n >= 0 是无意义的比较,也是一种常见笔误。

又如:

void bar(uint16_t x) {
    if (x == -1) {      // Non-compliant, always false
        ....
    }
}

例中 x 为 16 位无符号变量,其取值范围为 [0, 65535],x == -1 恒为假。由于“类型提升”,x 可以被转为 int 型再与 -1 比较,x 恒为正数而 -1 为负数,故不可能相等。

对于有符号字符型变量,与其比较的数值不在 [-128, 127] 范围内时,也是无效的:

CodePage encodingDetect(const char* src) {
    char b0 = src[0];
    char b1 = src[1];
    char b2 = src[2];
    if (b0 == 0xef && b1 == 0xbb && b2 == 0xbf) {   // Non-compliant, always false
        return cpUtf8;
    }
    ....
}

即使例中 b0 的二进制绝对值确实为 0xef,但由于类型提升,b0 转为 int 型后为负数,0xef 为正数,比较的结果恒为假。char 型变量是否有符号由实现定义,可参见 ID_plainNumericChar 的进一步说明,将 b0 等变量设为 unsigned char 可解决这个问题。

相关

ID_switch_caseOutOfRange

参考

CWE-697 CWE-1024 CWE-1025
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.