Nevykdomas kodas

Nevykdomas kodas () – programoje esantys sakiniai, neturintys įtakos jos vykdymui bei rezultatams.

 Nepasiekiamas kodas 
Nepasiekiamo kodo sakiniai niekada, jokiomis aplinkybėmis nėra įvykdomi. Pavyzdžiui, C (arba java) pavyzdyje:

 if (x >= 0)
   e = "Neneigiamas";
 else if (x < 0)
   e = "Neigiamas";
 else
   e = "Nepasiekiamas kodas";

paskutinis priskyrimo sakinys yra nepasiekiamas, nes kintamasis x gali būti arba neneigiamas, arba neigiamas – trečiosios kodo numatytos alternatyvos niekada nebus.

 Miręs kodas 
Nepasiekiamas artima (ir kartais su ja painiojama) mirusio kodo sąvoka, tačiau „mirusiu“ kompiliatorių teorijoje laikomas kodas, kuris, nors ir būdamas pasiekiamu, neturi įtakos programos vykdymui bei jos rezultatams.Компиляторы – принципы, технологии, инструменты – С. 669 (недостижимый код), 713 (мёртвый код). Pavyzdžiui,

 int a = 0;
 for (a = 0; a < 10; a = a + 1)
   {
     // (ciklo sakiniai)
   }

nulio priskyrimas pirmojoje pavyzdžio eilutėje yra perteklinis, nes tai antrą kartą padaroma pradedant vykdyti ciklą.

Šiuolaikiniai kompiliatoriai turi daug galimybių mirusiam ar nepasiekiamam kodui jau kompiliacijos metu aptikti

 Žinomi programavimo istorijos atvejai 
Miręs kodas gali slėpti rimtą programavimo klaidą, nes jei programuotojas rašė komandas, jis greičiausiai tikėjosi, jog jos kokiomis nors aplinkybėmis bus vykdomos – taigi programa veikia ne taip, kaip manė jos autorius.

Žinomas toks atvejis buvo 2014 metais aptikta Apple sistemos klaida, žinoma kaip CVE-2014-1266.

Klaidinga programos dalis atrodo taip:

static OSStatus
SSLVerifySignedServerKeyExchange(SSLContext *ctx, bool isRsa, SSLBuffer signedParams,
                                 uint8_t *signature, UInt16 signatureLen)
{
    OSStatus        err;
    ...

    if ((err = SSLHashSHA1.update(&hashCtx, &serverRandom)) != 0)
        goto fail;
    if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0)
        goto fail;
        goto fail;
    if ((err = SSLHashSHA1.final(&hashCtx, &hashOut)) != 0)
        goto fail;
    ...

fail:
    SSLFreeBuffer(&signedHashes);
    SSLFreeBuffer(&hashCtx);
    return err;
}

Eilutė „goto fail“ čia greičiausiai netyčia pakartota dukart, tačiau jei pirmajam pakartojimui galioja viršuje esanti if sąlyga, tai antrasis yra besąlyginis valdymo perdavimas. Jis priverčia praleisti visus vėlesnius tikrinimus iki pat fail žymės ir taip sukuria rimtą saugumo spragą.

Jei dėl įvairių priežasčių (tarkim, laiko trūkumo) programoje paliktas „žinomai mirusio“ ar „žinomai nepasiekiamo“ kodo fragmentas „atgyja“, jo veiklos padariniai irgi gali būti katastrofiški. Pavyzdžiui, kosminiame zonde Phobos buvo palikta orientacijos sistemą išjungianti komandų seka kuri buvo naudojama testų Žemėje metu. Prisidėjus papildomai operatoriaus klaidai, kodas nelauktai išjungė sistemą skrydžio metu.Risks digest summary of the malfunctions, from SCIENCE magazine, Vol 245, 8 September 1989 Zondas buvo prarastas.

Sudėtingose sistemose praeityje veikęs kodas gali tapti nepasiekiamas tobulinant programą perrašius kitas, nebūtinai tiesiogiai susijusias jos dalis. Kai kada kodas tampa nepasiekiamas perrašius operacinės sistemos dalis ar net pakeitus aparatinę įrangą.

Miręs kodas praeityje buvo didelė kartu su programa platinamų bibliotekų problema. Paprastai bendros paskirties biblioteka turi daugybę įvairių funkcijų, kurių visų konkrečiai programai beveik niekada nereikia. Jei nenaudojamas kodas iš galutinės versijos nepašalinamas, jis be reikalo padidina programos apimtį. Šiuolaikinės programavimo sistemos turi algoritmus tokioms nenaudojamoms bibliotekoms pašalinti.

 Kitos klaidos 
 Pasikartojantis kodas

 Šaltiniai 

Kategorija:Programavimo klaidos