Mais uma vez: regra estrita de alias e char *

Quanto mais leio, mais confuso fico.

A última pergunta das relacionadas é a mais próxima da minha, mas fiquei confuso com todas as palavras sobre a vida útil do objeto e principalmente - é bom ler apenas ou não.

Para ir direto ao ponto. Corrija-me se eu estiver errado.

Tudo bem, o gcc não dá aviso e estou tentando "ler o tipoT (uint32_t) através dachar*":

uint32_t num = 0x01020304;
char* buff = reinterpret_cast< char* >( &num );

Mas isso é "ruim" (também dá um aviso) e estou tentando "o contrário":

char buff[ 4 ] = { 0x1, 0x2, 0x3, 0x4 };
uint32_t num = *reinterpret_cast< uint32_t* >( buff );

Qual é a diferença entre o segundo e o primeiro, especialmente quando estamos falando de instruções para reordenar (para otimização)? Além disso, adicionandoconst não muda a situação de forma alguma.

Ou esta é apenas uma regra direta, que afirma claramente: "isso pode ser feito em uma direção, mas não na outra"? Não encontrei nada relevante nos padrões (procurei isso especialmente no padrão C ++ 11).

É o mesmo para C e C ++ (enquanto eu li um comentário, o que implica que é diferente para os 2 idiomas)?

eu useiunion para "contornar" isso, que ainda parece estarNÃO 100% OK, pois não é garantido pelo padrão (que afirma que só posso confiar no valor, que foi modificado pela última vez nounion)

Então, depois de lermuito, Agora estou mais confuso. Eu acho que apenasmemcpy é a solução "boa"?

Perguntas relacionadas:

Qual é a regra estrita de alias?aviso de "cancelamento de referência de ponteiro puncionado por tipo quebrará regras de alias estrito"Entendo o alias estrito de C / C ++ corretamente?Regra estrita de alias e ponteiros 'char *'

EDITAR
A situação do mundo real: eu tenho uma lib de terceiros (http://www.fastcrypto.org/), que calcula UMAC e o valor retornado está emchar[ 4 ]. Então eu preciso converter isso emuint32_t. E, a lib usa coisas como((UINT32 *)pc->nonce)[0] = ((UINT32 *)nonce)[0] muito. De qualquer forma.

Além disso, estou perguntando sobre o que é certo e o que está errado e por quê. Não apenas sobre reordenação, otimização etc. (o interessante é que, com-O0 não há avisos, apenas com-O2)

E por favor note: Estou ciente da situação endian grande / pequena. Não é o caso aqui. Eu realmente quero ignorar o endianness aqui. As "regras estritas de aliasing" parecem algo realmente sério, muito mais sério que endianness errado. Quero dizer - como acessar / modificar a memória, que não deve ser tocada;qualquer tipo de UB em tudo.

Citações das normas (C e C ++) seria realmente apreciado. Não consegui encontrar nada sobre regras de alias ou qualquer coisa relevante.

questionAnswers(2)

yourAnswerToTheQuestion