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.