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

时间:2015-03-09 06:57:48

标签: java arrays sonarqube

声纳违规:安全 - 数组直接存储

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();
}

上述哪一项是完美的,并没有造成任何阻碍?

2 个答案:

答案 0 :(得分:0)

只要你没有传递null值,

clone()就会正常工作,那么如果你的应用程序确认了将null值传递给这个方法,你应该检查一下。

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

答案 1 :(得分:0)

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

这将有助于您了解此声纳违规的原因。数组是可变对象,defensive copy是处理此类方案的一种方法。您可以谷歌搜索防御性副本,深层复制,克隆方法等。看看this问题。如果是一组自定义可复制对象/集合,则需要防御性深层复制。