Red Hat Training
A Red Hat training course is available for RHEL 8
Capítulo 16. Compiladores e ferramentas de desenvolvimento
16.1. Mudanças na cadeia de ferramentas desde a RHEL 7
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
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_overflow
e__builtin_mul_overflow
. -
A opção
-fstack-clash-protection
foi adicionada para gerar um código adicional de proteção contra o choque da pilha. -
A opção
-fcf-protection
foi 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-truncation
lista chamadas para funções de manipulação de cordas delimitadas comostrncat
,strncpy
, oustpncpy
que podem truncar a corda copiada ou deixar o destino inalterado. -
A opção de aviso
-Warray-bounds
foi melhorada para detectar índices de matriz fora de limites e compensações de ponteiro melhor. -
A opção de aviso
-Wclass-memaccess
foi adicionada para alertar sobre a manipulação potencialmente insegura de objetos de classes não triviais por funções de acesso à memória bruta, comomemcpy
ourealloc
.
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=native
nas 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_type
GNU C fornece um subconjunto da funcionalidade da palavra-chave C 11auto
na linguagem C. -
Os nomes dos tipos
_FloatN
e_FloatNx
especificados 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
alignof
foi corrigido para combinar com o operador C_Alignof
e retornar alinhamento mínimo. Para encontrar o alinhamento preferido, use a extensão GNU__alignof__
. -
A versão principal da biblioteca
libgfortran
para 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
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-bounds
foi 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
-Wrestrict
introduzida 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, comomemcpy
estrcpy
. -
A opção
-Wnonnull
foi 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-protection
foi 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
16.1.3. Mudanças de compatibilidade no GCC em RHEL 8
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.