Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Registro de Renumeración del Catálogo

Mapeo de códigos viejos a nuevos para la refactorización de gaff

Universidad Nacional de Río Negro

Este documento registra todos los cambios de numeración del catálogo de reglas. Su consumidor es la herramienta gaff: cada código viejo que la herramienta emite debe reemplazarse por el código nuevo, y cada AP-0xXXXXh debe pasar a ser el código de la regla que lo absorbe. La versión machine-readable es renumeracion.json.

Categorías y prefijos

PrefijoCategoríaDirectorioReglas
0x00XXSintaxis y formato visualreglas/00_formato/23
0x01XXNomenclatura e identificadoresreglas/01_nomenclatura/18
0x02XXComentarios, documentacion y organizacion de archivosreglas/02_documentacion/6
0x10XXEstructuras de control y flujoreglas/10_control/24
0x20XXFunciones, contratos y modularizacionreglas/20_funciones/24
0x30XXMemoria, punteros y tiposreglas/30_memoria/31
0x40XXArchivos y E/Sreglas/40_archivos/12
0x50XXCompilacion, preprocesador y seguridadreglas/50_seguridad/21
0x60XXProceso, diseno y construccion sistematicareglas/60_proceso/5
0x70XXRobustez y manejo de erroresreglas/70_robustez/7
0x80XXVerificacion, testing y depuracionreglas/80_verificacion/4

Renumeración de reglas

Código viejoCódigo nuevoTipoTítulo
0x0000h0x0001hrenumeradaLa claridad y prolijidad son de máxima importancia
0x0002h0x0002hrenumeradaUna declaración de variable por línea
0x0004h0x0003hrenumeradaUn espacio antes y después de cada operador binario
0x0005h0x0004hrenumeradaCada bloque debe tener una indentación de cuatro espacios respecto a su contenedor y llaves
0x0006h0x0005hrenumeradaEl asterisco de los punteros debe declararse junto al identificador
0x0009h0x0006hrenumeradaLas líneas de código no deben exceder los 79 caracteres
0x000Bh0x0007hrenumeradaLas llaves deben ubicarse en líneas independientes según el estilo Allman
0x0015h0x0008hrenumeradaAlineación vertical consistente en asignaciones y declaraciones consecutivas
0x0017h0x0009hrenumeradaEspaciado consistente en declaraciones de doble puntero (tipo **var)
0x0019h0x000AhrenumeradaProhibición de espacios en blanco antes de separadores de sintaxis (; y ,)
0x001Ah0x000BhrenumeradaProhibición de espacios en blanco alrededor de operadores de acceso a miembros (-> y .)
0x001Bh0x000ChrenumeradaProhibición de espacios en blanco entre operadores unarios (++, --, !) y su operando
0x001Ch0x000DhrenumeradaEspacio en blanco obligatorio tras la coma separadora en listas y argumentos
0x001Dh0x000EhrenumeradaProhibición de espacios en blanco internos inmediatamente tras ‘(’ o antes de ‘)’
0x001Eh0x000FhrenumeradaProhibición de múltiples espacios en blanco consecutivos dentro de una línea de código
0x001Fh0x0010hrenumeradaProhibición de llaves redundantes en inicialización de tipos escalares
0x0022h0x0011hrenumeradaValidador de espaciado estricto en sentencias de control
0x0025h0x0012hrenumeradaValidador de formato canónico en firmas de punteros a función
0x0028h0x0013hrenumeradaDetector de etiquetas de salto goto no alineadas al margen izquierdo
0x0029h0x0014hrenumeradaAuditor de inicialización de arreglos unidimensionales con exceso de elementos
0x002Bh0x0015hrenumeradaValidador de espaciado en listas de argumentos y llamadas a funciones
0x002Dh0x0016hrenumeradaValidador de espaciado en operadores unarios
0x600Eh0x0017hpropuesta-integradaAgrupá sentencias relacionadas y separá bloques lógicos
0x0001h0x0101hrenumeradaLos identificadores deben ser descriptivos
0x0007h0x0102hrenumeradaLos argumentos de función y las variables locales deben usar snake_case en minúsculas
0x0008h0x0103hrenumeradaLas constantes (const o #define) deben nombrarse en MAYUSCULAS_SNAKE_CASE
0x000Ch0x0104hrenumeradaLos nombres de los archivos deben usar snake_case en minúsculas (sin espacios)
0x000Eh0x0105hrenumeradaLos nombres de funciones deben usar snake_case estricto en minúsculas
0x0012h0x0106hrenumeradaLas variables globales deben ser declaradas como static o usar prefijo g_
0x0013h0x0107hrenumeradaLas macros #define deben nombrarse en MAYUSCULAS_SNAKE_CASE
0x0014h0x0108hrenumeradaProhibición de identificadores con caracteres no ASCII (acentos, ñ)
0x0016h0x0109hrenumeradaProhibición de identificadores que colisionen con palabras clave o tipos estándar
0x0018h0x010AhrenumeradaProhibición de identificadores con prefijos reservados para el compilador (__ o _[A-Z])
0x0020h0x010BhrenumeradaProporcionalidad en longitud de identificadores según su alcance
0x0026h0x010ChrenumeradaAuditor de identificadores reservados con doble guion bajo o guion bajo inicial
0x002Ch0x010DhrenumeradaAuditor de consistencia en nombres de constantes simbólicas
0x0037h0x010EhrenumeradaPrescindí de identificadores genéricos con sufijo numérico o afijos (numero1, num_1, n_a, a_n)
0x0038h0x010FhrenumeradaProhibición de constantes numéricas mágicas en índices de arreglos
0x6009h0x0110hpropuesta-integradaLos booleanos se nombran con prefijo interrogativo
0x600Ah0x0111hpropuesta-integradaNombrá en positivo y evitá las dobles negaciones
0x600Bh0x0112hpropuesta-integradaUsá constantes simbólicas para todo literal con significado
0x000Ah0x0201hrenumeradaEscribí comentarios que expliquen el ‘porqué’, no el ‘qué’
0x000Dh0x0202hrenumeradaNo dejes código comentado (dead code) en los archivos fuente
0x000Fh0x0203hrenumeradaPrescindí de comentarios obvios, redundantes o vacíos
0x0010h0x0204hrenumeradaControl de longitud máxima de archivos de código (máx 500 líneas)
0x0011h0x0205hrenumeradaEn archivos .c la inclusión de la cabecera propia debe figurar en primer lugar
0x0027h0x0206hrenumeradaValidador de presencia de cabecera de documentación obligatoria por archivo
0x1001h0x1001hrenumeradaTodas las estructuras de control deben utilizar llaves
0x1002h0x1002hrenumeradaRestringí el uso de break y continue; preferí lazos con bandera de control
0x1003h0x1003hrenumeradaUtilizá el lazo for para iteraciones con rango o contador definido y while para lazos controlados por condiciones lógicas
0x1004h0x1004hrenumeradaLas condiciones complejas deben simplificarse o comentarse
0x1005h0x1005hrenumeradaReemplazá las condiciones ambiguas basadas en la ‘veracidad’ (truthiness) del tipo de dato
0x1006h0x1006hrenumeradaNo utilizar la instrucción goto
0x1007h0x1007hrenumeradaNo utilizar el operador condicional (ternario) ?:
0x1008h0x1008hrenumeradaToda instrucción switch debe incluir un caso default
0x100Ah0x1009hrenumeradaProhibición de asignaciones simples dentro de condiciones lógicas
0x100Bh0x100AhrenumeradaProhibición de estructuras de control con cuerpo vacío (if (...);)
0x100Ch0x100BhrenumeradaNo utilices comparaciones en estilo Yoda (‘CONST == variable’)
0x100Eh0x100ChrenumeradaEspaciado obligatorio alrededor de operadores ternarios (‘? :’)
0x100Fh0x100DhrenumeradaProhibición de condiciones de parada compuestas complejas en lazos for
0x1010h0x100EhrenumeradaDelimitación obligatoria con bloque de llaves en lazos do-while
0x1011h0x100FhrenumeradaProhibición de cláusula else redundante tras sentencia de retorno anticipado
0x1012h0x1010hrenumeradaProhibición de comparaciones encadenadas no idiomáticas en C (a < b < c)
0x1013h0x1011hrenumeradaProhibición de saltos no estructurados goto fuera del patrón canónico de liberación de recursos
0x1014h0x1012hrenumeradaProhibición de expresiones de asignación dentro de estructuras de control
0x1016h0x1013hrenumeradaDetector de expresiones booleanas complejas sin paréntesis aclaratorios
0x1017h0x1014hrenumeradaDetector de operadores de incremento o decremento múltiples en una misma expresión
0x6004h0x1015hpropuesta-integradaLimitá la profundidad de anidación a tres niveles
0x600Ch0x1016hpropuesta-integradaDocumentá el invariante de cada lazo
0x600Dh0x1017hpropuesta-integradaEscribí condiciones afirmativas y directas
0x1018h0x1018hpromovidaNo uses variables de punto flotante como control de lazo
0x2001h0x2001hrenumeradaLas funciones deben usar cláusulas de guarda y retornos anticipados para reducir la anidación profunda
0x2002h0x2002hrenumeradaLas funciones no deben contener printf o scanf, a menos que ese sea su propósito explícito
0x2003h0x2003hrenumeradaTodas las funciones deben incluir documentación completa y estructurada
0x2004h0x2004hrenumeradaNo se permite el uso de variables globales
0x2005h0x2005hrenumeradaCada función debe tener una única responsabilidad (Principio de Responsabilidad Única)
0x2007h0x2006hrenumeradaMantené el alcance de las variables al mínimo posible
0x2008h0x2007hrenumeradaLos valores de retorno numéricos deben definirse como constantes de preprocesador o enums
0x2009h0x2008hrenumeradaLos ejercicios deben ser resueltos mediante funciones
0x200Ah0x2009hrenumeradaLos nombres de funciones y procedimientos deben usar snake_case en minúsculas
0x200Bh0x200AhrenumeradaModularización: una función no debe exceder 4 parámetros de entrada
0x200Ch0x200BhrenumeradaProhibición de retornar la dirección de una variable local de stack
0x200Dh0x200ChrenumeradaCada función debe tener a lo sumo un return
0x200Eh0x200DhrenumeradaComentarios de cierre explicativos en bloques de control extensos (> 25 líneas)
0x200Fh0x200EhrenumeradaUso obligatorio de ‘void’ explícito en funciones sin parámetros
0x2010h0x200FhrenumeradaProhibición de paréntesis superfluos en sentencia return
0x2011h0x2010hrenumeradaProhibición de reasignar o modificar parámetros recibidos por valor dentro de la función
0x2012h0x2011hrenumeradaProhibición de asignaciones múltiples a una variable sin lectura intermedia (dead store)
0x2013h0x2012hrenumeradaTipo de retorno obligatorio ‘int’ en la función main()
0x2016h0x2013hrenumeradaDetector de bloques else superfluos tras sentencias terminales
0x6003h0x2014hpropuesta-integradaCada función debe caber en una sola idea y en 25 líneas
0x6007h0x2015hpropuesta-integradaNo dupliques lógica: extraé una función
0x6008h0x2016hpropuesta-integradaEscribí el contrato de la función antes de implementarla
0x2017h0x2017hpromovidaToda funcion recursiva debe tener un caso base explicito
0x2018h0x2018hpromovidaLos comparadores no deben usar resta sujeta a desbordamiento
0x3001h0x3001hrenumeradaSiempre verificá la asignación exitosa de memoria dinámica
0x3002h0x3002hrenumeradaLiberá siempre la memoria dinámica y asigná NULL al puntero para mitigar punteros colgantes
0x3003h0x3003hrenumeradaNo mezcles operaciones de asignación y comparación en una sola línea
0x3004h0x3004hrenumeradaUtilizá typedef para definir tipos de estructuras con el sufijo _t
0x3005h0x3005hrenumeradaMinimizá el uso de múltiples niveles de indirección (punteros a punteros)
0x3006h0x3006hrenumeradaDocumentá la propiedad de los recursos al utilizar punteros
0x3007h0x3007hrenumeradaLos argumentos de tipo puntero deben ser const siempre que la función no los modifique
0x3008h0x3008hrenumeradaLos punteros nulos deben ser inicializados y comparados con NULL, no con 0
0x3009h0x3009hrenumeradaDocumentá explícitamente los casos en que una función puede retornar NULL
0x300Ah0x300AhrenumeradaUtilizá cast explícito al convertir tipos de punteros
0x300Bh0x300BhrenumeradaUsá siempre sizeof en las asignaciones de memoria dinámica, prefiriendo sizeof(*ptr)
0x300Ch0x300ChrenumeradaVerificá siempre los límites de los arreglos antes de acceder a sus elementos
0x300Dh0x300DhrenumeradaUtilizá enum en lugar de ‘números mágicos’ para conjuntos de estados y valores constantes
0x300Eh0x300EhrenumeradaDocumentá explícitamente el comportamiento de las funciones al manejar punteros nulos como argumentos
0x300Fh0x300FhrenumeradaLiberá la memoria en el orden inverso a su asignación
0x3010h0x3010hrenumeradaLas variables que representan tamaños o índices de arreglos deben ser de tipo size_t
0x3011h0x3011hrenumeradaSi una función recibe un puntero genérico para operaciones de solo lectura, la firma de la función debe utilizar const void*
0x3012h0x3012hrenumeradaProhibición de aritmética de punteros sobre void*
0x3013h0x3013hrenumeradaAsignación de memoria con sizeof sobre puntero en lugar del tipo apuntado
0x3014h0x3014hrenumeradaProhibición de doble liberación de memoria (double free) sobre el mismo puntero
0x3015h0x3015hrenumeradaReallocación segura: no sobreescribir el puntero original directamente
0x3016h0x3016hrenumeradaOrden incorrecto o sospechoso de argumentos en llamadas a memset
0x3017h0x3017hrenumeradaOrden canónico de calificadores: ‘const tipo’ en lugar de ‘tipo const’
0x3018h0x3018hrenumeradaInicialización idiomática de agregados con {0} en lugar de memset inmediato
0x3019h0x3019hrenumeradaProhibición de comparar punteros contra constantes numéricas distintas de NULL o cero
0x301Ah0x301AhrenumeradaValidador de uso idiomático de tipos booleanos estándar
0x100Dh0x301BhrenumeradaProhibición de casts de tipo innecesarios o redundantes
0x0023h0x301ChrenumeradaDetector de variables locales no inicializadas con modificador const
0x0035h0x301DhrenumeradaDiseñá los Tipos de Datos Abstractos utilizando punteros opacos
0x0036h0x301EhrenumeradaAsigná NULL al puntero tras liberar un recurso opaco en el ámbito del cliente
0x301Fh0x301FhpromovidaNo compares numeros de punto flotante con igualdad exacta
0x4001h0x4001hrenumeradaManejá correctamente la apertura y cierre de archivos
0x4002h0x4002hrenumeradaValidá los retornos de las operaciones de lectura y escritura de archivos
0x4003h0x4003hrenumeradaUtilizá errno, perror y strerror para reportar fallos del sistema operativo de manera precisa
0x4004h0x4004hrenumeradaMantené la simetría de recursos al abrir y cerrar archivos en el mismo nivel de abstracción
0x4005h0x4005hrenumeradaPrescindí del uso de offsets y posiciones fijas codificadas a mano en archivos binarios sin validar sus dimensiones
0x4006h0x4006hrenumeradaProhibición del antipatrón while (!feof(f)) para control de fin de archivo
0x4007h0x4007hrenumeradaProhibición de rutas absolutas hardcodeadas en llamadas de archivo
0x4008h0x4008hrenumeradaValidación obligatoria del valor de retorno de fclose() en modo escritura
0x4009h0x4009hrenumeradaProhibición de anidar llamadas a fopen() directamente dentro de funciones de E/S
0x400Ah0x400AhrenumeradaProhibición de operar sobre flujos de archivo tras haber invocado fclose() (use-after-close)
0x400Bh0x400BhpromovidaNo uses fflush(stdin); consumi el buffer con getchar()
0x400Ch0x400ChpromovidaLos formatos de printf/scanf deben coincidir y no ser variables
0x5001h0x5001hrenumeradaLos arreglos estáticos deben ser creados con un tamaño fijo en tiempo de compilación
0x5002h0x5002hrenumeradaDesarrollá y compilá siempre con todas las advertencias del compilador activadas
0x5003h0x5003hrenumeradaUtilizá guardas de inclusión en todos los archivos de cabecera
0x5004h0x5004hrenumeradaTodas las operaciones con cadenas deben ser seguras
0x5005h0x5005hrenumeradaOrganizá la estructura de tus archivos .c de forma estándar
0x5006h0x5006hrenumeradaPreferí fgets sobre gets y scanf para leer cadenas
0x5007h0x5007hrenumeradaInclusiones redundantes o duplicadas de la misma cabecera #include
0x5008h0x5008hrenumeradaProhibición de funciones obsoletas o inseguras (gets, atoi)
0x5009h0x5009hrenumeradaProhibición de división entera no intencional asignada a flotantes
0x500Ah0x500AhrenumeradaProtección obligatoria de parámetros en macros funcionales mediante paréntesis
0x500Bh0x500BhrenumeradaInclusión obligatoria de cabeceras estándar para funciones de la biblioteca C
0x500Ch0x500ChrenumeradaProhibición de inclusión directa de archivos de código fuente C (.c)
0x500Dh0x500DhrenumeradaProhibición de redefinir palabras clave o tipos primitivos de C con #define
0x500Eh0x500EhrenumeradaProhibición de la biblioteca obsoleta y no estándar <conio.h> (getch, clrscr)
0x5011h0x500FhrenumeradaColisión de nombres de macroguardas entre archivos de cabecera distintos
0x5012h0x5010hrenumeradaProhibición de directivas #pragma no estándar o privativas
0x5013h0x5011hrenumeradaProhibición de declaraciones extern en archivos de implementación (.c)
0x5014h0x5012hrenumeradaDetección de inclusiones cíclicas entre archivos de cabecera
0x5015h0x5013hrenumeradaProtección obligatoria con paréntesis envolventes en expresiones de macroconstantes (#define)
0x5016h0x5014hrenumeradaInclusión explícita obligatoria de cabeceras para funciones de biblioteca estándar
0x5015h0x5015hpromovidaNo invoques el interprete de comandos con system() o popen()
0x6001h0x6001hpropuesta-integradaDiseñá el algoritmo antes de escribir código en C
0x6002h0x6002hpropuesta-integradaCompilá con frecuencia y resolvé el primer error antes de continuar
0x6005h0x6003hpropuesta-integradaDeclará cada variable lo más cerca posible de su primer uso
0x6006h0x6004hpropuesta-integradaNo reutilices una variable para propósitos distintos
0x600Fh0x6005hpropuesta-integradaNo optimices prematuramente
0x0003h0x7001hrenumeradaSiempre debés inicializar las variables a un valor conocido
0x6010h0x7002hpropuesta-integradaValidá los datos en la frontera del programa
0x6011h0x7003hpropuesta-integradaNo ignores valores de retorno que pueden indicar fallo
0x6012h0x7004hpropuesta-integradaNo llamés exit() en funciones de biblioteca: propagá el error
0x6013h0x7005hpropuesta-integradaInicializá todos los campos de estructuras y arreglos
0x6014h0x7006hpropuesta-integradaProbá explícitamente los casos borde
0x6015h0x7007hpropuesta-integradaEvitá los parámetros bandera de tipo bool
0x2006h0x8001hrenumeradaUna aserción por cada función de prueba
0x6016h0x8002hpropuesta-integradaEscribí al menos una prueba por cláusula del contrato
0x6017h0x8003hpropuesta-integradaVerificá con gcc, gdb y valgrind antes de entregar
0x6018h0x8004hpropuesta-integradaEjecutá la lista de verificación de calidad antes de entregar

Antipatrones integrados

Cada antipatrón deja de tener código propio y pasa a documentarse dentro de la regla indicada. gaff debe emitir el código nuevo de esa regla.

Código AP viejoRegla nuevaAcción
AP-0x0003b0x7001hintegrado
AP-0x0004b0x7001hintegrado
AP-0x0039h0x500Dhintegrado
AP-0x1001h0x1001hintegrado
AP-0x1005h0x1005hintegrado
AP-0x100Ah0x1009hintegrado
AP-0x100Ch0x1008hintegrado
AP-0x100Dh0x1018hpromovido-a-regla
AP-0x100Eh0x1013hintegrado
AP-0x100Fh0x100Dhintegrado
AP-0x1010h0x1012hintegrado
AP-0x1011h0x301Fhpromovido-a-regla
AP-0x1014h0x100Dhintegrado
AP-0x1015h0x1003hintegrado
AP-0x1016h0x1013hintegrado
AP-0x1017h0x2015hintegrado
AP-0x1018h0x1001hintegrado
AP-0x1019h0x1006hintegrado
AP-0x101Ah0x1005hintegrado
AP-0x101Bh0x1005hintegrado
AP-0x101Ch0x1002hintegrado
AP-0x2007h0x2006hintegrado
AP-0x2009h0x2017hpromovido-a-regla
AP-0x200Bh0x200Ahintegrado
AP-0x2011h0x2017hpromovido-a-regla
AP-0x2012h0x2018hpromovido-a-regla
AP-0x2013h0x7003hintegrado
AP-0x3001h0x3001hintegrado
AP-0x3002b0x3002hintegrado
AP-0x3002h0x3002hintegrado
AP-0x3008h0x3008hintegrado
AP-0x300Ah0x300Ahintegrado
AP-0x300Dh0x300Dhintegrado
AP-0x300Fh0x3013hintegrado
AP-0x3015h0x3015hintegrado
AP-0x3019h0x300Bhintegrado
AP-0x301Ah0x3016hintegrado
AP-0x301Bh0x3001hintegrado
AP-0x301Ch0x300Ahintegrado
AP-0x301Dh0x3008hintegrado
AP-0x301Eh0x300Bhintegrado
AP-0x301Fh0x3001hintegrado
AP-0x3020h0x300Ahintegrado
AP-0x3021h0x3002hintegrado
AP-0x3022h0x3002hintegrado
AP-0x3023h0x3001hintegrado
AP-0x3024h0x3001hintegrado
AP-0x3025h0x3002hintegrado
AP-0x3026h0x3001hintegrado
AP-0x3027h0x300Bhintegrado
AP-0x3028h0x300Ahintegrado
AP-0x3029h0x3001hintegrado
AP-0x302Ah0x300Ahintegrado
AP-0x4002h0x4006hintegrado
AP-0x4006h0x400Bhpromovido-a-regla
AP-0x4008b0x400Chpromovido-a-regla
AP-0x4008h0x400Chpromovido-a-regla
AP-0x4009h0x4004hintegrado
AP-0x400Ah0x5006hintegrado
AP-0x400Bh0x4001hintegrado
AP-0x5004b0x5004hintegrado
AP-0x5004c0x5004hintegrado
AP-0x5004h0x5004hintegrado
AP-0x5008h0x5008hintegrado
AP-0x5009h0x5009hintegrado
AP-0x500Ah0x500Ahintegrado
AP-0x500Bh0x500Dhintegrado
AP-0x5014h0x5015hpromovido-a-regla
AP-0x5016h0x5015hpromovido-a-regla