V teorii kompilátoru je mrtvý kód ( eng. mrtvý kód , také mrtvý kód , zbytečný kód, nepoužívaný kód ) kód, který lze spustit (v aktuálně existující verzi kódové báze), byl proveden nebo mohl být proveden dříve (před zařazením v kódu v určitém okamžiku jeho existence změny, které jej učinily nepoužitelným), ale výsledky jeho výpočtů nemají vliv na další program (zejména nejsou používány) [1] [2] [3] . Jinými slovy, je to kód, který pouze definuje mrtvé proměnné nebo nedefinuje vůbec žádné proměnné.
Při zvažování zdrojového kódu se často používá jiný, obecnější koncept mrtvého (mrtvého) kódu , který kromě zbytečného kódu zahrnuje i nedosažitelný kód [4] [5] .
Přítomnost mrtvého kódu v programu zvyšuje jeho velikost, tlak na zdroje (zařízení, registry), odvod tepla a může prodloužit dobu provádění bez jakéhokoli přínosu. kompilátory používají odstranění mrtvého kódu a optimalizace odstranění nedosažitelného kódu na úrovni střední reprezentace k detekci a odstranění mrtvého a nedosažitelného kódu . Pro vyhledávání mrtvého kódu ve zdrojovém kódu se používají různé analyzátory a detektory mrtvého kódu [4] [5] . Takové analyzátory jsou často zabudovány do kompilátoru nebo IDE a vydávají příslušná varování o přítomnosti mrtvého kódu v programu během jeho kompilace [6] [7] [8] .
Zvažte následující příklad C :
int foo ( int x , int y ) { int z ; /* Deklarace mrtvé proměnné */ z = x / y _ /* Mrtvý kód */ vrátit x * y _ }Zde je operace z = x/ymrtvý (zbytečný) kód, protože výsledek této operace, proměnná z, se později v programu nepoužívá. Samotná proměnná zje v proceduře mrtvá foo. Pokud je proměnná ynula, pak operace, která provede zbytečný výpočet, vyvolá výjimku , takže její odstranění může změnit výstup programu. Optimalizace odstranění mrtvého kódu odstraní operaci z = x/ypouze v případě, že není pochyb o tom, že nezmění výsledek programu [9] .
Ve vztahu ke zdrojovému kódu je nedosažitelný kód často nazýván mrtvým kódem, i když z hlediska teorie kompilátoru jde o různé věci. Zvažte následující příklad:
int foo ( void ) { int x = 25 ; návrat x ; x = 2 * x ; /* Nedosažitelný kód */ návrat 0 ; /* Nedosažitelný kód */ }Zde operace x = 2*xa return 0nemohou být za žádných okolností provedeny, protože k nim dochází po bezpodmínečném návratu z procedury a jsou nedosažitelné (operace po návratu z procedury nemusí být nedosažitelný kód, například pokud je odkazováno na štítek po návratu příkazem goto ). Nedosažitelná optimalizace odstranění kódu může tuto operaci odstranit.
K identifikaci a odstranění nepotřebného kódu využívá optimalizace odstraňování mrtvého kódu výsledky analýzy toku dat (například analýza aktivních proměnných ) nebo provádí nezávislou analýzu reprezentace programu SSA. Optimalizace odstranění nedosažitelného kódu analyzuje graf řídicího toku a eliminuje nedosažitelné uzly.
Při práci se zbytečným kódem se používá konzervativní přístup: pokud operace, která provádí zbytečnou akci, může vyvolat výjimku a existuje nenulová pravděpodobnost, že tato výjimka ovlivní výstup programu, pak by tato operace neměla být odstraněna [9] .
Ve zdrojovém kódu velkých aplikací může být obtížné rozpoznat mrtvý kód (zbytečný a nedostupný). K tomu lze použít detektory mrtvých kódů [4] [5] , které provádějí statickou analýzu kódu . Mnoho kompilátorů a IDE vydává varování před deklarovanými, ale nepoužívanými funkcemi, metodami, třídami, proměnnými [6] [7] [8] .
Pro skrytí algoritmů používaných v programu, za účelem ochrany duševního vlastnictví, může být do programu záměrně přidán mrtvý kód jako stínovací transformace . Taková transformace je navržena tak, aby zvýšila entropii kódu, aby bylo obtížné obnovit algoritmus implementovaný v programu. Za účelem stínování lze do programu přidat také nedosažitelný nesprávný kód: během činnosti programu se taková část kódu nikdy nespustí a nezpůsobí chyby, ale disassembler nebo dekompilátor se může při práci s touto částí chovat nepředvídatelně. kód [10] [11 ] .
Přítomnost mrtvého a nedosažitelného kódu v programu může být zranitelností , protože do takových částí kódu mohou být zavedeny záložky programu [12] [13] .