Partilhar via


Aviso C26811

O tempo de vida da memória referenciada pelo parâmetro 'var' pode terminar no momento em que a co-rotina for retomada.

Comentários

O aviso C26811 é acionado quando uma variável pode ser usada após o término de sua vida útil em uma co-rotina retomada.

Nome da análise de código: COROUTINES_USE_AFTER_FREE_PARAM

Exemplo

O código a seguir gera 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;
}

Para corrigir esse aviso, considere usar o argumento por valor:

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

Como alternativa, quando o tempo de vida de a é garantido para sobreviver ao tempo de vida da corrotina, suprima o aviso usando gsl::suppress e documente os contratos de tempo de vida do código.

Confira também

C26810