Universidad Carlos III de Madrid

Grado en Ing. Telemática/Sist. Audiovisuales/Sist. de Comunicaciones

Arquitectura de Sistemas

Septiembre 2012 - Enero 2013

El depurador de memoria Valgrind

TO BE WRITTEN!

1. Preguntas de autoevaluación

  1. Has compilado un programa con la sentencia gcc -Wall -o main main.c. Lo ejecutas con valgrind con la sentencia valgrind --leak-check=yes ./main, y te advierte de fugas de memoria pero no te indica las líneas del código donde las ha encontrado.

    • Hay que indicar en la sentencia de compilación que se incluya información detallada en el fichero ejecutable, como el número de línea: gcc -l -Wall -o main main.c

    • Hay que indicar en la sentencia de compilación que se incluya información detallada en el fichero ejecutable, como el número de cada línea: gcc -g -Wall -o main main.c

    • Hay que indicar en la sentencia de Valgrind que saque por pantalla el número de línea donde encuentre errores. valgrind -l --leak-check=yes ./main

    • Hay que indicar en la sentencia de Valgrind que saque por pantalla el número de línea donde encuentre errores. valgrind -g --leak-check=yes ./main

  2. Dada la siguiente función:

    #define SIZE 10
    
    void f(void)
    {
      int *x = malloc(SIZE * sizeof(int));
      x[SIZE-1] = 0;
    }
    • Valgrind advierte de una fuga de memoria.

    • Valgrind advierte de un error de escritura en memoria.

    • Valgrind advierte de un error de lectura en memoria.

    • Valgrind advierte de una liberación inválida ("invalid free").

    • No hay fugas ni errores de memoria en esa función.

  3. Dada la siguiente función:

    #define SIZE 10
    
    void f(void)
    {
      char *x = malloc(SIZE * sizeof(char));
      x[SIZE] = '/0';
      free(x);
    }
    • Valgrind advierte de una fuga de memoria.

    • Valgrind advierte de un error de escritura en memoria.

    • Valgrind advierte de un error de lectura en memoria.

    • Valgrind advierte de una liberación inválida ("invalid free").

    • No hay fugas ni errores de memoria en esa función.

  4. Dado el siguiente trozo de código:

    #define SIZE 4
    ...
      char string[SIZE] = "Test";
      printf(string);
    ...
    • Valgrind advierte de una fuga de memoria.

    • Valgrind advierte de un error de escritura en memoria.

    • Valgrind advierte de un error de lectura en memoria.

    • Valgrind advierte de una liberación inválida ("invalid free").

    • No hay fugas ni errores de memoria en ese código.

  5. Dado el siguiente trozo de código:

    #define SIZE 6
    ...
      char string[SIZE] = "Test";
      printf(string);
    ...
    • Valgrind advierte de una fuga de memoria.

    • Valgrind advierte de uso de valor(es) o byte(s) sin inicializar.

    • Valgrind advierte de una liberación inválida ("invalid free").

    • No hay fugas ni errores de memoria en ese código.

  6. Dado el siguiente extracto de un programa:

    #define SIZE 2
    void f(int *number)
    {
      int *numbers = realloc(number,SIZE*sizeof(int));
      numbers[0] = 64;
      numbers[1] = 65;
      free(numbers);
    }
    int main(void)
    {
      int *aux = malloc (sizeof(int));
      f(aux);
      free(aux);
      return 0;
    }
    • Valgrind advierte de una fuga de memoria.

    • Valgrind advierte de uso de valor(es) o byte(s) sin inicializar.

    • Valgrind advierte de una liberación inválida ("invalid free").

    • No hay fugas ni errores de memoria en ese código.