December 3rd, 2020

prog

Undefined behavior - 2

Кстати

void test_for_11 (int t) {
    for (int i = t; i < ++i; i++) {                              
 //       break;                    
    }
}

int main () {
   test_for_11 (10);
   return 0;
}


При компиляции clang с ключиком -O0 - зацикливается, а с ключиком -O3 прекрасно завершается. Так что оно и в реале undefined
prog

Undefined behavior - 3

Ну как правильно почти все заметили оно там в i < ++ i.

Не определен порядок вычисления аргументов сравнения о чем clang и рапортует.

Что более забавно - что как я уже сказал - оно (если break убрать) с ключом -O0 зацикливается, а с ключом -O3 - нет.

Причина в целом понятна - есть старая-старая эвристика - при вычислении аргументов начинать с самого сложного выражения - просто потому что "в среднем" такая последовательность требует меньшего расхода регистров.

Что видимо clang и делает с -O0, ну а с -O3 он там какой-то продвинутый оптимизационный интелект подпускает.
fatherland

Удачная формулировка: