Skip to content

UB and the possibility of runtime bugs in SwappingSmart #1223

Description

@ddvamp

std::shared_ptr<T> Get() const {
const short index = current_.load(std::memory_order_relaxed);
return ptrs_[index];
}

Формально, чтение ptrs_ не синхронизировано с записью в терминах memory model, поэтому имеем UB.

При исполнении возможны различные гонки между чтением и записью.

Как гонка возникает:

  • чтение current_ не гарантирует видимость последнего в mo значения, так что можно вычитать старый индекс, обозначающий текущий слот записи.
  • после считывания актуального индекса копирование может быть отложено (например, вытеснением), до момента записи в слот.

Копирование std::shared_ptr<> может быть реализовано следующим образом:

  1. Скопировать указатель на объект.
  2. Скопировать указатель на блок.
  3. Если блок есть, увеличить счётчик.

Варианты гонок:

  • копирование старого указателя на объект и нового указателя на блок, или наоборот.
  • обращение к удалённому блоку.
  • e.t.c.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions