Warnung C26446
Verwenden Sie lieber gsl::at() anstelle eines nicht aktivierten Tiefstellungsoperators (bounds.4).
C++-Kernrichtlinien: Bounds.4: Verwenden Sie keine Standardbibliotheksfunktionen und Typen, die nicht gebunden sind.
Hinweise
Das Begrenzungsprofil der C++-Kernrichtlinien versucht, unsichere Manipulationen des Arbeitsspeichers zu beseitigen. Es hilft Ihnen, die Verwendung von unformatierten Zeigern und deaktivierten Vorgängen zu vermeiden. Eine Möglichkeit zum Durchführen des einheitlichen bereichsgecheckten Zugriffs auf Puffer besteht darin, das gsl::at()
Hilfsprogramm aus der Richtlinien-Supportbibliothek zu verwenden. Außerdem empfiehlt es sich, sich auf Standardimplementierungen von verfügbaren STL-Containern at()
zu verlassen.
Diese Regel hilft, Orte zu finden, an denen der potenziell deaktivierte Zugriff über Anrufe operator[]
ausgeführt wird. In den meisten Fällen können Sie solche Aufrufe mithilfe von gsl::at()
.
- Der Zugriff auf Arrays bekannter Größe wird gekennzeichnet, wenn ein nicht konstanter Index in einem Tiefstellungsoperator verwendet wird. Konstantenindizes werden von C26483 STATIC_INDEX_OUT_OF_RANGE behandelt.
- Die Logik zum Warnen von überladenen
operator[]
Aufrufen ist komplexer:- Wenn der Index nicht integral ist, wird der Aufruf ignoriert. Dies behandelt auch die Indizierung in Standardzuordnungen, da Parameter in solchen Operatoren per Verweis übergeben werden.
- Wenn der Operator als nicht ausgelöst markiert ist (mithilfe
noexcept
von ,throw()
oder__declspec(nothrow)
), wird der Anruf gekennzeichnet. Es wird davon ausgegangen, dass, wenn der Tiefstellungsoperator niemals Ausnahmen auslöst, entweder keine Bereichsprüfungen durchführt oder diese Prüfungen verdeckt sind. - Wenn der Operator nicht als nicht ausgelöst gekennzeichnet ist, kann er gekennzeichnet werden, wenn er aus einem STL-Container stammt, der auch eine herkömmliche
at()
Memberfunktion definiert. Solche Funktionen werden durch einfachen Namensabgleich erkannt. - Die Regel warnt nicht bei Aufrufen von Standardfunktionen
at()
. Diese Funktionen sind sicher; Das Ersetzen durchgsl::at()
sie würde nicht viel Wert bringen.
- Die Indizierung in
std::basic_string_view<>
ist unsicher, sodass eine Warnung ausgegeben wird. Ersetzen Sie den Standardstring_view
durch die Verwendunggsl::basic_string_span<>
, die immer gebunden ist. - Die Implementierung berücksichtigt keine Bereichsprüfungen, die der Benutzercode möglicherweise an einer beliebigen Stelle in Schleifen oder Verzweigungen hat. Hier wird Genauigkeit für die Performance gehandelt. Im Allgemeinen können Sie explizite Bereichsprüfungen häufig durch zuverlässigere Iteratoren oder präzisere erweiterte
for
Schleifen ersetzen.
Beispiel
In diesem Beispiel wird veranschaulicht, wie die gsl::at
Funktion einen indizierten Verweis ersetzen kann:
// 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';
}