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:
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.
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 ).
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.