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

不应存在无意义的重复子表达式

10.1.1 ID_illIdentical
目录 › next › previous

逻辑与、逻辑或、按位与、按位或的子表达式以及三元表达式的两个分枝不应重复,否则相关运算会失去意义。

示例:

void foo(int* p, int* q) {
    if (p != NULL && p != NULL) {   // Non-compliant
        ....
    }
}

void bar() {
    while (FLAG0 | FLAG1 | FLAG0) {   // Non-compliant
        ....
    }
}

char baz(bool x) {
    return x? 'a': 'a';   // Non-compliant
}

例中重复的子表达式都是有问题的,这是很常见的错误,多由复制粘贴引起。修正时不应只删去重复项,还要考虑是否漏掉了某些项。

例外:

void qux(ifstream& f) {
    if (f.get() == 'a' && f.get() == 'a') {   // Let it go
        ....
    }
}

具有副作用的逻辑子表达式可不受本规则约束。例中重复的子表达式可以改变文件流的状态,但第二个子表达式可能不会被执行,这种代码即使没有逻辑错误也是不便于维护的,参见 ID_shortCircuitSideEffect。

参考

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