Peringatan C26811
Masa pakai memori yang direferensikan oleh parameter 'var' mungkin berakhir pada saat coroutine dilanjutkan.
Keterangan
Peringatan C26811 dipicu ketika variabel dapat digunakan setelah masa pakainya berakhir dengan coroutine yang dilanjutkan.
Nama analisis kode: COROUTINES_USE_AFTER_FREE_PARAM
Contoh
Kode berikut menghasilkan 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;
}
Untuk memperbaiki peringatan ini, pertimbangkan untuk mengambil argumen berdasarkan nilai:
std::future<void> async_coro(int a)
{
co_await ManualControl{g_suspended_coro};
++a;
}
Atau, ketika masa a
pakai dijamin untuk lebih lama dari masa pakai koroutine, menekan peringatan menggunakan gsl::suppress
dan mendokumentasikan kontrak seumur hidup kode.