L'inizializzazione di tutte le variabili potrebbe non essere una buona idea.
Il comportamento affidabile dipende generalmente da variabili con valori noti come corretti ("garantito da costruzione" per essere corretti). Il problema con le variabili non inizializzate non è semplicemente il fatto che abbiano valori sconosciuti. Ovviamente essere sconosciuto è un problema, ma ancora una volta lo stato desiderato è noto e correggere i valori. L'inizializzazione di una variabile con un valore noto che non è corretto non produce un comportamento affidabile.
Non di rado accade che non ci sia un valore 'predefinito' corretto da usare come fallback se un'inizializzazione più complessa fallisce. Un programma può scegliere di non inizializzare una variabile con un valore se tale valore deve essere sovrascritto prima che la variabile possa essere utilizzata.
L'inizializzazione di una variabile su un valore predefinito può avere alcuni problemi in questi casi. Spesso i valori "predefiniti" sono inoffensivi in quanto se vengono utilizzati le conseguenze non sono immediatamente evidenti. Ciò non è generalmente auspicabile perché come sviluppatore vuoi notarlo quando le cose vanno male. È possibile evitare questo problema selezionando valori predefiniti che avranno conseguenze ovvie, ma ciò non risolve un secondo problema; Gli analizzatori statici possono spesso rilevare e segnalare quando viene utilizzata una variabile non inizializzata. Se c'è un problema con alcune complicate logiche di inizializzazione tali che nessun valore è impostato, vuoi che sia rilevabile. L'impostazione di un valore predefinito impedisce all'analisi statica di rilevare tali casi. Quindi ci sono casi in cui non si desidera inizializzare le variabili.
Con puntatori il valore di default è tipicamente nullptr
, che in una certa misura evita il primo problema sopra discusso perché dereferenziazione un puntatore nullo tipicamente produce un arresto immediato (buono per il debug). Tuttavia, il codice potrebbe anche rilevare un puntatore nullo e riportare un errore (valido per il debug) o potrebbe ricorrere ad un altro metodo (non corretto per il debug). Potrebbe essere meglio utilizzare l'analisi statica per rilevare l'utilizzo di puntatori non inizializzati anziché inizializzarli. Sebbene l'analisi statica possa rilevare il dereferenziamento di puntatori nulli, non verrà rilevato quando i puntatori nulli causano la segnalazione degli errori o le routine di fallback da utilizzare.
In risposta al tuo commento:
I maggiori problemi che vedo sono
- puntatori a variabili locali vengono restituiti dalle funzioni.
- Quasi tutte le variabili puntatore non sono inizializzate. Sono sicuro che AIX fornisce questo comfort per il cliente nella piattaforma precedente, ma dubito davvero che il codice funzionerà perfettamente in Linux quando verrà sottoposto a test reali (produzione).
- Non è possibile fornire soluzioni parziali che potrebbero funzionare. preferisco dare il meglio al mio cliente che mi paga per il mio lavoro. Quindi preferiremo usare soluzioni alternative.
- La qualità non può essere compromessa.
- fissarli (e prestare particolare attenzione alla pulizia correttamente)
- Come sostengo sopra semplicemente manca un inizializzatore non è di per sé un difetto. C'è solo un difetto se il valore non inizializzato viene effettivamente utilizzato in modo illegale. Non sono sicuro di cosa intendi su AIX che fornisce comfort.
- Come discusso sopra la 'soluzione parziale' e 'soluzione' sarebbe inizializzare ciecamente tutto.
- Anche in questo caso, inizializzare ciecamente tutto può risultare non solo in un lavoro inutile, ma può effettivamente compromettere la qualità togliendo alcuni strumenti per rilevare i bug.
Il compilatore su AIX è stato inizializzato per te? Il codice dipende dal/dai valore/i nella memoria non inizializzata? Se la risposta a entrambi è "No", allora potresti semplicemente provare a compilare il codice sul nuovo server e vedere cosa succede. Il tuo codice potrebbe essere orribilmente pericoloso in teoria, ma in pratica potrebbe funzionare. –
Che cosa "vedo alcuni problemi con il codice". significare? È che stai effettivamente vedendo i guasti, o semplicemente che stai individuando che "questo puntatore non è inizializzato, ma forse non è un problema"? Inizializzare i puntatori che in seguito vengono impostati su un valore diverso incondizionatamente non ha alcuno scopo in sé e per sé [potrebbe rendere più chiaro che DEFINITAMENTE è impostato su qualcosa]. –
La soluzione migliore è inizializzare tutti i puntatori. Non esiste un metodo più sicuro. – andre