Bagikan melalui


Compiler Warning C5045

Compiler akan menyisipkan mitigasi Spectre untuk beban memori jika sakelar /Qspectre ditentukan

Keterangan

Peringatan C5045 memungkinkan Anda melihat pola apa dalam kode Anda yang menyebabkan mitigasi Spectre, seperti LFENCE, dimasukkan saat opsi pengkompilasi /Qspectre ditentukan. Ini memungkinkan Anda mengidentifikasi file kode mana yang terpengaruh oleh masalah keamanan. Peringatan ini murni informasional: mitigasi tidak dimasukkan sampai Anda mengkompilasi ulang menggunakan sakelar /Qspectre . Fungsionalitas C5045 tidak bergantung pada sakelar /Qspectre , sehingga Anda dapat menggunakan keduanya dalam kompilasi yang sama.

Peringatan ini baru di Visual Studio 2017 versi 15.7, dan nonaktif secara default. Gunakan /Wall untuk mengaktifkan semua peringatan yang nonaktif secara default, atau /wn5045 untuk mengaktifkan C5045 sebagai tingkat n peringatan. Dalam IDE, tingkat peringatan default adalah /W3 dan peringatan ini dapat diaktifkan dalam dialog Halaman Properti proyek. Buka Properti>Konfigurasi C/C++>Baris Perintah dan di kotak Opsi tambahan, tambahkan /w35045, lalu pilih OK. Untuk informasi selengkapnya, lihat Peringatan pengkompilasi yang nonaktif secara default. Untuk informasi tentang cara menonaktifkan peringatan berdasarkan versi kompilator, lihat Peringatan pengkompilasi menurut versi kompilator.

Contoh

Contoh berikut meningkatkan peringatan C5045 saat dikompilasi oleh Visual Studio 2017 versi 15.7 dengan opsi /Wall atau /w35045 dan /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() { }

Output kompilator saat peringatan diaktifkan terlihat seperti ini:

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

Pesan peringatan menunjukkan bahwa mitigasi akan disisipkan pada baris 16. Ini juga mencatat bahwa mitigasi diperlukan karena indeks i pada baris 15 memberi umpan beban memori pada baris 17. Spekulasi dilakukan di seluruh bar dan bar1 tetapi mitigasi efektif ketika ditempatkan di baris 16.

Baca juga

Panduan Pengembang C++ untuk Saluran Sisi Eksekusi Spekulatif
/Qspectre
Momok