/Qspectre-load

すべての読み込み命令に対して、コンパイラによるシリアル化命令の生成を指定します。 このオプションを指定すると、/Qspectre フラグが拡張され、読み込みに基づく予測実行サイドチャネルからの攻撃が緩和されます。

構文

/Qspectre-load

解説

/Qspectre-load を指定すると、コンパイラによってメモリからの読み込みが検出され、それらの読み込み後にシリアル化命令が挿入されます。 メモリを読み込む制御フロー命令 (RET および CALL を含む) は、読み込みと制御フロー転送に分割されます。 読み込みの後には、その読み込みが確実に保護されるように、LFENCE が続きます。 jmp 命令など、コンパイラで制御フロー命令を分割できない場合もあります。その際には、代替の軽減策が使用されます。 たとえば、次に示すように、LFENCE を挿入する前にターゲットを非破壊的に読み込む命令を追加することで、コンパイラは軽減 jmp [rax] します。

    xor rbx, [rax]
    xor rbx, [rax]  ; force a load of [rax]
    lfence          ; followed by an LFENCE
    jmp [rax]

/Qspectre-load を指定すると、すべての読み込みの投機が停止されるため、パフォーマンスへの影響は高くなります。 その軽減策は、どこにでも適しているわけではありません。 保護を必要としないパフォーマンスにとって必要不可欠なコード ブロックがある場合は、__declspec(spectre(nomitigation)) を使用してそれらの軽減策を無効にできます。 詳しくは、「__declspec spectre」をご覧ください。

/Qspectre-load オプションは既定でオフになっており、すべての最適化レベルに対応しています。

/Qspectre-load オプションは、Visual Studio 2019 バージョン 16.5 以降で使用できます。 このオプションは、x86 プロセッサと x64 プロセッサを対象とするコンパイラでのみ使用できます。 ARM プロセッサを対象とするコンパイラでは使用できません。

Visual Studio 開発環境でこのコンパイラ オプションを設定するには

  1. プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。 詳細については、Visual Studio での C++ コンパイラとビルド プロパティの設定に関する記事を参照してください。

  2. [構成プロパティ]>[C/C++]>[コード生成] プロパティ ページを選択します。

  3. [Spectre 軽減策] プロパティの新しい値を選択します。 [OK] を選択して変更を適用します。

このコンパイラ オプションをコードから設定するには

関連項目

/Qspectre
/Qspectre-jmp
/Qspectre-load-cf
/Q オプション (低水準の操作)
MSVC コンパイラ オプション
MSVC コンパイラのコマンド ライン構文