赋值表达式不应作为子表达式
10.4.5 ID_assignmentAsSubExpression
赋值及复合赋值表达式作为子表达式可读性较差,易产生求值顺序或运算符优先级相关的问题。
示例(设 a、b、c 为变量):
a = b; // Compliant
a += b; // Compliant
a += b += c; // Non-compliant
fun(a = b, c); // Non-compliant
if (a = b) { // Non-compliant
....
}
switch (a = b) { // Non-compliant
....
}
while (a = b) { // Non-compliant
....
}
for (; a = b; ) { // Non-compliant
....
}
do {
....
} while (a = b); // Non-compliant
赋值表达式的值被使用,或作为控制语句的条件是不符合要求的。
连续赋值是一种惯用方式,但不值得提倡,如:
a = b = c; // Let it go?
审计工具不妨通过配置决定是否放过这种方式。
配置
allowSuccessiveAssignment: 是否允许连续赋值
相关
参考
CWE-481
MISRA C 2004 13.1
MISRA C 2012 13.4
MISRA C++ 2008 6-2-1