Compilerwarnung C5045

Compiler fügt spectre mitigation for memory load ein, wenn /Qspectre switch specified

Hinweise

Mit Warnung C5045 können Sie sehen, welche Muster in Ihrem Code dazu führen, dass eine Spectre-Entschärfung, z. B. eine LFENCE, eingefügt wird, wenn die /Qspectre-Compileroption angegeben wird. Auf diese Weise können Sie ermitteln, welche Codedateien vom Sicherheitsproblem betroffen sind. Diese Warnung ist rein informativ: Die Entschärfung wird erst eingefügt, wenn Sie die Option "/Qspectre " erneut kompilieren. Die Funktionalität von C5045 ist unabhängig vom /Qspectre-Switch , sodass Sie beide in derselben Kompilierung verwenden können.

Diese Warnung ist neu in Visual Studio 2017, Version 15.7, und standardmäßig deaktiviert. Verwenden Sie /Wall, um alle Standardmäßig deaktivierten Warnungen zu aktivieren, oder /wn5045, um C5045 als Warnung der Ebene n zu aktivieren. In der IDE lautet die Standardwarnungsstufe "/W3", und diese Warnung kann im Dialogfeld "Eigenschaftenseiten" des Projekts aktiviert werden. Öffnen Sie die Konfigurationseigenschaften>C/C++>, und fügen Sie im Feld "Zusätzliche Optionen" /w35045 hinzu, und wählen Sie dann "OK" aus. Weitere Informationen finden Sie unter Compilerwarnungen, die standardmäßig deaktiviert sind. Informationen zum Deaktivieren von Warnungen nach Compilerversion finden Sie unter Compilerwarnungen nach Compilerversion.

Beispiel

Im folgenden Beispiel wird die Warnung C5045 ausgelöst, wenn sie von Visual Studio 2017, Version 15.7, mit den Optionen "/Wall" oder "/w35045 " und "/W3 " kompiliert wurde:

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

Die Compilerausgabe, wenn die Warnung aktiviert ist, sieht ungefähr wie folgt aus:

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

Die Warnmeldungen zeigen, dass eine Entschärfung in Zeile 16 eingefügt worden wäre. Außerdem wird festgestellt, dass die Entschärfung erforderlich ist, da der Index i in Zeile 15 die Speicherlast in Zeile 17 einspeist. Die Spekulation erfolgt auf Balken und Bar1, aber die Entschärfung ist wirksam, wenn sie in Zeile 16 platziert wird.

Siehe auch

Leitfaden für C++-Entwickler für spekulative ausführungsseitige Kanäle
/Qspectre
spectre