Compartir por


Advertencia C26811

La duración de la memoria a la que hace referencia el parámetro "var" puede terminar en el momento en que se reanuda la corrutina.

Comentarios

Advertencia C26811 se desencadena cuando se puede usar una variable después de que finalice su vigencia en una corrutina reanudada.

Nombre del análisis de código: COROUTINES_USE_AFTER_FREE_PARAM

Ejemplo

El código siguiente genera la advertencia 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 corregir esta advertencia, considere la posibilidad de tomar el argumento por valor:

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

Como alternativa, cuando se garantiza que la duración de a supera la de la corrutina, suprima la advertencia mediante gsl::suppress y documente los contratos de duración del código.

Consulte también

C26810