静态告警——赋值语句用作条件

一,背景

赋值语句本身是有值的,相当于有个返回值。

形如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中就不能直接单独拎出来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值