Warnung C26811

Die Lebensdauer des Speichers, auf den der Parameter "var" verweist, kann enden, wenn die Coroutine fortgesetzt wird.

Hinweise

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

Codeanalysename: COROUTINES_USE_AFTER_FREE_PARAM

Beispiel

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

Um diese Warnung zu beheben, sollten Sie das Argument nach Wert verwenden:

std::future<void> async_coro(int a)
{
  co_await ManualControl{g_suspended_coro};
  ++a;
}

Wenn die Lebensdauer a des Coroutins garantiert ist, die Lebensdauer des Coroutins zu überleben, unterdrücken Sie die Warnung, indem gsl::suppress Sie die Lebenszeitverträge des Codes dokumentieren.

Siehe auch

C26810