Kääntäjäteoriassa kuollut koodi ( eng. kuollut koodi , myös kuollut koodi , hyödytön koodi, käyttämätön koodi ) on koodi, joka voidaan suorittaa (tällä hetkellä olemassa olevassa koodikannan versiossa), suoritettiin tai voidaan suorittaa aikaisemmin (ennen sisällyttämistä koodissa jossain vaiheessa sen olemassaoloa muutoksia, jotka tekivät siitä hyödyttömän), mutta sen laskelmien tulokset eivät vaikuta seuraavaan ohjelmaan (etenkään niitä ei käytetä) [1] [2] [3] . Toisin sanoen se on koodi, joka määrittelee vain kuolleet muuttujat tai ei määrittele muuttujia ollenkaan.
Lähdekoodia harkittaessa käytetään usein toista, yleisempää kuolleen (kuolleen) koodin käsitettä , joka sisältää hyödyttömän koodin lisäksi tavoittamattoman koodin [4] [5] .
Kuolleen koodin esiintyminen ohjelmassa lisää sen kokoa, painetta resursseihin (laitteet, rekisterit), lämmön haihtumista ja voi pidentää suoritusaikaa ilman mitään hyötyä. käyttävät kuolleen koodin poistoa ja tavoittamattoman koodin poiston optimointia keskitason esitystasolla havaitakseen ja poistaakseen kuolleen ja tavoittamattoman koodin . Kuolleen koodin etsimiseen lähdekoodista käytetään erilaisia analysaattoreita ja kuolleen koodin ilmaisimia [4] [5] . Tällaiset analysaattorit on usein rakennettu kääntäjään tai IDE :hen ja ne antavat asianmukaiset varoitukset kuolleesta koodista ohjelmassa sen kääntämisen aikana [6] [7] [8] .
Harkitse seuraavaa C -esimerkkiä :
int foo ( int x , int y ) { int z ; /* Kuolleen muuttujan ilmoittaminen */ z = x / y _ /* Kuollut koodi */ palauta x * y _ }Tässä operaatio z = x/yon kuollut (hyödytön) koodi, koska tämän operaation tulosta, muuttujaa z, ei käytetä ohjelmassa myöhemmin. Itse muuttuja zon kuollut prosessissa foo. Jos muuttuja yon nolla, turhan laskutoimituksen suorittava toiminto heittää poikkeuksen , joten sen poistaminen saattaa muuttaa ohjelman tulosta . Kuolleen koodin poiston optimointi poistaa toiminnon z = x/yvain, jos ei ole epäilystäkään siitä, että se ei muuta ohjelman tulosta [9] .
Lähdekoodin suhteen tavoittamatonta koodia kutsutaan usein kuolleeksi koodiksi , vaikka kääntäjäteorian näkökulmasta nämä ovat eri asioita. Harkitse seuraavaa esimerkkiä:
int foo ( tyhjä ) { int x = 25 ; paluu x ; x = 2 * x ; /* Koodi, jota ei tavoiteta */ paluu 0 ; /* Koodi, jota ei tavoiteta */ }Tässä operaatioita x = 2*xja return 0ei voida suorittaa missään olosuhteissa, koska ne tapahtuvat ehdottoman toimenpiteestä palaamisen jälkeen ja ovat tavoittamattomia (toimenpiteestä palaamisen jälkeiset toiminnot eivät välttämättä ole tavoittamaton koodi, esim. jos paluutunnisteeseen viitataan goto- ilmoituksella ). Koskemattoman koodin poiston optimointi voi poistaa tämän toiminnon.
Käyttämättömän koodin tunnistamiseksi ja poistamiseksi kuolleen koodin poiston optimointi käyttää tietovirta-analyysin tuloksia (esimerkiksi aktiivisten muuttujien analyysi ) tai suorittaa itsenäisen analyysin ohjelman SSA-esittelystä . Unreachable Code Removal Optimization analysoi ohjausvuokaavion ja eliminoi tavoittamattomat solmut.
Käsiteltäessä hyödytöntä koodia käytetään konservatiivista lähestymistapaa: jos turhan toiminnon suorittava toiminto voi aiheuttaa poikkeuksen ja on nollasta poikkeava todennäköisyys, että tämä poikkeus vaikuttaa ohjelman ulostuloon , tätä toimintoa ei pidä poistaa. [9] .
Suurten sovellusten lähdekoodissa voi olla vaikeaa tunnistaa kuollutta koodia (hyödytöntä ja tavoittamatonta). Tätä varten voidaan käyttää kuolleen koodin ilmaisimia [4] [5] , jotka suorittavat staattisen koodin analyysin . Monet kääntäjät ja IDE :t antavat varoituksia ilmoitetuista mutta käyttämättömistä funktioista, menetelmistä, luokista, muuttujista [6] [7] [8] .
Ohjelmassa käytettyjen algoritmien piilottamiseksi immateriaalioikeuksien suojaamiseksi ohjelmaan voidaan tarkoituksella lisätä kuollutta koodia varjostusmuunnokseksi . Tällainen muunnos on suunniteltu lisäämään koodin entropiaa , jotta ohjelmassa toteutetun algoritmin palauttaminen olisi vaikeaa. Ohjelmaan voidaan myös lisätä varjostusta varten tavoittamatonta väärää koodia: ohjelman toiminnan aikana tällaista koodin osiota ei koskaan suoriteta eikä se aiheuta virheitä, mutta purkaja tai kääntäjä saattaa käyttäytyä odottamattomasti työskennellessään tämän osan kanssa. koodi [10] [11 ] .
Kuolleen ja tavoittamattoman koodin esiintyminen ohjelmassa voi olla haavoittuvuus , koska ohjelman kirjanmerkkejä voidaan lisätä sellaisiin koodin osiin [12] [13] .