Otillgänglig kod

I programmerings- och kompilatorteori är oåtkomlig kod en del av programkoden som under inga omständigheter kan exekveras, eftersom den inte är nåbar i styrflödesdiagrammet [ 1] [2] .

Otillgänglig kod hänvisas ofta till som en av typerna av död kod , denna terminologi används vanligtvis när man överväger källkoden för program [3] [4] . Men i teorin om kompilatorer hänger dessa begrepp inte ihop på något sätt, död kod är bara uppnåbar kod som inte påverkar programmets output [ 1] [2] [5] .

De största nackdelarna med att ha oåtkomlig kod i ett program är:

Orsaker

Förekomsten av en oåtkomlig kod kan bero på olika faktorer, till exempel:

I de senaste fem fallen är den oåtkomliga koden äldre kod, det vill säga kod som en gång var användbar men som inte längre används.

Exempel

Tänk på följande C- exempel :

int foo ( int x , int y ) { returnera x + y _ int z = x * y ; /* Otillgänglig kod */ }

Åtgärden int z = x*yär oåtkomlig kod eftersom proceduren avslutas före den (operationer efter returen från proceduren kanske inte är oåtkomlig kod, till exempel om etiketten efter returen refereras av en goto-sats ).

Analys

Att hitta oåtkomlig kod i källkoden kan göras med statisk kodanalys [3] [4] . I en optimerande kompilator kan optimering av oåtkomlig kodborttagning upptäcka och ta bort oåtkomlig kod , som hittar oåtkomliga noder i kontrollflödesdiagrammet (CFG) och tar bort dem [6] . En enkel analys av en CFG-graf till oåtkomliga noder implementeras ofta i kompilatorn som en separat funktion, den sk. garbage collector , som anropas direkt efter transformationer som kan ändra styrflödesgrafen [7] .

Koden kan bli oåtkomlig som ett resultat av andra kompilatortransformationer som utförs på mellanrepresentationen , såsom vanliga optimeringar för borttagning av underuttryck .

I praktiken påverkar komplexiteten i analysen som implementeras avsevärt mängden oåtkomlig kod som upptäcks. Till exempel, efter konstant vikning och enkel kontrollflödesanalys , kan du upptäcka att koden i satsen ifi följande exempel inte går att nå:

int foo ( void ) { int n = 2 + 1 ; om ( n > 4 ) { printf ( "%d" , n ); /* Otillgänglig kod */ } }

Men för att identifiera den oåtkomliga koden i följande exempel måste en mycket mer sofistikerad analysalgoritm tillämpas:

int foo ( void ) { dubbel x = sqrt ( 2 ); om ( x > 4 ) { printf ( "%lf" , x ); /* Otillgänglig kod */ } }

En praktisk lösning är att först göra en enkel oåtkomlig kodanalys och sedan använda profileraren för att hantera de mer komplexa fallen. Profileraren kan inte bevisa att ett stycke kod inte går att nå, men det kan vara en bra heuristik för att hitta misstänkta noder som sannolikt inte går att nå. När dessa potentiellt oåtkomliga noder väl har hittats kan någon kraftfull oåtkomlig kodanalysalgoritm tillämpas.

Se även

Anteckningar

  1. 1 2 Konstruera en kompilator - s. 544.
  2. 1 2 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 )
  3. 12 Detektering och borttagning av död kod . Aivosto. Hämtad 12 juli 2012. Arkiverad från originalet 5 augusti 2012.
  4. 1 2 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. 
  5. Kompilatorer - principer, teknologier, verktyg - S. 669 ( oåtkomlig kod ), 713 ( död kod ).
  6. Konstruera en kompilator - S. 550.
  7. A. Yu. Drozdov, A. M. Stepanenkov. Hanterade optimeringspaket. In Information Technology and Computing Systems , 2004, nr 3 ( text arkiverad )

Litteratur

  • Cooper och Torczon. Konstruera en kompilator. - Morgan Kaufmann, 2011. - P. 544-550, 593. - ISBN 978-0-12-088478-0 .
  • Alfred Aho, Monica Lam, Ravi Seti, Jeffrey Ullman. Compilers : Principles, Techniques and Tools = Compilers: Principles, Techniques and Tools. — 2:a upplagan. - M . : "Williams", 2008. - 1184 sid. - 1500 exemplar.  - ISBN 978-5-8459-1349-4 .
  • Muchnick, Steven S. Avancerad kompilatordesign och implementering . - Morgan Kaufmann Publishers , 1997. - S.  580 -582. - ISBN 1-55860-320-4 .