Aracılığıyla paylaş


Uyarı C26445

Başvuru atamayın gsl::span veya std::string_view atayın. Bunlar ucuz oluşturulur ve temel alınan verilerin sahibi değildir. (gsl.view)

Bir başvuru gsl::span veya std::string_view yaşam süresi sorununun göstergesi olabilir.

C++ Temel Yönergeleri

GSL.view: Görünümler

Bu kural, standart kapsayıcılardan yeni yayılma ve görünüm türlerine geçirilen kodda oluşabilecek küçük yaşam süresi sorunlarını yakalar. Bu tür türler "arabelleklere başvurular" olarak değerlendirilebilir. Bir yayılma alanı veya görünüme başvuru kullanılması ek bir dolaylı katman oluşturur. Bu tür bir dolaylılık genellikle gereksizdir ve bakımcılar için kafa karıştırıcı olabilir. Span'ların kopyalanması ucuz olur ve işlev çağrılarından değere göre döndürülebilir. Açıkçası, bu tür arama sonuçlarına hiçbir zaman başvurulmamalıdır.

Açıklamalar

  • Kural gsl::span<>, gsl::basic_string_span ve std::basic_string_view<><> başvurularını algılar (örnek oluşturma diğer adları dahil).
  • Şu anda uyarılar yalnızca bildirimlerde ve dönüş deyimlerinde yayılıyor. Bu kural gelecekte işlev parametrelerine bayrak eklemek için genişletilebilir.
  • Bu kuralın uygulanması basit bir işlemdir, gerçek yaşam sürelerini izlemeyi denemez. Başvuruların kullanılması bazı senaryolarda hala anlamlı olabilir. Böyle durumlarda hatalı pozitifler güvenle gizlenebilir.

Kod analizi adı: NO_SPAN_REF

Örnek

Geçici bir başvuru:

// Old API - uses string reference to avoid data copy.
const std::string& get_working_directory() noexcept;

// New API - after migration to C++17 it uses string view.
std::string_view get_working_directory() noexcept;

// ...
// Client code which places an explicit reference in a declaration with auto specifier.
const auto &wd = get_working_directory(); // C26445 after API update.