是否使用未初始化的无符号类型对象未定义行为?

问题描述

我知道使用(访问值)内置整型类型的未初始化的非静态和非全局对象是未定义的行为。

int x; // x is defined inside a function scope for example main
++x;// UB

signed char c = 127; // max positive value for char on my machine

c++; // UB overflowing a signed char.
  • 到这里为止还可以,但是无符号类型呢?

       unsigned char uc = 255; // ok
       uc++; // ok c Now has the value 0
    

这里没问题,因为溢出一个无符号会丢弃范围之外的位。

  • 因此,只要分配给无符号的任何值都是无害的:

    unsigned int x; // local non-static uninitialized
    
    std::cout << x << '\n';// is it UB or OK?
    
  • 因为您可以看到设置为无符号的任何(不确定)值都不会导致 UB,所以这样做是错误的吗?

  • 我不关心 x 的值,但我认为它不会造成任何伤害。

  • 如果没问题,那么我想编译器可以使用未初始化的无符号非静态非全局对象生成一个随机值。

解决方法

是否使用未初始化的无符号类型对象未定义行为?

是的。

但我认为它不会造成任何伤害。

你可能是对的。但既然是 UB,你也可能是错的。 你永远无法确定

编译器所做的一件偷偷摸摸的事情是检测您的未定义行为并通过彻底删除到达此 UB 的代码路径来“优化”您的程序。

Example(程序编译,但什么都不做)