История изменений
Исправление 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.