Condividi tramite


Avviso C26810

La durata della variabile acquisita 'var' potrebbe terminare entro il momento in cui la coroutine viene ripresa.

Osservazioni:

L'avviso C26810 viene attivato quando una variabile potrebbe essere usata dopo la fine della durata in una coroutine ripresa.

Nome dell'analisi del codice: COROUTINES_USE_AFTER_FREE_CAPTURE

Esempio

Il codice seguente genera l'errore 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();
}

Per correggere questo avviso, prendere in considerazione l'uso di argomenti per valore anziché di acquisizioni:

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

In alternativa, se la coroutine è garantita una durata inferiore all'oggetto lambda, usare gsl::suppress per eliminare l'avviso e documentare i contratti di durata in un commento.

Vedi anche

C26811