Punter penjant
![](http://upload.wikimedia.org/wikipedia/commons/thumb/a/a4/Dangling_Pointer.svg/220px-Dangling_Pointer.svg.png)
Els punters penjants i els punters salvatges en programació informàtica són punters que no apunten a un objecte vàlid del tipus adequat. Aquests són casos especials de violacions de la seguretat de la memòria. De manera més general, les referències penjants i les referències salvatges són referències que no resolen una destinació vàlida.[1]
Els punters penjants sorgeixen durant la destrucció d'objectes, quan s'elimina o desassigna un objecte que té una referència entrant, sense modificar el valor del punter, de manera que el punter encara apunta a la ubicació de memòria de la memòria desassignada. El sistema pot reassignar la memòria alliberada anteriorment, i si el programa desfereix la referència al punter (ara) penjant, pot resultar un comportament impredictible, ja que la memòria ara pot contenir dades completament diferents. Si el programa escriu a la memòria a la qual fa referència un punter penjant, es pot produir una corrupció silenciosa de dades no relacionades, provocant errors subtils que poden ser extremadament difícils de trobar. Si la memòria s'ha reassignat a un altre procés, aleshores intentar desreferenciar el punter penjant pot provocar errors de segmentació (UNIX, Linux) o errors de protecció general (Windows). Si el programa té privilegis suficients per permetre-li sobreescriure les dades de comptabilitat utilitzades per l'assignador de memòria del nucli, la corrupció pot provocar inestabilitats del sistema. En els llenguatges orientats a objectes amb garbage collection, les referències penjants s'evitaven destruint només objectes que no són accessibles, és a dir, no tenen cap punter entrant; això s'assegura mitjançant el traçat o el recompte de referència. Tanmateix, un finalitzador pot crear noves referències a un objecte, requerint la resurrecció de l'objecte per evitar una referència penjant.[2]
Els punters salvatges sorgeixen quan s'utilitza un punter abans de la inicialització a algun estat conegut, cosa que és possible en alguns llenguatges de programació. Mostren el mateix comportament erràtic que els punters penjants, tot i que és menys probable que no es detectin perquè molts compiladors generaran un avís en temps de compilació si s'accedeix a les variables declarades abans de ser inicialitzades.[3]
Causa dels punters penjants
En molts llenguatges (per exemple, el llenguatge de programació C) esborrar un objecte de la memòria de manera explícita o destruint el marc de pila en retornar no altera els punters associats. El punter encara apunta a la mateixa ubicació de la memòria tot i que ara es pot utilitzar per a altres propòsits.
A continuació es mostra un exemple senzill:
{ char *dp = NULL; /* ... */ { char c; dp = &c; } /* c falls out of scope */ /* dp is now a dangling pointer */ }
Si el sistema operatiu és capaç de detectar referències en temps d'execució a punters nuls, una solució a l'anterior és assignar 0 (nul) a dp immediatament abans de sortir del bloc intern. Una altra solució seria garantir d'alguna manera que dp no es torni a utilitzar sense una inicialització addicional.[4]
Causa dels punters salvatges
Els punters salvatges es creen ometent la inicialització necessària abans del primer ús. Així, en sentit estricte, cada punter en llenguatges de programació que no obliguen a la inicialització comença com un punter salvatge.
Això passa sovint a causa de saltar per sobre de la inicialització, no per ometre-la. La majoria dels compiladors poden advertir sobre això.
int f(int i) { char *dp; /* dp is a wild pointer */ static char *scp; /* scp is not a wild pointer: * static variables are initialized to 0 * at start and retain their values from * the last call afterwards. * Using this feature may be considered bad * style if not commented */ }
Referències
- ↑ «Dangling, Void , Null and Wild Pointers» (en anglès americà), 15-10-2016. [Consulta: 18 setembre 2023].
- ↑ Twofiftysixbit. «What Is a Dangling Pointer?» (en anglès), 05-07-2020. [Consulta: 18 setembre 2023].
- ↑ «Warning Options - Using the GNU Compiler Collection (GCC)» (en anglès).
- ↑ «How to avoid dangling pointers: Tiny programming errors leave serious security vulnerabilities | TechTarget» (en anglès). [Consulta: 18 setembre 2023].