¿Es UB desechar const y leer valor? [duplicar]

Esta pregunta ya tiene una respuesta aquí:

¿Eliminar const de un puntero a const obedece a un alias estricto en C y se refiere al mismo objeto? 1 respuesta

Aclaración: Mi pregunta es:

¿Es UB usar un valor de tipo l?int para acceder a un objeto de tipo efectivoconst int ?

Esta pregunta tiene dos ejemplos de código que usan un valor de tipo lint para acceder a un objeto de tipo efectivoconst int, y mi intención es lograr esto con la menor distracción posible. Si hay alguna otra fuente de UB además de este problema específico, deje un comentario e intentaré actualizar el ejemplo de código.

Aquí hay un ejemplo de código específico para discusión:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    const int c = 5;

    printf("%d\n", *(int *)&c);
}

La razón por la que creo que podría ser UB es que la estricta regla de alias parece decir que es UB:

C11 6.5 / 7

Un objeto tendrá acceso a su valor almacenado solo mediante una expresión lvalue que tenga uno de los siguientes tipos:

un tipo compatible con el tipo efectivo del objeto,una versión calificada de un tipo compatible con el tipo efectivo del objeto,...

lostipo efectivo del objeto (6.5 / 6) aquí estáconst int.

Primera viñeta:int yconst int no sontipos compatibles (6.2.7 / 1, 6.7.3 / 10).

Segunda viñeta:int no parece ser una versión calificada deconst int, porque no lo produjimos agregando calificadores. Sin embargo, 6.2.5 / 26 no está claro:

Cada tipo no calificado tiene varias versiones calificadas de su tipo, que corresponden a las combinaciones de uno, dos o los tres calificadores constantes, volátiles y restringidos. Las versiones calificadas o no calificadas de un tipo son tipos distintos que pertenecen a la misma categoría de tipo y tienen los mismos requisitos de representación y alineación. Un tipo derivado no está calificado por los calificadores (si los hay) del tipo del que se deriva.

No define qué es una "versión calificada deconst int"sería, solo define el término" versión calificada "cuando se aplica a un tipo no calificado.

Segunda muestra de código:

int *pc = malloc(sizeof *pc);
memcpy(pc, &c, sizeof c);
printf("%d\n", *pc);   // UB?

Ya quememcpy conserva el tipo efectivo (6.5 / 6), leyendo*pc tiene exactamente la misma interacción con la estricta regla de alias que leer*(int *)&c lo hace en el primer ejemplo.

Respuestas a la pregunta(1)

Su respuesta a la pregunta