C/C++ 静态告警清理——赋值语句用作条件
一,背景
赋值语句本身是有值的,相当于有个返回值。
形如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中就不能直接单独拎出来。
上一篇:
IDEA上Java项目控制台中文乱码