Kuollut koodi

Kokeneet kirjoittajat eivät ole vielä tarkistaneet sivun nykyistä versiota, ja se voi poiketa merkittävästi 11. lokakuuta 2020 tarkistetusta versiosta . tarkastukset vaativat 9 muokkausta .

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

Esimerkkejä

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.

Analyysi

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

Kuollut koodi ja tietoturva

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

Katso myös

Muistiinpanot

  1. Kääntäjän suunnittelu - S. 544.
  2. Kääntäjät - periaatteet, tekniikat, työkalut - S. 713, 714.
  3. Debray, SK, Evans, W., Muth, R. ja De Sutter , B. 2000. Kääntäjätekniikat koodin pakkaamiseen Arkistoitu 22. toukokuuta 2003 Wayback Machinessa . ACM Trans. ohjelmoida. Lang. Syst. 22, 2 (maaliskuu 2000), 378-415. ( yhteenveto)
  4. 1 2 3 Kuolleen koodin havaitseminen ja poistaminen . Aivosto. Haettu 12. heinäkuuta 2012. Arkistoitu alkuperäisestä 5. elokuuta 2012.
  5. 1 2 3 Vertaa joitakin ilmaisia ​​vaihtoehtoja DCD:hen (Dead Code Detector) (downlink) . java.net Haettu 12. heinäkuuta 2012. Arkistoitu alkuperäisestä 23. syyskuuta 2012. 
  6. 1 2 GCC online-dokumentaatio. Varoitusten pyytäminen tai estäminen. . GNU Compiler Collection. Haettu 12. heinäkuuta 2012. Arkistoitu alkuperäisestä 25. kesäkuuta 2012.
  7. 1 2 JDT-laajennuksen kehittäjäopas. Java-koodin kääntäminen. (linkki ei saatavilla) . eclipse.org. Haettu 22. lokakuuta 2018. Arkistoitu alkuperäisestä 25. kesäkuuta 2012. 
  8. 1 2 Löydä kuollut koodi sovelluksestasi koodianalyysin avulla . Habib Heydarian, Microsoft Corp. Haettu 12. heinäkuuta 2012. Arkistoitu alkuperäisestä 23. syyskuuta 2012.
  9. 1 2 Appel, A. W. Modern Compiler Implementation in Java. - Cambridge University Press, 2004. - S. 360. - ISBN 0-511-04286-8 .
  10. I. Yu. Ivanov / Kiovan kansallinen yliopisto. Tarasa Shevchenko / Ohjelmistojärjestelmien immateriaalioikeuksien suojaamisen ongelmista // Ohjelmointiongelmat. - 2006. - Nro 2-3 Erikoisnumero - S. 68-72. ( teksti arkistoitu )
  11. Hämärtäminen ja sen voittaminen // Hakkerointilaboratorio. - Toukokuu 2006 - S. 8-13. ( teksti arkistoitu )
  12. Torshenko Yu. A. / SPb GU ITMO / Malli ja menetelmä haavoittuvuuksien havaitsemiseksi ohjelmistotuotteen teollisen suunnittelun alkuvaiheessa. — 2008. ( teksti arkistoitu )
  13. Sakulina M. S. / "Kuolleen koodin" tunnistaminen ja poistaminen käyttämällä IBM Rational Application Developer -ohjelmointitekniikkaa. ( teksti arkistoitu )

Kirjallisuus

Linkit