Compartir a través de


Advertencia C26810

La duración de la variable capturada "var" puede terminar por el momento en que se reanuda la corrutina.

Comentarios

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

Nombre de análisis de código: COROUTINES_USE_AFTER_FREE_CAPTURE

Ejemplo

El código siguiente genera la advertencia 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();
}

Para corregir esta advertencia, considere la posibilidad de usar argumentos por valor en lugar de capturas:

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

Como alternativa, si se garantiza que la duración de la corrutina es más corta que el objeto lambda, use gsl::suppress para suprimir la advertencia y documente los contratos de duración en un comentario.

Consulte también

C26811