Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

182
Vistas
¿Cuál es la semántica de los objetos superpuestos en C?

Considere la siguiente estructura:

 struct s { int a, b; };

Normalmente 1 , esta estructura tendrá un tamaño de 8 y una alineación de 4.

¿Qué pasa si creamos dos objetos struct s (más precisamente, escribimos en el almacenamiento asignado dos de esos objetos), con el segundo objeto superpuesto al primero?

 char *storage = malloc(3 * sizeof(struct s)); struct s *o1 = (struct s *)storage; // offset 0 struct s *o2 = (struct s *)(storage + alignof(struct s)); // offset 4 // now, o2 points half way into o1 *o1 = (struct s){1, 2}; *o2 = (struct s){3, 4}; printf("o2.a=%d\n", o2->a); printf("o2.b=%d\n", o2->b); printf("o1.a=%d\n", o1->a); printf("o1.b=%d\n", o1->b);

¿Hay algo sobre el comportamiento indefinido de este programa? Si es así, ¿dónde se vuelve indefinido? Si no es UB, se garantiza imprimir siempre lo siguiente:

 o2.a=3 o2.b=4 o1.a=1 o1.b=3

En particular, quiero saber qué sucede con el objeto al que apunta o1 cuando se escribe o2 , que lo superpone. ¿Todavía está permitido acceder a la parte no golpeada ( o1->a )? ¿Acceder a la parte o1->b es simplemente lo mismo que acceder a o2->a ?

¿Cómo se aplica el tipo efectivo aquí? Las reglas son lo suficientemente claras cuando habla de objetos que no se superponen y punteros que apuntan a la misma ubicación que la última tienda, pero cuando comienza a hablar sobre el tipo efectivo de porciones de objetos u objetos superpuestos, es menos claro.

¿Cambiaría algo si la segunda escritura fuera de un tipo diferente? ¿Si los miembros fueran int y short en lugar de dos int s?

Aquí hay un rayo divino si quieres jugar con él allí.


1 Esta respuesta se aplica a las plataformas donde este no es el caso también: por ejemplo, algunas pueden tener tamaño 4 y alineación 2. En una plataforma donde el tamaño y la alineación fueran los mismos, esta pregunta no se aplicaría ya que los objetos alineados y superpuestos Sería imposible, pero no estoy seguro de si existe alguna plataforma así.

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Básicamente, todo esto es un área gris en el estándar; la regla estricta de creación de alias especifica los casos básicos y deja que el lector (y los proveedores de compiladores) completen los detalles.

Ha habido esfuerzos para escribir una regla mejor, pero hasta ahora no han dado como resultado ningún texto normativo y no estoy seguro de cuál es el estado de esto para C2x.

Como mencioné en mi respuesta a su pregunta anterior, la interpretación más común es que p->q significa (*p).q y el tipo efectivo se aplica a todo *p , aunque luego aplicamos .q .

Bajo esta interpretación, printf("o1.a=%d\n", o1->a); causaría un comportamiento indefinido ya que el tipo efectivo de la ubicación *o1 no es s (ya que parte de ella se ha sobrescrito).

El fundamento de esta interpretación se puede ver en una función como:

 void f(s* s1, s* s2) { s2->a = 5; s1->b = 6; printf("%d\n", s2->a); }

Con esta interpretación, la última línea podría optimizarse a puts("5"); , pero sin ella, el compilador tendría que considerar que la llamada a la función pudo haber sido f(o1, o2); y, por lo tanto, perder todos los beneficios que supuestamente proporciona la regla estricta de aliasing.

Un argumento similar se aplica a dos tipos de estructuras no relacionadas que tienen un miembro int en un desplazamiento diferente.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda