История изменений
Исправление vbr, (текущая версия) :
вроде это UB
Во-первых есть флаг -fwrapv, с которым это не UB. Если автор компилирует свой код с этим флагом, то проблем не будет.
Во-вторых на UB наткнуться не так уж просто. Код, как в примере выше, gcc откомпилирует без сюрпризов.
Вот код вида
int f(int x) {
return x < x + 1 ? 1 : 2;
}
Компилятор скомпилирует просто в return 1
В-третьих я вообще в приведённом коде не вижу переполнений, но может быть я просто туплю.
If the left operand of a right-shift operator has a signed type and a negative value, the result is implementation-defined
Т.е. это не UB, а implementation-defined.
В gcc написано:
For a signed data type, GNU C performs “arithmetic shift,” which keeps the number’s sign unchanged by duplicating the sign bit.
Так что код не слишком хороший, и завязан на конкретный компилятор. Переписать его стоит. Но огромной проблемы в этом коде нет.
Исправление vbr, :
вроде это UB
Во-первых есть флаг -fwrapv, с которым это не UB. Если автор компилирует свой код с этим флагом, то проблем не будет.
Во-вторых на UB наткнуться не так уж просто. Код, как в примере выше, gcc откомпилирует без сюрпризов.
Вот код вида
int f(int x) {
return x < x + 1 ? 1 : 2;
}
Компилятор скомпилирует просто в return 1
В-третьих я вообще в приведённом коде не вижу переполнений, но может быть я просто туплю.
If the left operand of a right-shift operator has a signed type and a negative value, the result is implementation-defined
Т.е. это не UB, а implementation-defined.
В gcc написано:
For a signed data type, GNU C performs “arithmetic shift,” which keeps the number’s sign unchanged by duplicating the sign bit.
Исправление vbr, :
вроде это UB
Во-первых есть флаг -fwrapv, с которым это не UB. Если автор компилирует свой код с этим флагом, то проблем не будет.
Во-вторых на UB наткнуться не так уж просто. Код, как в примере выше, gcc откомпилирует без сюрпризов.
Вот код вида
int f(int x) {
return x < x + 1 ? 1 : 2;
}
Компилятор скомпилирует просто в return 1
В-третьих я вообще в приведённом коде не вижу переполнений, но может быть я просто туплю.
Исходная версия vbr, :
вроде это UB
Во-первых есть флаг -fwrapv, с которым это не UB. Если автор компилирует свой код с этим флагом, то проблем не будет.
Во-вторых на UB наткнуться не так уж просто. Код, как в примере выше, gcc откомпилирует без сюрпризов.
Вот код вида
int f(int x) {
return x < x + 1 ? 1 : 2;
}
Компилятор скомпилирует просто в return 1