Share via


Peligro C26831

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

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(int i, int j)
{
    int* p = (int*)SmallAlloc(i + j); // Warning: C26831
    p[i] = 5;
}

Si i+j se desborda, SmallAlloc devuelve 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.

La 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 en el que i+j podría desbordarse, introduzca una comprobación para asegurarse de que no lo hará. Por ejemplo:

void *SmallAlloc(int);

void foo(int i, int j)
{
    if (i < 0 || j < 0 )
    {
        return;
    }

    if (i > 100 || j > 100)
    {
        return;
    }

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

Consulte también

C26832
C26833