I compilerteori er død kode ( eng. død kode , også død kode , ubrugelig kode, ubrugt kode ) kode, der kan udføres (i den nuværende version af kodebasen), blev eksekveret eller kunne udføres tidligere (inden den blev inkluderet) i kode på et tidspunkt i dens eksistens, ændringer, der gjorde den ubrugelig), men resultaterne af dens beregninger påvirker ikke det videre program (især bruges de ikke) [1] [2] [3] . Med andre ord er det kode, der kun definerer døde variabler eller som slet ikke definerer nogen variable.
Når man overvejer kildekode , bruges ofte et andet, mere generelt begreb død (død) kode , som udover ubrugelig kode inkluderer uopnåelig kode [4] [5] .
Tilstedeværelsen af død kode i et program øger dets størrelse, pres på ressourcer (enheder, registre), varmeafledning og kan øge eksekveringstiden uden nogen fordel. bruger optimeringer til fjernelse af død kode og uopnåelig kodefjernelse på det mellemliggende repræsentationsniveau til at opdage og fjerne død og uopnåelig kode . For at søge efter død kode i kildekoden bruges forskellige analysatorer og dødkodedetektorer [4] [5] . Sådanne analysatorer er ofte indbygget i compileren eller IDE'en og udsender passende advarsler om tilstedeværelsen af død kode i programmet under dets kompilering [6] [7] [8] .
Overvej følgende C -eksempel :
int foo ( int x , int y ) { int z ; /* Erklæring af en død variabel */ z = x / y _ /* Død kode */ returner x * y _ }Her er operationen z = x/ydød (ubrugelig) kode, da resultatet af denne operation, variablen z, ikke bruges i programmet senere. Selve variablen zer død i proceduren foo. Hvis variablen yer nul, vil operationen, der udfører en ubrugelig beregning, give en undtagelse , så sletning af den kan ændre programmets output . Optimeringen af fjernelse af død kode vil kun fjerne operationen z = x/y, hvis der ikke er tvivl om, at den ikke vil ændre programmets resultat [9] .
I forhold til kildekode kaldes uopnåelig kode ofte for død kode, selvom det set fra compilerteoriens synspunkt er forskellige ting. Overvej følgende eksempel:
int foo ( ugyldig ) { int x = 25 ; returnere x ; x = 2 * x ; /* Uopnåelig kode */ returnere 0 ; /* Uopnåelig kode */ }Her kan operationerne x = 2*xog return 0under ingen omstændigheder udføres, da de opstår efter en ubetinget tilbagevenden fra proceduren og er uopnåelige (operationer efter returneringen fra proceduren er muligvis ikke uopnåelig kode, for eksempel hvis etiketten efter returneringen er refereret ved goto- erklæring ). Uopnåelig kodefjernelsesoptimering kan fjerne denne handling.
For at identificere og fjerne ubrugelig kode bruger optimering af fjernelse af død kode resultaterne af dataflowanalyse (for eksempel analyse af aktive variable ) eller udfører en uafhængig analyse af SSA-repræsentationen af programmet. Unreachable Code Removal Optimization analyserer kontrolflowgrafen og eliminerer uopnåelige noder.
Når man beskæftiger sig med ubrugelig kode, bruges en konservativ tilgang: hvis en operation, der udfører en ubrugelig handling, kan afgive en undtagelse , og der er en sandsynlighed, der ikke er nul, for at denne undtagelse påvirker outputtet af programmet, så bør denne operation ikke fjernes [9] .
I kildekoden til store applikationer kan det være svært at genkende død kode (ubrugelig og uopnåelig). Til dette kan der anvendes dødkodedetektorer [4] [5] , som udfører statisk kodeanalyse . Mange compilere og IDE'er udsender advarsler om deklarerede, men ikke brugte funktioner, metoder, klasser, variabler [6] [7] [8] .
For at skjule de algoritmer, der bruges i programmet, for at beskytte intellektuel ejendom, kan død kode tilføjes programmet med vilje som en skyggetransformation . En sådan transformation er designet til at øge kodens entropi for at gøre det vanskeligt at gendanne algoritmen implementeret i programmet. Med det formål at skygge kan der også tilføjes uopnåelig forkert kode til programmet: under programdrift udføres en sådan sektion af kode aldrig og forårsager ikke fejl, men disassembleren eller decompileren kan opføre sig uforudsigeligt, mens der arbejdes med denne sektion af kode [10] [11] .
Tilstedeværelsen af død og utilgængelig kode i programmet kan være en sårbarhed , da programbogmærker kan indføres i sådanne sektioner af koden [12] [13] .