Capítulo 16. Compiladores e ferramentas de desenvolvimento
16.1. Mudanças na cadeia de ferramentas desde a RHEL 7 Copiar o linkLink copiado para a área de transferência!
As seguintes seções listam as mudanças na cadeia de ferramentas desde o lançamento dos componentes descritos no Red Hat Enterprise Linux
16.1.1. Mudanças no GCC em RHEL 8 Copiar o linkLink copiado para a área de transferência!
No Red Hat Enterprise Linux 8, o conjunto de ferramentas GCC é baseado na série de lançamentos GCC 8.2. Mudanças notáveis desde o Red Hat Enterprise Linux 7 incluem:
- Numerosas otimizações gerais foram adicionadas, tais como análise de alias, melhorias de vetorizadores, dobramento de código idêntico, análise inter-processal, passe de otimização de fusão de lojas, e outras.
- O endereço Sanitizer foi melhorado.
- Foi adicionado o Saneante de vazamento para detecção de vazamentos de memória.
- Foi adicionado o Higienizador de Comportamento Indefinido para detecção de comportamento indefinido.
- As informações de depuração podem agora ser produzidas no formato DWARF5. Esta capacidade é experimental.
- A ferramenta de análise de cobertura de código fonte GCOV foi ampliada com várias melhorias.
- O suporte para a especificação OpenMP 4.5 foi adicionado. Além disso, as características de descarga da especificação OpenMP 4.0 são agora suportadas pelos compiladores C, C , e Fortran.
- Novos avisos e diagnósticos melhorados foram acrescentados para a detecção estática de certos erros de programação prováveis.
- Os locais de origem são agora rastreados como intervalos e não como pontos, o que permite diagnósticos muito mais ricos. O compilador agora oferece dicas "fix-it", sugerindo possíveis modificações de código. Um corretor ortográfico foi adicionado para oferecer nomes alternativos e facilitar a detecção de erros de digitação.
Segurança
O GCC foi ampliado para fornecer ferramentas para garantir o endurecimento adicional do código gerado. As melhorias relacionadas à segurança incluem:
-
Foram acrescentadas as funções embutidas para aritmética com verificação de transbordo:
__builtin_add_overflow,__builtin_sub_overflowe__builtin_mul_overflow. -
A opção
-fstack-clash-protectionfoi adicionada para gerar um código adicional de proteção contra o choque da pilha. -
A opção
-fcf-protectionfoi introduzida para verificar os endereços-alvo das instruções de fluxo de controle para aumentar a segurança do programa. -
A nova opção de aviso
-Wstringop-truncationlista chamadas para funções de manipulação de cordas delimitadas comostrncat,strncpy, oustpncpyque podem truncar a corda copiada ou deixar o destino inalterado. -
A opção de aviso
-Warray-boundsfoi melhorada para detectar índices de matriz fora de limites e compensações de ponteiro melhor. -
A opção de aviso
-Wclass-memaccessfoi adicionada para alertar sobre a manipulação potencialmente insegura de objetos de classes não triviais por funções de acesso à memória bruta, comomemcpyourealloc.
Arquitetura e suporte de processador
As melhorias na arquitetura e no suporte do processador incluem:
- Várias novas opções específicas de arquitetura para a arquitetura Intel AVX-512, várias de suas microarquiteturas e Extensões de Proteção de Software Intel (SGX) foram adicionadas.
- A geração de códigos pode agora visar as extensões LSE de arquitetura ARM de 64 bits, ARMv8.2-A Extensões de ponto flutuante de 16 bits (FPE) e ARMv8.2-A, ARMv8.3-A, e ARMv8.4-A versões de arquitetura.
-
O manuseio da opção
-march=nativenas arquiteturas ARM e ARM de 64 bits foi corrigido. - Foi adicionado suporte para os processadores z13 e z14 da arquitetura IBM Z.
Idiomas e normas
As mudanças notáveis relacionadas a idiomas e normas incluem:
- O padrão padrão usado na compilação de código na linguagem C mudou para C17 com extensões GNU.
- O padrão padrão usado na compilação de código na linguagem C mudou para C 14 com extensões GNU.
- A biblioteca de tempo de execução C agora suporta as normas C 11 e C 14.
-
O compilador C agora implementa o padrão C 14 com muitas características novas, tais como modelos variáveis, agregados com inicializadores de dados não estáticos, o especificador estendido
constexpr, funções de desalocação de tamanho, lambdas genéricas, matrizes de comprimento variável, separadores de dígitos e outros. - O suporte ao padrão de linguagem C11 foi melhorado: Atomics ISO C11, seleções genéricas e armazenamento local de fios estão agora disponíveis.
-
A nova extensão
__auto_typeGNU C fornece um subconjunto da funcionalidade da palavra-chave C 11autona linguagem C. -
Os nomes dos tipos
_FloatNe_FloatNxespecificados pela norma ISO/IEC TS 18661-3:2015 são agora reconhecidos pelo front end C. -
O padrão padrão usado na compilação de código na linguagem C mudou para C17 com extensões GNU. Isto tem o mesmo efeito que o uso da opção
--std=gnu17. Anteriormente, o padrão era C89 com extensões GNU. - A GCC pode agora compilar experimentalmente o código usando o padrão de linguagem C 17 e certas características do padrão C 20.
- Passar uma classe vazia como argumento agora não ocupa espaço nas arquiteturas Intel 64 e AMD64, como exigido pela plataforma ABI. Passar ou devolver uma classe com apenas uma cópia eliminada e mover construtores agora usa a mesma convenção de chamada que uma classe com uma cópia não trivial ou mover construtores.
-
O valor retornado pelo operador C 11
alignoffoi corrigido para combinar com o operador C_Alignofe retornar alinhamento mínimo. Para encontrar o alinhamento preferido, use a extensão GNU__alignof__. -
A versão principal da biblioteca
libgfortranpara o código do idioma Fortran foi alterada para 5. - O suporte para os idiomas Ada (GNAT), GCC Go e Objective C/C foi removido. Use o conjunto de ferramentas Go para o desenvolvimento do código Go.
Recursos adicionais
- Veja também as Notas de Lançamento do Red Hat Enterprise Linux 8.
- Usando o Go Toolset
16.1.2. Melhorias de segurança no GCC em RHEL 8 Copiar o linkLink copiado para a área de transferência!
Esta seção descreve em detalhes as mudanças no GCC relacionadas à segurança e acrescentadas desde o lançamento do Red Hat Enterprise Linux
Novos avisos
Estas opções de advertência foram acrescentadas:
| Opção | Exibe avisos para |
|---|---|
|
|
Chamadas para funções de manipulação de cordas delimitadas tais como |
|
|
Objetos de classes não triviais manipulados de maneiras potencialmente inseguras por funções de memória bruta, como O aviso ajuda a detectar chamadas que contornam construtores ou operadores de atribuição de cópia definidos pelo usuário, indicadores de tabela virtual corruptos, membros de dados de tipos ou referências constantes-qualificados, ou indicadores de membros. O aviso também detecta chamadas que contornariam os controles de acesso aos membros dos dados. |
|
| Lugares onde a recuo do código dá uma idéia enganosa da estrutura do bloco do código a um leitor humano. |
|
|
Chamadas para funções de alocação de memória onde a quantidade de memória a ser alocada ultrapassa size. Funciona também com funções onde a alocação é especificada multiplicando dois parâmetros e com qualquer função decorada com atributo |
|
|
Chamadas para funções de alocação de memória que tentam alocar uma quantidade zero de memória. Funciona também com funções onde a alocação é especificada multiplicando dois parâmetros e com qualquer função decorada com atributo |
|
|
Todas as chamadas para a função |
|
|
Chamadas para a função |
|
| Definições de matrizes de comprimento variável (VLA) que podem ou exceder o tamanho especificado ou cujo limite não é conhecido para ser suficientemente limitado. |
|
|
Tanto certo e provável excesso de buffer em chamadas para a família |
|
|
Truncagem de saída certa e provável nas chamadas para a família |
|
|
O excesso de buffer em chamadas para funções de manuseio de strings, como |
Melhorias de advertência
Estas advertências do GCC foram melhoradas:
-
A opção
-Warray-boundsfoi melhorada para detectar mais instâncias de índices de matriz fora dos limites e offsets de ponteiro. Por exemplo, índices negativos ou excessivos em membros de matriz flexível e literais de cordas são detectados. -
A opção
-Wrestrictintroduzida no GCC 7 foi aprimorada para detectar muito mais casos de sobreposição de acessos a objetos através de argumentos restritos a memória padrão e funções de manipulação de cordas, comomemcpyestrcpy. -
A opção
-Wnonnullfoi aperfeiçoada para detectar um conjunto mais amplo de casos de passagem de indicações nulas para funções que esperam um argumento não-nulo (decorado com atributononnull).
Novo Anti-Comportamento Não Definido
Foi adicionado um novo higienizador de tempo de execução para detectar comportamento indefinido chamado UndefinedBehaviorSanitizer. As seguintes opções são dignas de nota:
| Opção | Verifique |
|---|---|
|
| Detectar divisão de ponto flutuante por zero. |
|
| Verifique se o resultado das conversões de ponto flutuante para inteiro não transborda. |
|
| Permitir a instrumentação de limites de matriz e detectar acessos fora dos limites. |
|
| Permitir a verificação do alinhamento e detectar vários objetos desalinhados. |
|
| Permitir a verificação do tamanho do objeto e detectar vários acessos fora dos limites. |
|
| Permitir a verificação das chamadas de funções de membros C, acessos de membros e algumas conversões entre apontadores para classes base e derivadas. Além disso, detectar quando os objetos referenciados não têm o tipo dinâmico correto. |
|
|
Permitir uma verificação rigorosa dos limites da matriz. Isto permite |
|
| Diagnosticar transbordos aritméticos mesmo em operações aritméticas com vetores genéricos. |
|
|
Diagnosticar em tempo de execução argumentos inválidos para |
|
|
Realizar testes de tempo de execução baratos para embrulho de ponteiro. Inclui cheques do site |
Novas opções para o AddressSanitizer
Estas opções foram adicionadas ao AddressSanitizer:
| Opção | Verifique |
|---|---|
|
| Advertir sobre a comparação de ponteiros que apontam para um objeto de memória diferente. |
|
| Advertir sobre a subtração de ponteiros que apontam para um objeto de memória diferente. |
|
| Sanitizar variáveis cujo endereço é tomado e utilizado após um escopo onde a variável é definida. |
Outros higienizadores e instrumentação
-
A opção
-fstack-clash-protectionfoi adicionada para inserir sondas quando o espaço da pilha é alocado de forma estática ou dinâmica para detectar de forma confiável os transbordamentos da pilha e assim mitigar o vetor de ataque que depende de saltar sobre uma página de proteção da pilha fornecida pelo sistema operacional. -
Uma nova opção
-fcf-protection=[full|branch|return|none]foi adicionada para executar a instrumentação de código e aumentar a segurança do programa, verificando se os endereços-alvo das instruções de transferência de fluxo de controle (tais como chamada de função indireta, retorno de função, salto indireto) são válidos.
Recursos adicionais
Para mais detalhes e explicação dos valores fornecidos a algumas das opções acima, consulte a página do manual gcc(1):
homem gcc
$ homem gccCopy to Clipboard Copied! Toggle word wrap Toggle overflow
16.1.3. Mudanças de compatibilidade no GCC em RHEL 8 Copiar o linkLink copiado para a área de transferência!
C ABI muda em std::string e std::list
A Interface Binária de Aplicação (ABI) das classes std::string e std::list da biblioteca libstdc mudou entre a RHEL 7 (GCC 4.8) e a RHEL 8 (GCC 8) para estar em conformidade com o padrão C 11. A biblioteca libstdc suporta tanto a antiga como a nova ABI, mas algumas outras bibliotecas do sistema C não suportam. Como conseqüência, as aplicações que se ligam dinamicamente a essas bibliotecas precisarão ser reconstruídas. Isto afeta todos os modos padrão C, incluindo o C 98. Também afeta as aplicações construídas com compiladores Red Hat Developer Toolset para RHEL 7, que mantiveram a antiga ABI para manter a compatibilidade com as bibliotecas do sistema.
O GCC não constrói mais código Ada, Go e Objective C/C
A capacidade de construir código no Ada (GNAT), GCC Go e Objective C/C languages foi removida do compilador GCC.
Para construir o código Go, use o Go Toolset em seu lugar.