Здравствуйте, watchmaker, Вы писали:
N>>Непонятно, почему это UB вообще ломает всё, а не только одно вычисленное выражение.
W>Так это же суть UB. Или ты не видел тот пример с форматированием диска и clang?
Не видел. Спасибо, забавно. Но это не оправдывает всех замешанных.
Начиная с того, что в данном случае "undefined" или "implementation defined" должно было свестись к тому, что результат выполнения конкретного оператора является значением определённого параметрами и оператором типа, но с неизвестным значением. А не просто "UB".
N>>Вот за такие шутки авторов gcc бить по наглым рыжим мордам.
W>Какой-то невероятно нелогичный выбор кого бить
W>Это же комитет сделал в этом месте UB.
Да. Но комитет это заведомо сборище старых маразматиков, управляемых своими заказчиками. А вот заказчики должны были подумать (как минимум!) о том, чтобы само понятие UB здесь ограничить только эффектами, компилируемыми в рамках текущего контекста. А не пытаться получить себе кусок воли по принципу "ну мы же всё равно действуем в рамках
законодательства РФ стандарта C".
N>>Ну или требовать -fwrapv в обязательные опции по умолчанию.
W>Ну это же легко исправляется. Собственно, всё равно же в makefile всё вот это нужно писать.
W>Уж лучше требуй чтобы -Wall включили, или чтобы -std= со стандартным языком включили по умолчанию (а не с той дикой смесью из нескольких стандартов и расширений, что активна по-умолчанию сейчас) — вот где боль.
Про -Wall в принципе согласен. Про std — нет. По крайней мере в Posix системах для стандартных случаев есть врапперы типа c89, c99. Кто не рассчитывает на абсолютные знания gcc, а хочет поближе к стандарту — должен использовать их.