首页 > 解决方案 > 带有未初始化布尔值的三元组导致 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 版本中)。

编辑:进一步简化了示例。

编辑2:

我想这篇文章更像是一个“TIL:有 UB”,而不是一个实际的问题。如果您来到这里也了解了它,那么这个视频可能对您来说很有趣:

https://youtu.be/ehyHyAIa5so

标签: c++clangc-stringsconditional-operatormemory-corruption

解决方案


推荐阅读