typestar

Los bugs de memoria clásicos en C

Fuga, double free, puntero colgante y off-by-one — mostrados para que los reconozcas.

#include <stdlib.h>

/* Fuga: el return temprano nunca libera. */
int leaks(size_t n) {
    int *values = malloc(n * sizeof(int));
    if (values == NULL) {
        return 0;
    }
    if (n > 100) {
        return -1;
    }
    free(values);
    return 1;
}

/* Corregido: una sola salida, y NULL después del free. */
int careful(size_t n) {
    int *values = malloc(n * sizeof(int));
    if (values == NULL) {
        return 0;
    }
    int result = (n > 100) ? -1 : 1;
    free(values);
    values = NULL;
    free(values);
    return result;
}

Cómo funciona

  1. Cada malloc necesita exactamente un free, en cada ruta.
  2. Poner el puntero en NULL tras liberar vuelve inofensivo un double free.
  3. Un puntero colgante es retornar la dirección de una local muerta.

Palabras clave y builtins usados aquí

El intento, en números

Líneas
27
Caracteres a escribir
464
Tokens
122
Ritmo de tres estrellas
100 tpm

Al ritmo de tres estrellas de 100 tokens por minuto, este intento toma unos 73 segundos.

Escribe este fragmento

Paso 2 de 4 en Propiedad y errores; paso 16 de 25 en Punteros y memoria.

← Anterior Siguiente →