LINUX.ORG.RU

История изменений

Исправление 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