Guía de seguimiento dinámico de Solaris

Seguridad de punteros

Si es programador en C o C++, se puede asustar después de leer la sección anterior, ya que sabe que el uso inadecuado de los punteros en los programas puede dar lugar a que el programa falle. DTrace es un entorno sólido y seguro para ejecutar sus programas en D, donde estos fallos no pueden dar lugar a que el programa falle. De hecho, puede escribir un programa en D con errores, pero los accesos del puntero en D no válidos no darán lugar a que DTrace o el núcleo del sistema operativo falle o se bloquee de ninguna forma. En cambio, el software DTrace detectará cualquier acceso de puntero en D no válido, desactivará la instrumentación y le informará del problema para su depuración.

Si ha programado en el lenguaje de programación Java, probablemente sepa que el lenguaje Java no admite punteros precisamente por los mismos motivos de seguridad. Los punteros son necesarios en D, ya que son una parte intrínseca de la implementación del sistema operativo en C, pero DTrace implementa el mismo tipo de mecanismos de seguridad que el lenguaje de programación Java, los cuales evitan que los programas con errores se dañen a sí mismos o a otros. La información de errores de DTrace es similar al entorno de tiempo de ejecución del lenguaje de programación Java, que detecta un error de programación y le informa de una excepción.

Para ver la creación de informes y manejo de errores de DTrace, escriba un programa incorrecto a propósito en D que use punteros. En un editor, escriba el siguiente programa en D y guárdelo en un archivo denominado badptr.d:


Ejemplo 5–1 badptr.d: Demostración del manejo de errores de DTrace

BEGIN
{
	x = (int *)NULL;
	y = *x;
	trace(y);
}

El programa badptr.d crea un puntero en D denominado x, que es un puntero a int. El programa asigna a este puntero el valor de puntero especial no válido NULL, que es un alias incorporado para la dirección 0. Por convención, la dirección 0 siempre se define como no válida, de forma que NULL se puede utilizar como valor centinela en C y D. El programa utiliza una expresión de conversión para convertir NULL en un puntero a un entero. A continuación, el programa deja de hacer referencia al puntero usando la expresión *x y asigna el resultado a otra variable y; a continuación, intenta rastrear y. Cuando el programa en D se ejecuta, DTrace detecta un acceso del puntero no válido al ejecutar la instrucción y = *x e informa del error:


# dtrace -s badptr.d
dtrace: script '/dev/stdin' matched 1 probe
CPU     ID                    FUNCTION:NAME
dtrace: error on enabled probe ID 1 (ID 1: dtrace:::BEGIN): invalid address
(0x0) in action #2 at DIF offset 4
dtrace: 1 error on CPU 0
^C
#

Otro problema que los programas que utilizan punteros no válidos pueden dar es un error de alineación. Por convención de arquitectura, los objetos de datos fundamentales, como enteros, se alinean en memoria según su tamaño. Por ejemplo, los enteros de 2 bytes se alinean en las direcciones que son múltiplos de 2, enteros de 4 bytes en múltiplos de 4, y así sucesivamente. Si deja de hacer referencia a un puntero a un entero de 4 bytes y la dirección del puntero es un valor no válido que no es múltiplo de 4, el acceso fallará con un error de alineación. Los errores de alineación en D casi siempre indican que el puntero tiene un valor no válido o corrupto debido a un defecto en el programa en D. Se puede crear un error de alineación de ejemplo cambiando el código fuente de badptr.d para utilizar la dirección (int *)2 en vez de NULL. Ya que int tiene 4 bytes y 2 no es múltiplo de 4, la expresión *x dará lugar a un error de alineación de DTrace.

Para obtener más detalles sobre el mecanismo de error de DTrace, consulte Sondeo ERROR.