症状
当您构建的应用程序被配置在 x64 上使用/Ot (代码速度优先)编译器选项中 Microsoft Visual Studio 2005 Service Pack 1 (SP1) 平台。当您运行应用程序时,某些if语句可能无法正确运行。因此,结果是不可预知的。例如,如果语句可能跳过应用程序生成的代码中。
仅在以下情况下出现此问题。-
有两个比较操作之间某些 MOV 指令。
-
这些比较操作使用同一个操作数。
-
MOV 指令更改操作数的值。
在这种情况下,可能会跳过第二个比较操作中的if语句。
备注:-
当您使用/O2选项或/Ox选项生成应用程序时,可能也会出现此问题。
-
在 x86 上不会出现此问题的平台。
原因
发生此问题是因为编译器优化程序错误地假定通过 XOR 运算设置该标志可不包括在比较操作。
解决方案
修补程序信息
可以从 Microsoft 获得受支持的修复程序。然而,此修补程序仅用于解决本文中描述的问题。此修复程序仅适用于遇到本文中描述的问题的系统。此修补程序可能会接受进一步的测试。因此,如果这个问题没有对您造成严重的影响,我们建议您等待包含此修复程序的下一个软件更新。
如果此修复程序可供下载,则在此知识库文章的顶部会出现“修补程序下载可用”部分。如果未显示此部分,请与 Microsoft 客户服务和支持部门联系以获取此修复程序。 注意:如果出现其他问题或需要任何故障诊断时,您可能需要创建单独的服务请求。对于不符合此特定的修补程序的其他支持问题和事项将照常收取费用。有关 Microsoft 客户服务和支持电话号码或创建单独的服务请求的完整列表,请访问下面的 Microsoft 网站︰http://support.microsoft.com/contactus/?ws=support注意:"提供修补程序下载"窗体显示获取此修复程序的语言。如果看不到您的语言,则修补程序没有那种语言的版本。
系统必备组件
您必须具有要应用此修补程序的安装 Visual Studio 2005 SP 1。
重启要求
应用此修补程序后,不需要重新启动计算机。
修补程序替换信息
此修补程序不替换任何其他修补程序。
文件信息
此修复程序的英文版具有的文件属性 (或更新的文件属性)在下表中列出。日期和为这些文件的时间以协调世界时 (UTC) 列出。当您查看文件信息时,它将转换为本地时间。要了解 UTC 与本地时间之间的时差,请使用控制面板中的日期和时间项中的时区选项卡。
文件名称 |
文件版本 |
文件大小 |
日期 |
时间 |
平台 |
---|---|---|---|---|---|
C2.dll |
14.0.50727.3080 |
2,273,280 |
2008 年 11 月 19- |
18:52 |
x86 |
C2.dll |
14.0.50727.3080 |
7,192,576 |
2008 年 11 月 19- |
23:25 |
IA-64 |
C2.dll |
14.0.50727.3080 |
2,490,368 |
2008 年 11 月 19- |
23:26 |
x86 |
C2.dll |
14.0.50727.3080 |
3,600,384 |
2008 年 11 月 19- |
23:33 |
x64 |
C2.dll |
14.0.50727.3080 |
2,203,648 |
2008 年 11 月 19- |
23:33 |
x86 |
解决方法
若要变通解决此问题,请使用下列方法之一:
-
如果语句中使用的变量声明时,使用 volatile 关键字。
-
禁用的速度优化选项。/Os (代码大小优先)选项,例如,替换/Ot选项。或者,使用/O1选项/O2选项或/Ox选项取代。
-
添加代码行,然后在第二个if语句比较操作。例如,添加一个printf语句。
状态
Microsoft 已经确认这是“适用于”一节中列出的 Microsoft 产品中的问题。
详细信息
有关一个或多个代码语句可能无法正确运行,当您在 Visual Studio 2005年中使用代码优化功能的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章︰
925792一个或多个代码语句可能无法正确运行当您在 Visual Studio 2005年中使用代码优化功能 有关软件更新术语的详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
用于描述 Microsoft 软件更新的标准术语的824684说明