Após seis meses de desenvolvimento, foi apresentado o lançamento do projeto LLVM 15.0 - um kit de ferramentas compatível com GCC (compiladores, otimizadores e geradores de código) que compila programas em bitcode intermediário de instruções virtuais do tipo RISC (uma máquina virtual de baixo nível com um sistema de otimização multinível). O pseudocódigo gerado pode ser convertido usando um compilador JIT em instruções de máquina diretamente no momento da execução do programa.
Principais melhorias no Clang 15.0:
- Para sistemas baseados em x86, foi adicionada a flag "-fzero-call-used-regs". Isso garante que todos os registradores da CPU usados em uma função sejam zerados antes de retornar o controle. Essa opção ajuda a evitar vazamentos de informações de funções e reduz em aproximadamente 20% o número de blocos adequados para a construção de gadgets ROP (Programação Orientada a Retorno) em exploits.
- A randomização do layout da memória de estruturas foi implementada para código C, o que complica a extração de dados das estruturas em caso de exploração de vulnerabilidades. A randomização é habilitada e desabilitada usando os atributos `randomize_layout` e `no_randomize_layout` e requer a definição de uma semente usando a flag `-frandomize-layout-seed` ou `-frandomize-layout-seed-file`.
- Adicionada a flag "-fstrict-flex-arrays= ", que permite controlar os limites de um elemento de matriz flexível em estruturas (Membros de Matriz Flexível, uma matriz de tamanho indefinido no final da estrutura). Quando definido como 0 (o padrão), o último elemento da estrutura com uma matriz é sempre tratado como uma matriz flexível; 1 - apenas as dimensões [], [0] e [1] são tratadas como uma matriz flexível; 2 - apenas as dimensões [] e [0] são tratadas como uma matriz flexível.
- Adicionado suporte experimental para a linguagem HLSL (High-Level Shader Language), semelhante à linguagem C, usada no DirectX para escrever shaders.
- Adicionada a opção "-Warray-parameter", que alerta sobre a redefinição de funções com declarações de argumentos incompatíveis relacionados a arrays de comprimento fixo e de comprimento variável.
- Compatibilidade aprimorada com MSVC. Adicionado suporte para "#pragma function" (instrui o compilador a gerar uma chamada de função em vez de expandi-la inline) e "#pragma alloc_text" (define o nome da seção que contém o código da função), ambos fornecidos pelo MSVC. Adicionado suporte para as flags /JMC e /JMC compatíveis com MSVC.
- O trabalho continuou no suporte aos próximos padrões C2X e C++23. Para a linguagem C, foram implementados: o atributo noreturn, as palavras-chave false e true, o tipo _BitInt(N) para inteiros com uma determinada largura de bits, as macros *_WIDTH e o prefixo u8 para caracteres UTF-8.
Para C++, os seguintes recursos são implementados: fusão de módulos, isolamento ABI de membros de função, inicialização dinâmica ordenada de variáveis não locais em módulos, operadores de índice multidimensionais, auto(x), variáveis não literais, goto e rótulos em funções declaradas como constexpr, sequências de escape com delimitadores, caracteres de escape nomeados.
- O suporte para OpenCL e OpenMP foi expandido. Foi adicionado suporte para a extensão OpenCL cl_khr_subgroup_rotate.
- Para a arquitetura x86, foi adicionada proteção contra vulnerabilidades em processadores causadas pela execução especulativa de instruções após operações de salto direto incondicional. O problema surge devido ao processamento antecipado de instruções imediatamente após uma instrução de salto (SLS, Straight Line Speculation). A opção "-mharden-sls=[none|all|return|indirect-jmp]" está disponível para habilitar a proteção.
- Para plataformas que suportam a extensão SSE2, foi adicionado o tipo _Float16, que é emulado usando o tipo float na ausência de suporte para instruções AVX512-FP16.
- Adicionada a flag "-m[no-]rdpru" para controlar o uso da instrução RDPRU, suportada desde os processadores AMD Zen2.
- Adicionada a flag "-mfunction-return=thunk-extern" para proteção contra a vulnerabilidade RETBLEED, que funciona adicionando uma sequência de instruções que exclui o envolvimento do mecanismo de execução especulativa para saltos indiretos.
Principais inovações no LLVM 15.0:
- Adicionado suporte para CPU Cortex-M85, arquiteturas Armv9-A, Armv9.1-A e Armv9.2-A, e extensões Armv8.1-M PACBTI-M.
- Foi adicionado um backend DirectX experimental que suporta o formato DXIL (DirectX Intermediate Language) usado para shaders DirectX. O backend é habilitado especificando o parâmetro de compilação "-DLLVM_EXPERIMENTAL_TARGETS_TO_BUILD=DirectX".
- A Libc++ continua a implementar novos recursos dos padrões C++20 e C++2b, incluindo a conclusão da implementação da biblioteca "format" e a oferta de uma versão experimental da biblioteca "ranges".
- Backends aprimorados para arquiteturas x86, PowerPC e RISC-V.
- As funcionalidades do linker LLD e do depurador LLDB foram ampliadas.
Fonte: opennet.ru
