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

140
Vistas
¿Cuál es el tipo efectivo de un objeto escrito por memset?

Código 1:

 unsigned int *p = malloc(sizeof *p); memset(p, 0x55, sizeof *p); unsigned int u = *p;

Código 2:

 void *d = malloc(50); *(double *)d = 1.23; memset(d, 0x55, 50); unsigned int u = *(unsigned int *)d;

En cada caso, qué efecto tiene memset sobre el tipo efectivo del objeto en el espacio malloc'd; y entonces, ¿la u es correcta o es una violación estricta de alias?

La definición de tipo efectivo (C11 6.5/6) es:

El tipo efectivo de un objeto para acceder a su valor almacenado es el tipo declarado del objeto, si lo hay. Si un valor se almacena en un objeto que no tiene un tipo declarado a través de un lvalue que tiene un tipo que no es un tipo de carácter, entonces el tipo de lvalue se convierte en el tipo efectivo del objeto para ese acceso y para los accesos posteriores que no modifican el tipo. valor almacenado. Si un valor se copia en un objeto que no tiene un tipo declarado usando memcpy o memmove , o se copia como una matriz de tipo de carácter, entonces el tipo efectivo del objeto modificado para ese acceso y para los accesos posteriores que no modifican el valor es el tipo efectivo del objeto del que se copia el valor, si lo tiene. Para todos los demás accesos a un objeto que no tiene un tipo declarado, el tipo efectivo del objeto es simplemente el tipo del lvalue utilizado para el acceso.

Sin embargo, no está claro si memset se comporta como escribir a través de un lvalue de tipo de carácter, o algo más. La descripción de memset (7.24.6.1) no es muy esclarecedora:

La función memset copia el valor de c (convertido en un unsigned char ) en cada uno de los primeros n caracteres del objeto señalado por s.

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

0

Mi 50ct:

Primero, divido esto en oraciones para una referencia más fácil:

  1. El tipo efectivo de un objeto para acceder a su valor almacenado es el tipo declarado del objeto, si lo hay.
  2. Si un valor se almacena en un objeto que no tiene un tipo declarado a través de un lvalue que tiene un tipo que no es un tipo de carácter, entonces el tipo del lvalue se convierte en el tipo efectivo del objeto para ese acceso y para los accesos posteriores que no modifican el tipo. valor almacenado.
  3. Si un valor se copia en un objeto que no tiene un tipo declarado usando memcpy o memmove, o se copia como una matriz de tipo de carácter, entonces el tipo efectivo del objeto modificado para ese acceso y para los accesos posteriores que no modifican el valor es el tipo efectivo del objeto del que se copia el valor, si lo tiene.
  4. Para todos los demás accesos a un objeto que no tiene un tipo declarado, el tipo efectivo del objeto es simplemente el tipo del lvalue utilizado para el acceso.

La nota al pie podría ayudar aquí: "87) Los objetos asignados no tienen un tipo declarado". .

ADN: "no aplica"

Caso 1:

  • memset(...) : 1: DNA (sin tipo declarado), 2: DNA (memset escribe en char - semántica), 3: DNA (ni memcpy ni memmove), 4: char [] solo para memset internamente (no permanente ).
  • unsigned int u = *p : 1: ADN (sin tipo declarado), 2/3: ADN (sin escritura, pero leído), 4: tipo de lvalue es unsigned int .

Conclusión: no hay violación, pero la interpretación está definida por la implementación, ya que el valor real depende de la alineación dentro de la variable y la endianidad.

Caso 2:

  • *(double *)d = 1.23; : 2: d se convierte en double * para esta y las siguientes lecturas.
  • memset(d, 0x55, 50); : igual que para el Caso 1.
  • unsigned int u = *(unsigned int *)d : d sigue siendo double * : ¡bang!

De cualquier manera, memset() es de poco uso para char que no sean caracteres, excepto si se usa 0 , que aún depende de la implementación , ya que ni (float)0.0 ni el puntero nulo necesitan ser realmente "todos los bits cero".

Por fin:

  • La oración 2 no se aplica a memset , ya que internamente, memset() copia por char: "... de c (convertido a un char sin firmar) en cada uno de los primeros n caracteres ..." (o usa char semántica, al menos ; la implementación real es irrelevante aquí).
  • La oración 3 tampoco se aplica a memset() , ya que solo se aplica a memcpy / memmove o cuando se copia como "una matriz de tipo de carácter". Lo cual tampoco lo hace (pero el primero sí, por lo que la condición or simplemente hace un bucle de copia explícito equivalente a las funciones).
  • memset() no cambia el tipo efectivo del objeto. Eso difiere de memcpy y memmove . Eso resulta de la oración 4, que no incluye "... para ese acceso y para los accesos subsiguientes..." como dicen 2 y 3 y 1 implica.
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