c++ - 是否有用于处理 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++;
考虑到上面的例子等等,我的问题是:
是否有任何编译器设置/警告来检测这种情况?
如果在编译过程中无法检测到,那么处理此类情况的标准 Visual Studio 工具有哪些?[我正在寻找主要集成的 VS 解决方案,除了独立的 linter]
解决方案
推荐阅读
- nginx - 如何使带有斜杠和不带斜杠的 nginx 位置匹配路径?
- java - 使用 Java,从 Excel 表更新现有 SQL 表行
- docker - ddev:如何修改数据库凭据
- git - 从 git repo 对 go 应用程序进行 Dockerizing
- javascript - 单击确认按钮时移除卡
- python - 使用 Python 进行 DDD:我做对了吗?
- bamboo-specs - 组织包含多个 Bamboo Specs 配置的存储库的最佳方式是什么?
- c# - 从 asp.net 中的 API 获取数据
- swift - Xcode / plist - 在 macOS 上始终以 Dark/Light 主题运行应用程序
- oracle - DatabaseError:尝试检索错误 ORA-12154 的文本时出错 - Google Colab