Share via


Advertencia del compilador C5045

El compilador insertará la mitigación de Spectre para la carga de memoria si se especificó el modificador /Qspectre

Comentarios

La advertencia C5045 le permite ver cuáles son los patrones del código que hacen que se inserte una mitigación de Spectre, como LFENCE, cuando se especifica la opción del compilador /Qspectre. Esto le permite identificar a qué archivos del código afecta el problema de seguridad. Esta advertencia es meramente informativa: la mitigación no se inserta hasta que se vuelve a compilar mediante el modificador /Qspectre. La funcionalidad de C5045 es independiente del modificador /Qspectre, por lo que puede usarlos en la misma compilación.

Esta advertencia es nueva en la versión 15.7 de Visual Studio 2017 y está desactivada de manera predeterminada. Use /Wall para habilitar todas las advertencias desactivadas de manera predeterminada o /wn5045 para habilitar C5045 como advertencia de nivel n. En el IDE, el nivel de advertencia predeterminado es /W3 y esta advertencia se puede habilitar en el diálogo Páginas de propiedades del proyecto. Abra Propiedades de configuración>C/C++>Línea de comandos y, en el cuadro Opciones disponibles, agregue /w35045 y, luego, elija Aceptar. Para más información, consulte Advertencias del compilador desactivadas de manera predeterminada. Para información sobre cómo deshabilitar las advertencias por versión del compilador, consulte Advertencias del compilador por versión del compilador.

Ejemplo

En el ejemplo siguiente, se genera la advertencia C5045 cuando se compila con la versión 15.7 de Visual Studio 2017 con las opciones /Wall o /w35045 y /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() { }

La salida del compilador cuando la advertencia está habilitada tiene un aspecto similar al siguiente:

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

Los mensajes de advertencia muestran que se habría insertado una mitigación en la línea 16. También indica que la mitigación es necesaria, porque el índice i de la línea 15 alimenta la carga de memoria en la línea 17. La especulación ocurre a través de bar y bar1, pero la mitigación es eficaz cuando se coloca en la línea 16.

Consulte también

Información orientativa para desarrolladores de C++ sobre los canales laterales de ejecución especulativa
/Qspectre
spectre