Um objeto pode ter mais de um tipo eficaz?

Considere o seguinte código em uma plataforma em que a ABI não insere preenchimento em uniões:

union { int xi; } x;
x.xi = 1;

Eu acredito que a segunda linha exibe um comportamento indefinido, pois viola a regra estrita de alias:

O objeto referido porx.xi é o mesmo objeto que o objeto referido porx. Ambos são da mesma região de armazenamento e o termoobjeto é definido na ISO 9899: 2011 §3.15 como:

objeto

1 região de armazenamento de dados no ambiente de execução, cujo conteúdo pode representar valores

2 NOTA Quando referenciado, um objeto pode ser interpretado como tendo um tipo específico; ver 6.3.2.1.

Como um objeto não é mais que uma região de armazenamento, concluo que, comox ex.xi ocupam o mesmo armazenamento, eles são o mesmo objeto.

otipo eficaz dox éunion { int xi; } como esse é o tipo com o qual foi declarado. Veja §6.5 ¶6:

6 Oeficaz O tipo de um objeto para um acesso ao seu valor armazenado é o tipo declarado do objeto, se houver.(87) Se um valor for armazenado em um objeto sem tipo declarado por meio de um lvalue com um tipo que não seja um tipo de caractere, o tipo do lvalue se tornará o tipo efetivo do objeto para esse acesso e para acessos subseqüentes que não modificam o valor armazenado. Se um valor for copiado em um objeto sem tipo declarado usandomemcpy oumemmove, ou é copiado como uma matriz do tipo de caractere, o tipo efetivo do objeto modificado para esse acesso e para acessos subseqüentes que não modificam o valor é o tipo efetivo do objeto do qual o valor é copiado, se houver um. . Para todos os outros acessos a um objeto sem tipo declarado, o tipo efetivo do objeto é simplesmente o tipo de lvalue usado para o acesso.

87) Objetos alocados não têm tipo declarado.

Pela redação de ¶6, também está claro que cada objeto pode ter apenas um tipo efetivo.

Na declaraçãox.xi Eu acessox através do valorx.xi digitadoint. Este não é um dos tipos listados em §6.5 §7:

7 Um objeto deve ter seu valor armazenado acessado apenas por uma expressão lvalue que possui um dos seguintes tipos:88)

um tipo compatível com o tipo efetivo do objeto,uma versão qualificada de um tipo compatível com o tipo efetivo do objeto,um tipo que é o tipo assinado ou não assinado correspondente ao tipo efetivo do objeto,um tipo que é o tipo assinado ou não assinado correspondente a uma versão qualificada do tipo efetivo do objeto,um tipo agregado ou de união que inclua um dos tipos mencionados acima entre seus membros (incluindo, recursivamente, um membro de uma união subagregada ou contida), ouum tipo de caractere.

88) O objetivo desta lista é especificar as circunstâncias em que um objeto pode ou não ser aliasado.

Portanto, a segunda linha exibe um comportamento indefinido.

Como essa interpretação está claramente errada, onde está minha interpretação errada do padrão?

questionAnswers(2)

yourAnswerToTheQuestion