Pregunta

Para el desarrollo C ++ para sistemas de 32 bits (ya sea Linux, Mac OS o Ventanas, PowerPC o x86) He inicializado punteros que de otro modo sería sin definir (por ejemplo que no pueden inmediatamente obtener un valor adecuado) de esta manera:

int *pInt = reinterpret_cast<int *>(0xDEADBEEF);

(Para guardar a escribir y siendo SECO el lado derecho normalmente estar en una constante, por ejemplo, BAD_PTR.)

Si Pint se eliminan las referencias antes de que llegue un valor adecuado a continuación, se bloqueará inmediatamente en la mayoría de los sistemas (en lugar de estrellarse mucho más tarde cuando se sobrescribe parte de la memoria o de ir en un bucle muy largo).

Por supuesto, el comportamiento depende del subyacente hardware (conseguir un entero de 4 bytes de la extraña abordar 0xLOQUESEA de un proceso de usuario puede ser perfectamente válida), pero el estruendo ha sido del 100% fiable para toda la Los sistemas que se han desarrollado hasta el momento para (Mac OS 68xxx , Mac OS PowerPC, Linux Redhat Pentium, Pentium interfaz gráfica de usuario de Windows, Windows consola Pentium). Por ejemplo en PowerPC es ilegal (autobús Fallo) a buscar un entero de 4 bytes a partir de una dirección impar.

¿Qué es un buen valor para esto en sistemas de 64 bits?

¿Fue útil?

Solución

En general no importa exactamente qué patrón se escribe, lo importante es que se puede identificar el patrón con el fin de determinar dónde se están produciendo problemas. Lo que pasa es que en el kernel de Linux Estos son a menudo elige de manera que puedan ser atrapados si se eliminan las referencias las direcciones.

Tenga una mirada en el núcleo de Linux en include / linux / poison.h . Este archivo contiene diferentes valores de veneno para muchos diferentes subsistemas del kernel. No hay un valor de un veneno que es apropiado.

Además, es posible comprobar por la arquitectura incluyen archivos en el árbol de fuentes del núcleo Linux para obtener información sobre lo que se utiliza en arquitecturas específicas.

Otros consejos

0xBADC0FFEE0DDF00D

Según Wikipedia , BADC0FFEE0DDF00D se utiliza en IBM RS / 6000 sistemas de 64 bits para indicar registros de la CPU sin inicializar.

La mayoría de los sistemas actuales de 64 bits permiten utilizar sólo el más bajo 2 48 -2 52 bits del espacio de direcciones; los bits superiores de la dirección debe ser todo ceros. Algunos chips (por ejemplo amd64) también permiten utilizar el mayor 2 48 -2 52 . Direcciones fuera de estos rangos no pueden nunca ser mapeados a memoria accesible; el hardware simplemente no lo permite.

Por lo tanto, le recomiendo que utilice un valor cercano a 2 63 , que está muy lejos de cualquiera de los espacios posiblemente utilizables. Si los primeros cuatro dígitos hexadecimales son 7ff8, el valor será un doble precisión en coma flotante NaN, que es conveniente. Así que mi sugerido frase linda hexadecimal es 0x7FF8BADFBADFBADF.

Por cierto, que realmente no quieren usar un valor cercano a 0, porque eso hace que sea difícil saber un el desplazamiento eliminar la referencia de NULL - un miembro de estructura de acceso, por ejemplo - a partir de un dereference del patrón de veneno.

Estoy asumiendo que ya has descuentos NULL (es decir, sin el encasillado 0). Es sin duda la opción más segura, ya que, en teoría, un puntero válido podría punto a la dirección de memoria 0xLOQUESEA (o cualquier otra dirección de memoria que no sea NULL).

0xDEADBEEFBAADF00D podría funcionar.

No tengo una buena opción para usted, pero aquí es una lista rel="noreferrer"> que se puede utilizar para hacer su frase.

Dos 0xDEADBEEFs debería ser suficiente, creo ..

Veo varias respuestas afirmando NULL es una buena opción, pero no estoy de acuerdo.

NULL se utiliza a menudo como un valor válido de retorno de las funciones. Se indica un retorno fracaso o un valor desconocido. Se trata de un significado diferente de "puntero no inicializado."

El uso de un depurador en el código y ver NULL dejaría entonces dos posibilidades: el puntero no se ha inicializado o no había logrado una asignación de memoria

.

Configuración de la puntero no inicializado a 0xLOQUESEA o la 64 bits equivalente significa que un puntero NULL indica un valor intencional.

Depende del sistema operativo y el medio ambiente, por supuesto. No creo 0xLOQUESEA es necesariamente una mala puntero en un sistema de 32 bits arbitrario, tampoco.

Siendo realistas, cualquier sistema operativo moderno debe ser el acceso protectores de las primeras páginas de la memoria del proceso, por lo NULL debe ser un buen valor de puntero válido. Convenientemente suficiente, ya está pre-definido para usted.

0x42 podría trabajar en ambos 32 y 64 bits? (Todavía debe desencadenar un accidente, ya que es lo suficientemente cerca del puntero NULL, y dado que es bastante grande, lo más probable es que no tendría que dentro de un desreferenciar regular de un campo de estructura con el puntero estructura de ser NULL).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top