Suponha que eu tenha o seguinte código
#include <complex.h>
#include <stdio.h>
int main()
{
double _Complex a = 1.0;
void * b = &a;
double * c = b;
c[0] = 3;
c[1] = 2;
printf("%f %f\n",creal(a), cimag(a));
return 0;
}
O padrão C exige que isso a
seja alterado neste caso (os compiladores podem assumir a
que não foi alterado neste caso)? Vejo que a maioria dos compiladores está bem, mas não tenho certeza se isso é permitido pelo padrão.
Embora
c[0] = 3;
ec[1] = 2;
nominalmente violem as regras estritas de aliasing em C 2024 6.5.1 porque acessam odouble _Complex
objetoa
com um lvalue do tipodouble
, 6.2.5 afirma:Essa frase sobre a “mesma representação” é usada várias vezes no padrão com a intenção, de acordo com as notas, de tornar os dois tipos intercambiáveis de alguma forma vaga que o padrão não define. Essas informações conflitantes entre aliasing e intercambialidade são um defeito de longa data no padrão C, e pode-se interpretar a intercambialidade como anulando ou vindo antes das regras de aliasing.
No entanto, é mais seguro considerar o requisito de “mesma representação” como significando que você pode confiar no layout de memória do
double _Complex
tipo para ter o mesmo layout de doisdouble
objetos que podem ser aliasados por meio do tipo de caractere:ou usando uma união:
Você invoca comportamento indefinido (UB), o que significa que o comportamento do programa não pode ser previsto da perspectiva do padrão C.
O comportamento indefinido ocorre quando o padrão C não define o que deve acontecer em uma situação específica. O padrão não proíbe tal comportamento; ele apenas declara que o comportamento observável do programa não é especificado e pode variar dependendo do compilador, plataforma ou condições de tempo de execução.
Por que é UB: O padrão C especifica que um objeto double _Complex é representado como dois valores double adjacentes na memória:
Embora esse layout de memória permita a manipulação direta das partes reais e imaginárias usando ponteiros (como
c[0]
ec[1]
), ele ainda viola a regra estrita de aliasing.