Warnung C26810

Die Lebensdauer der erfassten Variablen "var" kann enden, wenn der Coroutin fortgesetzt wird.

Hinweise

Warnung C26810 wird ausgelöst, wenn eine Variable nach Beendigung ihrer Lebensdauer in einem fortgesetzten Coroutine verwendet werden kann.

Codeanalysename: COROUTINES_USE_AFTER_FREE_CAPTURE

Beispiel

Der folgende Code generiert 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();
}

Um diese Warnung zu beheben, sollten Sie anstelle von Erfassungen die Verwendung von Wertargumenten in Betracht ziehen:

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);
}

Wenn die Coroutine garantiert kürzer als das Lambda-Objekt ist, sollten Sie gsl::suppress die Warnung unterdrücken und die Lebensdauerverträge in einem Kommentar dokumentieren.

Siehe auch

C26811