Вопросы

Сопрограммы C ++: допустимо ли вызывать handle.destroy из последней точки приостановки?

Допустимо ли вызывать handle.destroy() из-за окончательной приостановки сопрограммы C ++?

Насколько я понимаю, это должно быть нормально, потому что сопрограмма в настоящее время приостановлена ​​и больше не будет возобновлена.

Тем не менее, AddressSanitizer сообщает heap-use-after-free для следующего фрагмента кода:

#include <experimental/coroutine>
#include <iostream>

using namespace std;

struct final_awaitable {
   bool await_ready() noexcept { return false; }
   void await_resume() noexcept {}
   template<typename PROMISE> std::experimental::coroutine_handle<> await_suspend(std::experimental::coroutine_handle<PROMISE> coro) noexcept {
      coro.destroy(); // Is this valid?
      return std::experimental::noop_coroutine();
   }
};

struct task {
   struct promise_type;
   using coro_handle = std::experimental::coroutine_handle<promise_type>;

   struct promise_type {
      task get_return_object() { return {}; }
      auto initial_suspend() { return std::experimental::suspend_never(); }
      auto final_suspend() noexcept { return final_awaitable(); }
      void unhandled_exception() { std::terminate(); }
      void return_void() {}
   };
};

task foo() {
    cerr << "foo\n";
    co_return;
}

int main() {
   auto x = foo();
}

при компиляции с clang 11.0.1 и флагами компиляции -stdlib=libc++ --std=c++17 -fcoroutines-ts -fno-exceptions -fsanitize=address. (см. https://godbolt.org/z/eq6eoc)

(упрощенная версия моего реального кода. Вы можете найти полный код в https://godbolt.org/z/8Yadv1)

Читать:
Несмотря на то, что установлен rpath, одна dll не найдена

Это проблема в моем коде или неправильный результат в AddressSanitizer?

Похожие записи

Внешний ключ Gorm Many-to-one только для одной модели

admin

AWS Cognito — PreTokenGeneration без параметра clientMetadata при обновлении токена

admin

указатель на указатели для односвязного списка в C

admin

Как создать проект Visual Studio с манифестом приложения из Qt?

admin

Луч — Прочтите AVRO и преобразуйте

admin

Как запланировать запуск двух групп DAG в двух разных schedule_interval, но второй запускается только после завершения первого

admin