2013-01-22 12 views
7

Come per il titolo, sto pianificando di spostare un codice legacy sviluppato più di dieci anni fa per AIX. Il problema è che la base del codice è enorme. Gli sviluppatori non inizializzarono i loro puntatori nel codice originale. Ora durante la migrazione del codice ai server più recenti, vedo alcuni problemi con esso.Migrazione del codice C++: gestione dei puntatori non inizializzati

So che la soluzione migliore è eseguire tutto il codice e inizializzare tutte le variabili dove richiesto. Tuttavia, desidero solo sapere se esistono altre soluzioni disponibili per questo problema. Ho provato google ma non ho trovato una risposta appropriata.

+2

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. –

+2

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]. –

+1

La soluzione migliore è inizializzare tutti i puntatori. Non esiste un metodo più sicuro. – andre

risposta

2

L'approccio a lungo termine più preventivo è quello di inizializzare tutti i puntatori nella posizione in cui sono stati dichiarati, modificando il codice per utilizzare indicatori intelligenti appropriati per la gestione della durata. Se hai qualche tipo di test unitari, questo refactoring può essere relativamente indolore.

In un termine più breve e se si esegue il porting su Linux, è possibile utilizzare valgrind e ottenere una buona dose per rintracciare uno o due problemi reali che ti stanno mordendo, dandoti il ​​tempo di ridefinire a un ritmo più lento.

2

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.
+0

I problemi principali che vedo sono: i puntatori alle variabili locali vengono restituiti dalle funzioni. - Quasi tutte le variabili del 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 posso 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. -Qualità non può essere compromessa. – kris123456

Problemi correlati