附录 A. 版本 11.0 的更改

以下小节包括了 Red Hat Developer Toolset 11.0 引入的功能及兼容性更改。该列表未满,将更新。

A.1. GCC 的更改

Red Hat Developer Toolset 11.0 由 GCC 11.2 提供。

自以前的 Red Hat Developer Toolset 发行版本以来,添加了或修改了以下功能:

常规改进

  • GCC 现在默认为 DWARF 版本 5 调试格式。
  • 诊断中显示的列号默认为实际列号并尊重多列字符。
  • 直接线性代码向向量化时,会考虑整个功能。
  • 如果每个条件表达式中包含比较同一变量,则可以将一系列条件表达式转换为 switch 语句。
  • 流程优化改进:

    • 新的 IPA-modref pass 由 -fipa-modref 选项控制,跟踪函数调用的副作用并改进点分析的精度。
    • 通过 -fipa-icf 选项控制相同的代码是明显的,以增加统一功能的数量并减少编译内存使用。
  • 链路优化改进:

    • 改进了连接过程中的内存分配,以减少峰值内存用量。
  • 在 IDE 中使用新的 GCC_EXTRA_DIAGNOSTIC_OUTPUT 环境变量,您可以在不调整构建标志的情况下请求机器可读的"fix-it hints"。
  • -fanalyzer 选项运行的静态分析器会显著提高,提供很多程序错误修复和增强。
  • 为了缓解 CVE-2021-42574,在 GCC 中添加了一个新的警告,并带有 RHSA-2021:4669 公告的发行版本。这个新的 -Wbiway=[none|unpaired|any] 警告可能存在危险(BiDi) Unicode 字符并有三个级别:

    • -Wbiway=unpaired (默认)警告错误终止 BiDi 上下文。
    • -Wbiway=none 关闭警告。
    • -Wbiway=any 警告任何使用 BiDi 字符。

特定于语言的改进

C family

  • C 和 C++ 编译器支持 OpenMP 构造和 OpenMP 5.0 规范的"非恢复循环"例程。
  • 属性:

    • 新的 no_stack_protector 属性标记不应通过堆栈保护来检测的功能(-fstack-protector)。
    • 改进的 malloc 属性可用于识别分配器和放大器 API 对。
  • 新警告:

    • -Wsizeof-array-div 通过 -Wall 选项启用,它会警告两个 sizeof 操作符的不同(当第一个应用到一个数组,而 divisor 与数组的大小不同时)。
    • -Wstringop-overread 默认启用,警告字符串对字符串功能的调用,尝试将以参数形式传递给它们的阵列结束。
  • 增强的警告:

    • -Wfree-nonheap-object 检测到更多调用实例来利用没有从动态内存分配功能返回的指针来取消分配函数。
    • -Wmaybe-uninitialized 诊断将指针和引用未初始化的内存传递给使用 const-qualified参数的功能。
    • -Wuninitialized 检测到从未初始化动态分配的内存中读取。

C

  • 通过 -std=c2x-std=gnu2x 选项支持来自即将发布的 C2X 版本中的几个新功能。例如:

    • 标准属性被支持。
    • 支持 __has_c_attribute preprocessor operator。
    • 标签可能会在 compound 语句的末尾出现。

C++

  • 默认模式改为 -std=gnu++17
  • 现在,C++ 库 libstdc++ 改进了 C++17 支持。
  • 实施了几个新的 C++20 功能。请注意,C++20 支持是实验性的。

    有关功能的更多信息,请参阅 C++20 语言功能

  • C++ 前端对一些即将出现的 C++23 草案功能提供了实验性支持。
  • 新警告:

    • -Wctad-maybe-unsupported(默认禁用),提醒在类型为 deduction 指南中的执行类模板参数。
    • -Wrange-loop-construct (由 -Wall 启用),当基于范围循环时警告是创建不必要的且资源低效的副本。
    • -Wmismatched-new-delete (由 -Wall 启用),警告对 Operator 的调用,并发出从不匹配形式的 Operator 返回的指针,或从其他不匹配分配功能返回。
    • -Wvexing-parse (默认启用)会警告大多数 vexing 解析规则:当声明与变量定义类似时,C++ 语言需要被解释为函数声明。

特定于架构的改进

64 位 ARM 架构

  • Armv8-R 架构通过 -march=armv8-r 选项进行支持。
  • GCC 可自动执行增加、减法、乘法、乘法和减去复杂数字上的操作。

AMD 和 Intel 64 位构架

  • 支持以下 Intel CPU:Sapphire Rapids、Alder Lake 和 Rocket Lake。
  • 添加了对 Intel AVX-VNNI 的新 ISA 扩展支持。-mavxvnni 编译器切换控制 AVX-VNNI 内部。
  • 新的 -march=znver3 选项支持基于 znver3 内核的 AMD CPU。
  • the x86-64 psABI supplement 中定义的三个微架构级别通过新的 -march=x86-64-v2-march=x86-64-v3-march=x86-64-v4 选项支持。