Buscar/Altere um projeto C portátil e antigo sem quebrar a compatibilidade

Altere um projeto C portátil e antigo sem quebrar a compatibilidade

Use se uma IA alterar código C maduro que precisa continuar compilando em compiladores antigos, muitas plataformas e recursos opcionais. Compila e testa o que foi afetado, segue as regras de estilo, memória, commits, documentação e versões, e deixa cada patch pequeno e válido por si só.

Para usar estas regras de IA
## Antes de mudar, verifique quais plataformas e variantes de recursos devem continuar funcionando - Trate portabilidade, estabilidade, robustez e compatibilidade com versões anteriores como restrições principais de projeto. - Considere compilações que vão de uma configuração mínima compatível com padrões até uma configuração gráfica completa com interfaces de script opcionais. - Leia a política de projeto de alto nível do repositório antes de alterar a arquitetura ou o comportamento visível ao público. - Diferencie o código-fonte principal, os recursos de tempo de execução, as traduções, os testes, a documentação, os subprojetos e o código externo incorporado. - Não pressuponha o compilador, sistema operacional, conjunto de recursos ou ambiente gráfico mais recente. - Mantenha o comportamento coerente entre as variantes suportadas, a menos que a alteração seja controlada explicitamente por uma chave de recurso. ## Compile e teste a configuração afetada sem novos avisos - Use o caminho de compilação documentado para a plataforma e a cadeia de ferramentas atuais. - Regenere declarações de funções ou outras interfaces derivadas por meio do respectivo gerador, em vez de editar manualmente a saída gerada. - Durante a iteração, execute o arquivo de teste específico e examine tanto a saída de mensagens quanto o registro detalhado dos testes. - Antes do envio, exija uma compilação limpa, sem novos avisos, os testes relevantes aprovados e um estilo de código-fonte compatível com o arquivo editado. - Quando os procedimentos de compilação variarem entre plataformas, consulte o guia de instalação da plataforma em vez de adaptar comandos por suposição. - Amplie os testes quando código compartilhado, combinações de recursos ou arquivos de tempo de execução forem afetados. ## Regenere arquivos gerados só pelo gerador e respeite os responsáveis pelos arquivos - Descubra quais diretórios são gerados, importados de uma fonte externa, compartilhados com projetos relacionados ou mantidos por uma pessoa responsável designada. - Altere um arquivo gerado somente quando sua fonte mudar e mantenha qualquer regeneração não relacionada fora de patches funcionais. - Encaminhe alterações em recursos de tempo de execução mantidos pelo fluxo documentado da pessoa responsável, sem contornar essa responsabilidade. - Atualize as datas ou descrições de alteração obrigatórias ao editar arquivos de tempo de execução e ajuda que são distribuídos. - Adicione a entrada de rastreamento de patches exigida pelo repositório para alterações no código-fonte principal, exceto quando houver uma exceção explícita de diretório. - Nunca misture em um único patch atualizações de código externo, ruído gerado, traduções e limpeza de código-fonte não relacionada. ## Escreva no assunto do commit o problema, não a solução - Siga exatamente a estrutura de assunto e corpo de patch definida pelo repositório. - Declare o problema no assunto, não a implementação da solução. - Escreva uma frase completa para o problema e uma frase concisa para a solução, com a atribuição e a pontuação obrigatórias. - Quando o formato exigir, coloque a explicação opcional após o cabeçalho obrigatório de problema e solução, usando prosa em vez de listas. - Rotule referências corrigidas, encerradas e relacionadas de acordo com seus significados distintos. - Inclua a certificação obrigatória da pessoa desenvolvedora e reconheça a assistência de IA somente pelo mecanismo de coautoria aceito. ## Siga o estilo C existente e evite sintaxe que compiladores antigos não aceitam - Preserve o recuo lógico de 4 espaços, respeitando as regras específicas de cada arquivo para tabulações ou somente espaços. - Coloque as chaves de abertura em linhas próprias para funções e estruturas de controle. - Formate as definições de função com o tipo de retorno e o nome da função na disposição estabelecida pelo repositório. - Siga a posição das declarações no arquivo ao redor, em vez de modernizá-la de modo oportunista. - Use somente a linguagem C de base documentada e os recursos mais recentes que tenham sido aprovados; não introduza construções incompatíveis com compiladores antigos. - Execute qualquer formatador específico do arquivo após a edição e examine suas diferenças. ## Use os tipos do projeto e passe aos auxiliares o comprimento de string já conhecido - Use o sufixo de tipo personalizado do repositório e evite sufixos reservados por padrões do sistema. - Preserve a migração booleana em andamento: use de forma coerente, dentro de um patch, a forma booleana estabelecida localmente e evite conversões em massa. - Inicialize variáveis locais quando a primeira atribuição não for evidente, mas não adicione inicializações redundantes que possam ocultar uma leitura não inicializada. - Use o auxiliar de comprimento literal para literais de string e o formatador que retorna o comprimento quando o tamanho gravado for necessário. - Quando o comprimento de uma string já for conhecido, passe-o à operação ciente do comprimento, em vez de percorrê-la novamente. - Mantenha cada ponteiro para um buffer de bytes junto de seu comprimento `size_t`; use tipos inteiros mais estreitos somente quando uma interface legada exigir. ## Gerencie a memória com os wrappers do projeto e libere-a em todo erro - Prefira as funções envoltórias do repositório às operações diretas de alocação, liberação, cópia, movimentação, caracteres e espaços em branco da biblioteca padrão. - Escolha as funções envoltórias pelo tratamento documentado de valores nulos, falta de memória, sobreposição, codificação e consistência entre plataformas. - Verifique explicitamente se o divisor não é zero antes de cada divisão, mesmo que uma condição composta anterior pareça garantir isso. - Para cada nova alocação, verifique os caminhos de limpeza em caso de sucesso, retorno antecipado e cada ramo de erro. - Mantenha os tamanhos de buffer em bytes e torne explícito o comportamento de truncamento, terminação e comprimento gravado. - Não substitua uma função envoltória mais segura do projeto por uma chamada genérica de biblioteca apenas por ela ser mais familiar. ## Siga as regras de nomes e macros e mantenha os arquivos de make portáteis - Siga as restrições de nomes reservados, identificadores proibidos, limites de comprimento de nomes de função, espaçamento e a regra de uma instrução por linha. - Use o prefixo estabelecido para recursos e a convenção de macros em maiúsculas. - Teste macros de recurso com o padrão condicional suportado pelo repositório. - Mantenha os arquivos principais de compilação dentro do dialeto portátil de make documentado; evite extensões de atribuição, padrão, shell e condicionais específicas de uma implementação. - Reutilize os tipos de string e bytes do projeto e suas macros correspondentes. - Leia as referências oficiais de estilo antes de introduzir um novo identificador, macro ou regra de compilação. ## Escreva scripts de execução que funcionem também em ambientes e derivações relacionados - Use o estilo de script atual em novos arquivos, considerando a compatibilidade com ambientes de execução e derivações relacionadas. - Quando a compatibilidade for incerta, pergunte antes de adotar uma construção mais recente da linguagem. - Siga as convenções de nomes de variáveis locais nos testes de script. - Não repita uma chave de recurso em testes individuais quando o arquivo já controlar esse recurso no nível superior. - Se o arquivo não tiver um controle no nível superior, adicione um controle específico somente aos testes que exigirem o recurso opcional. - Mantenha alterações em scripts de tempo de execução separadas de uma modernização não relacionada da linguagem principal. ## Escreva testes de regressão que reproduzam o defeito relatado - Prefira uma asserção determinística a um teste que apenas verifique que o programa não falha. - Para defeitos de renderização, adicione uma comparação de captura de tela; para dados incorretos, verifique a saída exata. - Adicione cobertura abrangente para o novo comportamento, de preferência em um arquivo de teste relevante já existente. - Ao corrigir um defeito relatado, reproduza o cenário original, em vez de apenas um caso sintético simplificado. - Use os auxiliares padrão para sessões de terminal, despejos de tela, carregamento bem-sucedido de scripts e falhas esperadas no carregamento de scripts. - Coloque testes de sintaxe e recuo dos recursos de tempo de execução em suas suítes dedicadas. ## Atualize a documentação de ajuda no mesmo patch e mantenha o formato dela - Atualize a documentação voltada à pessoa usuária no mesmo patch de qualquer alteração de opção ou recurso. - Atualize o cabeçalho de alterações do arquivo de ajuda ao editar a documentação existente. - Preserve o formato oficial da ajuda para cabeçalhos de arquivo, linhas de modo, largura, alinhamento por tabulações, tags exclusivas, referências cruzadas, títulos, exemplos de código e notação realçada. - Use a operação segura de retabulação e examine suas diferenças; não force uma reescrita ampla de espaços em branco. - Mantenha as tags de link exclusivas em todo o conjunto e adicione um prefixo às tags específicas de extensões quando necessário. - Prefira linguagem neutra em relação a gênero em textos novos ou alterados, sem reescrever texto não afetado apenas para essa finalidade. ## Verifique primeiro a fase de versões e mantenha o comportamento obsoleto acessível - Determine se o projeto está em um ciclo de desenvolvimento ou em um período de estabilidade antes de propor o escopo. - Durante um período de estabilidade, limite as alterações aceitas a correções claras de defeitos, correções de segurança, documentação, traduções e manutenção de recursos de tempo de execução. - Não introduza novos recursos nem alterações no núcleo incompatíveis com versões anteriores durante a estabilidade. - Preserve o comportamento publicado do núcleo entre versões secundárias. - Mantenha o comportamento obsoleto acessível pela configuração, documente-o como obsoleto, permita desativá-lo durante a compilação quando houver suporte e remova-o somente em um ciclo posterior permitido. - Trate os recursos de tempo de execução conforme sua flexibilidade de manutenção documentada, sem enfraquecer as garantias do núcleo. ## Envie patches em que cada commit compile e passe nos testes sozinho - Leia a política de segurança antes de relatar uma possível vulnerabilidade ou alterar código sensível à segurança. - Garanta que estejam completos o formato do commit, a compilação limpa, os testes relevantes, a cobertura de regressão, a documentação e a certificação. - Limite as diferenças ao problema declarado: sem alterações isoladas de espaços, refatorações não relacionadas ou saída gerada alheia. - Em uma série com vários patches, exija que cada commit compile e passe em seus próprios testes de forma independente. - Não deixe um commit intermediário intencionalmente quebrado para ser reparado por outro posterior; combine-os. - Confirme que o comportamento documentado e o comportamento imposto ainda coincidem e descreva alterações intencionais no registro de problema e solução. ## Faça a menor mudança possível e pergunte antes de agir fora da árvore de trabalho - Faça a menor alteração que alcance o objetivo e siga o código ao redor, em vez de impor uma melhoria ampla. - Divida um patch que resolva vários problemas independentes. - Se um patch tratar apenas um sintoma, informe o problema mais profundo e a limitação de escopo escolhida. - Reproduza um defeito antes de afirmar que ele existe e leia a implementação antes de afirmar o que o código faz. - Não dependa do conteúdo de arquivos lembrado quando o código-fonte atual estiver disponível. - Confirme com a pessoa usuária antes de instalar pacotes, modificar arquivos fora da árvore de trabalho, enviar branches ou usar operações de rede.