У меня есть небольшой конвейер сопрограмм в C++20, в котором три сопрограммы передают данные друг другу, используя ожидаемые файлы в стиле генератора. Все работает корректно под:
GCC 14.1 (libstdc++)
MSVC 19.40
Clang 18 + libc++
Однако, когда я компилирую с помощью Clang 18 + libstdc++ + AddressSanitizer, программа всегда блокируется внутри финального co_await, даже когда программа сводится к минимальному примеру, приведенному ниже.
У меня есть небольшой конвейер сопрограмм в C++20, в котором три сопрограммы передают данные друг другу, используя ожидаемые файлы в стиле генератора. Все работает корректно под: [list] [*][b]GCC 14.1[/b] (libstdc++)
[*][b]MSVC 19.40[/b]
[*][b]Clang 18 + libc++[/b]
[/list] Однако, когда я компилирую с помощью [b]Clang 18 + libstdc++ + AddressSanitizer[/b], программа [b]всегда блокируется[/b] внутри финального co_await, даже когда программа сводится к минимальному примеру, приведенному ниже. [code]#include #include #include
template struct Generator { struct promise_type { T current; auto get_return_object() { return Generator{handle_type::from_promise(*this)}; } static auto get_return_object_on_allocation_failure() noexcept { return Generator{nullptr}; } auto initial_suspend() noexcept { return std::suspend_always{}; } auto final_suspend() noexcept { return std::suspend_always{}; } void return_void() noexcept {} auto yield_value(T v) noexcept { current = v; return std::suspend_always{}; } void unhandled_exception() { std::terminate(); } };
using handle_type = std::coroutine_handle ; handle_type h;