具有未初始化布尔值的三进制会导致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”,然后是一个实际的问题。 如果您也是来这里学习的,那么这段视频可能对您很有趣:

https://youtu.be/ehyHyAIa5so

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)