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
, 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, 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
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