• Strict aliasing - когда/где и у кого шалит оптимизатор?

    @Marvel_K Автор вопроса
    Исходя из доклада протестировал такой пример (clang 5.0.1, MSVC 2015, GCC 6), билды 32 и 64:

    float invert(float f)
    {
        unsigned int *i = (unsigned int *)&f;
    
        *i ^= 1 << 31;
    
        return *(float *)i;
    }
    
    ...
    
    printf("%.2f\n", invert_sign(-3.14f));


    никаких UB не обнаружил - взаимодействия с FPU правильные при разных уровнях оптимизации, а также конкретно в GCC с опцией -strict-aliasing, т.е. новые версии компиляторов багом (конкретно на этом примере (?) ) из серии strict aliasing - не грешат.
    Ответ написан
    Комментировать