Partager via


Avertissement C26811

La durée de vie de la mémoire référencée par le paramètre 'var' peut se terminer par la reprise de la coroutine.

Notes

L’avertissement C26811 est déclenché lorsqu’une variable peut être utilisée après sa durée de vie terminée dans une coroutine reprise.

Nom de l’analyse du code : COROUTINES_USE_AFTER_FREE_PARAM

Exemple

Le code suivant génère l’erreur 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;
}

Pour corriger cet avertissement, envisagez de prendre l’argument par valeur :

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

Sinon, lorsque la durée de vie de a la coroutine est garantie pour survivre à la durée de vie de la coroutine, supprimez l’avertissement à l’aide gsl::suppress et documentez les contrats de durée de vie du code.

Voir aussi

C26810