2010-01-06 10 views
6

Suponiendo que tengo una estructura como la siguiente:¿Puede el relleno de struct ser utilizado con seguridad por el código de usuario?

struct Struct { 
    char Char; 
    int Int; 
}; 

y sizeof(int) es mayor que uno y el compilador añade relleno para la variable Char miembro - es el código generado por el compilador permite cambiar los valores de los bytes de relleno ?

quiero decir si uso la aritmética de punteros y escribir algunos datos en los bytes de relleno que rodean la variable Char miembro y posteriormente hacer variable.Char = asignación es posible que el código generado por el compilador también se sobreponen a algunos de los bytes de relleno?

+1

@nobugz, creo que es una pregunta válida. Imagen que tiene memset una estructura en 0 antes de establecer los valores, que puede usar memcmp más tarde para comparar dos estructuras, pero solo si el compilador no toca los bytes de relleno. – quinmars

+0

No te metas con el relleno, 'memset' o' memcpy' con clases y estructuras. El enfoque ** más seguro ** y ** más robusto ** es implementar métodos para leer y escribir en un búfer empaquetado (por ejemplo, 'unsigned char []'). El seguro vale el espacio y el tiempo extra ejecutable. –

+0

@Thomas Matthews, creo que me malentendió. Estaba hablando de comparar dos estructuras, consulte http://stackoverflow.com/questions/141720/how-do-you-compare-structs-for-equality-in-c/141791#141791 – quinmars

Respuesta

10

La siguiente oración es incorrecta: No, no sobrescribiría los bytes de relleno. Pero probablemente no sea una buena práctica usar eso. Si lo necesita, agregue variables miembro allí.

he investigado basándose en las observaciones que indican (correctamente) que soy estúpida:

El C estándar tiene un "Anexo J" con la sección J.1 comportamiento no especificado. Dice: "El valor de rellenar bytes al almacenar valores en estructuras o uniones". La implicación es que el compilador puede generar las instrucciones que desee para escribir los datos en la estructura, lo que puede permitirle sobrescribir el relleno después de un miembro.

+0

No hay nada que impida que el compilador sobrescriba el relleno. –

+0

sí, ¿por qué no? – jalf

+0

Mea culpa.Estás en lo correcto. No hay nada que lo impida. El anexo J del estándar C enumera "el valor de los bytes de relleno en las estructuras" como no especificado. –

4

Seguro que puede escribir algo allí, y memset -solo una instancia de dicha estructura hace eso. Sin embargo, es no seguro y nunca es una buena idea hacerlo. Algún otro día, otro desarrollador pone un #pragma en algún lugar o agrega un miembro a la declaración de estructura y su código explotará de muchas maneras extrañas y sofisticadas, lo que podría llevar bastante tiempo en depurar.

13

¿Qué pasa si el compilador fuera lo suficientemente inteligente como para usar una palabra escrita para guardar el carácter? Sus datos cuidadosamente guardados se perderán. ;-)

+0

bien, creo que esa es la pregunta. ¿El compilador puede hacer eso o no? – quinmars

+0

Al compilador aparentemente se le permite hacer eso. Actualicé mi respuesta incorrecta para indicar tanto y voté por encima de esta. –

+0

@MarkW, oh, es bueno saberlo. ¡Gracias! – quinmars

1

La única razón para hacer esto sería algo así como un plugin maliciosamente engañando a una aplicación host para almacenar datos adicionales.

No lo hagas, porque en algún punto en el futuro se romperá, y será un fuerte dolor de cabeza para todos los interesados.

Cuestiones relacionadas