簡體   English   中英

幽靈警告MSVC C5040的解決方法

[英]Workaround for Spectre warning MSVC C5040

MSVC剛剛發布了一個更新,它添加了一個關於編譯器將注入的一些代碼的新警告,以緩解(顯然是一些小的)Spectre:

https://blogs.msdn.microsoft.com/vcblog/2018/01/15/spectre-mitigations-in-msvc/

這是一個來自他們的“有問題”代碼示例的小MCVE:

#include <stdio.h>

int main(int argc, char *argv) {
    unsigned char array1[1] = {0};
    int array1_length = 1;
    unsigned char array2[1] = {99};
    int untrusted_index = 0; /* in this MCVE, I trust it, compiler doesn't */
    for (; untrusted_index < array1_length; ++untrusted_index) {
        unsigned char value = array1[untrusted_index];
        unsigned char value2 = array2[value * 64];
        printf("Picked value %d\n", value2);
    }
    return 0;
}

“在上面的例子中,代碼執行數組邊界檢查以確保untrusted_index小於array1的長度。這是確保程序不讀取超出數組邊界所必需的。雖然這似乎是聲音正如所寫,它沒有考慮涉及推測性執行的CPU的微體系結構行為。“

所以你現在得到一個警告:

警告C5045:如果指定了/ Qspectre開關,編譯器將為內存加載插入Spectre緩解

這是告訴你這個代碼最終可能比你想要的慢(如果編譯/ Qspectre)的方式,因為它會提供一些額外的保護。

既然你似乎沒有把任何事情視為理所當然,我懷疑做出“只是讓警告消失”的改變 例如,對於我在這里給出的MCVE代碼的特定實例,將untrusted_index < array1_length更改為untrusted_index != array1_length似乎就這樣做 但這是一個可行的補丁,還是他們的警告只是不完整 - 在下一次更新中,它也會抱怨這個?

我知道我可以使用/ wd5040或其他方式禁用警告。 但我有興趣確保如果使用/ Qspectre編譯代碼沒有減速,並且如果沒有使用/ Qspectre編譯則沒有警告。 我不想四處尋找在循環條件下改變< to !=文件 - 或者其他什么 - 如果那只是流失。

所以一個更大的問題是,如果存在這種基本的合法解決方案模式,為什么沒有提到它們呢? 例如,我描述的情況是一個迭代,我控制索引,而不必擔心它來自“不受信任的來源”。 然而我收到了一個警告,從<切換到!=讓它消失了。 為什么? 應該有嗎?

從文章本身:

值得注意的是,MSVC和編譯器在嘗試識別變體1的實例時通常可以執行的分析存在限制。因此,無法保證變體1的所有可能實例都將在/ Qspectre下進行檢測。

您可能遇到過/ Qspectre的當前實現無法通過設計緩解漏洞的情況之一。 這是合理的,因為過度使用LFENCE可能會顯着降低性能。 減輕代碼中出現的變體1的每個實例都太昂貴而無法在軟件中完全完成(使用LFENCE)。

在評論中,有人問:

您能否為開發人員描述MSVC的限制,以及開發人員需要做些什么來保護自己免受“變體1”的侵害?

該文章的作者回答說:

我們不會詳細介紹MSVC的實現。 很多人和公司都依賴我們的工具,因此我們會謹慎對待我們公開討論的問題。

因此,微軟似乎並不想詳細披露/ Qspectre不會減少變體1的哪些實例。

如果您不想要警告,只需使用#pragma warning(disable:5040),或在項目屬性頁面中禁用它。

請注意,您提供的更改為“untrusted_index!= array1_length”是不夠的,因為它會使整個范圍大於濫用的大小。

請記住,這個診斷只是告訴你編譯器會在啟用幽靈緩解的情況下做一些不同的事情,它並不是真的告訴你,你必須對代碼做任何事情

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM