Compartilhar via


Aviso do compilador C5045

O compilador inserirá a mitigação Spectre para carga de memória se a opção /Qspectre for especificada

Comentários

O aviso C5045 permite que você veja quais padrões em seu código fazem com que uma mitigação do Spectre, como um LFENCE, seja inserida quando a opção do compilador /Qspectre for especificada. Isso permite identificar quais arquivos de código são afetados pelo problema de segurança. Esse aviso é puramente informativo: a mitigação só é inserida depois que você recompilar usando a opção /Qspectre. A funcionalidade do C5045 é independente da opção /Qspectre; portanto, você pode usá-los na mesma compilação.

Esse aviso é novo no Visual Studio 2017 versão 15.7, e está desativado por padrão. Use /Wall para habilitar todos os avisos desativados por padrão, ou /wn5045 para habilitar C5045 como um aviso de nível n. No IDE, o nível de aviso padrão é /W3. Esse aviso pode ser habilitado na caixa de diálogo Páginas de Propriedades do projeto. Abra as Propriedades de configuração>C/C++>Linha de Comando e, na caixa de Opções adicionais, adicione /w35045 e escolha OK. Para obter mais informações, confira Avisos do compilador desativados por padrão. Para obter informações sobre como desabilitar avisos por versão do compilador, consulte Avisos do compilador por versão do compilador.

Exemplo

O exemplo a seguir gera o aviso C5045 quando compilado pelo Visual Studio 2017 versão 15.7 com a /Wall ou as opções /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() { }

A saída do compilador quando o aviso está habilitado é semelhante a esta:

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

As mensagens de aviso mostram que uma mitigação teria sido inserida na linha 16. Elas também observam que a mitigação é necessária, porque o índice i na linha 15 alimenta a carga de memória na linha 17. A especulação é feita entre barra e barra1, mas a mitigação é eficaz quando colocada na linha 16.

Confira também

Diretrizes para desenvolvedores de C++ para canais do lado de execução especulativos
/Qspectre
spectre