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 como strncat, strncpy, ou stpncpy 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, como memcpy ou realloc.

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 11 auto 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.

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çãoExibe avisos para

-Wstringop-truncation

Chamadas para funções de manipulação de cordas delimitadas tais como strncat, strncpy e stpncpy que podem truncar a corda copiada ou deixar o destino inalterado.

-Wclass-memaccess

Objetos de classes não triviais manipulados de maneiras potencialmente inseguras por funções de memória bruta, como memcpy ou realloc.

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.

-Wmisleading-indentation

Lugares onde a recuo do código dá uma idéia enganosa da estrutura do bloco do código a um leitor humano.

-Walloc-size-larger-than=size

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 alloc_size.

-Walloc-zero

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 alloc_size.

-Walloca

Todas as chamadas para a função alloca.

-Walloca-larger-than=size

Chamadas para a função alloca onde a memória solicitada é superior a size.

-Wvla-larger-than=size

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.

-Wformat-overflow=level

Tanto certo e provável excesso de buffer em chamadas para a família sprintf de funções de saída formatadas. Para mais detalhes e explicação do valor level, consulte a página do manual gcc(1).

-Wformat-truncation=level

Truncagem de saída certa e provável nas chamadas para a família snprintf de funções de saída formatadas. Para mais detalhes e explicação do valor level, consulte a página do manual gcc(1).

-Wstringop-overflow=type

O excesso de buffer em chamadas para funções de manuseio de strings, como memcpy e strcpy. Para mais detalhes e explicação do valor level, consulte a página do manual gcc(1).

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, como memcpy e strcpy.
  • 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 atributo nonnull).

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çãoVerifique

-fsanitize=float-divide-by-zero

Detectar divisão de ponto flutuante por zero.

-fsanitize=float-cast-overflow

Verifique se o resultado das conversões de ponto flutuante para inteiro não transborda.

-fsanitize=bounds

Permitir a instrumentação de limites de matriz e detectar acessos fora dos limites.

-fsanitize=alignment

Permitir a verificação do alinhamento e detectar vários objetos desalinhados.

-fsanitize=object-size

Permitir a verificação do tamanho do objeto e detectar vários acessos fora dos limites.

-fsanitize=vptr

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.

-fsanitize=bounds-strict

Permitir uma verificação rigorosa dos limites da matriz. Isto permite -fsanitize=bounds e a instrumentação de matrizes flexíveis como matrizes de membros.

-fsanitize=signed-integer-overflow

Diagnosticar transbordos aritméticos mesmo em operações aritméticas com vetores genéricos.

-fsanitize=builtin

Diagnosticar em tempo de execução argumentos inválidos para __builtin_clz ou __builtin_ctz prefixados construídos. Inclui cheques de -fsanitize=undefined.

-fsanitize=pointer-overflow

Realizar testes de tempo de execução baratos para embrulho de ponteiro. Inclui cheques do site -fsanitize=undefined.

Novas opções para o AddressSanitizer

Estas opções foram adicionadas ao AddressSanitizer:

OpçãoVerifique

-fsanitize=pointer-compare

Advertir sobre a comparação de ponteiros que apontam para um objeto de memória diferente.

-fsanitize=pointer-subtract

Advertir sobre a subtração de ponteiros que apontam para um objeto de memória diferente.

-fsanitize-address-use-after-scope

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.