Кіріспе

Бағдарламалық жасақтамадағы қате – компьютерлік бағдарламадағы қате. Көптеген немесе ауыр қателері бар компьютерлік бағдарламаны «қателі» деп сипаттауға болады. Бағдарламалық жасақтамадағы қателердің әсері шағын (мысалы, пайдаланушы интерфейсінде дұрыс жазылмаған сөз) –ден ауырға дейін (мысалы, құлау немесе тоқтау) дейін жетеді. Бағдарламалық жасақтамадағы қателер апаттарға әкеп соғуы мүмкін. Therac 25 сәулелік терапия машинасының бағдарламалық қатесі 1980-ші жылдары науқастардың өліміне тікелей себеп болды. 1996 жылы Еуропалық ғарыш агенттігінің 1 миллиард АҚШ доллары тұратын Ariane 5 зымырасының прототипі ұшырылғаннан бір минуттан кейін борттағы басқару компьютері бағдарламасындағы қате салдарынан жойылды. 1994 жылы Ұлыбритания Корольдік әскерінің Chinook тікұшағы апатқа ұшырап, 29 адам қаза тапты. Алғашында бұл оқиға ұшқыштың қатесіне байланысты деп есептелді, бірақ кейіннен қозғалтқышты басқару компьютеріндегі бағдарламалық қате себеп болды деген болжам пайда болды. Бағдарламалық жасақтамадағы қателер 21-ші ғасырдың басында Ұлыбритания почтасындағы үлкен мәселеге себеп болды. 2002 жылы АҚШ Сауда министрлігінің Ұлттық стандарттар және технология институты тапсырыс берген зерттеуде «бағдарламалық қателер немесе ақаулар өте кең таралған және зиянды, олар АҚШ экономикасына жыл сайын шамамен 59 миллиард доллар шығын келтіреді, бұл жалпы ішкі өнімнің 0,6 пайызына тең» деген қорытынды жасалды. 1950 жылдан бері кейбір компьютерлік жүйелер операция кезінде әртүрлі бағдарламалық қателерді анықтауға немесе автоматты түрде түзетуге арналған.

Терминология

Қате метаморфизмі (грекше meta = "өзгеріс", morph = "форма") – бағдарламалық қамтамасты орналастырудың соңғы кезеңіндегі кемшіліктің қалыптасуына қатысты құбылыс. Бағдарламалық жасақтаманы жасау өмірлік циклінің бастапқы кезеңдерінде талдаушы жасаған "қате" циклдің соңғы кезеңінде "кемшілікке" айналуы "қате метаморфизмі" деп аталады. Даму циклындағы қателіктің әртүрлі сатылары қате, аномалия, кінә, сәтсіздік, қателік, ерекше жағдай, құлау, ақау, бұзушылық, кемшілік, жағдай немесе қосымша әсер ретінде сипатталуы мүмкін. Кейбір мамандар бұл қателіктерді қасақана жасалған дизайн шешімін жасыру үшін қолдануға болатынын айтады. 2011 жылы АҚШ сенаторы Аль Франкен пайдаланушылардың орналасқан жерін шифрланбаған файлдарда тіркегені үшін Apple компаниясы бұл жағдайды қате деп атады. Бірақ Демократия және технология орталығының өкілі Джастин Брукман бұл тұжырымға тікелей қарсы шығып, "Олар өздері қате деп атаған нәрсені түзетіп жатқанына қуаныштымын, бірақ пайдаланушыларды қадағалайтындарын жоққа шығаруына келіспеймін" деді.

Алдын алу

Бағдарламалық жасақтаманы әзірлеу процесінде қателерді ең басында болдырмау инвестициялар мен жаңарулардың мақсаты болып табылады.

Ерекшеліктер

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

Бағдарламалық қамтамасыз етуді сынау

Бағдарламалық жасақтаманы сынаудың бір мақсаты – қателерді табу. Сынау барысында алынатын өлшемдер қалған күдікті қателердің шамасын бағалауға көмектеседі. Өнім сыналып, дамытыла бере қалған сайын бұл бағалау сенімдірек болады.

Жеңіл тәжірибелер

Жылдам бағдарламалық жасақтаманы әзірлеу жиі, бірақ салыстырмалы түрде шағын өзгерістермен жаңа нұсқаларды шығаруды қамтуы мүмкін. Кемшіліктер пайдаланушылардың кері байланысы арқылы анықталады. Тестпен басқарылатын әзірлеу (TDD) кезінде бірлік тесттері өндірістік код жазылатын кезде жазылады және өндірістік кодтың толыққанды саналуы үшін барлық тесттер сәтті өтуі керек.

Статикалық талдау

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

Аспаптар

Бағдарламалық қамтамасының жұмыс істеуін бақылауға арналған құралдар, мысалы, тұйықтар сияқты проблемаларды анықтау немесе дұрыс жұмыс істеуін қамтамасыз ету мақсатымен кодқа тікелей енгізілуі мүмкін (мысалы, PRINT "I AM HERE" сияқты қарапайым жазба арқылы) немесе жеке құралдар түрінде берілуі мүмкін. Көбінесе кодтың қай бөлігі ең көп уақытты жұмсайтынын білу күтпеген нәрсе болып келеді, және осый пікірлерді жою кодты қайта жазуға себеп болуы мүмкін.

Ашық көз

Ашық кодты әзірлеу кез келген адамға бастапқы кодты қарауға мүмкіндік береді. Эрик С. Реймонд танымал еткен Лайнус заңы бойынша, кең таралған ашық кодты бағдарламалық жасақтамада басқа бағдарламаларға қарағанда кем немесе мүлдем қателер болмауы мүмкін, себебі "көбінесе қарап отырса, барлық қателер бетіне шығады". Алайда, бұл пікірге қарсылық білдірілді: компьютерлік қауіпсіздік маманы Элиас Леви "күрделі, жақсы түсінілмеген және құжатталмаған бастапқы кодта осалдықтарды жасыру оңай" деп жазды, өйткені "адамдар кодты қараса да, олардың оны тексеруге қабілетті екенін білдірмейді". Ашық кодты бағдарламалық жасақтамадағы қателердің мысалы – 2008 жылы Debian жүйесіндегі OpenSSL осалдығы.

Қателерді жою

Қателерді жою бағдарламалық жасақтаманы әзірлеу өмірлік циклының маңызды бөлігі болуы мүмкін. Компьютерлік технологияның алғашқы дамушыларының бірі Морис Уилкс 1940 жылдардың соңында өмірінің көп бөлігін бағдарламаларындағы қателерді табуға жұмсайтынын түсінгенін айтқан. «Дебьюгер» деп аталатын бағдарлама бағдарламашыға қате кодты табуға көмектеседі, бағдарламаның ішкі жұмысын зерттеу арқылы, мысалы, кодты жол-жолға орындау және айнымалылардың мәнін қарау арқылы. Дебьюгерді пайдаланудың орнына, кодты бағдарламаның орындалуын және мәндерін бақылау үшін қате туралы ақпаратты шығаруға арналған логикамен жабдықтауға болады. Шығару әдетте консольге, терезеге, журналдық файлға немесе аппараттық шығысқа (мысалы, светодиодқа) бағытталады. Кейбіреулер қатені табу – өнер екенін айтады. Бағдарламаның бір бөліміндегі қате басқа бөлімде жұмыстың дұрыс болмауына себеп болуы мүмкін, бұл жүйенің сырттай байланысы жоқ бөлігінде іздеуді қиындатады. Мысалы, графикалық рендерингтегі қате файлдық кіріс-шығыс операцияларының сәтсіз аяқталуына әкелуі мүмкін. Кейде қателерді жоюдың ең қиын бөлігі – қатеге не себеп болғанын анықтау. Бір рет себебі табылып қойғаннан кейін, мәселені түзету кейде оңай, тіпті қарапайым болуы мүмкін. Кейде қате оқшауланған кемшілік емес, бағдарламалаушылардың ойлау немесе жоспарлау қатесін көрсетеді. Мұндай логикалық қателер көбінесе бағдарламаның бір бөлігін қайта қарауды немесе жаңадан жазуды талап етеді. Кейбіреулер кодты қарау кезінде кодты қадаммен оқып, орындалу процесін көз алдында елестету немесе жазып алу арқылы қателерді оларды қайта жасамастан табуға болатынын айтады. Әдетте, қатені анықтаудың бірінші қадамы – оны сенімді түрде қайта жасау. Егер мәселені қайта жасау мүмкін болмаса, бағдарламалаушы қате себебін таба алмайды, демек, оны түзетуге де келмейді. Кейбір қателер бағдарламалаушының қайта жасауы қиын болатын кірістер арқылы көрінеді. Therac 25 сәулелендіру машинасының өліміне себеп болған бір фактор – қате (нақтырақ айтқанда, жарыс жағдайы), ол оператор емдеу жоспарын өте жылдам енгізгенде ғана пайда болды; мұны жасау үшін бірнеше күн жаттығу қажет болды, сондықтан қате сынақтар кезінде немесе өндіруші оны қайталауға тырысқанда көрінбеді. Басқа қателер қателерді табуға көмектесетін жағдай өзгертілгенде, мысалы, бағдарламаны дебьюгермен орындағанда, пайда болуын тоқтатуы мүмкін; мұндай қателер «гейзенбугтар» деп аталады (Гейзенберг белгісіздік принципіне сүйену арқылы әзілде аталады). 1990 жылдардан бастап, әсіресе Ariane 5 рейсі 501 апатынан кейін, қателерді жоюға арналған автоматтандырылған құралдарға қызығушылық артты, мысалы, абстрактілі интерпретация арқылы статикалық кодты талдау. Көбінесе қателер код жазу кезінде пайда болады, бірақ нашар жобаланған құжаттама да қатеге себеп болуы мүмкін. Кейбір жағдайларда кодқа енгізілген өзгерістер мәселені шешеді, тіпті егер код енді құжаттамамен сәйкес келмесе де. Енгізілген жүйелерде бағдарламалық қамтамасыз ету көбінесе аппараттық қатені айналып өту үшін өзгертіледі, өйткені аппаратты өзгертуге қарағанда бұл арзан.

Менеджмент

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

Қателігі

Ауырлық – бұл қатеге тигізетін әсердің өлшемі. Бұл әсер деректерді жоғалту, қаржылық шығын, жақсы қарым-қатынастың жоғалтылуы және еңбектің зая болуы сияқты түрлерде көрінеді. Ауырлық деңгейлері стандартталмаған; олар сала және бақылау құралы сияқты жағдайларға байланысты өзгереді. Мысалы, бейне ойындағы қателік банктің серверіндегі қателіктен өзгеше әсер етеді. Ауырлық деңгейлері құлау немесе тоқтау, шешімі жоқ (пайдаланушы тапсырманы орындай алмайды), шешімі бар (пайдаланушы тапсырманы орындай алады), көрінетін ақау (мысалы, жазылыс қатесі) немесе құжаттамадағы қате болуы мүмкін. Тағы бір мысал: өте ауыр, жоғары, төмен, тоқтатушы, ұсақ. Қателік ауырлығы оны түзетуге берілетін маңыздылықтан бөлек қарастырылуы мүмкін, немесе екеуі де жеке-жеке өлшеніп, басқарылуы мүмкін. Өнімді шығаруды кешіктіретіндей ауыр қате «шығаруды тоқтатушы» деп аталады.

Басымдық

Басымдық – бұл басқа қателермен салыстырғанда қатені жоюдың маңыздылығын көрсетеді. Басымдықтар сандық түрде, мысалы 1-ден 5-ке дейін, немесе атаулы түрде, мысалы, өте маңызды, жоғары, төмен және кейінге шегерілген болуы мүмкін. Мұндай мәндер ауырлық деңгейімен ұқсас немесе бірдей болуы мүмкін, бірақ басымдық – мүлдем басқа шарт. Басымдық қатенің ауырлығымен және оны түзетуге жұмсалатын күш-жігердің мөлшерінің комбинациясы болуы мүмкін. Оңай түзетілетін, бірақ ауырлығы төмен қате, жөндеу үшін көп күш салуды қажет ететін орташа ауырлықтағы қатеге қарағанда жоғары басымдыққа ие болуы мүмкін.

Жапсырма

Жоғары басымдылығы бар қателерді жою үшін арнайы жаңарту шығару қажет болуы мүмкін, мұндай жаңарту кейде "жабдық" деп аталады.

Жөндеуді іске қосу

Қателерді жоюға баса назар жасайтын бағдарламалық жасақтама нұсқасы, жаңа мүмкіндіктерге немесе басқа өзгерістерге баса назар жасайтын нұсқадан ерекшелену үшін, техникалық қолдау нұсқасы деп аталуы мүмкін.

Салдары

Бағдарламалық жасақтамадағы қателердің тудыратын зиянның мөлшері мен түрі бағдарламалық өнімнің сапасына қатысты шешімдер қабылдауға, процестерге және саясатқа әсер етеді. Адамды ғарышқа ұшыру, авиация, ядролық энергетика, денсаулық сақтау, қоғамдық көлік немесе автомобиль қауіпсіздігі сияқты салаларда бағдарламалық жасақтамадағы ақаулар адамдардың жарақаттануына немесе тіпті өліміне себеп болуы мүмкін болғандықтан, мұндай бағдарламалық өнімдер, мысалы, онлайн-сауда веб-сайтынан гөрі әлдеқайда қатаң бақылаудан және сапаны тексеруден өтеді. Банк ісі сияқты, бағдарламалық жасақтамадағы ақаулар банкке немесе оның клиенттеріне ауыр қаржылық зиян келтіруі мүмкін салаларда сапаны бақылау, мысалы, суреттерді өңдеу бағдарламасынан гөрі маңыздырақ. Қателердің тудыратын зиянынан басқа, оларды жоюға жұмсалатын еңбек те олардың құнына әсер етеді. 1978 жылы Лиенц және авторлар тобы жобалардың медианасы бойынша даму еңбегінің 17 пайызы қателерді түзетуге жұмсалатынын көрсетті. 2020 жылы GitHub репозиторийлеріндегі зерттеулер медиананың 20% құрайтынын көрсетті.

Құны

1994 жылы NASA-ның Годдард ғарыш ұшу орталығы кодтың 1000 жолына (SLOC) шаққандағы қателердің орташа санын 4,5-тен 1-ге дейін төмендетуге қол жеткізді. 1990 жылы жасалған тағы бір зерттеуде, өте жақсы бағдарламалық жасақтаманы әзірлеу процестері 1000 SLOC-ке 0,1 дейін орнату сәтсіздігінің деңгейін төмендетуге мүмкіндік беретіні хабарланды. Бұл көрсеткіш Стив Макконнеллдің "Code Complete" кітабында және NASA-ның "Flight Software Complexity" зерттеуінде келтірілген. Кейбір жобалар тіпті нөлдік ақауларға қол жеткізді: IBM Wheelwriter теріскеш машинасының 63 000 SLOC-тан тұратын микробағдарламасы және 500 000 SLOC-тан тұратын Space Shuttle бағдарламалық жасақтамасы. 9 ашық кодты бағдарламадағы 185 C қатесінің өлшемі болып табылады. Defects4J – 5 ашық кодты жобадан алынған 341 Java қатесінің эталоны. Ол әртүрлі түзету түрлерін қамтитын тиісті түзетулерді де қамтиды.

Құрылыс қатесі

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

Арифметика

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

Бақылау ағыны

Басқару ағыны қатесі, әйтекел, логикалық қате – бұл қатемен тоқтамайтын, бірақ күтілгендей жұмыс істемейтін кодпен сипатталатын жағдай. Мұндай қателерге шексіз цикл, шексіз рекурсия, шартты оператордағы дұрыс емес салыстыру (мысалы, қате салыстыру белгісін қолдану) және бірлік қатесі жатады.

Интерфейс

API-ны дұрыс пайдаланбау. Протоколдың дұрыс емес іске асырылуы. Аппараттық құралды дұрыс қолданбау. Белгілі бір платформа туралы қате болжамдар. Үйлесімсіз жүйелер. Жаңа API немесе байланыс протоколы екі жүйе әртүрлі нұсқаларды қолданғанда жұмыс істейтіндей көріне алады, бірақ бір нұсқада іске асырылған функция немесе мүмкіндік екіншісінде өзгертілген немесе жоқ болған жағдайда қателер туындауы мүмкін. Өндірістік жүйелерде, үздіксіз жұмыс істеуі тиіс болғандықтан, телекоммуникация саласы немесе интернет сияқты жағдайларда, толық жүйені үлкен жаңарту үшін тоқтату мүмкін болмайды. Мұндай жағдайда, үлкен жүйенің кішігірім бөлімдері жеке-жеке жаңартылады, осылайша үлкен желіде бұзылыстар азайтылады. Дегенмен, кейбір бөлімдер назардан тыс қалып, жаңартылмауы мүмкін, бұл анықтау және түзету қиын болатын үйлесімсіздік қателеріне әкелуі мүмкін. Кодтың дұрыс емес түсіндірмелері.

Бір мезгілде жұмыс істеу

Тұйыққа тірелу – бір тапсырма екіншісі аяқталғанша жалғаса алмайды, ал екіншісі біріншісі аяқталғанша жалғаса алмайды. Жарыс жағдайы – бірнеше тапсырма бір уақытта ресурстар үшін бәсекелеседі. Критикалық бөлімдердегі қателер, өзара құлыптаулар және бір уақытта өңдеудің басқа да мүмкіндіктері. Тексеруден пайдалану уақытына дейін (TOCTOU) – қорғалмаған критикалық бөлімнің бір түрі.

Ресурстар

Нөлдік көрсеткіштің қолданылуы. Басталмаған айнымалыны пайдалану. Дұрыс дерек түрінде емес нұсқауды қолдану (жинақталған ондық/екілік кодталған ондыққа қараңыз). Жасақ бұзу. Ресурс ағысы, онда шектеулі жүйелік ресурс (мысалы, жад немесе файл дескрипторлары) босатылмаған қайта-қайта бөлу арқылы таусылады. Буфердің артық толуы, онда бағдарлама бөлінген жадтың соңынан асып, дерек сақтауға тырысады. Бұл жасақ немесе жад бұзуға әкелуі мүмкін немесе әкелмейді. Бұл көбінесе қауіпсіздік қатесі болып табылады. Шамадан тыс рекурсия, логикалық жағынан дұрыс болғанымен, стек ағынына себеп болады. Босатылғаннан кейін жадты пайдалану қатесі, жүйе сілтеме жасайтын жадты босатқаннан кейін көрсеткіш қолданылады. Қос босату қатесі.

Синтаксисі

Дұрыс емес операторды қолдану, мысалы, теңдеуді тексерудің орнына мән беру. Мысалы, кейбір тілдерде x=5 x-тің мәнін 5-ке теңесе, ал x==5 x-тің қазір 5-ке тең екенін немесе басқа сан екенін тексереді. Интерпретацияланатын тілдер мұндай кодтың қателіктерге әкелуіне мүмкіндік береді. Компиляцияланатын тілдер мұндай қателерді тестілеуден бұрын анықтай алады.

Топтық жұмыс

Жаңартылмаған өзгерістер; мысалы, бағдарламашы "myAdd" функциясын өзгертеді, бірақ сол алгоритмді пайдаланатын "mySubtract" функциясын өзгертуді ұмытады. Мұндай қателерді "Қайталамау" қағидасы азайтады. Ескірген немесе қате түсініктемелер: көптеген бағдарламашылар түсініктемелер кодты нақты көрсетеді деп есептейді. Құжаттама мен дайын өнім арасындағы келіспеушіліктер.

"Жүйедегі қателер" есебі

New America тобы басқаратын Open Technology Institute 2016 жылдың тамызында "Жүйедегі қателер" атты есеп жариялады. Есепте АҚШ саясаткерлері зерттеушілерге бағдарламалық жасақтамадағы қателерді анықтауға және түзетуге көмектесетін реформалар жасауы керек екені айтылған. Есеп "бағдарламалық жасақтамадағы осалдықтарды анықтау және жариялау саласында реформа қажеттігін" көрсетеді. Есептің авторларының бірі Конгресс киберқауіпсіздік мәселесімен күресу үшін бірнеше заң қабылдағанына қарамастан, кибер бағдарламалық жасақтаманың осалдықтарын жоюға жеткілікті шаралар қабылдамағанын мәлімдеді. 2008 жылы Канадада түсірілген "Control Alt Delete" фильмі 1999 жылдың соңында компьютер бағдарламашысының 2000 жыл мәселесіне байланысты компаниясындағы қателерді түзетуге тырысуы туралы айтады.