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