Share via


Upozornění kompilátoru C5045

Kompilátor vloží omezení rizik spectre pro načtení paměti, pokud je zadaný přepínač /Qspectre.

Poznámky

Upozornění C5045 umožňuje zjistit, jaké vzory v kódu způsobují zmírnění rizik Spectre, například LFENCE, které se vloží při zadání možnosti kompilátoru /Qspectre . To vám umožní zjistit, které soubory kódu mají vliv na problém se zabezpečením. Toto upozornění je čistě informativní: zmírnění rizik se nevloží, dokud znovu nekompilujete pomocí přepínače /Qspectre . Funkce C5045 je nezávislá na přepínači /Qspectre , takže je můžete použít ve stejné kompilaci.

Toto upozornění je nové v sadě Visual Studio 2017 verze 15.7 a je ve výchozím nastavení vypnuté. Pomocí /Wall povolte všechna upozornění, která jsou ve výchozím nastavení vypnutá, nebo /wn5045, pokud chcete povolit C5045 jako upozornění na úroveň n. V integrovaném vývojovém prostředí je výchozí úroveň upozornění /W3 a toto upozornění lze povolit v dialogovém okně Stránky vlastností projektu. Otevřete příkazový řádek Vlastnosti>konfigurace C/C++>a v poli Další možnosti přidejte /w35045 a pak zvolte OK. Další informace najdete v tématu Upozornění kompilátoru, která jsou ve výchozím nastavení vypnutá. Informace o tom, jak zakázat upozornění podle verze kompilátoru, naleznete v tématu Upozornění kompilátoru podle verze kompilátoru.

Příklad

Následující příklad zobrazí upozornění C5045 při kompilaci sadou Visual Studio 2017 verze 15.7 s možnostmi /Wall nebo /w35045 a /W3 :

// 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() { }

Výstup kompilátoru, když je upozornění povolené, vypadá přibližně takto:

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

Zprávy upozornění ukazují, že zmírnění rizik by bylo vloženo na řádek 16. Upozorňuje také, že zmírnění rizik je potřeba, protože index i na řádku 15 podává zatížení paměti na řádku 17. Spekulace se provádí přes pruh a bar1, ale zmírnění je účinné při umístění na řádku 16.

Viz také

Pokyny pro vývojáře C++ k útokům souvisejícím se spekulativním spouštěním postranních kanálů
/Qspectre
spectre