Buscar/Modifica un proyecto C portable y veterano sin romper la compatibilidad

Modifica un proyecto C portable y veterano sin romper la compatibilidad

Úsalo si una IA cambia código C maduro que debe seguir compilando con compiladores antiguos, muchas plataformas y funciones opcionales. Compila y prueba lo afectado, sigue las reglas de estilo, memoria, commits, documentación y versiones, y deja cada parche pequeño y válido por sí solo.

Para usar estas reglas de IA
## Antes de cambiar, comprueba qué plataformas y variantes de funciones deben seguir funcionando - Trata la portabilidad, la estabilidad, la robustez y la compatibilidad con versiones anteriores como restricciones principales de diseño. - Ten en cuenta compilaciones que van desde una configuración mínima compatible con los estándares hasta una configuración gráfica completa con interfaces de scripts opcionales. - Lee la política de diseño de alto nivel del repositorio antes de cambiar la arquitectura o el comportamiento de cara al público. - Distingue el código fuente principal, los recursos de ejecución, las traducciones, las pruebas, la documentación, los subproyectos y el código incorporado desde upstream. - No presupongas el compilador, sistema operativo, conjunto de funciones o entorno gráfico más reciente. - Mantén un comportamiento coherente entre las variantes compatibles, salvo que el cambio esté controlado explícitamente por una puerta de funcionalidad. ## Compila y prueba la configuración afectada sin advertencias nuevas - Usa la ruta de compilación documentada para la plataforma y la cadena de herramientas actuales. - Regenera las declaraciones de funciones u otras interfaces derivadas mediante su generador, en vez de editar manualmente la salida generada. - Durante la iteración, ejecuta el archivo de prueba específico e inspecciona tanto la salida de mensajes como el registro detallado de pruebas. - Antes de entregar, exige una compilación limpia sin advertencias nuevas, las pruebas pertinentes aprobadas y un estilo de código que coincida con el archivo editado. - Cuando los procedimientos de compilación difieran entre plataformas, consulta la guía de instalación de esa plataforma en lugar de traducir los comandos por conjetura. - Amplía las pruebas cuando se vean afectados el código compartido, las combinaciones de funciones o los archivos de ejecución. ## Regenera los archivos generados desde su generador y respeta a sus responsables - Averigua qué directorios se generan, se importan desde upstream, se comparten con proyectos relacionados o tienen un responsable designado. - Cambia un archivo generado solo cuando cambie su fuente y mantén cualquier regeneración no relacionada fuera de los parches funcionales. - Tramita los cambios de recursos de ejecución mantenidos mediante el flujo documentado del responsable, sin eludir esa propiedad. - Actualiza las fechas o descripciones de cambio obligatorias al editar archivos de ejecución y ayuda que se distribuyen. - Añade la entrada de seguimiento de parches exigida por el repositorio para cambios en el código fuente principal, salvo donde exista una excepción explícita de directorio. - Nunca mezcles en un mismo parche actualizaciones de terceros, ruido generado, traducciones y limpieza de código no relacionada. ## Escribe el problema, no la solución, en el asunto del commit - Sigue exactamente la estructura de asunto y cuerpo de parche del repositorio. - Expón el problema en el asunto, no la implementación de la solución. - Escribe una oración completa para el problema y otra concisa para la solución, con la atribución y la puntuación exigidas. - Cuando el formato lo requiera, coloca la explicación opcional después del encabezado obligatorio de problema y solución, en prosa y no como lista. - Etiqueta las referencias corregidas, cerradas y relacionadas según sus significados distintos. - Incluye la certificación de desarrollo obligatoria y reconoce la ayuda de IA únicamente mediante el mecanismo de coautoría aceptado. ## Sigue el estilo C existente y evita sintaxis que los compiladores antiguos no admiten - Conserva la indentación lógica de 4 espacios y respeta las reglas específicas de cada archivo sobre tabuladores o solo espacios. - Coloca las llaves de apertura en líneas propias tanto en funciones como en estructuras de control. - Da formato a las definiciones de funciones con el tipo de retorno y el nombre de la función en la disposición establecida por el repositorio. - Respeta la ubicación de declaraciones del archivo circundante, en vez de modernizarla de forma oportunista. - Usa únicamente el lenguaje C de base documentado y las funciones más recientes que estén aprobadas; no introduzcas estructuras incompatibles con compiladores antiguos. - Ejecuta cualquier formateador específico del archivo después de editar y revisa sus diferencias. ## Usa los tipos del proyecto y pasa a los auxiliares la longitud de cadena ya conocida - Usa el sufijo de tipo personalizado del repositorio y evita los sufijos reservados por los estándares del sistema. - Conserva la migración de booleanos en curso: usa de forma coherente dentro de un parche la forma booleana establecida localmente y evita conversiones masivas. - Inicializa variables locales cuando la primera asignación no resulte evidente, pero no añadas inicializaciones redundantes que puedan ocultar una lectura sin inicializar. - Usa el auxiliar de longitud literal para literales de cadena y el formateador que devuelve la longitud cuando se necesite el tamaño escrito. - Cuando ya se conozca la longitud de una cadena, pásala a la operación que admite longitud en vez de volver a recorrerla. - Mantén cada puntero a un búfer de bytes junto a su longitud `size_t`; usa tipos enteros más estrechos solo cuando una interfaz heredada lo exija. ## Gestiona la memoria con los envoltorios del proyecto y libérala en cada error - Prefiere los envoltorios del repositorio frente a las operaciones directas de asignación, liberación, copia, movimiento, caracteres y espacios en blanco de la biblioteca estándar. - Elige los envoltorios por su gestión documentada de valores nulos, falta de memoria, solapamientos, codificación y coherencia entre plataformas. - Comprueba explícitamente que el divisor no sea cero antes de cada división, aunque una condición compuesta anterior parezca implicarlo. - Para cada asignación nueva, verifica las rutas de limpieza en caso de éxito, retorno anticipado y cada rama de error. - Conserva los tamaños de búfer en bytes y especifica el comportamiento de truncamiento, terminación y longitud escrita. - No sustituyas un envoltorio más seguro del proyecto por una llamada genérica a una biblioteca solo porque esta resulte más familiar. ## Sigue las reglas de nombres y macros, y mantén portables los archivos de make - Sigue las restricciones de nombres reservados, los identificadores prohibidos, los límites de longitud de los nombres de función, el espaciado y la regla de una instrucción por línea. - Usa el prefijo de funcionalidad establecido y la convención de macros en mayúsculas. - Comprueba las macros de funcionalidad mediante el patrón condicional compatible con el repositorio. - Mantén los archivos principales de compilación dentro del dialecto portable de make documentado; evita extensiones de asignación, patrones, shell y condicionales específicas de una implementación. - Reutiliza los tipos de cadena y bytes del proyecto y sus macros correspondientes. - Lee las referencias de estilo autorizadas antes de introducir un identificador, una macro o una regla de compilación nuevos. ## Escribe scripts de ejecución que funcionen también en entornos y versiones derivadas - Usa el estilo de scripts actual en los archivos nuevos y considera la compatibilidad con entornos de ejecución y variantes relacionadas. - Si la compatibilidad no está clara, pregunta antes de adoptar una construcción más reciente del lenguaje. - Sigue las convenciones de nombres de variables locales en las pruebas de scripts. - No repitas una puerta de funcionalidad dentro de pruebas individuales cuando el archivo ya controle esa función en su nivel superior. - Si el archivo no tiene una puerta de nivel superior, añade una puerta específica solo a las pruebas que requieran la función opcional. - Mantén los cambios de scripts de ejecución separados de una modernización no relacionada del lenguaje principal. ## Escribe pruebas de regresión que reproduzcan el fallo reportado - Prefiere una aserción determinista frente a una prueba que solo verifique que el programa no falla. - Para defectos de renderizado, añade una comparación de captura de pantalla; para datos incorrectos, comprueba la salida exacta. - Añade cobertura completa para el comportamiento nuevo, preferiblemente en un archivo de prueba pertinente ya existente. - Al corregir un defecto notificado, reproduce el escenario original y no solo un caso sintético simplificado. - Usa los auxiliares estándar para sesiones de terminal, volcados de pantalla, carga correcta de scripts y fallos esperados al cargar scripts. - Coloca las pruebas de sintaxis e indentación de los recursos de ejecución en sus conjuntos específicos. ## Actualiza la ayuda en el mismo parche y conserva su formato - Actualiza la documentación orientada al usuario en el mismo parche que cualquier cambio de opción o función. - Actualiza el encabezado de cambios del archivo de ayuda cuando edites documentación existente. - Conserva el formato de ayuda autorizado para encabezados de archivo, líneas de modo, ancho, alineación con tabuladores, etiquetas únicas, referencias cruzadas, títulos, ejemplos de código y notación resaltada. - Usa la operación segura de retabulación y revisa sus diferencias; no fuerces una reescritura amplia de espacios en blanco. - Mantén las etiquetas de enlace únicas en todo el conjunto y antepón un prefijo a las etiquetas específicas de extensiones cuando sea necesario. - Prefiere lenguaje neutral en cuanto al género para texto nuevo o modificado, sin reescribir texto no afectado solo con ese fin. ## Comprueba primero la fase de versiones y mantén accesible el comportamiento obsoleto - Determina si el proyecto está en un ciclo de desarrollo o en un período de estabilidad antes de proponer el alcance. - Durante un período de estabilidad, limita los cambios aceptados a correcciones claras de defectos, correcciones de seguridad, documentación, traducciones y mantenimiento de recursos de ejecución. - No introduzcas funciones nuevas ni cambios incompatibles con versiones anteriores en el núcleo durante la estabilidad. - Conserva el comportamiento publicado del núcleo entre versiones menores. - Mantén el comportamiento obsoleto accesible mediante configuración, documéntalo como obsoleto, permite desactivarlo durante la compilación cuando sea compatible y elimínalo solo en un ciclo posterior permitido. - Trata los recursos de ejecución conforme a su flexibilidad de mantenimiento documentada, sin debilitar las garantías del núcleo. ## Entrega parches en los que cada commit compile y pase las pruebas por sí solo - Lee la política de seguridad antes de informar de una posible vulnerabilidad o cambiar código sensible para la seguridad. - Asegúrate de que estén completos el formato del commit, la compilación limpia, las pruebas pertinentes, la cobertura de regresión, la documentación y la certificación. - Limita las diferencias al problema declarado: sin cambios de espacios aislados, refactorizaciones no relacionadas ni salida generada ajena. - En una serie de varios parches, exige que cada commit compile y apruebe sus propias pruebas por separado. - No dejes un cambio intermedio roto de forma intencionada para que otro posterior lo repare; combínalos. - Confirma que el comportamiento documentado y el comportamiento aplicado sigan coincidiendo, y describe los cambios intencionados en el registro del problema y la solución. ## Haz el cambio más pequeño y pregunta antes de actuar fuera del árbol de trabajo - Realiza el cambio mínimo que alcance el objetivo y respeta el código circundante, en vez de imponer una mejora amplia. - Divide un parche que resuelva varios problemas independientes. - Si un parche solo corrige un síntoma, indica el problema más profundo y la limitación de alcance elegida. - Reproduce un defecto antes de afirmar que existe y lee la implementación antes de afirmar lo que hace el código. - No dependas del contenido de archivos recordado cuando esté disponible el código fuente actual. - Confirma con el usuario antes de instalar paquetes, modificar archivos fuera del árbol de trabajo, hacer push de ramas o usar operaciones de red.