/Qspectre-load-cf
読み込みが含まれるすべての制御フロー命令に対して、コンパイラによるシリアル化命令の生成を指定します。 このオプションを指定すると、/Qspectre-load オプションによって実行される軽減策のサブセットが実行されます。
構文
/Qspectre-load-cf
解説
/Qspectre-load-cf を指定すると、コンパイラによってメモリから読み込まれる JMP
、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-cf を指定すると、制御フロー命令内のすべての読み込みの投機が停止されるため、パフォーマンスへの影響は高くなります。 その軽減策は、どこにでも適しているわけではありません。 保護を必要としないパフォーマンスにとって必要不可欠なコード ブロックがある場合は、__declspec(spectre(nomitigation))
を使用してそれらの軽減策を無効にできます。
/Qspectre-load-cf オプションは、既定でオフになっており、すべての最適化レベルに対応しています。
/Qspectre-load-cf オプションは、Visual Studio 2019 バージョン 16.5 以降で使用できます。 このオプションは、x86 プロセッサと x64 プロセッサを対象とするコンパイラでのみ使用できます。 ARM プロセッサを対象とするコンパイラでは使用できません。
Visual Studio 開発環境でこのコンパイラ オプションを設定するには
プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。 詳細については、Visual Studio での C++ コンパイラとビルド プロパティの設定に関する記事を参照してください。
[構成プロパティ]>[C/C++]>[コード生成] プロパティ ページを選択します。
[Spectre 軽減策] プロパティの新しい値を選択します。 [OK] を選択して変更を適用します。
このコンパイラ オプションをコードから設定するには
- 以下を参照してください。AdditionalOptions
関連項目
/Qspectre
/Qspectre-jmp
/Qspectre-load
/Q オプション (低レベルの操作)
MSVC コンパイラ オプション
MSVC コンパイラのコマンド ライン構文