【问题标题】:Sonar Violation: Security Array is stored directly声纳违规:安全阵列直接存储
【发布时间】:2015-05-10 06:58:54
【问题描述】:

声纳违规:安全 - 阵列直接存储

public void setMyArray(String[] myArray) { 
  this.myArray = myArray; 
} 

解决方案:

public void setMyArray(String[] newMyArray) { 
  if(newMyArray == null) { 
    this.myArray = new String[0]; 
  } else { 
   this.myArray = Arrays.copyOf(newMyArray, newMyArray.length); 
  } 
}

[或]

public void setMonths(String[] months)
{
this.months = months.clone();
}

以上哪一项是完美的,不会造成任何阻碍?

【问题讨论】:

  • 这取决于你的要求!
  • 请准确说明您的问题:两种解决方案都是有效的,有助于解决此规则提出的问题,但都各有利弊,因此除非您明确要查找的内容,否则无法回答您的问题.
  • @benzonico 我有一个任务来解决这个声纳违规问题,那么 clone() 是否可以在阵列上正常工作?不会造成任何未来的障碍?

标签: java arrays sonarqube


【解决方案1】:

clone() 只要你不传递空值就可以正常工作,那么如果你的应用程序确实授权空值传递给这个方法,你应该检查一下。

if(months==null) {
  this.months = null;
} else {
  this.months = months.clone();
}

【讨论】:

    【解决方案2】:

    在这种情况下,两种方式都可以。克隆方法不应该对非空字符串数组造成问题,因为 java 字符串本身是不可变的值对象。但如果数组包含其他一些对象/集合,那么deep copy 会是更好的方法。

    这将帮助您了解这种声纳违规的原因。数组是一个可变对象,defensive copy 是处理这种情况的一种方式。防御性拷贝、深拷贝、克隆方法等可以google。看看this的问题。如果是自定义可克隆对象/集合数组,则需要防御性深拷贝。

    【讨论】:

      猜你喜欢
      • 2012-07-19
      • 1970-01-01
      • 2014-06-16
      • 2014-07-25
      • 1970-01-01
      • 1970-01-01
      • 2014-05-17
      • 1970-01-01
      相关资源
      最近更新 更多