Un cast de puntero funcionaba en -O0 y se rompía en silencio en -O2
Type Punning in C and C++
El type punning es esencial para serialización y acceso a hardware, pero los casts de puntero son comportamiento indefinido por las reglas de strict aliasing. En C, las formas seguras son union y memcpy; en C++, el compilador asume que tipos distintos nunca se solapan, como muestra un ejemplo que devuelve 2 con GCC o Clang en -O2 y 0 en -O1.
El bug con el que empecé? Un cast de puntero de float* a uint32_t* en un bucle crítico. En -O2, el bucle se optimizó bajo las suposiciones de strict aliasing, y los valores que escribía nunca aparecían donde esperaba. Un union lo arregló en diez minutos.