Megosztás:


Figyelmeztetés: C26446

Inkább a gsl::at() funkciót használja az ellenőrizetlen index operátor (bounds.4) helyett.

C++ Alapvető irányelvek: Bounds.4: Ne használjon szabványos kódtárfüggvényeket és olyan típusokat, amelyek nincsenek bejelölve.

Megjegyzések

A C++ alapvető irányelvek Határok profilja megpróbálja kiküszöbölni a memória nem biztonságos manipulálását. Segít elkerülni a nyers mutatók és a nem ellenőrzött műveletek használatát. A pufferekhez való egységes tartományellenőrzés egyik módja a segédprogram használata az gsl::at() irányelvek támogatási kódtárából. Emellett ajánlott az STL-tárolókban elérhető standard implementációkra at() támaszkodni.

Ez a szabály segít megtalálni azokat a helyeket, ahol a potenciálisan nem ellenőrzött hozzáférés a hívásokkal operator[]történik. A legtöbb esetben az ilyen hívásokat lecserélheti a következővel gsl::at(): .

  • Az ismert méretű tömbökhöz való hozzáférés akkor van megjelölve, ha egy nem állandó indexet használnak egy alsó index operátorban. Az állandó indexeket a C26483 STATIC_INDEX_OUT_OF_RANGE kezeli.
  • A túlterhelt operator[] hívásokra való figyelmeztetés logikája összetettebb:
    • Ha az index nem integrál, a rendszer figyelmen kívül hagyja a hívást. Ez a szabványos térképek indexelését is kezeli, mivel az ilyen operátorok paramétereit hivatkozással adja át.
    • Ha az operátor nem dobhatóként van megjelölve (az noexcept, throw() vagy __declspec(nothrow) használatával), a hívás meg van jelölve. Feltételezzük, hogy ha az alsó index operátor soha nem ad kivételeket, akkor vagy nem végez tartományellenőrzéseket, vagy ezek az ellenőrzések homályosak.
    • Ha az operátor nem dobásmentesként van megjelölve, akkor megjelölheti, ha egy olyan STL-tárolóból származik, amely egy hagyományos at() tagfüggvényt is definiál. Az ilyen függvényeket egyszerű névegyeztetés észleli.
    • A szabály nem figyelmeztet a standard at() függvényhívásoknál. Ezek a függvények biztonságosak; az gsl::at()-re való lecserélésük nem hoz sok értéket.
  • Az std::basic_string_view<> indexelése nem biztonságos, ezért figyelmeztetés jelenik meg. Cserélje le a szabványt string_view a mindig határok által ellenőrzött beállítással gsl::basic_string_span<>.
  • Az implementáció nem veszi figyelembe a felhasználói kódban előforduló tartományellenőrzéseket, amelyek hurkokban vagy elágazásokban lehetnek. Itt a pontosságot a teljesítményre cserélik. Az explicit tartományellenőrzéseket általában megbízhatóbb iterátorok vagy tömörebb továbbfejlesztett forciklusok használatával helyettesítheti.

példa

Ez a példa bemutatja, hogyan helyettesítheti a függvény az gsl::at indexelt hivatkozásokat:

// C26446.cpp
#include <vector>
#include <gsl/gsl_util>
#include <iostream>

void fn()
{
    std::vector<int> v{1, 2, 3, 4, 5};
  
    // Normal bracket operators do not prevent you from accessing memory out of bounds.
    std::cout << v[5] << '\n';  // C26446, prefer using gsl::at instead of using operator[].
  
    // gsl::at prevents accessing memory out of bounds and invokes std::terminate on access.
    std::cout << gsl::at(v, 5) << '\n';
}