Newsgroup: it.comp.os.linux.development
Titolo: Controllare se un puntatore e' valido

Come posso fare per controllare se posso leggere/scrivere su una
locazione di memoria, senza arrivare al segfault in caso negativo?
Esiste qualcosa tipo "int is_valid_ptr_to_char/word/qualcosa(void*ptr)" ?
ZioCantante

"Zio Cantante" ha scritto:

no, ma esistone le eccezioni in c++


Until I loved, life had no beauty;
I did not know I lived until I had loved. (Theodor Korner)

Esiste qualcosa tipo "int is_valid_ptr_to_char/word/qualcosa(void*ptr)" ?
Forse (non so se ricordo bene) esiste una funzione che ritorna l'indirizzo
piů alto oltre al quale un tentativo di accesso causa sigsev, era qualcosa
nei dintorni di sbrk(), ma non ricordo con precisione, prova a spulciare il
man.
Lanugo

 locazione di memoria, senza arrivare al segfault in caso negativo?
Potresti controllare se il puntatore supera l'indirizzo di 
argv[argc - 1], ma questo e' giocare veramente sporco.
-- 
Fabio Bonelli  fabio161616(at)
libero.it
 blackmagic(at)
penguinpowered.com
Unix is simple. It just takes a genius to understand its simplicity.
               -- Dennis Ritchie

 argv[argc - 1], ma questo e' giocare veramente sporco.
anche perche' valido solo su archittetture con lo stack top-down, che 
cioe' parte da indirizzi di memoria alti e scende...
Inoltre non consideri il versante opposto. nel primo GB di mem virtuale 
sono mappate varie cosette interessanti...

    cosa fare a proposito
Non penso che sia una buona idea:
- Potrebbe non succedere nulla (ovvero niente SIGSEGV: il risultato 
  dell'accesso a memoria non allocata e` un 'undefined behaviour')
- Una volta intercettato il SIGSEV l'unica cosa sensata da fare e`
  uscire. Ignorare un SIGSEV (non generato da raise) conduce anche qui`
  ad un undefined behaviour.
IMHO se si sente la necessita` di una funzione del genere si sta facendo
un uso sbagliato dei puntatori.
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
Il piu` bel momento dell'amore e` quando ci si illude che duri
per sempre; il piu` brutto, quando ci si accorge che dura
da troppo.

 cioe' parte da indirizzi di memoria alti e scende...
Esattamente, questo e' nella mia concezione di giocare sporco. :-)
-- 
Fabio Bonelli  fabio161616(at)
libero.it
 blackmagic(at)
penguinpowered.com
Sword fighting is kinda like making love. It's not
always what you do, but what you say.  	-- Captain Smirk

 Esattamente, questo e' nella mia concezione di giocare sporco. :-)
magari con lo shell code dell'ormai mitico STSFFAP?-)

Esiste qualcosa tipo "int is_valid_ptr_to_char/word/qualcosa(void*ptr)" ?
No. Devi fartelo da solo. Ma ci sono librerie che sostituiscono tutte
le funzioni "pericolose" con dei "wrappers", che si segnalano se stai
per fare qualcosa di osceno, e anche se ci sono dei leaks, tipo:
	checkpoint(SET, "function_pippo");
	function_pippo();
	checkpoint(CHECKABORT, "function_pippo");
...se function_pippo() alloca qualcosa, senza liberarla, il programma
esce di brutto con
	CheckPoint: "function_pippo": 1 open file, 2 memory blocks
		FD #  1: "/etc/iplogd.conf" opened but not closed
		MB #  1: "nic_buf" allocated but not freed
		MB #  2: "dummy" allocated but not freed
	Program aborted on user request.
Cerca cose come ElectricFence o fortify.
Leonardo
-- 
".signature": bad command or file name