Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
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; azgsl::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ánytstring_viewa mindig határok által ellenőrzött beállítássalgsl::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';
}