次の方法で共有


警告 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