Nevykdomas kodas

Straipsnis iš Vikipedijos, laisvosios enciklopedijos.
(Nukreipta iš puslapio Miręs kodas)
Peršokti į: navigaciją, paiešką

Nevykdomas kodas (angl. unreachable code, dead code) – programoje esantys sakiniai, neturintys įtakos jos vykdymui bei rezultamas.

Nepasiekiamas kodas[taisyti | redaguoti kodą]

Nepasiekiamo kdo sakiniai niekada, jokiomis aplinkybėmis nėra įvykdomi.[1] 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[taisyti | redaguoti kodą]

Nepasiekiamas artima (ir kartais su ja painiojama[2][3]) mirusio kodo sąvoka, tačiau "mirusiu" kompiliatorių teorijoje laikomas kodas, kuris, nors ir būdamas pasiekamu, neturi įtakos programos vykdymui bei jos rezultatamas.[4] 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[taisyti | redaguoti kodą]

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. [5] [6] Klaidinga programos dalis atrodo taip: [7]

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 pirmąjam 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 nepasiekamo" 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.[8] 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[taisyti | redaguoti kodą]

Šaltiniai[taisyti | redaguoti kodą]

  1. Debray, S. K.; Evans, W., Muth, R., and De Sutter, B. (March 2000). "Compiler techniques for code compaction.." (PDF) Volume 22, issue 2. ACM Transactions on Programming Languages & Systems (TOPLAS).
  2. "Dead code detection and removal." Aivosto. Suarchyvuota nuo originalo 6 Rugpjūtis 2012.
  3. "Compares some free alternatives to DCD (Dead Code Detector)." Java.net. Suarchyvuota nuo originalo 23 Rugsėjis 2012.
  4. Компиляторы — принципы, технологии, инструменты — С. 669 (недостижимый код), 713 (мёртвый код).
  5. Adam Langley (2014). "Apple's SSL/TLS bug."
  6. Arie van Deursen (2014). "Learning from Apple’s #gotofail Security Bug."
  7. "sslKeyExchange.c - Source code for support for key exchange and server key exchange."
  8. Risks digest summary of the malfunctions, from SCIENCE magazine, Vol 245, 8 September 1989