Regla 0x500Eh: Prohibición de la biblioteca obsoleta y no estándar <conio.h> (getch, clrscr)
Compilacion, preprocesador y seguridad (0x50XX)
0x500Eh: Prohibición de la biblioteca obsoleta y no estándar <conio.h> (getch, clrscr)¶
Enunciado normativo¶
NO DEBE incluirse
<conio.h>ni usarse sus funciones (getch,clrscr,textcolor,gotoxy, ...). La entrada y la salida se resuelven con la biblioteca estándar (<stdio.h>).
¿Por qué existe esta regla?¶
El problema¶
<conio.h> es una cabecera propietaria de compiladores antiguos de DOS y de
algunos entornos Windows (Turbo C, Borland, MSVC). No pertenece a ISO C ni a
POSIX: en Linux con GCC no existe y cualquier #include <conio.h> detiene la
compilación con «No such file or directory». Sus funciones tampoco son
portables: getch lee una tecla sin eco con comportamiento no especificado y
clrscr escribe directo en memoria de video. Un programa así no se puede probar
ni ejecutar en el sandbox de corrección.
Consecuencias de violarla¶
| Tipo de consecuencia | Efecto concreto |
|---|---|
| Compilación | fatal error: conio.h: No such file or directory en GCC/Linux. |
| Portabilidad | Sólo compila en DOS o Windows; no corre en la cátedra. |
| Testabilidad | La lectura de teclas sin eco no se puede simular desde un archivo. |
Fundamento en el estándar y en la cátedra¶
ISO/IEC 9899:2011 no define ninguna función de conio; la entrada/salida de
caracteres y la lectura de líneas están en <stdio.h> (§7.21). La cátedra exige
código compilable con gcc -std=c11 -pedantic en Linux, lo que excluye toda
cabecera no estándar.
Alcance y excepciones¶
Aplica a todo el código de la materia. No hay excepción: si se necesita control de terminal (colores, limpiar pantalla), se usa la biblioteca estándar con secuencias de escape ANSI, que es texto y por lo tanto testeable. Si se requiere detección de teclas sin Enter, eso excede el alcance de la materia y se consulta con la cátedra antes de usar bibliotecas de terceros.
Ejemplos exhaustivos¶
❌ Contraejemplo 1 — conio.h para pausar o limpiar¶
#include <conio.h>
int main(void)
{
clrscr();
printf("Hola");
getch();
return 0;
}Por qué falla: ni <conio.h> ni clrscr ni getch existen en la biblioteca
estándar; el programa no compila en la máquina de la cátedra.
❌ Contraejemplo 2 — Colores y posición con API propietaria¶
#include <conio.h>
void dibujar(void)
{
textcolor(4);
gotoxy(10, 5);
cprintf("Hola");
}Por qué falla: textcolor, gotoxy y cprintf son extensiones del entorno
DOS. Su semántica depende de la memoria de video y no tienen equivalente
portable; además el código deja de poder redirigirse a un archivo.
✅ Ejemplo conforme 1 — Pausa y limpieza con E/S estándar¶
#include <stdio.h>
int main(void)
{
printf("\033[2J\033[H");
printf("Hola\n");
getchar();
return 0;
}getchar es la lectura estándar de un carácter (requiere Enter) y \033[2J
es la secuencia ANSI de limpieza, que es texto normal y puede redirigirse o
testearse alimentando la entrada estándar.
✅ Ejemplo conforme 2 — Entrada interactiva con fgets¶
#include <stdio.h>
int main(void)
{
char linea[32];
printf("Presione Enter para continuar...");
if (fgets(linea, sizeof(linea), stdin) == NULL) {
return 1;
}
return 0;
}La pausa se implementa leyendo una línea con fgets, portable y verificable; el
retorno se controla como exige 0x5006h: Preferí fgets sobre gets y scanf para leer cadenas. Reemplaza directamente a getch.
⚠️ Casos límite¶
Windows: algunos entornos aún ofrecen
conio; usarla ataría el código a esa plataforma y la cátedra evalúa en Linux.Tecla sin eco:
getchno tiene equivalente ISO C. Si el ejercicio la exige, se consulta antes; no se recurre aconio.system("cls"): tampoco es la salida; además invoca al shell y cae bajo 0x5014h: Inclusión explícita obligatoria de cabeceras para funciones de biblioteca estándar/0x5015h.
Cómo detectarla¶
| Herramienta | Comando | Señal |
|---|---|---|
gaff | gaff check archivo.c | Reporta 0x500Eh ante #include <conio.h> o funciones de esa API. |
gcc / clang | gcc -std=c11 -Wall -Wextra -Werror -pedantic archivo.c | fatal error: conio.h: No such file or directory. |
Checklist de autocontrol¶
¿Evité por completo
<conio.h>?¿Reemplacé
getch/getcheporgetcharofgets?¿El código compila en Linux con
-std=c11 -pedantic?
Reglas relacionadas¶
0x5006h: Preferí fgets sobre gets y scanf para leer cadenas —
fgetses la lectura portable que reemplaza agetch.0x500Bh: Inclusión obligatoria de cabeceras estándar para funciones de la biblioteca C — incluí la cabecera estándar correcta en cada caso.