Flatbuffers VectorIterator::operator - неопределенное поведениеC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Flatbuffers VectorIterator::operator - неопределенное поведение

Сообщение Anonymous »

Я копался в коде плоских буферов и мне кажется, что в основной библиотеке есть неопределенное поведение. Но я просто не могу поверить, что оно существует (и, похоже, в некоторых случаях оно работает)...
Я был бы очень признателен, если бы кто-нибудь подтвердил мой образ мышления/показывал мне это Что-то я пропустил :)
https://github.com/google/flatbuffers/b ... ctor.h#L80

Код: Выделить всё

  difference_type operator-(const VectorIterator &other) const {
return (data_ - other.data_) / element_stride;
}
Мое обоснование, почему я думаю, что это UB:
difference_type == std::ptrdiff_t, который основан на стандартном Signed ["something" > = 16b] (https://en.cppreference.com/w/cpp/types/ptrdiff_t)
Будем ожидать, что первая скобка окажется отрицательной (что должно быть допустимый вариант использования)
  • Теперь, когда я предполагаю, что ptrdiff_t равен size_t
    • применяются практически те же шаги, за исключением последнего:

      на основе стандарта (8/11.5.4), второй операнд деления преобразуется в знаковое число большего битового размера.
    • это приводит к тому, что возвращаемое значение становится (интуитивно понятным) отрицательным числом, которое указывает расстояние между два VectorIterator.
Итак, я вижу там 2 возможные результаты оператора-, оба соответствующие стандартным требованиям, основаны на реализации ptrdiff_t конкретным компилятором.
Спасибо!

Подробнее здесь: https://stackoverflow.com/questions/793 ... d-behavior
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»