Skip to content

UB and the possibility of runtime bugs in SwappingSmart #1223

@ddvamp

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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions