Nedosažitelný kód

Nedosažitelný kód je v programování část zdrojového kódu programu, která není nikdy vykonána, protože neexistuje žádná cesta, která by k ní vedla ze zbytku programu.

Chyba „nedosažitelný kód“ v nástroji Eclipse.

Nedosažitelný kód je někdy nesprávně označován jako mrtvý kód, avšak mrtvým kódem se rozumí kód, který je vykonán, ale jeho výsledek nemá žádný vliv na výstup programu.

Obecně je nedosažitelný kód považován za nežádoucí například z následujících důvodů:

  • zbytečně zabírá paměť
  • způsobuje nadbytečné cachování instrukcí do instrukční cache CPU
  • z pohledu údržby programu může stát čas a peníze udržovat a dokumentovat kód který není nikdy vykonán a tudíž je zbytečný.

Příčiny editovat

Vznik nedosažitelného kódu může mít mnoho různých důvodů, jako jsou:

  • programátorská chyba v komplexním větvení programu.
  • důsledek vnitřních transformací provedených optimalizací.
  • nedokonalé testování nového, či modifikovaného programu, které neodhalilo přeskočený nedosažitelný kód.
  • zastaralý kód, který programátor zapomněl smazat.
  • nepoužitý kód, o kterém programátor rozhodl jej ponechat, protože byl zamíchaný s funkčním kódem.
  • část kódu užitečného kódu v podmíněném větvení nemusí být nikdy vykonána, pokud tomu neodpovídají vstupní data.
  • komplexní zastaralý kus kódu byl záměrně v programu ponechán, ale učiněn nedosažitelným, aby mohl být později v případě nutnosti opět navrácen.
  • ladící informace, které z programu teprve budou odebrány.

Příklad editovat

Uvažujme následující část kódu v jazyce C:

int foo (int X, int Y)
{
  return X + Y;
  int Z = X + Y;	
}

Deklarace int Z = X + Y; nebylo nikdy dosaženo, protože dříve nastal návrat z funkce. Deklarace proměnné Z proto může být odstraněna.

Analýza editovat

Detekce nedosažitelného kódu je forma statické analýzy a zahrnuje provedení analýzy řídícího toku k nalezení částí, které nebyly nikdy dosaženy bez ohledu na hodnoty proměnných a jiných podmínek při běhu. V některých jazycích (např. Java) jsou určité formy nedosažitelného kódu explicitně zakázány. Optimalizace odstraňující nedosažitelný kód se nazývá eliminace nedosažitelného kódu.

Kód se může stát nedosažitelným v důsledku optimalizací provedených kompilátorem (např. eliminace společných podvýrazů). V praxi má na odhalování nedosažitelného kódu značný vliv míra důmyslnosti provedené analýzy. Například výpočet konstantních výrazů a jednoduchá analýza toku dat snadno odhalí, že volání funkce bar(); je nedosažitelné.

int N = 2 + 1;

if (N == 4)
{
 bar();
}

Avšak mnohem komplexnější a důmyslnější analýzy musí být provedeny, aby odhalily nedosažitelné volání funkce bar(); v tomto příkladu:

double X = sqrt(2);

if (X > 5)
{
  bar();
}

Technika eliminace nedosažitelného kódu je ve stejné třídě optimalizací jako eliminace mrtvého kódu a redundantního kódu.

Nedosažitelnost a profilování editovat

V některých případech může být praktický přístup vyřešit snadná kritéria neodosažitelnosti a na komplexnější použít profiler. Profilování samo o sobě nedokazuje cokoli o nedosažitelnosti kusu kódu, ale může být dobrý vodítkem k potenciálně nedosažitelnému kódu. Když je ten nalezen, nedosažitelnost je třeba ověřit komplexnějším nástrojem nebo i ruční analýzou a rozhodnout, zdali je podezřelá část skutečně nedosažitelná.

Reference editovat

V tomto článku byl použit překlad textu z článku Unreachable code na anglické Wikipedii.