【问题标题】:Sonar Violation:Security-Array is stored directly声纳违规:Security-Array 直接存储
【发布时间】:2015-10-26 13:03:18
【问题描述】:

我正在尝试使用 Sonar 更改我的应用程序中的代码。 如何解决它,为什么? 谢谢。

public class BeanResultSetHandler<T> extends BasicResultSetHandler<T> {
T instance;
Class<T> clas;
Object[] selectFields;

/**
 * Constructor
 */
**
public BeanResultSetHandler(Class<T> type, Object[] selectedFields) {
    this.clas = type;
    this.selectFields = selectedFields;
    if (selectedFields == null)
        this.selectFields = this.clas.getFields();
}

【问题讨论】:

    标签: java sonarqube defensive-copy


    【解决方案1】:

    您必须在存储之前克隆数组:

    this.selectFields = Arrays.copyOf(selectFields, selectedFields.length)

    Sonar 抱怨,因为可以修改来自 BeanResultSetHandler 的所有者为 caller 的数组。

    【讨论】:

      【解决方案2】:

      Sonar 告诉您,您没有复制 selectedFields 数组,而只是将 reference 存储到该数组中。因此,如果调用者稍后要修改数组,它也会修改 BeanResultSetHandler 对象的“内容”,例如使用以下代码:

      h = new BeanResultSetHandler(MyClass.class, myFieldsArray);
      myFieldsArray[0] = null;       // now t.selectFields[0] also is null
      myFieldsArray[0] = someObject; // now t.selectFields[0] also references someObject
      

      这是否是一个真正的问题取决于恕我直言,如果调用者可能使用自定义数组,她会在调用构造函数后尝试修改该数组。如果在所有实际情况下,参数为 null 或某些 Class.getFields() 的结果,我不会太在意它。

      “防御性复制”习惯用法是永远不要存储对可变对象或数组的引用,而是在有疑问时始终克隆,在您的情况下克隆数组:

      public BeanResultSetHandler(Class<T> type, Object[] selectedFields) {
          this.clas = type;
          if (selectedFields == null)
              this.selectFields = this.clas.getFields();
          else
              this.selectFields = selectedFields.clone();
      }
      

      问题是克隆会产生性能开销,当这种方法被推广时(例如,从对象返回某些东西时),将会执行大量无用的克隆。所以我不会开始尝试纠正 Sonar 报告的所有此类问题。

      就我个人而言,我倾向于仅在模块边界上应用此类惯用语,例如在用于向其他模块公开服务的方法中。然后在模块内部我不使用防御性副本,而是依赖单元测试。

      【讨论】:

      • 我尝试使用 clone() 方法,但它是黄色的(未使用): if (selectedFields == null) this.selectFields = this.clas.getFields();
      猜你喜欢
      • 2012-07-19
      • 2015-05-10
      • 2014-06-16
      • 1970-01-01
      • 2014-07-25
      • 2014-05-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多