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 i
j
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
, malloc
y 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
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de