• Domingo 15 de Diciembre de 2024, 11:42

Autor Tema:  Comprobar de forma segura el acceso a memoria  (Leído 1741 veces)

marcialre

  • Nuevo Miembro
  • *
  • Mensajes: 11
    • Ver Perfil
Comprobar de forma segura el acceso a memoria
« en: Sábado 24 de Octubre de 2009, 15:09 »
0
Necesito comprobar si la dirección de memoria apuntada por un puntero es accesible, es decir, una lectura o escritura no generará un Segmentation Fault.

Una forma de realizarlo es leyendo o escribiendo en la dirección y tratar la señal SIGSEGV cuando se produzca. El problema es que necesito una forma más segura que no requiera generar la excepción para averiguar si la dirección es accesible.

¿Hay alguna forma de hacerlo?

SO: Linux 2.6.28, gcc.

Gracias.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Comprobar de forma segura el acceso a memoria
« Respuesta #1 en: Sábado 24 de Octubre de 2009, 15:49 »
0
Si tenes un puntero invalido lo mas probable es que haya un problema en otra parte del programa ... ¿Para que quers hacer esto?

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

marcialre

  • Nuevo Miembro
  • *
  • Mensajes: 11
    • Ver Perfil
Re: Comprobar de forma segura el acceso a memoria
« Respuesta #2 en: Sábado 24 de Octubre de 2009, 15:55 »
0
Es para aumentar la seguridad en una función de una librería. No puedo confiar en que el código del usuario sea correcto y escribir directamente en la dirección. Debo comprobar que eso es posible y comunicarlo en caso de que no lo sea.

Gracias.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Comprobar de forma segura el acceso a memoria
« Respuesta #3 en: Sábado 24 de Octubre de 2009, 16:07 »
0
Efectivamente el problema esta en otra parte, si un programa le pasa un puntero erroneo a tu libreria no hay mucho mas que hacer ademas de capturar la excepcion pero es preferible no hacerlo y que el programa muera en lugar de enmascarar el problema real.

http://stackoverflow.com/questions/5510 ... lidity-c-c

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

marcialre

  • Nuevo Miembro
  • *
  • Mensajes: 11
    • Ver Perfil
Re: Comprobar de forma segura el acceso a memoria
« Respuesta #4 en: Sábado 24 de Octubre de 2009, 16:32 »
0
Estoy de acuerdo contigo, pero me interesa conocer la forma de hacerlo. En Windows podría utilizar la función VirtualQuery para averiguar si la página a la que pertenece la dirección es accesible, pero no conozco la forma de hacerlo en Linux.

Me interesa una forma que haga uso únicamente de las llamadas al sistema y no requiera una librería externa o lenguaje específico. Debería ser implementable en C y en el caso más extremo en ensamblador.

Gracias otra vez.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Comprobar de forma segura el acceso a memoria
« Respuesta #5 en: Sábado 24 de Octubre de 2009, 17:10 »
0
Lo ideal es intentar acceder a la memoria y captuarar la excepcion en Windows usando SEH y en Linux tal y como mencionaste al principio del hilo.

http://stackoverflow.com/questions/2693 ... -protectio

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

marcialre

  • Nuevo Miembro
  • *
  • Mensajes: 11
    • Ver Perfil
Re: Comprobar de forma segura el acceso a memoria
« Respuesta #6 en: Sábado 24 de Octubre de 2009, 17:37 »
0
Creo que con esto me las apañaré. Muchas gracias por tu tiempo.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Comprobar de forma segura el acceso a memoria
« Respuesta #7 en: Sábado 24 de Octubre de 2009, 18:16 »
0
De nadas  :comp:

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

marcialre

  • Nuevo Miembro
  • *
  • Mensajes: 11
    • Ver Perfil
Re: Comprobar de forma segura el acceso a memoria
« Respuesta #8 en: Domingo 25 de Octubre de 2009, 01:54 »
0
El archivo /proc/self/maps (man proc) nos da toda la información necesaria. No es una llamada al sistema, pero por ahora es la solución que ofrece más información.

Como mera curiosidad, intentar generar una tabla como la que ofrece /proc/self/maps a mano es una opción en una arquitectura de 32 bits, pues solo hay que comprobar 1,7·10^7 páginas, pero en una arquitectura de 64 bits, el número de páginas asciende a 4,5·10^15.

Para dar más significado a las cifras supondremos que una comprobación de página (intento de escritura y captura la SIGSEGV) tarda 1 us (microsegundo).
  • 1,7·10^7 comprobaciones tardarían 1,7·10^7 x 1·10^-6 = 17 segundos.
  • 4,5·10^15 comprobaciones tardarían 4,5·10^15 x 1·10^-6 = 4,5·10^9 segundos, es decir, 170 años.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Comprobar de forma segura el acceso a memoria
« Respuesta #9 en: Domingo 25 de Octubre de 2009, 07:04 »
0
Lo mejor es acceder, es una comprobacion instantanea, despues podes capturar la excepcion aunque es probable que ocultes el origen de un problema de esa manera.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.