You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VS 2022 MSVC编译器优化Bug:变量被错误判定为未修改?

环境信息

Visual Studio版本:17.7.1 (MSVC 19.37.32822)
使用默认设置和编译器标志新建项目。

最小复现示例

#include <cstdio>

__declspec(noinline) void test2(char** data)
{
    // 移动指针后:
    // data_1 指向 data[1] = 1
    // data_0 指向 data[0] = 2
    *data += 1;
}

__declspec(noinline) void test(char* data_1)
{
    char* data_0 = data_1;
    test2(&data_1);
    int len = (int)(data_1 - data_0);

    if (*data_1 & 1)
    {
        if (*data_0 & 2)
            printf("good\n");
     }
}

int main()
{
    char data[2];
    data[0] = 2;
    data[1] = 1;
    test(data);
    return 0;
}

问题现象

在Release|x64配置下,程序未输出"good";但Debug或Release|x86配置下能得到预期结果。

原因分析

通过实验和查看汇编代码精简出上述复现代码后,发现问题根源是编译器错误假设data_1在test2()中未被修改,因此省略了data_0 = data_1语句,并在(*data_0 & 2)表达式中用data_1替代data_0。代码中的每一行(包括将data_1 - data_0强制转换为int)都是复现问题的必要条件,这可能解释了x86构建中未出现该问题的原因。

更新1

该问题仅出现在x64 Release构建中。将优化选项从/O2改为/Od,或使用#pragma optimize("", off)可临时"修复"问题。
各VS版本复现情况:

  • 17.7.1 - 存在问题
  • 17.7.2 - 存在问题
  • ???
  • 17.7.6 - 无问题
  • 17.8 preview 7 - 无问题
    推测该问题已被修复或复现条件发生变化。

更新2

某MSVC开发者已在私人沟通中确认该问题,我已创建问题跟踪进度。


内容的提问来源于stack exchange,提问作者void

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 18:33:29