Aracılığıyla paylaş


Uyarı C26810

Yakalanan 'var' değişkeninin ömrü, coroutine sürdürülürken sona erebilir.

Açıklamalar

C26810 uyarısı, bir değişkenin yaşam süresi sürdürülen bir eş yordamda sona erdikten sonra kullanılabilmesiyle tetiklenir.

Kod analizi adı: COROUTINES_USE_AFTER_FREE_CAPTURE

Örnek

Aşağıdaki kod C26810 oluşturur.

#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();
}

Bu uyarıyı düzeltmek için yakalamalar yerine değere göre bağımsız değişkenler kullanmayı göz önünde bulundurun:

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);
}

Alternatif olarak, coroutine'un lambda nesnesinden daha kısa yaşayacağı garanti edilirse uyarıyı bastırmak ve yaşam süresi sözleşmelerini bir yorumda belgelemek için kullanın gsl::suppress .

Ayrıca bkz.

C26811