60 votes

Violation du sonar : Sécurité - Array est stocké directement

Il y a une violation du sonar :

Violation du sonar : Sécurité - Array est stocké directement

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

Solution :

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

Mais je me demande pourquoi ?

51voto

Brian Agnew Points 143181

Il se plaint que le tableau que vous stockez est le même que celui qui est détenu par l'appelant. C'est-à-dire que si l'appelant modifie ensuite ce tableau, le tableau stocké dans l'objet (et donc l'objet lui-même) changera.

La solution consiste à faire une copie à l'intérieur de l'objet lorsqu'il est transmis. Cela s'appelle copie défensive . Une modification ultérieure de la collection n'affectera pas le tableau stocké dans l'objet.

C'est aussi une bonne pratique de le faire normalement lors du retour d'une collection (par exemple dans un correspondant getMyArray() appel). Sinon, le récepteur pourrait effectuer une modification et affecter l'instance stockée.

Notez que cela s'applique évidemment à toutes les collections mutables (et en fait à tous les objets mutables) - pas seulement aux tableaux. Notez également que cela a un impact sur les performances qui doit être évalué en même temps que d'autres préoccupations.

21voto

ewernli Points 23180

C'est ce qu'on appelle la copie défensive. Un bon article sur le sujet est "A qui est cet objet, d'ailleurs ?" de Brian Goetz, qui traite de la différence entre les sémantiques de valeur et de référence pour les getters et setters.

Fondamentalement, le risque avec la sémantique de référence (sans copie) est que vous pensez erronément que vous possédez le tableau, et quand vous le modifiez, vous modifiez également d'autres structures qui ont des alias au tableau. Vous pouvez trouver en ligne de nombreuses informations sur la copie défensive et les problèmes liés aux alias d'objets.

12voto

Elenasys Points 23268

J'ai eu le même problème :

Sécurité - Le tableau est stocké directement Le tableau fourni par l'utilisateur palomitas" est stocké directement.

ma méthode originale :

public void setCheck(boolean[] palomitas) {
        this.check=palomitas;
    }

fixe s'est tourné vers :

public void setCheck(boolean[] palomitas) { 
      if(palomitas == null) { 
        this.check = new boolean[0]; 
      } else { 
       this.check = Arrays.copyOf(palomitas, palomitas.length); 
      } 
}

Autre exemple :

Sécurité - Le tableau est stocké directement Le tableau fourni par l'utilisateur

private String[] arrString;

    public ListaJorgeAdapter(String[] stringArg) {      
        arrString = stringArg;
    }

Fixe :

public ListaJorgeAdapter(String[] stringArg) {  
    if(stringArg == null) { 
      this.arrString = new String[0]; 
    } else { 
      this.arrString = Arrays.copyOf(stringArg, stringArg.length); 
    } 
}

3voto

Wolverine789 Points 7

Pour les éliminer, vous devez cloner le tableau avant de le stocker ou de le retourner, comme indiqué dans l'implémentation de la classe suivante. Ainsi, personne ne peut modifier ou obtenir les données originales de votre classe, mais seulement une copie de celles-ci.

public byte[] getarrString() {
    return arrString.clone();
}
/**
 * @param arrStringthe arrString to set
 */
public void arrString(byte[] arrString) {
    this.arrString= arrString.clone();
}

Je l'ai utilisé comme ça et maintenant je n'obtiens aucune violation de SONAR...

0voto

Jordi Laforge Points 550

Suivre la voie de la mise en œuvre défensive peut vous faire gagner beaucoup de temps. En Guava, vous disposez d'une autre solution intéressante pour atteindre cet objectif : les ImmutableCollections.

http://code.google.com/p/guava-libraries/wiki/ImmutableCollectionsExplained

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X