In informatica il codice morto è un termine della programmazione con il quale si indica del codice sorgente di un programma che viene eseguito, ma produce un risultato che non sarà mai utilizzato in nessun'altra computazione. L'esecuzione di codice morto comporta inoltre uno spreco di tempo computazionale.
Mentre il risultato di una computazione morta non dovrebbe essere usato, il codice morto può generare eccezioni o influire sullo stato globale, in tal modo la rimozione di tale codice può modificare l'output del programma e dar luogo a bug involontari. Se vi è ambiguità nel garantire una ininfluenza dell'output di programma, le ottimizzazioni del compilatore mantengono tipicamente un approccio conservativo e tendono quindi a non rimuovere il codice morto.
int foo (int iX, int iY)
{
int iZ = iX/iY; // Può accadere una divisione per zero
return iX*iY;
}
Nell'esempio sopra, la divisione di iX e iY è computata ma mai utilizzata. È perciò codice morto e può essere rimosso.
public void Metodo(){
final boolean bDebug = false;
if (bDebug){
//fai qualcosa…
}
}
Nell'esempio sopra, "fai qualcosa" non verrà mai eseguito, è perciò codice morto. Il compilatore Java è intelligente a sufficienza da non compilarlo.
Eliminare il codice morto comporta due principali vantaggi: riduce la dimensione del programma, un'importante considerazione in alcuni contesti, e permette al programma di evitare l'esecuzione di operazioni irrilevanti, riducendo quindi il tempo d'esecuzione. Il codice morto include codice che non sarà mai eseguito e codice che influisce solo su variabili morte, ovvero variabili irrilevanti nell'output di programma. Consideriamo il seguente esempio scritto in C.
int foo(void)
{
int iA = 24;
int iB = 25; /* Assegnamento della variabile morta */
int iC = iA << 2;
return iC;
iB = 24; /* Codice irraggiungibile */
return 0;
}
A causa dell'esecuzione incondizionata dell'istruzione return, l'assegnazione di iB non verrà mai raggiunta. È pertanto possibile rimuovere tale codice.