Sdílet prostřednictvím


Upozornění C26445

Nepřiřazujte ani std::string_view nepřiřazujte gsl::span odkaz. Jsou levné k vytvoření a nejsou vlastníky podkladových dat. (gsl.view)

Odkaz na gsl::span nebo std::string_view může být indikací problému životnosti.

C++ Core Guidelines

GSL.view: Zobrazení

Toto pravidlo zachytává drobné problémy s životností, ke kterým může dojít v kódu migrovaném ze standardních kontejnerů na nové typy rozsahů a zobrazení. Takové typy lze považovat za "odkazy na vyrovnávací paměť". Použití odkazu na rozsah nebo zobrazení vytvoří další vrstvu nepřímých odkazů. Takové nepřímé je často zbytečné a může být matoucí pro správce. Rozsahy jsou levné ke kopírování a mohou být vráceny hodnotou z volání funkce. Samozřejmě, takové výsledky volání by nikdy neměly být odkazovány.

Poznámky

  • Pravidlo detekuje odkazy na gsl::span<>, gsl::basic_string_span<> a std::basic_string_view<> (včetně aliasů pro vytváření instancí).
  • V současné době se upozornění vygenerují pouze u deklarací a návratových příkazů. Toto pravidlo se může v budoucnu rozšířit tak, aby také označí parametry funkce.
  • Implementace tohoto pravidla je jednoduchá, nepokouší se sledovat skutečné životnosti. Použití odkazů může v některých scénářích stále dávat smysl. V takových případech lze falešně pozitivní výsledky bezpečně potlačit.

Název analýzy kódu: NO_SPAN_REF

Příklad

Odkaz na dočasný:

// 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.