首页 > 解决方案 > 是否有用于处理 C++ 中未定义行为的 Visual Studio 工具?

问题描述

C++ 代码以易于破解而著称。

有很多未定义行为的示例(例如 i = i++ 等等,例如为什么这些构造使用前增量和后增量未定义行为?)。它们中的大多数很容易发现,因为它们通常涉及同一变量的前/后增量的组合和/或对求和顺序敏感。

这是另一个例子,看起来几乎是正确的:

#include <iostream>

int main()
{
    float a[] = {1.f, 2.f, 3.f};
    float* b = a;
    float c = pow(*b++, 2) + pow(*b++, 2);
    std::cout << c << "," << *b; 
}

乍一看,首先pow(*b++, 2)执行哪个条款并不重要。

尽管如此,它在调试模式下编译和运行时会打印出“5,3”(标准 Visual Studio 控制台 C++ 项目,所有默认值)并在发布模式下打印出“2,3”(使用 VS2008 和 VS2019 测试) .

在同时处理 * 和 ++ 运算符时,很容易发现编译器产生的不同操作顺序。

在 Debug 模式下不进行优化,表达式pow(*b++, 2) + pow(*b++, 2)等价于:

float c;
c = pow(*b, 2);
b++;
c+= pow(*b, 2);
b++;

打开发布优化后,它的行为如下:

float c;
c = pow(*b, 2);
c+= pow(*b, 2);
b++;
b++;

考虑到上面的例子等等,我的问题是:

标签: c++visual-studiooperatorscompiler-optimization

解决方案


推荐阅读