2.5. RHEL 7 以降の toolchain の変更点
以下のシナリオでは、Red Hat Enterprise Linux 7 で説明されているコンポーネントのリリース以降のツールチェインにおける変更を記載します。Red Hat Enterprise Linux 8.0 リリースノート も併せて参照してください。
2.5.1. RHEL 8 の GCC における変更点
Red Hat Enterprise Linux 8 では、GCC ツールチェーンは GCC 8.2 リリースシリーズに基づいています。以下は、Red Hat Enterprise Linux 7 からの主な変更点です。
- エイリアス解析、ベクトル化機能の改善、同一コードの折りたたみ、プロシージャー間解析、ストアマージの最適化パスなど、一般的な最適化が多数追加されました。
- Address Sanitizer が改善されました。
- メモリーリークを検出するために、Leak Sanitizer が追加されました。
- 未定義の挙動を検出するために、Undefined Behavior Sanitizer が追加されました。
- デバッグ情報が DWARF5 形式で生成できるようになりました。この機能は実験的なものです。
- ソースコードカバレッジ解析ツールの GCOV が、様々な改良とともに拡張されました。
- OpenMP 4.5 仕様のサポートが追加されました。また、OpenMP 4.0 仕様のオフロード機能は、C、C++、および Fortran のコンパイラーで対応されます。
- 特定の、起こりうるプログラムエラーを静的に検出するために、新しい警告と改善された診断が追加されました。
- ソースの場所は、その場所よりも広い範囲を追跡するため、診断する内容が濃くなりました。コンパイラーは、fix-it ヒントを提供し、可能なコードの修正を提案します。代替名とタイポの検出を簡単にするために、スペルチェックが追加されました。
セキュリティー
GCC が、生成したコードをさらに強化するツールを提供するように拡張されました。
詳細は 「RHEL 8 の GCC へのセキュリティー強化」 を参照してください。
アーキテクチャーおよびプロセッサーのサポート
アーキテクチャーおよびプロセッサーサポートの改善点は次のとおりです。
- Intel AVX-512 アーキテクチャー、その多数のマイクロアーキテクチャー、および Intel Software Guard Extensions (SGX) にアーキテクチャー固有の新しいオプションが複数追加されました。
- コード生成は、現在、64 ビットの ARM アーキテクチャー LSE 拡張、ARMv8.2-A 16 ビット浮動小数点拡張 (FPE)、およびアーキテクチャーのバージョン ARMv8.2-A、ARMv8.3-A、および ARMv8.4-A を対象にできるようになりました。
-
ARM および 64 ビット ARM アーキテクチャーで
-march=native
オプションの処理が修正されました。 - 64 ビット IBM Z アーキテクチャーの z13 および z14 プロセッサーのサポートが追加されました。
言語および標準
以下は、言語と標準規格に関連した主な変更点です。
- C 言語でコンパイルする際に使用されるデフォルトの標準規格が、GNU 拡張機能が含まれる C17 に変更になりました。
- C++ 言語でコードをコンパイルする際に使用されるデフォルトの標準規格が、GNU 拡張機能が含まれる C++14 に変更になりました。
- C++ ランタイムライブラリーが、C++11 および C++14 の標準規格に対応するようになりました。
-
C++ コンパイラーは、新しい機能を多数持つ C++14 標準仕様を実装するようになりました。たとえば、変数テンプレート、非静的データメンバーイニシャライザーを持つ統合、拡張した
constexpr
指定子、標準サイズの割り当て解除関数、汎用ラムダ、可変長の配列、桁区切り記号などになります。 - C 言語の標準 C11 のサポートが改善しました。ISO C11 アトミック、一般的な選択、およびスレッドローカルストレージが利用可能になりました。
-
新しい
__auto_type
の GNU C 拡張機能が、C 言語の C++11 のauto
キーワード機能のサブセットを提供します。 -
ISO/IEC TS 18661-3:2015 標準規格が指定する型名
_FloatN
および_FloatNx
が、C フロントエンドで認識されるようになりました。 -
C 言語でコンパイルする際に使用されるデフォルトの標準規格が、GNU 拡張機能が含まれる C17 に変更になりました。これは、
--std=gnu17
オプションを使用するのと同じ効果があります。以前は、デフォルトは、GNU 拡張を持つ C89 です。 - GCC は、C++17 言語標準規格と、C++20 標準規格の一部の機能を使用してコンパイルできるようになりました。
- 空のクラスを引数として渡すと、プラットフォーム ABI で要求される、Intel 64 アーキテクチャーおよび AMD64 アーキテクチャーで領域を使用しません。削除したコピーまたは移動のコンストラクターだけを持つクラスを渡すか返すと、重要なコピーまたは移動のコンストラクターを持つクラスと同じ規則を使用します。
-
C++11 の
alignof
演算子により返される値は、C の_Alignof
演算子と一致し、最小の配置を返すように修正されました。適切な配置を見つけるには、GNU 拡張機能__alignof__
を使用します。 -
Fortran 言語コード用の
libgfortran
ライブラリーのメインバージョンが 5 に変更になりました。 - Ada (GNAT)、GCC Go、および Objective C/C++ 言語に対応しなくなりました。Go コード開発には Go Toolset を使用してください。
関連情報
- Red Hat Enterprise Linux 8 リリースノート も併せて参照してください。
- Using Go Toolset
2.5.2. RHEL 8 の GCC へのセキュリティー強化
以下では、Red Hat Enterprise Linux 7.0 のリリース以降に追加されたセキュリティーに関連する GCC の変更の詳細を紹介します。
新しい警告
以下のような警告オプションが追加されました。
オプション | 警告が表示された理由 |
---|---|
|
コピーした文字列を切り捨てるか、目的が変更しない |
|
警告は、ユーザー定義のコンストラクターやコピー代入演算子、破損した仮想テーブルポインター、const 修飾型または参照、またはメンバーポインターのデータメンバーを回避する呼び出しを検出します。この警告は、データメンバーへのアクセス制御を回避する呼び出しも検出します。 |
| コードのインデントにより、コードのブロック構造について誤解を与える場所。 |
|
割り当てるメモリーの量が size を超えた場合にメモリー割り当て関数を呼び出します。2 つのパラメーターを乗じることで割り当てが指定される関数や、 |
|
メモリー量を割り当てないようにするメモリー割り当て関数を呼び出します。2 つのパラメーターを乗じることで割り当てが指定される関数や、 |
|
|
|
size 以上のメモリーが必要になると、 |
| 指定のサイズを超えたか、そのバインドが十分に拘束されるか不明な可変長配列 (VLA) の定義。 |
|
形式化された出力関数の |
|
形式化された出力関数の |
|
|
警告の改良
次の GCC の警告が修正されました。
-
-Warray-bounds
オプションが改善され、範囲外の配列インデックスおよびポインターオフセットの複数インスタンスを検出するようになりました。たとえば、フレキシブル配列メンバーと文字列リテラルに、負または過剰なインデックスが検出されます。 -
GCC 7 で導入された
-Wrestrict
オプションは、標準メモリーと、memcpy
、strcpy
などの文字列操作関数への制限引数を介してオブジェクトへのアクセスをオーバーラップする、より多くのインスタンスを検出するように強化されました。 -
-Wnonnull
オプションは、null 以外の引数 (nonnull
属性が付いている) を期待する関数に null ポインターを渡す広範囲なケースセットを検出するように強化されました。
新しい UndefinedBehaviorSanitizer
UndefinedBehaviorSanitizer と呼ばれる未定義の動作を検出する新しいランタイムサニタイザーが追加されました。主な機能は以下のようになります。
オプション | チェック |
---|---|
| ゼロによる浮動小数点除算を検出します。 |
| 浮動小数点型から整数の変換がオーバーフローしていないことを確認します。 |
| 配列境界の計測を有効にして、範囲外のアクセスを検出します。 |
| アラインメントチェックを有効にし、アラインが適切でない様々なオブジェクトを検出します。 |
| オブジェクトサイズのチェックを有効にして、様々な範囲外のアクセスを検出します。 |
| C++ メンバー関数呼び出し、メンバーアクセス、および基本クラスおよび派生クラスへのポインター間の会話のチェックを有効にします。また、参照されるオブジェクトに正しい動的タイプがない場合は検出します。 |
|
配列境界の厳密なチェックを有効にします。これにより、 |
| 汎用ベクトルを持つ算術演算でも、算術オーバーフローが診断されます。 |
|
事前定義されたビルトインの |
|
ポインターのラッピングに簡易ランタイムテストを実行します。 |
AddressSanitizer の新規オプション
以下のオプションが AddressSanitizer に追加されました。
オプション | チェック |
---|---|
| 異なるメモリーオブジェクトを指定するポインターの比較を警告します。 |
| 異なるメモリーオブジェクトを指すポインターの減算を警告します。 |
| その変数が定義されている範囲後に取得され使用されているアドレスの変数をサニタイズします。 |
その他のサニタイザーおよび計測
-
プローブを挿入するために、
-fstack-clash-protection
オプションが追加されました。このプローブは、スタック領域が静的または動的に割り当てられた場合に、スタックオーバーフローが確実に検出され、オペレーティングシステムが提供するスタックガードページを超えることに依存する攻撃ベクトルを軽減する際に挿入されます。 -
制御フロー転送のターゲットアドレス命令 (間接的な関数呼び出し、関数の戻り値、間接ジャンプなど) のターゲットアドレスが有効であることを確認することで、コード計測を実行して、プログラムセキュリティーを高める新しいオプション
-fcf-protection=[full|branch|return|none]
が追加されました。
関連情報
上述のオプションの一部に提供された値の詳細および説明は、gcc(1) man ページを参照してください。
$ man gcc
2.5.3. RHEL 8 の GCC で互換性に影響を与える変更
std::string
および std::list
における C++ ABI の変更
RHEL 7 (GCC 4.8) と RHEL 8 (GCC 8) との間で変更した libstdc++
ライブラリーの std::string
クラスおよび std::list
クラスの Application Binary Interface (ABI) は、C++11 標準に従います。libstdc++
ライブラリーは、古い ABI および新しい ABI の両方に対応しますが、その他の C++ システムライブラリーには対応しません。そのため、このライブラリーに動的にリンクするアプリケーションを再構築する必要があります。これは、C++98 を含むすべての C++ 標準モードに影響します。RHEL 7 で Red Hat Developer Toolset コンパイラーを使用して構築したアプリケーションにも影響します。このコンパイラーは、古い ABI を維持して、システムライブラリーとの互換性を維持します。
GCC が、Ada、Go、および Objective C/C++ コードを構築しなくなる
GCC コンパイラーから、Ada (GNAT)、GCC Go、および Objective C/C++ の言語でコードを構築する機能が削除されました。
Go コードを構築する場合は、代わりに Go Toolset を使用します。