LINUX.ORG.RU

История изменений

Исправление hateyoufeel, (текущая версия) :

И UB с знаковым переполнением тоже не из-за этого. Они как раз из-за того, что компилятор делает специальный лишний код. Разумеется, он делает его не для того чтобы испортить твою прогу, а для того чтобы попытаться её оптимизировать, а порча получается побочным эффектом.

Объясни мне пожалуйста, почему оптимизация знакового переполнения добавляет бесконечный цикл вот сюда:

#include <iostream>

int main() {
    char buf[50] = "y";
    for (int j = 0; j < 9; ++j) {
        std::cout << (j * 0x20000001) << std::endl;
        if (buf[0] == 'x') break;
    }
}

Собирать gcc с -O3. Проверено на GCC 11 и 14. Если что, пример синтетический, но вытащен из реального кода, где такое вот выстрелило.

Исходная версия hateyoufeel, :

И UB с знаковым переполнением тоже не из-за этого. Они как раз из-за того, что компилятор делает специальный лишний код. Разумеется, он делает его не для того чтобы испортить твою прогу, а для того чтобы попытаться её оптимизировать, а порча получается побочным эффектом.

Объясни мне пожалуйста, почему оптимизация знакового переполнения добавляет бесконечный цикл вот сюда:

#include <iostream>

int main() {
    char buf[50] = "y";
    for (int j = 0; j < 9; ++j) {
        std::cout << (j * 0x20000001) << std::endl;
        if (buf[0] == 'x') break;
    }
}

Собирать gcc с -O3. Проверено на GCC 11 и 14.