C ++ memset () desbordamiento de memoria

3

Soy nuevo en C ++.

¿Puede algún experto en C ++ decirme si esto causaría un desbordamiento del búfer?

Código de muestra:

MyObject op;
memset(&op, 0, sizeof(MyObject));

Desde mi punto de vista, está bien ser así, ya que el límite es el tamaño del tipo de objeto en sí, pero hay herramientas de seguridad que se detectan como un desbordamiento de búfer. Si realmente es un desbordamiento de búfer, ¿podría describir un poco cómo podría ser? Gracias por su aclaración y explicación.

    
pregunta overshadow 25.09.2014 - 10:20
fuente

3 respuestas

2

Esto es no un desbordamiento de búfer. El tamaño del búfer que le está dando a memset es exactamente el tamaño real del búfer (en este caso, el objeto op ).

Si este es un objeto C ++ con funciones virtuales, entonces el memset pondrá a cero la memoria que no debería haberse puesto a cero, y es probable que la llamada al destructor explote. Pero esto sería corrupción de memoria, no un desbordamiento de búfer.

En cuanto a la razón por la que su herramienta se queja: hay un idioma común que usa el tipo del primer argumento de memset para determinar el tamaño del búfer:

memset(&my_object, 0, sizeof(my_object));
memset(my_pointer, 0, sizeof(*my_pointer));
memset(my_array, 0, sizeof(my_array));

Es posible que su herramienta emita una advertencia cada vez que use algo más para el tamaño, ya que podría olvidarse de actualizar sizeof cuando cambie el objeto real más tarde.

    
respondido por el CL. 25.09.2014 - 15:35
fuente
1

Ignorame, soy un idiota.

Mark señala que MyObject op es una creación de instancias de alcance local de una clase, que se colocará en la pila. Esto significa que &op es en realidad la dirección de los datos de clase en la memoria.

Como tal, no tengo idea de por qué se marcó esto. Falso positivo, tal vez?

Es correcto quejarse, así que echemos un vistazo a este código. ¿Qué hace?

MyObject op;

En la línea 1, define una variable de objeto. Sin embargo, no llama a su constructor, por lo que esta variable de objeto no está configurada para nada, en este momento solo es un puntero sin inicializar.

memset(&op, 0, sizeof(MyObject));

En la línea 2, toma la dirección de la variable y realiza un memset en esa dirección con un tamaño que seguramente será más grande que el tamaño del puntero. Tenga en cuenta que no está sobrescribiendo la memoria que contendrá los datos del objeto, sino el espacio de almacenamiento de alcance local que se utiliza para mantener un puntero al objeto. Esta es definitivamente una condición de desbordamiento.

    
respondido por el Polynomial 25.09.2014 - 10:55
fuente
0

Depende de la definición de MyObject . Como es C ++, el constructor ha configurado los valores iniciales que luego sobrescribe utilizando memset . El destructor asumirá que no ha sobrescrito el objeto y podría mostrar todo tipo de comportamiento no deseado.

Pero como no muestra ninguno de esos códigos, debemos asumir lo peor. Los desbordamientos de memoria son bastante posibles.

    
respondido por el MSalters 25.09.2014 - 15:33
fuente

Lea otras preguntas en las etiquetas