소나 위반 : 보안-어레이가 직접 저장 됨
소나 위반이 있습니다.
소나 위반 : 보안-어레이가 직접 저장 됨
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);
}
}
하지만 왜 그런지 궁금 해요?
저장하는 배열이 호출자가 보유한 배열과 동일하다는 불평이 있습니다. 즉, 호출자가 이후에이 배열을 수정하면 객체에 저장된 배열 (따라서 객체 자체)이 변경됩니다.
해결책은 전달 될 때 객체 내에서 사본을 만드는 것입니다. 이를 방어 적 복사 라고 합니다. 컬렉션의 후속 수정은 개체 내에 저장된 배열에 영향을주지 않습니다.
컬렉션을 반환 할 때 (예 : 해당 getMyArray()
호출에서) 일반적으로이 작업을 수행하는 것도 좋은 방법 입니다. 그렇지 않으면 수신자가 수정을 수행하고 저장된 인스턴스에 영향을 미칠 수 있습니다.
이것은 배열뿐만 아니라 모든 변경 가능한 컬렉션 (실제로 모든 변경 가능한 객체)에 분명히 적용됩니다. 이것은 다른 문제와 함께 평가해야하는 성능 영향을 가지고 있습니다.
방어 적 복제라고합니다. 이 주제에 대한 좋은 기사는 "어쨌든 누구의 대상입니까?"입니다. by Brian Goetz, getter 및 setter에 대한 값과 참조 의미의 차이에 대해 설명합니다.
기본적으로 참조 의미론 (복사본 없음)의 위험은 배열을 소유하고 있다고 잘못 생각하고 수정하면 배열에 별칭이있는 다른 구조도 수정한다는 것입니다. 방어 복사 및 개체 앨리어싱과 관련된 문제에 대한 많은 정보를 온라인에서 찾을 수 있습니다.
나는 같은 문제가 있었다.
보안-어레이가 직접 저장 됨 사용자 제공 어레이 '팔로 미 타스'가 직접 저장됩니다.
내 원래 방법 :
public void setCheck(boolean[] palomitas) {
this.check=palomitas;
}
고정 설정 :
public void setCheck(boolean[] palomitas) {
if(palomitas == null) {
this.check = new boolean[0];
} else {
this.check = Arrays.copyOf(palomitas, palomitas.length);
}
}
다른 예 :
보안-어레이가 직접 저장 됨 사용자 제공 어레이
private String[] arrString;
public ListaJorgeAdapter(String[] stringArg) {
arrString = stringArg;
}
결정된:
public ListaJorgeAdapter(String[] stringArg) {
if(stringArg == null) {
this.arrString = new String[0];
} else {
this.arrString = Arrays.copyOf(stringArg, stringArg.length);
}
}
이를 제거하려면 다음 클래스 구현에 표시된대로 배열을 저장 / 반환하기 전에 Array를 복제해야합니다. 따라서 아무도 클래스의 원본 데이터를 수정하거나 가져올 수 없지만 복사본 만 가져올 수 있습니다.
public byte[] getarrString() {
return arrString.clone();
}
/**
* @param arrStringthe arrString to set
*/
public void arrString(byte[] arrString) {
this.arrString= arrString.clone();
}
나는 이것을 이렇게 사용했고 이제는 SONAR 위반이 발생하지 않습니다 ...
이 모든 것보다 더 쉽습니다. Sonar 위반을 방지하려면 메소드 매개 변수의 이름을 다른 이름으로 변경하기 만하면됩니다.
http://osdir.com/ml/java-sonar-general/2012-01/msg00223.html
public void setInventoryClassId(String[] newInventoryClassId)
{
if(newInventoryClassId == null)
{
this.inventoryClassId = new String[0];
}
else
{
this.inventoryClassId = Arrays.copyOf(newInventoryClassId, newInventoryClassId.length);
}
}
방어 구현 방식을 사용하면 많은 시간을 절약 할 수 있습니다. Guava에서는 목표를 달성하기위한 또 다른 멋진 솔루션 인 ImmutableCollections를 얻을 수 있습니다.
http://code.google.com/p/guava-libraries/wiki/ImmutableCollectionsExplained
There are certain cases where it is a design decision and not missed out. In these cases, you need to modify the Sonar rules to exclude it so that it doesn't show such issues in report.
참고URL : https://stackoverflow.com/questions/11580948/sonar-violation-security-array-is-stored-directly
'IT박스' 카테고리의 다른 글
추가 필드와 장고의 ManyToMany 관계 (0) | 2020.12.05 |
---|---|
HTML5 지연 : 첫 번째 이벤트까지 유효하지 않은 의사 클래스 (0) | 2020.12.05 |
MAVEN_HOME, MVN_HOME 또는 M2_HOME (0) | 2020.12.05 |
왜`abs ()`가 다르게 구현됩니까? (0) | 2020.12.05 |
파일에서 탐색기 열기 (0) | 2020.12.05 |