Вопрос:

Как boost :: asio :: buffer_cast нарушает безопасность типов?

c++

117 просмотра

1 ответ

11 Репутация автора

Комментарии разбросаны по всему boost :: asio, которые говорят это:

Функция boost :: asio :: buffer_cast допускает нарушения безопасности типов, поэтому следует тщательно их использовать в коде приложения.

Однако в конечном итоге интерфейс буфера сводится к следующему:

struct buffer {
  void *data;

  friend void* cast_helper(const buffer& b);
};

void* cast_helper(const buffer& b) {
  return b.data;
}

template <typename to_t>
to_t buffer_cast(const buffer& b) {
  return static_cast<to_t>(cast_helper(b));
}

static_castvoid*Тип указателя a to четко определен и считается подходящим для void*данных (см. «Должен ли я использовать static_cast или reinterpret_cast при приведении void * к чему-либо»). Так что это значит, нарушая безопасность типов?

Автор: user7855226 Источник Размещён: 12.04.2017 08:20

Ответы (1)


3 плюса

25023 Репутация автора

Рассмотрим следующий код:

    char i = 2;
    buffer b;
    b.data = &i;
    double *pd = buffer_cast<double*>(b);

    *pd = 1.0;

Это скомпилируется правильно, но, очевидно, вызывает неопределенное поведение. Это ничем не отличается от:

    char i = 2;
    void *pv = &i;
    double *pd = static_cast<double*>(pv);
    *pd = 1.0;

И в случае, static_castи buffer_castрецензент должен внимательно посмотреть код, чтобы убедиться, что приведение законно.

Использование static_castдля преобразования a void*в тип указателя хорошо определено, только если void * был первоначально получен из указателя этого типа или чего-то подобного (где «Similar» включает в себя некоторые, но не все, базовые / производные отношения и беззнаковый символ против простого char против подписанного char и т. д.).

Автор: Martin Bonner Размещён: 12.04.2017 08:39
Вопросы из категории :
32x32