Sdílet prostřednictvím


Upozornění C26811

Doba životnosti paměti, na kterou odkazuje parametr var, může končit časem obnovení korutiny.

Poznámky

Upozornění C26811 se aktivuje, když proměnná může být použita po ukončení jeho životnosti v obnovené korutině.

Název analýzy kódu: COROUTINES_USE_AFTER_FREE_PARAM

Příklad

Následující kód vygeneruje 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;
}

Pokud chcete toto upozornění opravit, zvažte použití argumentu podle hodnoty:

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

Alternativně platí, že pokud a je zaručeno, že životnost korutinu prožije, potlačit upozornění pomocí gsl::suppress a zdokumentovat životnost kontrakty kódu.

Viz také

C26810