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

if 语句的条件不应为赋值表达式

9.1.11 ID_if_assignment
目录 › next › previous

虽然语言允许在 if 语句的条件中赋值,但 = 和 == 极易混淆,建议所有产生 bool 型结果的表达式,都不要包含赋值运算符。

本规则是 ID_assignmentAsSubExpression 的特化。

示例:

void foo(HRESULT r) {
    if (r = S_OK) {     // Non-compliant
        ....
    }
}

例中 S_OK 为常量,在条件中用常量对变量赋值是没有逻辑意义的,如果条件中等号右侧为常量,基本可以判定是 == 被误写成了 =。

又如:

if (r = fun()) {   // Non-compliant
    ....
}

例中 fun 为函数,这也是一种公认的不良风格,应将赋值表达式拆分出来,或者在 C++ 代码中改为:

if (auto r = fun()) {   // Compliant
    ....
}

将赋值表达式加上括号表示有意为之,是一种惯用写法,但并不值得提倡,如:

if ((r = fun())) {   // Let it go?
    ....
}

审计工具不妨通过配置决定是否放过这种情况。

配置

allowEnclosedAssignment: 是否放过括号括起来的赋值表达式

相关

ID_assignmentAsSubExpression

参考

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