Död kod

Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från versionen som granskades den 11 oktober 2020; kontroller kräver 9 redigeringar .

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

Exempel

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.

Analys

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

Död kod och informationssäkerhet

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

Se även

Anteckningar

  1. Konstruera en kompilator - S. 544.
  2. Kompilatorer - principer, teknologier, verktyg - S. 713, 714.
  3. Debray, SK, Evans, W., Muth, R. och De Sutter , B. 2000. Kompilatortekniker för kodkomprimering Arkiverad 22 maj 2003 på Wayback Machine . ACM Trans. program. Lang. Syst. 22, 2 (mars 2000), 378-415. ( sammanfattning)
  4. 1 2 3 Detektering och borttagning av död kod . Aivosto. Hämtad 12 juli 2012. Arkiverad från originalet 5 augusti 2012.
  5. 1 2 3 Jämför några gratisalternativ till DCD (Dead Code Detector) (nedlänk) . java.net Hämtad 12 juli 2012. Arkiverad från originalet 23 september 2012. 
  6. 1 2 GCC online-dokumentation. Alternativ för att begära eller undertrycka varningar. . GNU Compiler Collection. Hämtad 12 juli 2012. Arkiverad från originalet 25 juni 2012.
  7. 1 2 Utvecklarguide för JDT Plug-in. Kompilerar Java-kod. (inte tillgänglig länk) . eclipse.org. Hämtad 22 oktober 2018. Arkiverad från originalet 25 juni 2012. 
  8. 1 2 Upptäck död kod i din applikation med kodanalys . Habib Heydarian, Microsoft Corp. Hämtad 12 juli 2012. Arkiverad från originalet 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 / Kievs nationella universitet. Tarasa Shevchenko / Om problemen med att skydda immateriella rättigheter i mjukvarusystem // Programmeringsproblem. - 2006. - Nr 2-3 Specialnummer - S. 68-72. ( text arkiverad )
  11. Obfuscation och dess övervinna // Hacking Lab. - Maj 2006. - S. 8-13. ( text arkiverad )
  12. Torshenko Yu. A. / SPb GU ITMO / Modell och metod för att upptäcka sårbarheter i de inledande stadierna av industriell design av en mjukvaruprodukt. — 2008. ( text arkiverad )
  13. Sakulina M. S. / Identifiering och eliminering av "död kod" med IBM Rational Application Developer-programmeringsteknologi. ( text arkiverad )

Litteratur

Länkar