Кіріспе
Деректер жиынтығының жарамсыз немесе жоқ екенін көрсететін мән. Есептеуде, нөлдік көрсеткіш немесе нөлдік сілтеме – көрсеткіш немесе сілтеме жарамды нысанға сілтеме жасамайтынын білдіру үшін сақталатын мән. Бағдарламалар нөлдік көрсеткіштерді белгісіз ұзындығы бар тізімнің соңы сияқты жағдайларды немесе кейбір әрекетті орындау мүмкін болмаған жағдайларды көрсету үшін жиі пайдаланады. Нөлдік көрсеткішті пайдалануды nullable типтермен және option типіндегі "ештеңе" мәнімен салыстыруға болады. Нөлдік көрсеткішті инициализацияланбаған көрсеткішпен шатастыруға болмайды: нөлдік көрсеткіш жарамды нысанға сілтеме жасайтын кез келген көрсеткішпен тең емес екеніне кепілдік беріледі. Дегенмен, көптеген тілдер мұндай кепілдік бермейді. Ол басқа жарамды көрсеткіштермен немесе басқа нөлдік көрсеткіштермен тең болуы мүмкін. Кейде олар тең болуы мүмкін, кейде тең болмауы мүмкін; ал салыстырудың нәтижесі белгісіз болуы да мүмкін. Сондай-ақ, мұндай мүмкіндіктерді ұсынатын тілдерде дұрыс пайдалану әрбір әзірлеушінің тәжірибесіне және линтер құралдарына байланысты. Нөлдік көрсеткіштер дұрыс пайдаланғанда да семантикалық тұрғыдан толық емес, себебі олар "Қолданылмайды" мәні мен "Белгісіз" немесе "Болашақ" мәні арасындағы айырмашылықты көрсету мүмкіндігін ұсынбайды. Нөлдік көрсеткіш мағыналы нысанға сілтеме жасамағандықтан, осы (жарамсыз) жад орнындағы деректерге қол жеткізу әрекеті орындалу кезінде қателікке немесе бағдарламаның дереу тоқтауына әкелуі мүмкін. Бұл нөлдік көрсеткіш қатесі. Бұл бағдарламалық жасақтамадағы ең көп кездесетін әлсіздіктердің бірі және осы ұғымды енгізген Тони Хоар оны "бір миллиард долларлық қателік" деп атады.
In computing, a null pointer or null reference is a value saved for indicating that the pointer or reference does not refer to a valid object. Programs routinely use null pointers to represent conditions such as the end of a list of unknown length or the failure to perform some action; this use of null pointers can be compared to nullable types and to the Nothing value in an option type. A null pointer should not be confused with an uninitialized pointer: a null pointer is guaranteed to compare unequal to any pointer that points to a valid object. However, in general, most languages do not offer such guarantee. It might compare equal to other, valid pointers; or it might compare equal to null pointers. It might do both at different times; or the comparison might be undefined behaviour. Also, in languages offering such support, the correct use depends on the individual experience of each developer an linter tools. Even when used properly, null pointers are semantically incomplete, since they do not offer the possibility to express the difference between of a "Not Applicable" value versus a "Not known" value or versus a "Future" value. Because a null pointer does not point to a meaningful object, an attempt to access the data stored at that (invalid) memory location may cause a run time error or immediate program crash. This is the null pointer error. It is one of the most common types of software weaknesses, and Tony Hoare, who introduced the concept, has referred to it as a "billion dollar mistake".
С
C тілінде кез келген типтегі екі нөлдік көрсеткіш тең салыстырылатыны кепілдік беріледі. NULL препроцессор макросы <stdlib.h> кітапханасында нөлдік көрсеткіш тұрақтысы ретінде анықталады, және C99 стандартында ((void *)0) түрінде кескіндік түрде бейнеленеді, яғни 0 бүтін сан мәні void* типіне түрлендіріледі (void типіне көрсеткіш қараңыз). C стандарты нөлдік көрсеткіштің 0 жад мекенжайына көрсеткішпен бірдей екенін айтпайды, бірақ практикада олай болуы мүмкін. Нөлдік көрсеткішті дерексіздендіру C тілінде белгіленбеген мінез-құлыққа әкеледі.
C++ тілінде
C++-та NULL макросы C-ден келгенімен, нөлдік көрсеткіш тұрақтысын көрсету үшін нөлге тең бүтін сан әдетте артық көрінеді. Дегенмен, C++11 nullptr деп аталатын нөлдік көрсеткіш тұрақтысын және оның типі nullptr_t-ны пайдалануды ұсынды.
Басқа тілдер
Кейбір бағдарламалау тілдерінің орталарында (мысалы, кем дегенде бір жекеменшік Lisp нұсқасында) нөлдік көрсеткіш ретінде қолданылатын мән (Lisp-те nil деп аталады) іс жүзінде орындау үшін пайдалы ішкі деректер блогына көрсеткіш болуы мүмкін (бірақ пайдаланушы бағдарламаларынан тікелей қол жетімді емес), соның арқасында сол тіркегішті пайдалы тұрақты ретінде де, орындау ішкі құрылымдарына жылдам қол жеткізу үшін де пайдалануға болады. Бұл нөлдік вектор деп аталады. Белгіленген архитектурасы бар тілдерде, мүмкін нөлдік көрсеткішті ерекше жағдайды нақты түрде өңдеуді қажет ететін белгіленген жиынмен алмастыруға болады; шын мәнінде, мүмкін нөлдік көрсеткішті есептелген белгісі бар белгіленген көрсеткіш ретінде қарастыруға болады. Бағдарламалау тілдері нөлдік көрсеткіш үшін әртүрлі әдеби мәндерді қолданады. Мысалы, Python-да нөлдік мән None деп аталады. Паскаль және Swift тілдерінде нөлдік көрсеткіш nil деп аталады. Eiffel-де ол бос сілтеме деп аталады.
Нөлдік қайта сілтемелеу
Нөлдік көрсеткіш ешқандай мағыналы объектіге сілтеме жасамағандықтан, нөлдік көрсеткішті дереференциялауға (яғни, сол жад орнында сақталған деректерге қол жеткізуге) тырысу көбінесе (бірақ әрдайым емес) орындалу кезінде қатеге немесе бағдарламаның дереу құлауына әкеледі. MITRE нөлдік көрсеткіш қатесін ең көп пайдаланылатын бағдарламалық жасақтама әлсіздіктерінің бірі ретінде тізімдейді. C тілінде нөлдік көрсеткішті дереференциялау белгіленбеген мінез-құлық болып табылады. Көптеген жүзеге асырулар мұндай код бағдарламаның кіруді бұзу арқылы тоқтатылуына себеп болуы мүмкін, себебі нөлдік көрсеткіштің ұсынылымы жүйеде объектілерді сақтау үшін ешқашан бөлінбейтін мекенжай ретінде таңдалады. Алайда, бұл мінез-құлық әртүрлі болуы мүмкін. Бұл да кепілдендірілмейді, өйткені компиляторларға анықталмаған мінез-құлықтан бос деп есептегенде бағдарламаларды оңтайландыруға рұқсат беріледі. Delphi және көптеген басқа Pascal жүзеге асыруларында тұрақты жадтағы бірінші адреске нөлдік көрсеткіш сәйкес келеді, ол басқарылатын айнымалыларды бастау үшін де қолданылады. Дереференциялау сыртқы операциялық жүйе ерекшелігін тудырады, егер бөлімі байланысты болса, ол Pascal ерекшелігінің экземплярына шамаланған болады. Java-да нөлдік сілтемеге қол жеткізу (NPE) тудырады, оны қателерді өңдеу кодын пайдаланып ұстап алуға болады, бірақ мұндай ерекшеліктердің пайда болуын болдырмау әлдеқайда жақсы тәжірибе саналады. Lisp-те бірінші дәрежелі объекті болып табылады. Конвенция бойынша, (first nil) тең, сондай-ақ (rest nil) да. Сондықтан, осы контексттерде дереференциялау қате тудырмайды, бірақ нашар жазылған код шексіз циклге түсуі мүмкін. .NET-те нөлдік сілтемеге қол жеткізу тудырады. Бұларды ұстап алу әдетте жаман практика саналады, бірақ бұл ерекшелік түрін бағдарлама ұстап, өңдей алады. Objective-C-де хабарламалар объектіге (яғни, нөлдік көрсеткіш) бағдарламаны тоқтатусыз жіберілуі мүмкін; хабарлама жай ғана елеусіз қалдырылады, ал қайтарылатын мән (бар болса) немесе болады, түріне байланысты. Supervisor Mode Access Prevention (SMAP) енгізілгенге дейін нөлдік көрсеткішті дереференциялау қатесін пайдалану үшін нөлдік бетті шабуылшының адрестік кеңістігіне бейнелеуге болады, соның салдарынан нөлдік көрсеткіш сол аймаққа бағытталатын. Бұл кейбір жағдайларда кодты орындауға әкелуі мүмкін.
Жеңілдіктер
Нөлдік көрсеткіштерді ажырату қателерін жоюды жеңілдететін әдістер бар. Бонд және т.б. D және Rust тілдерінде. Кейбір тілдерде осыған ұқсас талдау сыртқы құралдарды пайдалану арқылы жүргізілуі мүмкін.
Нөлдік көрсеткішке балама
Жалпы ереже ретінде, әрбір құрылым немесе сынып түрі үшін бизнес логикасының белгілі бір күйін көрсететін объектілерді анықтаңыз, бұл нөлдік мәндегі белгісіз мінез-құлықты алмастырады. Мысалы, "келешек" - құрылым ішіндегі қазір қолжетімді емес, бірақ болашақта анықталатыны белгілі өрісті көрсету үшін, "қолданылмайды" - нормаланбаған құрылымдағы өрісті көрсету үшін, ал "қате", "уақыт өткізілді" - өрісті инициализациялау мүмкін болмағанын (мүмкін, толық бағдарламаның, жиектің, сұраныстың немесе команданың қалыпты жұмысын тоқтату арқылы) көрсету үшін қолданылады.