相关疑难解决方法(0)

C++标准是否允许未初始化的bool使程序崩溃?

我知道C++ 中的"未定义行为"几乎可以让编译器做任何想做的事情.但是,我遇到了让我感到惊讶的崩溃,因为我认为代码足够安全.

在这种情况下,真正的问题仅发生在使用特定编译器的特定平台上,并且仅在启用了优化时才发生.

我尝试了几件事来重现问题并将其简化到最大程度.这是一个名为的函数的摘录Serialize,它将获取bool参数,并将字符串true或复制false到现有的目标缓冲区.

如果bool参数是未初始化的值,那么这个函数是否会在代码审查中,没有办法告诉它实际上可能会崩溃?

// Zero-filled global buffer of 16 characters
char destBuffer[16];

void Serialize(bool boolValue) {
    // Determine which string to print based on boolValue
    const char* whichString = boolValue ? "true" : "false";

    // Compute the length of the string we selected
    const size_t len = strlen(whichString);

    // Copy string into destination buffer, which is zero-filled (thus already null-terminated)
    memcpy(destBuffer, whichString, len);
}
Run Code Online (Sandbox Code Playgroud)

如果使用clang 5.0.0 +优化执行此代码,它将/可能崩溃.

boolValue ? "true" …

c++ abi llvm undefined-behavior llvm-codegen

482
推荐指数
5
解决办法
3万
查看次数

为什么这句话:"未定义的行为意味着编译器可以做任何想做的事情"是真的吗?

具体参考:https://blogs.msdn.microsoft.com/oldnewthing/20140627-00/?p = 633 /

我是一名新的C++程序员,我目前正在学习未定义的行为及其对程序的影响.我特意链接到上面的博客,该博客说当发生未定义的行为时,任何事情都可能发生.

它特别提到了几次,当发生未定义的行为时,编译器可以允许任何事情发生.

具体是什么导致这种情况发生,为什么会发生?

c++ compiler-construction undefined-behavior

6
推荐指数
2
解决办法
321
查看次数