Кіріспе
Дұрыс нысанға сілтеме жасамайтын меңзер. Компьютерлік бағдарламалауда, аспаптық меңзерлер (dangling pointers) және жапайы меңзерлер (wild pointers) – тиісті типтегі жарамды нысанға сілтеме жасамайтын меңзерлер. Бұл есте сақтау қауіпсіздігін бұзудың ерекше жағдайлары. Жалпы алғанда, аспаптық сілтемелер (dangling references) және жапайы сілтемелер (wild references) – жарамды мақсатқа шешімін таппаған сілтемелер. Аспаптық меңзерлер объектіні жою кезінде пайда болады, егер кіріс сілтемесі бар объект өшірілсе немесе босатылса, меңзердің мәнін өзгертпей, меңзер әлі де босатылған жадтың жад орнын көрсетеді. Жүйе бұрын босатылған жадыны қайта бөлуі мүмкін, ал егер бағдарлама (қазіргі) аспаптық меңзерді қолданса, күтпеген мінез-құлық пайда болуы мүмкін, өйткені жадыда қазір мүлдем басқа деректер болуы мүмкін. Егер бағдарлама аспаптық меңзер арқылы жадыға жазса, байланысты емес деректердің үндемеу бұзылуы болуы мүмкін, бұл өте қиын болатын нәзік қателерге әкелуі мүмкін. Егер жад басқа процеске қайта бөлінген болса, онда аспаптық меңзерді қолдануға тырысу сегментация қателеріне (UNIX, Linux) немесе жалпы қорғаныс қателеріне (Windows) әкелуі мүмкін. Егер бағдарламаның ядроның жад бөлгіші пайдаланатын бухгалтерлік деректерді ауыстырып жазуға мүмкіндік беретін жеткілікті артықшылықтары болса, бүліну жүйелік тұрақсыздыққа әкелуі мүмкін. Қоқыс жинаушы объектіге бағдарланған тілдерде, аспаптық сілтемелерге қол жетпейтін объектілерді жою арқылы ғана жол берілмейді, яғни олардың кіріс көрсеткіштері жоқ; бұл іздену немесе сілтемелерді санау арқылы қамтамасыз етіледі. Алайда, finalizer бір нысанға жаңа сілтемелер жасай алады, бұл сілтемені тоқтату үшін нысанды қайта тірілтуді қажет етеді. Жапайы меңзерлер (wild pointers), инициализацияланбаған меңзерлер (uninitialized pointers) деп те аталады, кейбір бағдарламалау тілдерінде мүмкін болатын белгілі бір күйге бастау алдында меңзер қолданылған кезде пайда болады. Олар аспаптық меңзерлер сияқты бейімсіз мінез-құлықты көрсетеді, бірақ олар байқалмай қалу ықтималдығы аз, өйткені көптеген компиляторлар, егер бастапқыда ашылғанда мәлімделген айнымалыларға қол жеткізілсе, компиляция кезінде ескертуді шығарады.
Dangling pointers and wild pointers in computer programming are pointers that do not point to a valid object of the appropriate type. These are special cases of memory safety violations. More generally, dangling references and wild references are references that do not resolve to a valid destination. Dangling pointers arise during object destruction, when an object that has an incoming reference is deleted or deallocated, without modifying the value of the pointer, so that the pointer still points to the memory location of the deallocated memory. The system may reallocate the previously freed memory, and if the program then dereferences the (now) dangling pointer, unpredictable behavior may result, as the memory may now contain completely different data. If the program writes to memory referenced by a dangling pointer, a silent corruption of unrelated data may result, leading to subtle bugs that can be extremely difficult to find. If the memory has been reallocated to another process, then attempting to dereference the dangling pointer can cause segmentation faults (UNIX, Linux) or general protection faults (Windows). If the program has sufficient privileges to allow it to overwrite the bookkeeping data used by the kernel's memory allocator, the corruption can cause system instabilities. In object oriented languages with garbage collection, dangling references are prevented by only destroying objects that are unreachable, meaning they do not have any incoming pointers; this is ensured either by tracing or reference counting. However, a finalizer may create new references to an object, requiring object resurrection to prevent a dangling reference. Wild pointers, also called uninitialized pointers, arise when a pointer is used prior to initialization to some known state, which is possible in some programming languages. They show the same erratic behavior as dangling pointers, though they are less likely to stay undetected because many compilers will raise a warning at compile time if declared variables are accessed before being initialized.
Ұсталған бетті қолмен ауыстыру
Антони Кречмар [pl] (1945–1996) аспалы сілтеме құбылысы болмайтын толық нысанды басқару жүйесін жасады. Фишер мен ЛеБланк осыған ұқсас тәсілді "Құлыптар мен кілттер" деген атпен ұсынды.
Ұсталған көрсеткіштермен қамтамасыз ету тесіктері
Буферлік ағып кету сияқты, ілгерілейтін/жабайы көрсеткіштердегі қателер жиі қауіпсіздікке қауіп тудырады. Мысалы, егер көрсеткіш виртуалды функцияны шақыру үшін қолданылса, vtable көрсеткіші жазылып алынса, басқа мекенжай (мүмкін, зиянды кодқа сілтеме) шақырылуы мүмкін. Басқа жағдайда, егер көрсеткіш жадқа жазу үшін қолданылса, басқа дерек құрылымы бұзылуы мүмкін. Жады тек көрсеткіш ілгерілегеннен кейін оқылса да, бұл ақпараттың құпиялылығын бұзуға (егер қызықты деректер сол жерге орналастырылған келесі құрылымда болса) немесе құқықтарды арттыруға (егер бұрынғы жарамсыз жад қауіпсіздік тексерулерінде қолданылса) әкелуі мүмкін. Босатылғаннан кейін жаңа жад бөлігі берілмей, ілгерілейтін көрсеткіш қолданылса, бұл "босатылғаннан кейін қолдану" осалдығы деп аталады. Мысалы, Microsoft Internet Explorer 6-11 нұсқаларындағы босатылғаннан кейін қолдану осалдығын пайдаланып, күндізгі шабуылдар жасап жатқан озық тұрақты қауіп бар.