Share via


コンパイラ警告 C5045

/Qspectre スイッチが指定されている場合、コンパイラではメモリの読み込みに Spectre の軽減策が挿入されます

解説

警告 C5045 では、/Qspectre コンパイラ オプションが指定されている場合に、LFENCE などの Spectre の軽減策が挿入される原因となるコードのパターンを確認できます。 これにより、セキュリティ問題の影響を受けるコード ファイルを特定できます。 この警告は純粋に情報提供であり、/Qspectre スイッチを使用して再コンパイルするまで、軽減策は挿入されません。 C5045 の機能は、/Qspectre スイッチとは独立しているので、同じコンパイルで両方を使うことができます。

この警告は Visual Studio 2017 バージョン 15.7 で新たに追加されたものであり、既定では無効になっています。 既定でオフになっているすべての警告を有効にするには /Wall を、C5045 をレベル n の警告として有効にするには /wn5045 を使用します。 IDE では、既定の警告レベルは /W3 で、この警告はプロジェクトの Property Pages ダイアログで有効にできます。 [Configuration Properties (構成のプロパティ)]>C/C++> コマンドラインを開き、[Additional options (追加オプション)] ボックスに /w35045 を追加し、[OK] を選択します。 詳細については、「既定で無効になっているコンパイラ警告」を参照してください。 コンパイラのバージョン別の警告を無効にする方法は、「コンパイラのバージョン別のコンパイラの警告」を参照してください。

次の例では、Visual Studio 2017 バージョン 15.7 で /Wall または /w35045/W3 オプションを使用してコンパイルすると、警告 C5045 が発生します:

// C5045.cpp
// Compile with: cl /EHsc /W3 /w35045 C5045.cpp

int G, G1, G2;

__forceinline
int * bar(int **p, int i)
{
    return p[i];
}

__forceinline
void bar1(int ** p, int i)
{
    if (i < G1) {
        auto x = p[i]; // C5045: mitigation here
        G = *x;
    }
}

__forceinline
void foo(int * p)
{
    G = *p;
}

void baz(int ** p, int i)
{
    if (i < G1) {
        foo(bar(p, i + G2));
    }
    bar1(p, i);
}

int main() { }

警告が有効になっている場合のコンパイラ出力は次のように表示されます:

C:\Users\username\source\repos\C5045>cl /W3 /w35045 C5045.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 19.14.26431 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

C5045.cpp
c:\users\username\source\repos\c5045\c5045.cpp(16) : warning C5045: Compiler will insert Spectre mitigation for memory load if /Qspectre switch specified
c:\users\username\source\repos\c5045\c5045.cpp(15) : note: index 'i' range checked by comparison on this line
c:\users\username\source\repos\c5045\c5045.cpp(17) : note: feeds memory load on this line
Microsoft (R) Incremental Linker Version 14.14.26431.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:C5045.exe
C5045.obj

警告メッセージは、軽減策が 16 行目に挿入された可能性を示しています。 また、15 行目のインデックス i によって 17 行目のメモリ負荷が供給されるので、軽減策が必要である点にも注意してください。 この推測は bar と bar1 をまたがって行われますが、軽減策は 16 行目に配置された場合に有効です。

関連項目

予測実行のサイド チャネルの C++ 開発者向けガイダンス
/Qspectre
spectre