Freigeben über


Warnung C26833

Die Zuordnungsgröße kann das Ergebnis eines numerischen Überlaufs vor der gebundenen Prüfung sein.

Hinweise

Diese Warnung meldet, dass die für eine Zuordnung angegebene Größe das Ergebnis eines numerischen Überlaufs sein kann. Beispiel:

void* SmallAlloc(int);

void foo(unsigned i, unsigned j)
{
    unsigned size = i + j;

    if (size > 50)
    {
        return;
    }

    int* p = (int*)SmallAlloc(size + 5); // Warning: C26833
    p[j] = 5;
}

Die Überprüfung size > 50 ist zu spät. Wenn i + j Überlauf erfolgt, erzeugt sie einen kleinen Wert, der die Prüfung übergibt. Weisen Sie dann einen Puffer zu, SmallAlloc der kleiner als erwartet ist. Dies führt wahrscheinlich zu begrenzungsgebundenen Versuchen, später auf den Puffer zuzugreifen. Dieses Codemuster kann zu Remotecodeausführungsrisiken führen.

Diese Überprüfung gilt für allgemeine Zuordnungsfunktionen wie new, mallocund VirtualAlloc. Die Überprüfung gilt auch für benutzerdefinierte Allokatorfunktionen, die (Groß-/Kleinschreibung) im Funktionsnamen aufweisen alloc .

Diese Überprüfung erkennt manchmal nicht, dass bestimmte Prüfungen Überläufe verhindern können, da die Prüfung konservativer ist.

Diese Warnung ist in Visual Studio 2022, Version 17.7 und höher, verfügbar.

Beispiel

Um das vorherige Codebeispiel zu beheben, stellen Sie sicher, dass i+j der Überlauf nicht möglich ist. Beispiel:

void* SmallAlloc(int);

void foo(unsigned i, unsigned j)
{
    if (i > 100 || j > 100)
    {
        return;
    }

    unsigned size = i + j;

    if (size > 50)
    {
        return;
    }

    int* p = (int*)SmallAlloc(size + 5);
    p[j] = 5;
}

Weitere Informationen

C26831
C26832