Condividi tramite


Avviso C26811

La durata della memoria a cui fa riferimento il parametro 'var' potrebbe terminare entro il momento in cui la coroutine viene ripresa.

Osservazioni:

L'avviso C26811 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_PARAM

Esempio

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

Per correggere questo avviso, prendere in considerazione l'argomento in base al valore:

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

In alternativa, quando la durata di a è garantita la durata della coroutine, eliminare l'avviso usando gsl::suppress e documentare i contratti di durata del codice.

Vedi anche

C26810