I kompilatorteorin är död kod ( eng . död kod , även död kod , värdelös kod, oanvänd kod ) kod som kan exekveras (i den för närvarande befintliga versionen av kodbasen), exekveras eller kunde exekveras tidigare (innan den inkluderades) i kod någon gång under dess existens, ändringar som gjorde den värdelös), men resultaten av dess beräkningar påverkar inte det ytterligare programmet (i synnerhet används de inte) [1] [2] [3] . Med andra ord är det kod som bara definierar döda variabler eller som inte definierar några variabler alls.
När man överväger källkod används ofta ett annat, mer allmänt begrepp av död (död) kod , som förutom värdelös kod inkluderar oåtkomlig kod [4] [5] .
Närvaron av död kod i ett program ökar dess storlek, trycket på resurser (enheter, register), värmeavledning och kan öka exekveringstiden utan någon fördel. kompilatorer använder optimeringar för borttagning av död kod och oåtkomlig kodborttagning på mellanliggande representationsnivå för att upptäcka och ta bort död och oåtkomlig kod . För att söka efter död kod i källkoden används olika analysatorer och dödkodsdetektorer [4] [5] . Sådana analysatorer är ofta inbyggda i kompilatorn eller IDE och utfärdar lämpliga varningar om förekomsten av död kod i programmet under dess kompilering [6] [7] [8] .
Tänk på följande C- exempel :
int foo ( int x , int y ) { int z ; /* Deklarera en död variabel */ z = x / y _ /* Död kod */ returnera x * y _ }Här är operationen z = x/ydöd (värdelös) kod, eftersom resultatet av denna operation, variabeln z, inte används i programmet senare. Variabeln i sig zär död i proceduren foo. Om variabeln yär noll, kommer operationen som utför en värdelös beräkning att ge ett undantag , så att ta bort den kan ändra programmets utdata . Optimeringen för borttagning av död kod tar bort operationen z = x/yendast om det inte råder någon tvekan om att den inte kommer att ändra programmets resultat [9] .
I förhållande till källkod kallas oåtkomlig kod ofta för död kod, även om det ur kompilatorteoris synvinkel är olika saker. Tänk på följande exempel:
int foo ( void ) { int x = 25 ; returnera x ; x = 2 * x ; /* Otillgänglig kod */ returnera 0 ; /* Otillgänglig kod */ }Här kan operationerna x = 2*xoch return 0kan inte utföras under några omständigheter, eftersom de inträffar efter en ovillkorlig återgång från proceduren och är oåtkomliga (operationer efter återkomsten från proceduren får inte vara oåtkomlig kod, till exempel om etiketten efter returen refereras till genom goto uttalande ). Otillgänglig kodborttagningsoptimering kan ta bort denna operation.
För att identifiera och ta bort värdelös kod använder optimering av död kodborttagning resultaten av dataflödesanalys (till exempel analys av aktiva variabler ) eller utför en oberoende analys av SSA-representationen av programmet. Otillgänglig kodborttagningsoptimering analyserar kontrollflödesdiagrammet och eliminerar oåtkomliga noder.
När man hanterar värdelös kod används ett konservativt tillvägagångssätt: om en operation som utför en värdelös handling kan ge ett undantag och det finns en sannolikhet som inte är lika med noll att detta undantag påverkar programmets utdata , bör denna operation inte tas bort [9] .
I källkoden för stora applikationer kan det vara svårt att känna igen död kod (värdelös och oåtkomlig). För detta kan dödkoddetektorer [4] [5] användas , som utför statisk kodanalys . Många kompilatorer och IDE:er utfärdar varningar om deklarerade men inte använda funktioner, metoder, klasser, variabler [6] [7] [8] .
För att dölja algoritmerna som används i programmet, för att skydda immateriella rättigheter, kan död kod läggas till programmet avsiktligt, som en skuggomvandling . En sådan transformation är utformad för att öka kodens entropi för att göra det svårt att återställa algoritmen som implementerats i programmet. Dessutom, i syfte att skugga, kan oåtkomlig felaktig kod läggas till programmet: under programdrift exekveras en sådan kodsektion aldrig och orsakar inte fel, men disassembleraren eller dekompilatorn kan bete sig oförutsägbart när man arbetar med den här delen av kod [10] [11] .
Närvaron av död och oåtkomlig kod i programmet kan vara en sårbarhet , eftersom programbokmärken kan införas i sådana avsnitt av koden [12] [13] .