Share via


Derleyici Uyarısı C5045

/Qspectre anahtarı belirtilirse derleyici bellek yükü için Spectre azaltması ekler

Açıklamalar

Uyarı C5045, /Qspectre derleyici seçeneği belirtildiğinde kodunuzdaki hangi desenlerin LFENCE gibi bir Spectre azaltmasına eklenmesine neden olduğunu görmenizi sağlar. Bu, güvenlik sorunundan hangi kod dosyalarının etkilendiğini belirlemenizi sağlar. Bu uyarı tamamen bilgilendiricidir: /Qspectre anahtarını kullanarak yeniden derlemeden azaltma eklenmez. C5045'in işlevselliği /Qspectre anahtarından bağımsızdır, bu nedenle ikisini de aynı derlemede kullanabilirsiniz.

Bu uyarı Visual Studio 2017 sürüm 15.7'de yenidir ve varsayılan olarak kapalıdır. Varsayılan olarak kapalı olan tüm uyarıları etkinleştirmek için /Wall veya düzey nuyarı olarak C5045'i etkinleştirmek için /wn 5045 kullanın. IDE'de varsayılan uyarı düzeyi /W3'dür ve bu uyarı proje Özellik Sayfaları iletişim kutusunda etkinleştirilebilir. Yapılandırma Özellikleri>C/C++>Komut Satırı'nıaçın ve Ek seçenekler kutusuna /w35045 ekleyin ve Tamam'ı seçin. Daha fazla bilgi için bkz . Varsayılan olarak kapalı olan derleyici uyarıları. Uyarıları derleyici sürümüne göre devre dışı bırakma hakkında bilgi için bkz . Derleyici sürümüne göre derleyici uyarıları.

Örnek

Aşağıdaki örnek, Visual Studio 2017 sürüm 15.7 tarafından /Wall veya /w35045 ve /W3 seçenekleriyle derlendiğinde C5045 uyarısını oluşturur:

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

Uyarı etkinleştirildiğinde derleyici çıkışı şuna benzer:

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

Uyarı iletileri, 16. satıra bir azaltma eklendiğini gösterir. Ayrıca, 15. satırdaki i dizini 17. satırdaki bellek yükünü beslediğinden azaltmanın gerekli olduğunu da not eder. Spekülasyon çubuk ve çubuk1 arasında yapılır, ancak azaltma 16. satıra yerleştirildiğinde etkili olur.

Ayrıca bkz.

Kurgusal Yürütme Yan Kanalları için C++ Geliştirici Kılavuzu
/Qspectre
spectre