Mrtvý kód

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 11. října 2020; kontroly vyžadují 9 úprav .

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

Příklady

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.

Analýza

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

Mrtvý kód a bezpečnost informací

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

Viz také

Poznámky

  1. Engineering a Compiler - S. 544.
  2. Kompilátory - principy, technologie, nástroje - S. 713, 714.
  3. Debray, SK, Evans, W., Muth, R. a De Sutter , B. 2000. Techniky kompilátoru pro komprimaci kódu Archivováno 22. května 2003 na Wayback Machine . ACM Trans. program. Lang. Syst. 22, 2 (březen 2000), 378-415. ( shrnutí)
  4. 1 2 3 Detekce a odstranění mrtvého kódu . Aivosto. Získáno 12. července 2012. Archivováno z originálu 5. srpna 2012.
  5. 1 2 3 Porovnává některé bezplatné alternativy k DCD (Dead Code Detector) (downlink) . java.net Získáno 12. července 2012. Archivováno z originálu dne 23. září 2012. 
  6. 1 2 GCC online dokumentace. Možnosti Vyžádat nebo Potlačit varování. . Kolekce kompilátorů GNU. Získáno 12. července 2012. Archivováno z originálu 25. června 2012.
  7. 1 2 Příručka vývojáře zásuvných modulů JDT. Kompilace kódu Java. (nedostupný odkaz) . eclipse.org. Získáno 22. října 2018. Archivováno z originálu 25. června 2012. 
  8. 1 2 Objevte mrtvý kód ve své aplikaci pomocí analýzy kódu . Habib Heydarian, Microsoft Corp. Získáno 12. července 2012. Archivováno z originálu dne 23. září 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 / Kyjevská národní univerzita. Tarasa Shevchenko / K problémům ochrany duševního vlastnictví v softwarových systémech // Problémy s programováním. - 2006. - č. 2-3 Zvláštní vydání - S. 68-72. ( text archivován )
  11. Mlžení a jeho překonání // Hacking Lab. - Květen 2006. - S. 8-13. ( text archivován )
  12. Torshenko Yu.A. / SPb GU ITMO / Model a metoda detekce zranitelností v počátečních fázích průmyslového návrhu softwarového produktu. — 2008. ( text archivován )
  13. Sakulina M. S. / Identifikace a odstranění „mrtvého kódu“ pomocí programovací technologie IBM Rational Application Developer. ( text archivován )

Literatura

Odkazy