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
- Cada
mallocnecesita exactamente unfree, en cada ruta. - Poner el puntero en NULL tras liberar vuelve inofensivo un double free.
- Un puntero colgante es retornar la dirección de una local muerta.
Palabras clave y builtins usados aquí
NULLifintreturnsize_tsizeof
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.
Paso 2 de 4 en Propiedad y errores; paso 16 de 25 en Punteros y memoria.