一,背景
赋值语句本身是有值的,相当于有个返回值。
形如a=func(b),这个语句本身的值就是a,以此作为条件语句会引起告警。
主要是2种:
(1)
if(a=func(b))
{
do something
}
(2)
while (a = func(b))
{
do something
}
二,通用清理方案
(1)if语句
这种情况比较简单,通用清理方案如下伪代码:
a = func(b);
if (a) {
do something
}
在极简情况下,或许也可以改成
if (func(b)) {
do something
}
不过这种情况一般不存在,除非是这块代码经过了多次变更,或者之前写这个代码的人犯傻了。
(2)while语句
通用清理方案如下伪代码:
a = func(b);
while (a) {
do something
a = func(b);
}
(3)注意点
可能出现goto 和 return,while语句里面可能还会出现break和continue
我总结了一下,规律如下:
1,return和break无需在意
2,如果while循环里面有continue,需要在每个continue之前加上赋值语句,形如:
a = func(b);
while (a) {
do something
a = func(b);
continue;
do something
a = func(b);
}
3,对于goto,如果所有新加的赋值语句都做到了紧贴,那么就无需在意goto,以while语句为例:
here:
a=func(b);//紧贴while语句,如果原本goto标签头指向while这一行,也要插进去
while(a){
do something
there:
a=func(b);//紧贴continue,如果原本goto标签头指向continue这一行,也要插进去
continue;
do something
goto here;
do something
goto there;
do something
a=func(b);
}
三,特殊情况
1,while循环内有continue且以return结尾
这种情况下,只需要continue之前加赋值语句即可,while循环的最末尾(即return之后)不需要加赋值语句
2,逻辑短路,比如: i!=-1 && array[i]!=0
条件是形如 条件1 && 条件2,而且只有条件1为真时,执行条件2的判断才不会导致错误,单独执行条件2可能导致严重错误。
这样,整改的时候就需要尤其小心,如果赋值语句出现在条件1中应该问题不大,出现在条件2中就不能直接单独拎出来。