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 noexceptvon , 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 durch gsl::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 Standard string_view durch die Verwendung gsl::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 forSchleifen 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';
}