gpt4 book ai didi

c - Spectre 警告 MSVC C5040 的解决方法

转载 作者:太空狗 更新时间:2023-10-29 16:41:55 28 4
gpt4 key购买 nike

MSVC 刚刚发布了一个更新,其中添加了关于编译器将注入(inject)以减轻(显然是一小部分)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 微架构行为。”

所以你现在得到一个警告:

Warning C5045: Compiler will insert Spectre mitigation for memory load if /Qspectre switch specified

这是它告诉您这段代码最终可能比您希望的慢(如果编译/Qspectre)的方式,因为它会加入一些额外的保护。

由于您似乎无法将任何事情视为理所当然,所以我对做出一些“只是让警告消失”的改变持怀疑态度。例如,更改 untrusted_index < array1_lengthuntrusted_index != array1_length似乎可以做到,对于我在此处提供的 MCVE 代码的特定实例。但这是一个可行的补丁,还是他们的警告只是不完整——在下一次更新中,它也会提示这个?

我知道我可以使用/wd5040 或其他方式禁用警告。但我感兴趣的是确保如果代码是使用/Qspectre 编译的,则不会出现减速,并且如果它不是使用/Qspectre 编译的,则不会出现警告。我不想四处触摸文件更改 <!=循环条件——或其他条件——如果这只是流失。

所以一个更大的问题是,如果有这种基本的合法解决方法模式,为什么没有提到它们?例如,我描述的案例是我控制索引的迭代,不必担心它来自“不受信任的来源”。但是我收到警告,并从 < 切换至 !=让它消失了。为什么?应该有吗?

最佳答案

来自文章本身:

It is important to note that there are limits to the analysis that MSVC and compilers in general can perform when attempting to identify instances of variant 1. As such, there is no guarantee that all possible instances of variant 1 will be instrumented under /Qspectre.

您可能遇到过这样一种情况,即/Qspectre 的当前实现不会通过设计来缓解漏洞。这是合理的,因为过度使用 LFENCE 可能会显着降低性能。缓解代码中出现的变体 1 的每个实例的成本太高,无法在软件中完全完成(使用 LFENCE)。

评论里有人问:

Can you characterize for developers what MSVC’s limits are, and what more developers need to do to protect themselves from “variant 1”?

文章作者回复:

We’re not going into the details MSVC’s implementation. A lot of people and companies rely upon our tools so we’re going to err on the side of caution with regards to what we discuss publicly.

因此,Microsoft 似乎不想确切披露变体 1 的哪些实例不会被/Qspectre 缓解。

关于c - Spectre 警告 MSVC C5040 的解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50399940/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com