Død kode

Den aktuelle version af siden er endnu ikke blevet gennemgået af erfarne bidragydere og kan afvige væsentligt fra den version , der blev gennemgået den 11. oktober 2020; checks kræver 9 redigeringer .

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

Eksempler

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.

Analyse

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

Død kode og informationssikkerhed

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

Se også

Noter

  1. Engineering a Compiler - S. 544.
  2. Kompilere - principper, teknologier, værktøjer - S. 713, 714.
  3. Debray, SK, Evans, W., Muth, R., og De Sutter , B. 2000. Kompilatorteknikker til kodekomprimering Arkiveret 22. maj 2003 på Wayback Machine . ACM Trans. program. Lang. Syst. 22, 2 (mars. 2000), 378-415. ( resumé)
  4. 1 2 3 Detektering og fjernelse af død kode . Aivosto. Hentet 12. juli 2012. Arkiveret fra originalen 5. august 2012.
  5. 1 2 3 Sammenligner nogle gratis alternativer til DCD (Dead Code Detector) (downlink) . java.net Hentet 12. juli 2012. Arkiveret fra originalen 23. september 2012. 
  6. 1 2 GCC online dokumentation. Muligheder for at anmode om eller undertrykke advarsler. . GNU Compiler Collection. Hentet 12. juli 2012. Arkiveret fra originalen 25. juni 2012.
  7. 1 2 JDT Plug-in Developer Guide. Kompilere Java-kode. (utilgængeligt link) . eclipse.org. Hentet 22. oktober 2018. Arkiveret fra originalen 25. juni 2012. 
  8. 1 2 Opdag død kode i din applikation ved hjælp af kodeanalyse . Habib Heydarian, Microsoft Corp. Hentet 12. juli 2012. Arkiveret fra originalen 23. september 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 / Kiev National University. Tarasa Shevchenko / Om problemerne med at beskytte intellektuel ejendom i softwaresystemer // Programmeringsproblemer. - 2006. - Nr. 2-3 Særnummer - S. 68-72. ( tekst arkiveret )
  11. Obfuscation og dens overvindelse // Hacking Lab. - Maj 2006. - S. 8-13. ( tekst arkiveret )
  12. Torshenko Yu. A. / SPb GU ITMO / Model og metode til detektering af sårbarheder i de indledende stadier af industrielt design af et softwareprodukt. — 2008. ( tekstarkiveret )
  13. Sakulina M. S. / Identifikation og eliminering af "død kode" ved hjælp af IBM Rational Application Developer-programmeringsteknologi. ( tekst arkiveret )

Litteratur

Links