警告 C26810
キャプチャされた変数 'var' の有効期間は、コルーチンが再開されるまでに終了することがあります。
解説
警告 C26810 は、再開されたコルーチンで有効期間が終了した後に変数が使用される可能性がある場合にトリガーされます。
コード分析名: COROUTINES_USE_AFTER_FREE_CAPTURE
例
次のコードでは C26810 が生成されます。
#include <experimental/generator>
#include <future>
using namespace std::experimental;
coroutine_handle<> g_suspended_coro;
// 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() {}
};
void bad_lambda_example1()
{
int x = 5;
auto bad = [x]() -> std::future<void> {
co_await ManualControl{g_suspended_coro}; // @expected(26810), Lifetime of capture 'x' might end by the time this coroutine is resumed.
printf("%d\n", x);
};
bad();
}
この警告を修正するには、キャプチャの代わりに値渡し引数を使用することを検討してください。
void bad_lambda_example1()
{
int x = 5;
auto good = [](int x) -> std::future<void> {
co_await ManualControl{g_suspended_coro};
printf("%d\n", x);
};
good(x);
}
または、コルーチンがラムダ オブジェクトよりも短く動作することが保証されている場合は、 gsl::suppress
を使用して警告を抑制し、コメント内の有効期間コントラクトを文書化します。