如何将FindBugs规则EI_EXPOSE_REP迁移到Squid?

时间:2016-12-23 17:06:57

标签: java sonarqube findbugs

在将SonarQube版本4.3更新到5.6之后,我尝试将所有FindBugs规则迁移到Squid规则,因为FindBugs规则都被标记为已弃用。

但我对FindBugs规则EI_EXPOSE_REP有疑问:

  

返回对存储在对象的一个​​字段中的可变对象值的引用,公开该对象的内部表示。如果不受信任的代码访问实例,并且对可变对象的未经检查的更改会危及安全性或其他重要属性,则需要执行不同的操作。在许多情况下,返回对象的新副本是更好的方法。

我应该迁移到Squid规则S2384

  

可变对象是那些状态可以改变的对象。例如,数组是可变的,但String不是。永远不应将可变类成员返回给调用者或直接接受和存储。这样做会使您容易受到类状态的意外更改。

     

而是使用不可修改的Collection(通过Collections.unmodifiableCollectionCollections.unmodifiableList,...)或制作可变对象的副本,然后存储或返回副本。

     

此规则检查数组,集合和日期是否未直接存储或返回。

关注SonarQube Java Plugin coverage/deprecation of FindBugs

  

EI_EXPOSE_REP S2384不应直接存储或返回可变成员   EI_EXPOSE_REP2 S2384不应直接存储或返回可变成员   EI_EXPOSE_STATIC_REP2 S2384不应直接存储或返回可变成员

使用Squid规则,类型为Collection的代码会遇到很多问题:

public class MyClass {

    private List<String> assetIds;

    public List<String> getAssetIds() {
        return assetIds;
    }

    public void setAssetIds(List<String> assetIds) {
        this.assetIds = assetIds;
    }
}

使用FindBugs规则EI_EXPOSE_REP我没有遇到此问题。它只检查Date和数组。这是FindBugs的错误吗?

有没有办法摆脱Collection类型的所有问题而不更改我的遗留代码,但仍然会看到Date和数组的问题?

0 个答案:

没有答案