Articles of estrito aliasing

Isso realmente quebra as regras de aliases restritas?

Quando eu compilo este código de exemplo usando g + +, recebo este aviso: aviso: o ponteiro com punção de tipo de referência cancelará regras estritas de aliasing [-Wstrict-aliasing] O código: #include int main() { alignas(int) char data[sizeof(int)]; int *myInt = new (data) int; *myInt = 34; std::cout << *reinterpret_cast(data); } Nesse caso, o alias […]

gcc, strict-aliasing e casting por meio de uma união

Você tem alguma história de terror para contar? O Manual do GCC adicionou recentemente um aviso sobre o aliasing -fstrict e a seleção de um ponteiro por meio de uma união: […] Tomando o endereço, lançando o ponteiro resultante e desreferenciando o resultado tem um comportamento indefinido [ênfase adicionada], mesmo que o casting use um […]

Regra de aliasing estrito e pointers ‘char *’

A resposta aceita para o que é a regra de aliasing estrita? menciona que você pode usar char * para alias outro tipo, mas não o contrário. Não faz sentido para mim – se temos dois pointers, um do tipo char * e outro do tipo struct something * apontando para o mesmo local, como […]

Aliasing T * com char * é permitido. Também é permitido o contrário?

Nota: Esta questão foi renomeada e reduzida para torná-la mais focada e legível. A maioria dos comentários se refere ao texto antigo. De acordo com o padrão, objects de tipos diferentes podem não compartilhar o mesmo local de memory. Então isso não seria legal: std::array shorts; int* i = reinterpret_cast(shorts.data()); // Not OK O padrão, […]

Qual é a maneira correta de digitar um float para um int e vice-versa?

O código abaixo executa uma operação de raiz quadrada inversa rápida por alguns hacks bit. O algoritmo foi provavelmente desenvolvido pela Silicon Graphics no início dos anos 90 e também apareceu no Quake 3. mais informações No entanto, recebo o seguinte aviso do compilador GCC C ++ : ponteiro de tipo puncionada dereferencing irá quebrar […]

Por que a otimização elimina essa function?

Recentemente, tivemos uma palestra na universidade sobre programação de especialidades em vários idiomas. O palestrante escreveu a seguinte function: inline u64 Swap_64(u64 x) { u64 tmp; (*(u32*)&tmp) = Swap_32(*(((u32*)&x)+1)); (*(((u32*)&tmp)+1)) = Swap_32(*(u32*) &x); return tmp; } Embora eu entenda totalmente que esse também é um estilo muito ruim em termos de legibilidade, seu ponto principal […]

Qual é a regra de aliasing estrita?

Ao perguntar sobre o comportamento indefinido comum em C , almas mais esclarecidas do que eu me referi à regra de aliasing estrito. Do que eles estão falando?