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

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