Udostępnij za pośrednictwem


Ostrzeżenie kompilatora C5045

Kompilator wstawi ograniczenie ryzyka spectre dla obciążenia pamięci, jeśli /Qspectre switch określony

Uwagi

Ostrzeżenie C5045 pozwala zobaczyć, jakie wzorce w kodzie powodują ograniczenie ryzyka Spectre, takie jak LFENCE, do wstawienia po określeniu opcji /Qspectre kompilatora. Dzięki temu można zidentyfikować pliki kodu, których dotyczy problem z zabezpieczeniami. To ostrzeżenie jest czysto informacyjne: środki zaradcze nie są wstawione do momentu ponownego skompiluj przy użyciu przełącznika /Qspectre . Funkcjonalność C5045 jest niezależna od przełącznika /Qspectre , więc można ich używać zarówno w tej samej kompilacji.

To ostrzeżenie jest nowe w programie Visual Studio 2017 w wersji 15.7 i jest domyślnie wyłączone. Użyj /Wall , aby włączyć wszystkie ostrzeżenia, które są wyłączone domyślnie, lub /wn5045, aby włączyć C5045 jako ostrzeżenie poziomu n . W środowisku IDE domyślny poziom ostrzeżenia to /W3, a to ostrzeżenie można włączyć w oknie dialogowym Strony właściwości projektu. Otwórz okno Właściwości>konfiguracji C/C++>Wiersza polecenia i w polu Dodatkowe opcje dodaj /w35045, a następnie wybierz przycisk OK. Aby uzyskać więcej informacji, zobacz Ostrzeżenia kompilatora, które są domyślnie wyłączone. Aby uzyskać informacje na temat wyłączania ostrzeżeń według wersji kompilatora, zobacz Ostrzeżenia kompilatora według wersji kompilatora.

Przykład

Poniższy przykład zgłasza ostrzeżenie C5045 podczas kompilacji przez program Visual Studio 2017 w wersji 15.7 z /Wall lub /w35045 i /W3 opcje:

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

Dane wyjściowe kompilatora po włączeniu ostrzeżenia wyglądają mniej więcej tak:

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

Komunikaty ostrzegawcze pokazują, że ograniczenie ryzyka zostałoby wstawione w wierszu 16. Zauważa również, że konieczne jest ograniczenie ryzyka, ponieważ indeks i w wierszu 15 generuje obciążenie pamięci w wierszu 17. Spekulacje są wykonywane na poprzeczkę i bar1, ale środki zaradcze są skuteczne w kolejce 16.

Zobacz też

Wskazówki dla deweloperów języka C++ dotyczące ataków Speculative Execution Side Channels
/Qspectre
spectre