c++ - 带有未初始化布尔值的三元组导致 macOS 上的缓冲区溢出
问题描述
以下代码导致非常奇怪的行为。
#include <iostream>
#include <string>
class A
{
std::string x = "";
std::string y = "a";
bool b; // Uninitialized!
public:
void test()
{
std::cout << y + (b ? "b" : "") << std::endl;
}
};
int main(int argc, const char * argv[]) {
A a;
a.test();
return 0;
}
而不是输出“ab”或只是“a”它实际上回显:
ab $\321XQ\300\<\246
\\300\324< \340\353
=X |
在发现它的原因是未初始化的变量后b
,我仍然很好奇为什么会发生这种情况(并且仅在 macos 的 clang 版本中)。
编辑:进一步简化了示例。
- 如果我删除
A::x
,它会回声a
。 - 如果我把它改成它
y + (b ? "b" : "c")
会回声ab
- 如果
A::b
最后没有声明,它会回显a
。
编辑2:
我想这篇文章更像是一个“TIL:有 UB”,而不是一个实际的问题。如果您来到这里也了解了它,那么这个视频可能对您来说很有趣:
解决方案
推荐阅读
- java - 除 7 月外,全年日历工作
- mysql - 如何根据多个最大日期列选择整行
- java - 这里应该有两个错误,但我看不到它们
- python - 如何在 numpy 数组中找到元组的索引?
- java - 在 Java 中绑定 Yaml 属性时出现异常
- javascript - Vue.js 路由不起作用时的常见错误是什么?
- laravel - Laravel - 每天在 randon 选择五个用户
- c# - 如何将“06/22/2019 00:00:00”的字符串转换为格式为 2019/06/22 的有效 DateTime 类型,而不包含小时、分钟和秒的部分
- mysql - 使用从最后一个值到下一个填充值的值更新列
- scala - 在 Scala 中,特征定义名称后的大括号是什么意思?