Per secure coding
Esempio BAD codice:
final class Publisher {
public static volatile Publisher published;
int num;
Publisher(int number) {
published = this;
// Initialization
this.num = number;
// ...
}
}
Se l'inizializzazione di un oggetto (e, di conseguenza, la sua costruzione) dipende da un controllo di sicurezza all'interno del costruttore, il controllo di sicurezza potrà prescindere un chiamante non attendibile ottiene l'istanza parzialmente inizializzata. Vedi regola OBJ11-J. Fai attenzione a lasciare che i costruttori generino eccezioni per ulteriori informazioni.
final class Publisher {
public static Publisher published;
int num;
Publisher(int number) {
// Initialization
this.num = number;
// ...
published = this;
}
}
Poiché il campo è volatile e nonfinal, le istruzioni all'interno costruttore possono essere riordinate dal compilatore in modo tale che pubblicazione del presente domanda prima che le istruzioni di inizializzazione sono eseguiti.
codice corretto:
final class Publisher {
static volatile Publisher published;
int num;
Publisher(int number) {
// Initialization
this.num = number;
// ...
published = this;
}
}
Il dice questo riferimento essere sfuggito quando è reso disponibile oltre il suo ambito corrente. Di seguito sono modi comuni con cui il riferimento this può sfuggire:
Returning this from a non-private, overridable method that is invoked from the constructor of a class whose object is being
costruito. (Per ulteriori informazioni, vedere la regola MET05-J. Assicurarsi che i costruttori non chiamino metodi sovrascrivibili.) Restituisce ciò da un metodo non privato di una classe mutabile, che consente al chiamante di manipolare lo stato dell'oggetto indirettamente. Questo si verifica comunemente nelle implementazioni concatenate di metodi; vedi regola VNA04-J. Assicurarsi che le chiamate ai metodi concatenati siano atomiche per ulteriori informazioni. Passando questo argomento come argomento a un metodo alien richiamato dal costruttore di una classe il cui oggetto è in costruzione. Uso delle classi interne. Una classe interna contiene implicitamente un riferimento all'istanza della sua classe esterna a meno che la classe interna non sia dichiarata statica . Pubblicazione assegnando questo a una variabile statica pubblica dal costruttore di una classe il cui oggetto è in costruzione. Lanciare un'eccezione da un costruttore. Ciò potrebbe causare la vulnerabilità del codice a un attacco finalizzatore; vedi regola OBJ11-J. Fai attenzione a lasciando che i costruttori generino eccezioni per ulteriori informazioni. Passaggio dello stato dell'oggetto interno a un metodo alieno. Ciò consente al metodo di recuperare questo riferimento dell'oggetto membro interno.
Questa regola illustra le possibili conseguenze di consentire il riferimento this per sfuggire durante la costruzione dell'oggetto, tra cui la razza condizioni e l'inizializzazione improprio. Ad esempio, la dichiarazione di un campo final in genere garantisce che tutti i thread vedano il campo in uno stato inizializzato completamente ; tuttavia, consentire a questo riferimento di sfuggire a durante la costruzione dell'oggetto può esporre il campo ad altri thread in uno stato non inizializzato o parzialmente inizializzato . Regola TSM03-J. Non pubblicare oggetti parzialmente inizializzati, che descrive le garanzie fornite da vari meccanismi per la pubblicazione sicura, si basa sulla conformità a questa regola. Di conseguenza, i programmi non devono consentire allo questo riferimento di uscire durante la costruzione dell'oggetto.
In generale, è importante rilevare i casi in cui il riferimento può fuoriuscire oltre l'ambito del contesto corrente. Nello studio , le variabili e i metodi pubblici devono essere attentamente esaminati esaminati.
Domanda bella e ben fatta. – Maroun