Предупреждение C26811
Время существования памяти, на которую ссылается параметр var, может завершиться с момента возобновления корутины.
Замечания
Предупреждение C26811 активируется, когда переменная может использоваться после окончания его существования в возобновленной корутине.
Имя анализа кода: COROUTINES_USE_AFTER_FREE_PARAM
Пример
Следующий код создает C26811.
#include <experimental/generator>
#include <future>
using namespace std::experimental;
// Simple awaiter to allows to resume a suspended coroutine
struct ManualControl
{
coroutine_handle<>& save_here;
bool await_ready() { return false; }
void await_suspend(coroutine_handle<> h) { save_here = h; }
void await_resume() {}
};
coroutine_handle<> g_suspended_coro;
std::future<void> async_coro(int &a)
{
co_await ManualControl{g_suspended_coro}; // @expected(26811), Lifetime of 'a' might end by the time this coroutine is resumed.
++a;
}
Чтобы устранить это предупреждение, рассмотрите возможность принятия аргумента по значению:
std::future<void> async_coro(int a)
{
co_await ManualControl{g_suspended_coro};
++a;
}
Кроме того, если время существования a
гарантированно превысит время существования корутины, отключите предупреждение с помощью gsl::suppress
и задокументируйте контракты времени существования кода.