경고 C26810

캡처된 변수 'var'의 수명은 코루틴이 다시 시작될 때까지 끝날 수 있습니다.

설명

다시 시작된 코루틴에서 수명이 종료된 후 변수를 사용할 수 있는 경우 경고 C26810이 트리거됩니다.

코드 분석 이름: COROUTINES_USE_AFTER_FREE_CAPTURE

예시

다음 코드는 C26810을 생성합니다.

#include <experimental/generator>
#include <future>

using namespace std::experimental;

coroutine_handle<> g_suspended_coro;

// 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() {}
};

void bad_lambda_example1()
{
  int x = 5;
  auto bad = [x]() -> std::future<void> {
    co_await ManualControl{g_suspended_coro};  // @expected(26810), Lifetime of capture 'x' might end by the time this coroutine is resumed.
    printf("%d\n", x);
  };
  bad();
}

이 경고를 해결하려면 캡처 대신 값별 인수를 사용하는 것이 좋습니다.

void bad_lambda_example1()
{
  int x = 5;
  auto good = [](int x) -> std::future<void> {
    co_await ManualControl{g_suspended_coro};
    printf("%d\n", x);
  };
  good(x);
}

또는 코루틴이 람다 개체보다 짧게 유지되도록 보장되는 경우 경고를 표시하지 말고 주석에 수명 계약을 문서화하는 데 사용합니다 gsl::suppress .

참고 항목

C26811