Pereiti prie turinio

Nevykdomas kodas

Straipsnis iš Vikipedijos, laisvosios enciklopedijos.

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

Nepasiekiamas kodas

[redaguoti | redaguoti vikitekstą]

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.

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 | redaguoti vikitekstą]

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.

  1. Debray, Saumya K.; Evans, William; Muth, Robert; De Sutter, Bjorn (1 March 2000). „Compiler techniques for code compaction“. ACM Transactions on Programming Languages and Systems. 22 (2): 378–415. CiteSeerX 10.1.1.43.7215. doi:10.1145/349214.349233. S2CID 6129772.
  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“. Suarchyvuotas originalas 2015-04-23. Nuoroda tikrinta 2015-03-29.
  8. Risks digest summary of the malfunctions, from SCIENCE magazine, Vol 245, 8 September 1989