Допустимо ли вызывать 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)
Это проблема в моем коде или неправильный результат в AddressSanitizer?
