Ostrzeżenie C26811
Okres istnienia pamięci, do których odwołuje się parametr "var", może zakończyć się do czasu wznowienia coroutine.
Uwagi
Ostrzeżenie C26811 jest wyzwalane, gdy zmienna może być używana po zakończeniu okresu istnienia w wznowionej koprutynie.
Nazwa analizy kodu: COROUTINES_USE_AFTER_FREE_PARAM
Przykład
Poniższy kod generuje kod 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;
}
Aby naprawić to ostrzeżenie, rozważ użycie argumentu według wartości:
std::future<void> async_coro(int a)
{
co_await ManualControl{g_suspended_coro};
++a;
}
Alternatywnie, gdy okres istnienia a
programu ma zagwarantować przeżycie okresu istnienia kohroutyny, pomiń ostrzeżenie przy użyciu i gsl::suppress
udokumentowanie kontraktów okresu istnienia kodu.