Locked History Actions

Dangling pointer

Žodis angliškai

Dangling pointer

Žodis lietuviškai

Kabančios rodyklės


ĮVADAS

Kabančios rodykles – tai rodyklės naudojamos programavime, kurios nurodo adresą į neegzistuojančią atminties ląstelę. Tai yra vienas iš specialiųjų atminties saugumo pažeidimų. Kabančios rodyklės atsiranda, kai objektas yra ištrinamas ar pakeičiama jo lokacija, nepakeičiant rodyklės reikšmės. Tokiu atveju rodyklė vis dar rodo į ta atminties ląstelę, kurioje buvo objektas.

BENDRA INFORMACIJA

Sistemai, į prieš tai atlaisvintą atmintį, įkėlus kitą objektą, prieš tai nepakeitus rodyklės reikšmės, gali įvykti įvairūs nenuspėjami programos pakitimai. Tai ypač aktualu, kai programa įrašo duomenis į atmintį, kuriuos nurodo kabanti rodyklė, tokiu atveju gali įvykti duomenų iškraipymas, kurie vėliau veda prie įvairių programos klaidų, kurių šaltinį dažniausiai yra ypač sudėtinga rasti. Jei perrašytuose duomenyse yra laikomi duomenys susiję su sistemos atminties paskirstytuvu, tai tokiu atveju sistema pasidaro nestabili. Kabančios rodyklės pavizdys: Iš viso yra 4 rodyklės, tačiau viena iš jų yra kabančioji, nes nurodo į ištrintą objektą:

3.png

KABANČIŲ RODYKLIŲ RADIMAS IR ŠALINIMAS

Kabančios rodyklės randamos ir šalinamos panaudojant tam tikras funkcijas. C ir C++ kalboje papraščiausias būdas išvengti kabančių rodyklių yra naudoti ištrinimo destruktorių funkcijas, kurios garantuoja kabančių rodyklių ištrinimą ar rodyklės pašalinimą. Tačiau šitas būdas nepanaikins kitų rodyklių, kurios turėti rodyklės kopiją. C++ pavyzdinis kodas kabančių rodyklių pašalinimui:

4.png

Norint rasti kabančių rodyklių klaidas yra naudojama programinė technika, kai rodyklė nurodoma į nulinę rodyklę (null) arba į negaliojantį adresą, prieš tai išvalius atmintį. Kai nulinė (null) rodyklė yra panaudojama, programa iškart nutraukia darbą ir nėra jokio pavojaus prarasti duomenis ar, kad sistema pradės dirbti nestabiliai. Tai padeda daug lengviau surasti atspindimas programavimos klaidas ir vėliau jas ištaisyti. Tačiau šita technika nepadeda rasti kabančių rodyklių, kurios turi kelias kopijas. Kai kurie debugeriai automatiškai perrašo ir sunaikina duomenis, kurie buvo atlaisvinti, dažniausiai naudojamas konkretus modelis: 0xDEADBEEF (Microsoft's Visual C/C++ debugeris,naudoja 0xCC, 0xCD arba 0xDD , priklausomai nuo to kokio tipo duomenys buvo atlaisvinti). Tai dažniausiai apsaugo duomenis nuo pernaudojimo, padarant juos beverčius ir lengvai pastebimus (pagal panaudotus modelius). Tokie įrankiai kaip „Polyspace“, „TotalView“, „Valgrind“, „Mudflap“ ir pan. naudojami automatizuotam kabančių rodyklių radimui.

Literatūra

http://en.wikipedia.org/wiki/Dangling_pointer

http://stackoverflow.com/questions/3468456/dangling-pointer-example