Как правило, UB считается чем-то, чего следует избегать, и сам текущий стандарт C содержит довольно много примеров в приложении J.
Однако бывают случаи, когда я не вижу никакого вреда в использовании UB, кроме потери переносимости.
Рассмотрим следующее определение:
int a = INT_MAX + 1;
Вычисление этого выражения приводит к UB. Однако, если моя программа предназначена для работы, скажем, на 32-разрядном процессоре с модульной арифметикой, представляющей значения в дополнении до двух, я склонен полагать, что могу предсказать результат.
На мой взгляд, иногда UB — это просто способ стандарта C сказать мне: «Надеюсь, вы знаете, что делаете, потому что мы не можем дать никаких гарантий относительно того, что произойдет».
Отсюда мой вопрос: безопасно ли иногда полагаться на машинно-зависимое поведение, даже если стандарт C считает, что это вызывает UB, или «UB» действительно следует избегать, независимо от обстоятельств?
1
на1U
. Преобразование обратно в значение со знаком определяется реализацией и всегда (на современных машинах с дополнением до двух) будет тем, что вы хотите. Но зачем вообще писать такой неприятный код, когда есть чистые переносимые способы сделать это? - person R.. GitHub STOP HELPING ICE   schedule 24.05.2011a(b(),c())
, может произвольно выбирать между двумя вариантами поведения: выполнитьb()
полностью, а затемc()
, или выполнитьc()
целое число, а затемb()
. Компилятор мог бы, если бы он был склонен, делать новый выбор каждый раз при выполнении кода. Обратите внимание, что нет неопределенного поведения, но последовательность неопределена. - person supercat   schedule 12.01.2013int
мог принимать только значения до 8 675 309 и аварийно завершал работу при подаче большего значения, он мог сделать это при условии, что он задокументировал такое поведение и при условии, что его тип типаchar
не может обрабатывать значения большего размера. - person supercat   schedule 12.01.2013int
может содержать значение больше 32767, если только вы не проверите значениеINT_MAX
. Однако если проверить значениеINT_MAX
или просто гарантировать, чтоint
никогда не будет вызываться для хранения значения больше 32767, проблем не будет. Однако сценарии, включающие неопределенное поведение, не имеют никаких гарантий. - person supercat   schedule 12.01.2013