Per motivi di debug devo testare un puntatore per vedere se punta a una pagina leggibile valida. Attualmente sto analizzando/proc/[pid]/maps per vedere se l'indirizzo è mappato ok, ma questo sembra un po 'prolisso. C'è un modo migliore? Grazie.Come verificare se un indirizzo è leggibile nell'app dello spazio utente linux
risposta
Il modo canonico consiste nell'utilizzare la chiamata di sistema write()
per leggere dalla pagina (scrivendo in un descrittore di file fittizio pipe()
). Invece di errori, restituirà -1
con errno == EFAULT
se il buffer da scrivere non è leggibile.
Grazie, questo funziona a meraviglia! – gimmeamilk
Attenzione: ho visto almeno un'altra soluzione SO suggerire di utilizzare/dev/null per questo scopo (http://stackoverflow.com/questions/4611776/isbadreadptr-analogue-on-unix), ma i nuovi kernel (ho testato il 3.8 .7) return success per/dev/null write() anche se 'buf' è NULL. Quindi, anche se questo test potrebbe funzionare con/dev/null su qualsiasi sistema si stia testando, non è sicuramente una soluzione portatile. L'utilizzo di qualche altro file fd (come un dummy pipe o un oggetto posix shm) non sarebbe altrettanto veloce, ma sarebbe sicuramente più sicuro e più portabile. – etherice
Sto eseguendo l'analisi di '/ proc/self/maps' pure –
@GregoryPakosz: Per essere una soluzione generica e affidabile, non richiederebbe ricaricare e riorganizzare la mappa ad ogni controllo per tenere conto delle cose come un mucchio crescente o segmenti di memoria appena mappati? – etherice
@etherice: No perché/proc è autoaggiornante; ogni volta che si accede a un file/proc, viene eseguito il codice del kernel che rigenera il suo "contenuto". – kaiwan