Share via


Peligro C26832

El tamaño de asignación es el resultado de una conversión de restricción que podría dar lugar a desbordamiento.

Comentarios

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

void* SmallAlloc(int);

void foo(unsigned short i, unsigned short j)
{
    unsigned short size = i + j;
    
    int* p = (int*)SmallAlloc(size); // Warning: C26832
    p[i] = 5;
}

En la expresión i + j, y ij se promueven a enteros y el resultado de la adición se almacena en un entero temporal. A continuación, el entero temporal se convierte implícitamente en un unsigned short antes de que el valor se almacene en size. La conversión a unsigned short podría desbordarse, en cuyo caso SmallAlloc puede devolver 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 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(unsigned short i, unsigned short j)
{
    if (i > 100 || j > 100)
        return;

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

Consulte también

C26831
C26833