Сопрограммы 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 << «foon»; 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)

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

Источник: ledsshop.ru

Стиль жизни - Здоровье!