Nevykdomas kodas

(Nukreipta iš puslapio Miręs kodas)

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

Nepasiekiamas kodas redaguoti

Nepasiekiamo kodo 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 redaguoti

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 pasiekiamu, neturi įtakos programos vykdymui bei jos rezultatams.[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 redaguoti

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 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.[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 redaguoti

Šaltiniai redaguoti

  1. S. K. Debray; Evans, W.; Muth, R.; De Sutter, B. (2000 m. kovo mėn.). „Compiler techniques for code compaction“ (PDF). Volume 22, issue 2. New York, USA: ACM Transactions on Programming Languages & Systems (TOPLAS). Bibcode:378-415. {{cite web}}: Patikrinkite |bibcode= length (pagalba)
  2. „Dead code detection and removal“. Aivosto. Suarchyvuota iš originalo 2012-08-05. Nuoroda tikrinta 2015-03-29.
  3. „Compares some free alternatives to DCD (Dead Code Detector)“. Java.net. Suarchyvuota iš originalo 2012-09-23. Nuoroda tikrinta 2015-03-29.
  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