Информация об изменениях

Сообщение Re[2]: каждый раз, когда вы пишете i++ + ++i... от 18.06.2014 20:41

Изменено 30.06.2019 6:11 netch80

Re[2]: каждый раз, когда вы пишете i++ + ++i...
Здравствуйте, watchmaker, Вы писали:

К>> где здесь чёрный ящик.

W>i*1000000000 — переполнение int — UB.

Непонятно, почему это UB вообще ломает всё, а не только одно вычисленное выражение.
Вот за такие шутки авторов gcc бить по наглым рыжим мордам.
Ну или требовать -fwrapv в обязательные опции по умолчанию.
Re[2]: каждый раз, когда вы пишете i++ + ++i...
Здравствуйте, watchmaker, Вы писали:

К>> где здесь чёрный ящик.

W>i*1000000000 — переполнение int — UB.

Непонятно, почему это UB вообще ломает всё, а не только одно вычисленное выражение.
Вот за такие шутки авторов таких компиляторов бить по наглым рыжим мордам.
Ну или требовать -fwrapv в обязательные опции по умолчанию.

UPDATE[2019-06-30]: сейчас так не думаю. Считаю, что обязательно ввести в язык (оба, раз речь про C/C++):
— уровень 1: операции типа {add,sub,mul,bsl}_overflow с выставлением флага по факту переполнения; такое же для конверсии со сжатием размера; это уже даст переносимую возможность эффективно проверять такое вручную;
— уровень 2: шаблонные функции типа checked_add_with_flag, truncating_mul;
— уровень 3: синтаксические контексты для выбора характера операции, задаваемые атрибутами выражения или блока, а до конца блока, функции или входного файла — прагмами.

Обоснование: оптимизации на основании возможности компилятору предполагать, что переполнение не планировалось, таки нужны, но в очень малой доле (грубо говоря, 5%) от всего кода, а для остального (то есть по умолчанию) должны быть максимально сильные меры по отлову и немедленной генерации ошибки (исключения).