if 语句的条件不应为赋值表达式
9.1.11 ID_if_assignment
虽然语言允许在 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: 是否放过括号括起来的赋值表达式