A programozási és fordítóelméletben az elérhetetlen kód a programkód része, amelyet semmilyen körülmények között nem lehet végrehajtani, mert a vezérlőfolyamat gráfban elérhetetlen [1] [2] .
Az elérhetetlen kódot gyakran a holt kód egyik típusaként emlegetik , ezt a terminológiát általában a programok forráskódjának figyelembevételekor használják [3] [4] . A fordítók elméletében azonban ezek a fogalmak semmilyen módon nem kapcsolódnak egymáshoz, a holt kód csak elérhető kód, amely nem befolyásolja a program kimenetét [1] [2] [5] .
A program elérhetetlen kódjának fő hátrányai a következők:
Az elérhetetlen kód létezését számos tényező okozhatja, például:
Az utolsó öt esetben az elérhetetlen kód örökölt kód, vagyis olyan kód, amely egykor hasznos volt, de már nem használják.
Tekintsük a következő C példát :
int foo ( int x , int y ) { vissza x + y _ int z = x * y ; /* Elérhetetlen kód */ }A művelet int z = x*yelérhetetlen kód, mert az eljárás előtte lép ki (az eljárás visszatérése utáni műveletek nem biztos, hogy elérhetetlen kódok, például ha a visszatérés utáni címkére egy goto utasítás hivatkozik ).
Az elérhetetlen kód megkeresése a forráskódban statikus kódelemzéssel végezhető el [3] [4] . Egy optimalizáló fordítóprogramban az elérhetetlen kód eltávolításának optimalizálása képes észlelni és eltávolítani az elérhetetlen kódot , amely megtalálja az elérhetetlen csomópontokat a vezérlőfolyamat gráfban (CFG) és eltávolítja azokat [6] . Egy CFG gráf elérhetetlen csomópontokra történő egyszerű elemzését a fordító gyakran külön funkcióként, ún. szemétgyűjtő , amelyet közvetlenül a vezérlési folyamatgráfot megváltoztató transzformációk után hívunk meg [7] .
A kód elérhetetlenné válhat az közbenső reprezentáción végrehajtott egyéb fordítói átalakítások, például az általános részkifejezés-eltávolítási optimalizálás eredményeként .
A gyakorlatban a végrehajtott elemzés összetettsége jelentősen befolyásolja az észlelt elérhetetlen kód mennyiségét. Például folyamatos hajtogatást és egyszerű vezérlési folyamatelemzést követően azt tapasztalhatja, hogy a következő példában szereplő utasításban lévő kód ifnem érhető el:
int foo ( üres ) { int n = 2 + 1 ; ha ( n > 4 ) { printf ( "%d" , n ); /* Elérhetetlen kód */ } }A következő példában szereplő elérhetetlen kód azonosításához azonban egy sokkal kifinomultabb elemzési algoritmust kell alkalmazni:
int foo ( üres ) { dupla x = sqrt ( 2 ); ha ( x > 4 ) { printf ( "%lf" , x ); /* Elérhetetlen kód */ } }Az egyik praktikus megoldás, ha először egy egyszerű elérhetetlen kódelemzést végzünk, majd a profilkészítővel kezeljük a bonyolultabb eseteket. A profilkészítő nem tudja bizonyítani, hogy egy kódrészlet elérhetetlen, de jó heurisztika lehet a gyanús csomópontok megtalálásához, amelyek valószínűleg elérhetetlenek. Miután megtalálta ezeket a potenciálisan elérhetetlen csomópontokat, néhány hatékony elérhetetlen kódelemző algoritmus alkalmazható.