Share via


Peligro C26833

El tamaño de asignación puede ser el resultado de un desbordamiento numérico antes de la comprobación enlazada.

Comentarios

Esta advertencia informa de que el tamaño especificado para una asignación puede ser el resultado de un desbordamiento numérico. Por ejemplo:

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;
}

La comprobación size > 50 es demasiado tarde. Si i + j se desborda, genera un valor pequeño que pasa la comprobación. A continuación, SmallAlloc asigna un búfer menor de lo esperado. Esto probablemente provocará que los límites no tengan acceso al búfer más adelante. Este patrón de código puede dar lugar a vulnerabilidades de ejecución remota de código.

Esta comprobación se aplica a funciones de asignación comunes como new, mallocy VirtualAlloc. La comprobación también se aplica a las funciones de asignador personalizadas que tienen alloc (sin distinción entre mayúsculas y minúsculas) en el nombre de la función.

Esta comprobación a veces no reconoce que ciertas comprobaciones pueden impedir desbordamientos porque la comprobación es conservadora.

Esta advertencia está disponible en Visual Studio 2022, versión 17.7 y versiones posteriores.

Ejemplo

Para corregir el ejemplo de código anterior, asegúrese i+j de que no se puede desbordar. Por ejemplo:

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;
}

Consulte también

C26831
C26832