Condividi tramite


Avviso del compilatore C5045

Il compilatore inserisce la mitigazione Spectre per il carico di memoria se si specifica l'opzione /Qspectre

Osservazioni:

Avviso C5045 consente di visualizzare i modelli nel codice che causano una mitigazione Spectre, ad esempio un LFENCE, da inserire quando viene specificata l'opzione del compilatore /Qspectre . In questo modo è possibile identificare i file di codice interessati dal problema di sicurezza. Questo avviso è puramente informativo: la mitigazione non viene inserita fino a quando non si ricompila usando l'opzione /Qspectre . La funzionalità di C5045 è indipendente dall'opzione /Qspectre , quindi è possibile usarle entrambe nella stessa compilazione.

Questo avviso è una novità di Visual Studio 2017 versione 15.7 e disattivato per impostazione predefinita. Usare /Wall per abilitare tutti gli avvisi disattivati per impostazione predefinita o /wn5045 per abilitare C5045 come avviso di livello n. Nell'IDE il livello di avviso predefinito è /W3 e questo avviso può essere abilitato nella finestra di dialogo Pagine delle proprietà del progetto. Aprire Proprietà>di configurazione C/C++>Riga di comando e nella casella Opzioni aggiuntive aggiungere /w35045 e quindi scegliere OK. Per altre informazioni, vedere Avvisi del compilatore disattivati per impostazione predefinita. Per informazioni su come disabilitare gli avvisi in base alla versione del compilatore, vedere Avvisi del compilatore per versione del compilatore.

Esempio

L'esempio seguente genera l'avviso C5045 quando viene compilato da Visual Studio 2017 versione 15.7 con le opzioni /Wall o /w35045 e /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() { }

L'output del compilatore quando l'avviso è abilitato è simile al seguente:

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

I messaggi di avviso mostrano che una mitigazione sarebbe stata inserita nella riga 16. Nota anche che la mitigazione è necessaria perché l'indice i nella riga 15 alimenta il carico di memoria sulla riga 17. La speculazione viene eseguita attraverso bar e bar1, ma la mitigazione è efficace quando posizionata alla riga 16.

Vedi anche

Materiale sussidiario per sviluppatori C++ - Minacce Speculative Execution Side Channel
/Qspectre
spectre