Қол жетімді емес код - Unreachable code

Жылы компьютерлік бағдарламалау, қол жетпейтін код бөлігі болып табылады бастапқы код ешқашан орындалмайтын бағдарламаның, өйткені ол жоқ басқару ағыны бағдарламаның қалған бөлігінен кодқа жол.[1]

Кейде қол жетімді емес код деп те аталады өлі код,[2][3] дегенмен өлі код орындалатын, бірақ бағдарламаның нәтижесіне әсер етпейтін кодқа қатысты болуы мүмкін.[4]

Қол жетімді емес код бірнеше себептер бойынша қажетсіз болып саналады:

  • Ол жадты қажетсіз қолданады
  • Бұл процессорды қажетсіз пайдалануды тудыруы мүмкін нұсқаулық кэші
  • Уақыт пен күш ешқашан пайдаланылмайтын кодты тексеруге, жүргізуге және құжаттауға жұмсалуы мүмкін
    • Кейде автоматтандырылған тест - кодты қолданатын жалғыз нәрсе.

Алайда, қол жетімді емес код кейбір қолданыстарға ие болуы мүмкін, мысалы, қоңырау шалу немесе қолмен секіру үшін функциялар кітапханасын ұсыну. түзеткіш а кейін бағдарлама тоқтайды үзіліс нүктесі. Бұл әсіресе бағдарламаның ішкі күйін тексеру және әдемі басып шығару үшін өте пайдалы. Жөнелтілетін өнімде осындай кодтың болуы мағыналы болуы мүмкін, сонда жасаушы клиенттің іске қосылған данасына түзеткішті қоса алады.

Себептері

Қол жетімді емес код көптеген себептер бойынша болуы мүмкін, мысалы:

  • күрделі шартты тармақтардағы бағдарламалау қателіктері
  • ішкі трансформациялардың салдары компиляторды оңтайландыру;
  • жаңа немесе өзгертілген кодты толық емес тестілеу
  • Бұрынғы код
    • Код басқа бағдарламамен ауыстырылды
    • Бағдарламашы өшіруге шешім қабылдады, себебі ол қол жетімді кодпен араласқан
    • Ағымдағы пайдалану жағдайлары ешқашан қажет болмайтын ықтимал код
    • Қажет болған жағдайда әдейі сақталатын қалыпты код
  • Тек түзету үшін қолданылатын код.

Бұрынғы код - бұрын пайдалы болған, бірақ енді қолданылмайтын немесе қажет емес код. Сонымен қатар, қол жетімді емес код, мысалы, басқаларға пайдалы болған жағдайда немесе белгілі бір сценарийде кездеспейтін жағдайда, күрделі кітапхананың, модульдің немесе күнделікті жұмысының бөлігі болуы мүмкін.

Мұндай шартты түрде қол жетімді емес кодтың мысалы компилятордың жұмыс уақытының кітапханасында жалпы мүмкін болатын аргументтерді өңдеуге арналған күрделі кодты қамтитын жалпы тізбекті форматтау функциясын жүзеге асыруы болуы мүмкін, оның ішіндегі шағын жиын ғана. Әдетте компиляторлар компиляция кезінде пайдаланылмаған код бөлімдерін жоя алмайды, өйткені мінез-құлық негізінен жұмыс уақытындағы аргументтер мәндерімен анықталады.

Мысалдар

С кодының осы фрагментінде:

int ақымақ (int X, int Y){    қайту X + Y;    int З = X * Y;}

анықтамасы int Z = X * Y; ешқашан қол жеткізілмейді, өйткені функция әрқашан оның алдында қайтып келеді. Сондықтан З сақтау бөлуге де, инициализациялауға да болмайды.

қате орындалмады

Apple's SSL / TLS 2014 жылдың ақпан айынан бастап ресми түрде белгілі қауіпсіздікке қатысты үлкен кемшіліктер болды CVE -2014-1266 және бейресми түрде «goto fail bug» ретінде.[5][6] Тиісті код үзіндісі[7]бұл:

статикалық OSStatusSSLVerifySignedServerKeyExchange(SSLContext *ctx, bool isRsa, SSLBuffer Парамдар қол қойды,                                 uint8_t *қолтаңба, UInt16 қолтаңбаЛен){    OSStatus        қате;    ...     егер ((қате = SSLHashSHA1.жаңарту(&hashCtx, &serverRandom)) != 0)        бару сәтсіздік;    егер ((қате = SSLHashSHA1.жаңарту(&hashCtx, &Парамдар қол қойды)) != 0)        бару сәтсіздік;        бару сәтсіздік;    егер ((қате = SSLHashSHA1.ақтық(&hashCtx, &hashOut)) != 0)        бару сәтсіздік;    ... сәтсіздік:    SSLFreeBuffer(&қол қойылды);    SSLFreeBuffer(&hashCtx);    қайту қате;}

Міне, келесі екі қоңырау бар сәтсіздікке ұшырау. Си тілінің синтаксисінде екіншісі сөзсіз, демек әрқашан қоңырауды өткізіп жібереді SSLHashSHA1.финал.Нәтижесінде, қате SHA1 жаңарту операциясының мәртебесіне ие болады және қолтаңбаны растайды ешқашан сәтсіздік.[5]

Мұнда қол жетімсіз код - қоңырау ақтық функциясы. Бұл ақаулықтың алдын алуға болатын бірнеше кодтау тәжірибесі бар, мысалы, кодты қарау, шегініс немесе блок құрылымын дұрыс пайдалану және тестілік қамтуды талдау.[6] Қолдану Қоңырау опциясы бар компилятор -Бәрі қол жетімді емес кодты талдауды қамтиды, бұл осы код үшін дабыл тудырады.[6]

C ++

Жылы C ++, кейбір конструкциялар болуы керек деп көрсетілген анықталмаған мінез-құлық. Компилятор кез-келген мінез-құлықты еркін жүзеге асыра алады және әдетте оңтайландырушы компилятор кодты қол жетімді емес деп санайды.[8]

Талдау

Қол жетпейтін кодты анықтау - бұл формасы ағынды басқару бағдарламаның кез келген мүмкін күйінде ешқашан қол жетпейтін кодты табу. Кейбір тілдерде (мысалы. Java[9]) қол жетімді емес кодтың кейбір нысандарына нақты тыйым салынған. Қол жетімді емес кодты жоятын оңтайландыру ретінде белгілі өлі кодты жою.

Кодын өзгерткен кезде қол жетімді болмауы мүмкін компиляторды оңтайландыру (мысалы, жалпы субэкспрессияны жою ).

Іс жүзінде талдаудың талғампаздығы анықталған қол жетімді емес код мөлшеріне айтарлықтай әсер етеді. Мысалға, тұрақты жиналмалы және қарапайым ағынды талдау келесі кодтағы if-операторының ішкі жағы қол жетімді емес екенін көрсетеді:

int N = 2 + 1;егер (N == 4){   / * қол жетімді емес * /}

Алайда, келесі кодта сәйкес блокқа қол жетімді еместігін анықтау үшін өте талғампаздық қажет:

екі есе X = кв(2);егер (X > 5){    / * қол жетімді емес * /}

Қол жетпейтін кодты жою әдістемесі оңтайландыру класында болады өлі кодты жою және артық код жою.

Профильге қарсы қол жетімділік

Кейбір жағдайларда практикалық тәсіл қол жетімділіктің қарапайым критерийлері мен а-ны қолдану тіркесімі болуы мүмкін профиль жасаушы неғұрлым күрделі істерді қарау үшін. Жалпы профильдеу мүмкін емес дәлелдеу код бөлігінің қол жетімділігі туралы кез келген нәрсе, бірақ жақсы болуы мүмкін эвристикалық мүмкін емес кодты табу үшін. Кодтың күдікті бөлігі табылғаннан кейін, басқа әдістер, мысалы, кодты талдау құралы немесе тіпті қолмен талдау, кодты шынымен жету мүмкін еместігін анықтау үшін қолданылуы мүмкін.

Сондай-ақ қараңыз

Әдебиеттер тізімі

  1. ^ Дебрей, Саумя К .; Эванс, Уильям; Мут, Роберт; Де Саттер, Бьорн (2000 ж. 1 наурыз). «Кодты тығыздаудың компилятор техникасы». Бағдарламалау тілдері мен жүйелері бойынша ACM транзакциялары. 22 (2): 378–415. CiteSeerX  10.1.1.43.7215. дои:10.1145/349214.349233.
  2. ^ RTCA / DO-178C бағдарламалық жасақтамасын әуе-десанттық жүйелер мен жабдықты сертификаттау кезінде қарастыру. RTCA, Inc. 2011. б. 112. Алынған 2019-06-11. Өлі код - бағдарламалық жасақтама қатесінің нәтижесінде болатын, бірақ мақсатты компьютерлік ортаның кез-келген жедел конфигурациясында орындалмайтын (код) немесе пайдаланылмайтын (деректер) орындалатын объектілік код (немесе деректер). Бұл жүйеге немесе бағдарламалық жасақтамаға қажет емес. Келесі ерекшеліктер қате түрде өлі код деп жіктеледі, бірақ талаптарды / дизайнды жүзеге асыру үшін қажет: ендірілген идентификаторлар, беріктігін жақсарту үшін қорғаныс бағдарламалау құрылымдары және пайдаланылмаған кітапхана функциялары сияқты өшірілген код. [Талаптарға негізделген шолу функционалды талаптарға сәйкес келмейтін кодты анықтауы керек болғандықтан, статикалық кодты талдау мұндай кодты қол жетімді емес ретінде анықтауы керек, ал тестілеу нәтижелеріне арналған құрылымдық қамту анализі мұндай кодты қол жетімсіз, негізсіз өлі кодтың болуы жоба ұйымның дамуы мен тексеру процесінің тиімділігі туралы мәселені қарастыруы керек.]
  3. ^ Джей Томас. «Бағдарламалық жасақтаманы мұқият тексеруге негіз болатын талаптардың қадағалануы». Алынған 2019-06-11. Талаптардың бақыланатындығының қамту талдауларымен үйлесуі «өлі код» немесе ешқашан орындалмайтын кодтардың аймақтарын өзгерте алады. Бұл код негізінен қолайсыздықты тудыруы мүмкін, бірақ сонымен қатар, егер хакер қол жеткізе алса және сол жерден бақылауға ие болса, қауіпсіздікке қауіп төндіруі мүмкін. Бұл іздеу мүмкін емес код, сондықтан оны жою керек.
  4. ^ MISRA консорциумы (наурыз 2013). MISRA C: 2012 сыни жүйелерде Си тілін қолдану жөніндегі нұсқаулық. MIRA Limited. б. 41. Алынған 2019-06-11. Ереже 2.2 жоқ өлі код. Орындалатын, бірақ жойылуы бағдарламаның әрекетіне әсер етпейтін кез-келген операцияны құрайды өлі код.
  5. ^ а б Адам Лэнгли (2014). «Apple-дің SSL / TLS қатесі».
  6. ^ а б c Arie van Deursen (2014). «Apple компаниясының #gotofail қауіпсіздік қатесінен сабақ алу».
  7. ^ «sslKeyExchange.c - кілттермен алмасу және серверлік кілттермен алмасу үшін бастапқы код».
  8. ^ «MSC15-C. Анықталмаған тәртіпке тәуелді емес». Карнеги Меллон университеті. 2020. Алынған 28 қыркүйек 2020. Компиляторлар анықталмаған мінез-құлық үшін код жасауға міндетті емес болғандықтан, бұл әрекеттер оңтайландыруға үміткер болып табылады.
  9. ^ «Java тілінің сипаттамасы».
  • Appel, A. W. 1998 Java-да заманауи компиляторды енгізу. Кембридж университетінің баспасы.
  • Muchnick S. S. 1997 жетілдірілген компиляторды жобалау және енгізу. Морган Кауфман.