参与比较的对象之间应具备合理的大小关系
10.5.1 ID_illComparison
对象与超出其类型取值范围的值比较,或与取值范围的边界进行无意义的比较属于逻辑错误。
示例:
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 可解决这个问题。