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.

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