【发布时间】:2021-05-05 13:04:14
【问题描述】:
在 C++ 协程的最终暂停中调用 handle.destroy() 是否有效?
据我了解,这应该没问题,因为协程当前已暂停,不会再次恢复。
不过,AddressSanitizer 仍为以下代码 sn-p 报告 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 中的错误正面?
【问题讨论】:
标签: c++ clang c++20 address-sanitizer c++-coroutine