警告 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 取消警告,并记录代码的生存期协定。

另请参阅

C26810