При -O2 указатель на float превратился в тыкву: как type punning ломает код

Type Punning in C and C++

Автор рассказывает, как отладка бага с type punning заняла много времени: приведение указателя работало при -O0, но молча ломалось при -O2. В C безопасны union и memcpy, а приведение указателей — UB из-за strict aliasing. В C++ компилятор ещё агрессивнее оптимизирует, предполагая, что разные типы не пересекаются. Пример с uint64_t* и struct c при -O2 возвращает 2 вместо 0. Практическое правило: используйте union или memcpy.

При -O2 цикл был оптимизирован с учётом предположений strict aliasing, и значения, которые я записывал, никогда не появлялись там, где я ожидал.

Ещё за этот день

2026-09-22