vak: (Default)
[personal profile] vak
Сложить два целых числа, вернуть целое. Породить исключение в случае арифметического переполнения.
int add(int a, int b);
Удивительно, сколько народу обламывается на этой задачке.

Date: 2020-08-03 08:08 (UTC)
waqur: (Default)
From: [personal profile] waqur
Как-то была история с LLVM, касающаяся бесконечных циклов с пустым телом. С точки зрения стандарта C++, такие циклы — это UB, так что llvm их просто выбрасывал. Когда разработчики Rust наткнулись на это — была та ещё драма. Вопрос решался пустой ассемблерной вставкой с volatile-аттрибутом, IIRC.

Date: 2020-08-03 15:50 (UTC)
archaicos: Шарж (Default)
From: [personal profile] archaicos
Опять же, не «UB, а значит можно выкинуть», а у кода пустого бесконечного цикла нет никаких т.н. side effects (доступа к volatile-переменным, модификации объекта или файла, вызова функции, которая может сделать одно или более из перечисленного, и т.д. – по стандарту), и значит, что цикл можно выкинуть.
В стандарт просто не внесли зависание как побочный эффект (вероятно, забыли, хотя зуб не даю, т.к. очевидно, бесконечные циклы в ходу издревле). Ну и вот, бесконечный цикл пал жертвой оптимизации в какой-то момент.