Кіріспе

Бағдарламалауда, пайдалану алдында айнымалының белгілі бір шектерде екенін анықтау. Компьютерлік бағдарламалауда, шектерді тексеру – айнымалыны пайдалану алдында оның нақты шектерде екенін анықтаудың кез келген әдісі. Ол көбінесе санның белгілі бір типке сәйкес келуін (диапазонды тексеру) немесе массив индексі ретінде қолданылатын айнымалының массив шегінде болуын (индекс тексеру) қамтамасыз ету үшін қолданылады. Егер шектерді тексеру сәтсіз болса, әдетте, белгілі бір қате туралы хабарлама немесе ерекшелік сигналы туындайды. Әр пайдалану кезінде шектерді тексеру көп уақыт алатындықтан, мұндай тексеру әрқашан жасалмайды. Шектерді тексеруді болдырмау – компилятордың оңтайландыру әдісі, ол қажетсіз шектерді тексеруді жояды.

Қашықтықты тексеру

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

Индексті тексеру

Индексті тексеру – массивті индекстейтін барлық өрнектерде индекс мәні масситтің шектеріне (массив анықталған кезде белгіленген) тексеріледі және егер индекс шектен тыс болса, одан әрі орындалу қате арқылы тоқтатылады. Массивтің шегінен тыс мәнді оқу немесе, әсіресе, жазу бағдарламаның жұмысын бұзуына немесе құлауына немесе қауіпсіздікке қатысты осал тұстарды тудыруы мүмкін (буферлік ағып кетуді қараңыз), сондықтан индексті тексеру көптеген жоғары деңгейдегі тілдердің құрамында болады. Индексті тексеру мүмкіндігі бар ерте компилирленетін бағдарламалау тілдеріне ALGOL 60, ALGOL 68 және Pascal, сондай-ақ BASIC сияқты интерпретацияланатын бағдарламалау тілдері жатады. Көптеген бағдарламалау тілдері, мысалы C, жылдамдық үшін автоматты шектерді тексермейді. Дегенмен, бұл көптеген қателерді және буферлік ағып кетуді анықталмаған күйде қалдырады. Көптеген бағдарламашылар бұл тілдер жылдам орындалу үшін тым көп құрбан етеді деп санайды. 1980 жылғы Тьюринг сыйлығы бойынша сөйлеген сөзінде К.А.Р. Хоар ALGOL 60 тілін жобалаудағы тәжірибесін сипаттап, шектерді тексеруді қамтитын тіл екенін айтты:

Бұл қағиданың салдары – әрбір индекстелген айнымалының әрбір индексі әрбір жағдайда орындалу кезінде массивтің жоғарғы және төменгі шектерімен тексерілетін болды. Көп жылдар өткен соң біз клиенттерден өндіріс орындалуының тиімділігі үшін осы тексерулерді өшіруге рұқсат беруді сұрадық. Олар бірауыздан бізге рұқсат бермеуге шақырды – олар өндіріс орындалуында индекстеу қателерінің қаншалықты жиі болатынын және оларды анықтамау қаншалықты қауіпті болуы мүмкін екенін білді. 1980 жылға дейін тілдік дизайнерлер мен пайдаланушылар бұл сабақты үйренбегенін қорқынышпен және үреймен атап өткім келеді. Кез келген құрметті инженерлік саласында мұндай қарапайым сақтық шараларын сақтамау заңмен қудаланатын еді. Орындалу уақытын тексеруді міндеттейтін негізгі тілдерге Ada, C#, Haskell, Java, JavaScript, Lisp, PHP, Python, Ruby, Rust және Visual Basic кіреді. D және OCaml тілдерінде компиляторлық опция арқылы қосылатын немесе өшірілетін орындалу уақытындағы шектерді тексеру бар. C++ тілінде орындалу уақытындағы тексеру тілдің бөлігі емес, STL-дің бөлігі болып табылады және компиляторлық опция арқылы қосылады (GLIBCXX DEBUG=1 немесе LIBCPP DEBUG=1). C# сонымен қатар қауіпсіз емес аймақтарды қолдайды: тиімділікті арттыру үшін (басқа нәрселермен қатар) шектерді уақытша тоқтататын кодтың бөлімдері. Бұл кішігірім уақытқа сезімтал тұйықтарды жеделдету үшін пайдалы, сонымен бірге бағдарламаның қауіпсіздігінен бас тартпайды. JS++ бағдарламалау тілі массивтің индексі немесе картаның кілті шектерде ме, әлде шектен тыс па екенін сипаттайтын номиналды типті қолдана отырып, компиляция уақытында индекс немесе кілттің шектен тыс екенін талдай алады. Қолданыстағы типтер компиляция уақытына тек 1 мс үстеме шығын қосады деп көрсетілген.

Жабдықтың шектерін тексеру

Шекараларды тексеру арқылы қамтамасыз етілетін қауіпсіздік, егер тексеру бағдарламалық түрде орындалса, процессор уақытын қажет етеді; бірақ, егер тексерулер аппараттық құралдар арқылы орындалса, онда қауіпсіздік қосымша уақыт кетірмей "тегін" қамтамасыз етілуі мүмкін. Аппараттық шекараларды тексеруді қолданған алғашқы жүйе – 1974 жылы жарияланған ICL 2900 сериялы эВМ болды. VAX компьютері массивтердің индексін тексеру үшін INDEX жиналымдық нұсқауын қолданады, ол алты операторды қабылдайды, олардың барлығы кез келген VAX адрестеу режимін пайдалана алады. B6500 және оған ұқсас Burroughs компьютерлері машиналық кодты жасау үшін қандай тілде құрастырылғанына қарамастан, аппараттық құралдар арқылы шекаралық тексеруді жүзеге асырды. Кейбір жаңа CPU-лар шекараны тексеруге арналған арнайы нұсқауларға ие, мысалы, Motorola 68000 сериясындағы CHK2 нұсқауы. Массивтер мен буферлерге қол жеткізу қауіпсіздігін қамтамасыз ету үшін x86 процессорларының енгізілген виртуалды жад басқару бірлігін пайдалану әдістері бойынша зерттеулер кем дегенде 2005 жылдан бері жүргізілуде. 2015 жылы Intel өздерінің Skylake процессор архитектурасында Intel MPX кеңейтімдерін ұсынды, ол шекараларды процессор тіркегішінде және жадтағы кестеде сақтайды. 2017 жылдың басына қарай GCC кем дегенде MPX кеңейтімдерін қолдайды.