Uyarı C26811
'var' parametresi tarafından başvuruda bulunan belleğin ömrü, eş yordam sürdürülürken sona erebilir.
Açıklamalar
C26811 uyarısı, bir değişkenin yaşam süresi devam eden bir eş yordamda sona erdikten sonra kullanılabilmesiyle tetiklenir.
Kod analizi adı: COROUTINES_USE_AFTER_FREE_PARAM
Örnek
Aşağıdaki kod C26811 oluşturur.
#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;
}
Bu uyarıyı düzeltmek için bağımsız değişkeni değere göre almayı göz önünde bulundurun:
std::future<void> async_coro(int a)
{
co_await ManualControl{g_suspended_coro};
++a;
}
Alternatif olarak, kullanım ömrünün a
coroutine ömründen uzun ömürlü olması garanti edildiğinde, kodun kullanım ömrü sözleşmelerini kullanarak gsl::suppress
uyarıyı bastırın ve belgelenin.