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
相关产品推荐
相关产品推荐

