相关疑难解决方法(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万
查看次数

未初始化的局部变量是最快的随机数发生器吗?

我知道未初始化的局部变量是未定义的行为(UB),并且该值可能具有可能影响进一步操作的陷阱表示,但有时我想仅使用随机数进行可视化表示,并且不会在其他部分使用它们.例如,程序在视觉效果中设置具有随机颜色的东西,例如:

void updateEffect(){
    for(int i=0;i<1000;i++){
        int r;
        int g;
        int b;
        star[i].setColor(r%255,g%255,b%255);
        bool isVisible;
        star[i].setVisible(isVisible);
    }
}
Run Code Online (Sandbox Code Playgroud)

是不是比它快

void updateEffect(){
    for(int i=0;i<1000;i++){
        star[i].setColor(rand()%255,rand()%255,rand()%255);
        star[i].setVisible(rand()%2==0?true:false);
    }
}
Run Code Online (Sandbox Code Playgroud)

并且还比其他随机数发生器更快?

c c++ undefined-behavior garbage

319
推荐指数
16
解决办法
2万
查看次数

为什么需要.bss段?

我所知道的是全局和静态变量存储在.data段中,未初始化的数据存在于.bss段中.我不明白的是为什么我们有未初始化变量的专用段?如果未初始化的变量在运行时分配了值,那么该变量是否仅存在于.bss段中?

在以下程序中, a是在.data段中,并且b.bss段中; 那是对的吗?如果我的理解是错误的,请纠正我.

#include <stdio.h>
#include <stdlib.h>

int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9};
int b[20]; /* Uninitialized, so in the .bss and will not occupy space for 20 * sizeof (int) */

int main ()
{
   ;
}  
Run Code Online (Sandbox Code Playgroud)

另外,请考虑以下程序,

#include <stdio.h>
#include <stdlib.h>
int var[10];  /* Uninitialized so in .bss */
int main ()
{
   var[0] = 20  /* …
Run Code Online (Sandbox Code Playgroud)

c linux compiler-construction

107
推荐指数
6
解决办法
4万
查看次数

(为什么)使用未初始化的变量未定义行为?

如果我有:

unsigned int x;
x -= x;
Run Code Online (Sandbox Code Playgroud)

很明显,x 应该这样表达后是零,但到处看,他们说的行为,这种代码是不确定的,而不是仅仅值x(直到减法之前).

两个问题:

  • 这段代码的行为确实未定义吗?
    (例如,代码在兼容系统上崩溃[或更糟]?)

  • 如果是这样,为什么 C表示行为是未定义的,当非常清楚x这里应该为零时?

    即不在此定义行为给出的优势是什么?

很明显,编译器可以简单地使用它在变量中认为"方便"的任何垃圾值,并且它可以按预期工作......这种方法有什么问题?

c initialization undefined-behavior

77
推荐指数
6
解决办法
1万
查看次数

为什么全局变量和静态变量初始化为默认值?

在C/C++中,为什么全局变量和静态变量初始化为默认值?

为什么不留下垃圾值呢?这有什么特别的原因吗?

c c++ static global-variables

61
推荐指数
4
解决办法
3万
查看次数

<value optimized out>在gdb中意味着什么?

(gdb) n
134   a = b = c = 0xdeadbeef + ((uint32_t)length) + initval;
(gdb) n
(gdb) p a
$30 = <value optimized out>
(gdb) p b
$31 = <value optimized out>
(gdb) p c
$32 = 3735928563
Run Code Online (Sandbox Code Playgroud)

gdb如何优化我的价值?

gdb

58
推荐指数
4
解决办法
9万
查看次数

默认变量值

如果我在声明它时没有为变量赋值,它是默认为零还是只是以前在内存中的任何内容?

例如

float x;
Run Code Online (Sandbox Code Playgroud)

c++

51
推荐指数
5
解决办法
6万
查看次数

C++ - 未初始化的向量<int>的值

我从答案明白这个问题 是全局/静态初始化为int值将为0回答这一说,对向量,对象类型的默认构造函数将被调用.

我无法弄清楚 - 当我vector<int> v(10)在本地函数中时会发生什么 .int的默认构造函数是什么?如果我在vector<int> v(10)全球宣布怎么办?

我所看到的是, vector<int> v(10)在本地函数中导致变量为0 - 但我不确定这是因为我的编译器还是固定的预期行为.

c++ scope initialization vector

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

23
推荐指数
2
解决办法
2万
查看次数

是否有一个gcc标志来初始化本地变量存储?

IBM AIX xlc编译器提供了一个标志,用于生成初始化本地变量存储的代码:

      initauto=<hh>
                  Initialialize automatic storage to <hh>. <hh> is a
                  hexadecimal value.  This generates extra code and
                  should only be used for error determination.
Run Code Online (Sandbox Code Playgroud)

我认为MSVC编译器对调试版本做了类似的事情,但在这一点上我的内存可能很模糊.

海湾合作委员会是否有同等选择权?

c gcc local

18
推荐指数
1
解决办法
7090
查看次数