paulo1205
(usa Ubuntu)
Enviado em 08/03/2019 - 11:27h
As opções de compilação que eu lhe mostrei aumentam o nível de diagnóstico de código.
•
-Wall instrui o compilador a mostrar a maior quantidade possível de alertas sobre código que pode ter comportamento perigoso. Isso inclui casos de situações que são sintaticamente válidas, mas potencialmente perigosas ou inócuas (por exemplo: certas comparações entre inteiros com sinal e inteiros sem sinal, atribuições de valores a variáveis que possam provocar truncamento, alguns usos de operadores em contextos pouco usuais, entre outros). Mas pode incluir também verificações sobre atributos de variáveis e funções, deliberadamente aplicados sobre elas no momento de suas declarações.
Alguns sistemas (particularmente aqueles derivados do Debian) aplicam atributos a funções da biblioteca padrão com vistas à segurança de código, particularmente no caso de funções cuja execução com erro pode impactar o restante da execução do programa, e mais especialmente ainda quando tais funções sinalizam esses eventuais erros ao programador, de modo que ele teria condições de evitar ou mitigar efeitos desses possíveis erros, se tão-somente tratar a sinalização que lhe foi dada. A função
system() é uma dessas funções, cujo valor de retorno indica com que grau de sucesso ou falha o comando solicitado pode ter executado, e por isso ela é marcada com um atributo de produzir alertas caso o valor de retorno seja desprezado. Outros exemplos de funções com tal atributo são
scanf(),
fgets() e
malloc(), entre outras.
-Wall, por si só, apenas emite alertas, sem impedir o progresso da compilação, porém...
•
-Werror faz com que o compilador trate todos os alertas com o mesmo grau de gravidade de erros, impedindo, portanto, o progresso da compilação. Eu gosto dessa opção para me obrigar a tomar ciência de código que pode ser perigoso e me educar a programar de um modo mais seguro.
•
-pedantic-errors eleva ainda mais o rigor na análise de comportamento que poderia produzir alertas, atentando para aspectos de conformidade do código com certas regras prescritas nos padrões das linguagens de programação C ou C++, a um nível que algumas pessoas poderiam considerar pedantismo (por isso o nome da opção), e ainda faz com que tais alertas sejam convertidos em erros, impedindo o progresso da compilação.
Creio que tais opções têm um caráter realmente educador, na medida em que obrigam o programador a não se contentar com o menor esforço, que permite que um programa funcione apenas se nada de errado acontecer. Isso pode parecer bobagem no caso de um pequeno programa de testes, mas muitos dos hábitos que nós adquirimos em nossas vidas de programadores vêm da época do nosso aprendizado e dos programinhas de testes do nosso dia-a-dia (os quais, em última análise, são também parte do nosso processo de aprendizado continuado). Um dia, a alocação de memória que quase nunca falha vai eventualmente falhar, o arquivo que sempre esteve presente abre não vai abrir por não ter sido encontrado ou não vai poder ser criado porque o disco está cheio ou porque a conexão de rede caiu, o fim do arquivo vai chegar numa hora inesperada e produzir uma entrada que vai gerar dados inválidos, que não podem ser tratados como se válidos fossem.
A mudança de paradigma pode parecer um pouco penosa a princípio, pois é inegável que gerar código que intercepte e teste a possibilidade de erro dá mais trabalho do que executar tudo às cegas, mas depois de um tempo a gente se habitua e o novo estilo de programar flui muito mais naturalmente.
... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)