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

2023-12-21

如果我有:

unsigned int x;
x -= x;

很明显x should在这个表达式之后为零,但是我到处都看到,他们说behavior这段代码的值是未定义的,而不仅仅是x(直到减法之前)。

两个问题:

  • Is the behavior这段代码确实未定义?
    (例如,代码可能会在兼容的系统上崩溃[或更糟]?)

  • If so, whyC 是否说behavior是未定义的,当完全清楚的是x这里应该为零?

    即什么是优势通过不在这里定义行为来给出?

显然,编译器可以简单地使用whatever它认为变量内“方便”的垃圾值,并且它将按预期工作......这种方法有什么问题?


是的,这种行为是未定义的,但其原因与大多数人意识到的不同。

首先,使用统一值本身并不是未定义的行为,但该值只是不确定的。如果该值恰好是该类型的陷阱表示,那么访问它就是 UB。无符号类型很少有陷阱表示,因此在这方面你会相对安全。

使行为未定义的原因是变量的附加属性,即它“可以用以下方式声明”register“也就是说,它的地址永远不会被获取。此类变量会被特殊处理,因为有些架构具有真正的 CPU 寄存器,这些寄存器具有某种“未初始化”的额外状态,并且与类型域中的值不对应。

Edit:标准的相关短语是6.3.2.1p2:

如果左值指定自动存储持续时间的对象 可以用寄存器存储类来声明(从来没有 它的地址已被占用),并且该对象未初始化(未声明 带有初始化器并且之前没有对其进行赋值 使用),行为未定义。

为了更清楚地说明,以下代码is在所有情况下均合法:

unsigned char a, b;
memcpy(&a, &b, 1);
a -= a;
  • 这里的地址a and b被采取,所以他们的价值只是 不定。
  • Since unsigned char从来没有陷阱表示 该不确定值只是未指定,任何值unsigned char可以 发生。
  • 在最后a must保持价值0.

Edit2: a and b有未指定的值:

3.19.3 未指定值
相关类型的有效值,本国际标准对哪个值没有要求 在任何情况下都被选择

Edit3:其中一些将在 C23 中得到澄清,其中术语“不确定值”被术语“不确定表示”替换,术语“陷阱表示”被“非值表示”替换。另请注意,所有这些在 C 和 C++ 之间都是不同的,它们具有不同的对象模型。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(为什么)使用未初始化的变量是未定义的行为? 的相关文章

随机推荐

  • 通过 SSIS 上传之前验证数据

    我有一个 SSIS 包 用于将 Excel 文件中的数据上传到 Sql Server 2005 表中 Excel 文件将包含 20k 30k 行范围内的不同行数据 当所有数据正确时 上传工作正常 但当即使在单行中出现小问题时 显然也会失败
  • 将 JavaScript 对象进行 AND 运算

    我在我们的应用程序中遇到了这段代码 已修改 并对它的工作原理感到困惑 function someObject this someProperty this foo bar baz function return Huh this getVa
  • Spark 结构化流 - 由于输入源数量增加而导致检查点中出现断言错误

    我正在尝试将两个流合并为一个并将结果写入一个主题 代码 1 阅读两个主题 val PERSONINFORMATION df DataFrame spark readStream format kafka option kafka boots
  • 提高重叠片段可视化的性能

    我有一组 x 点对 用于沿 x 轴绘制线段 以在 R 中创建自定义读取映射 绘制这些线段的一半任务是确定它们的 y 位置 以便没有两个重叠的线段位于同一 y 水平上 对于每个段 我从第一个位置迭代 y 个级别 直到到达尚未包含与当前段重叠的
  • Angularjs ng-单击重复表行不起作用

    在 AngularJS 中 ng click 以下 HTML 对我不起作用 tr td ai name td td ai desc td tr 我的控制器中的 go 功能目前只有 scope go function hash console
  • 如何使用 sns.boxplot 或 sns.catplot 添加剖面线到箱线图

    I need to add hatches to a categorical box plot What I have is this 我需要的是这样的 带有中线 我尝试过的是这段代码 exercise sns load dataset e
  • 存储库模式与活动记录模式相同吗?

    他们似乎很相似 他们是不同的 活动记录模式定义 An包装数据库中的行的对象表或视图 封装数据访问 并在该数据上添加域逻辑 在存储库模式中全部数据访问放在单独的类中并通过实例方法进行访问 对我来说 这样做是有益的 因为数据访问现在封装在一个单
  • 在哪里存储桌面应用程序的用户数据?

    我正在开发 C NET 桌面应用程序 我希望用户能够创建新的数据库文件 我是桌面应用程序的新手 我真的不知道存储这些文件的最佳位置在哪里 我想将它们存储在我的应用程序文件夹中 但我读到这不是最好的解决方案 我应该将它们存储在 C 中还是有其
  • 需要 XAML 教程 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我是 Silverlight 新手 我需要一个教程来帮助我理解 XAML 样式 资源和对象绑定到 UI
  • 如何根据环境设置facebook认证密钥?

    我有一个 Rails 应用程序 它使用omniauth 通过 Facebook 对访问者进行身份验证 当您向 Facebook 注册应用程序时 您必须注册一个回调 URL 一旦完成身份验证过程 他们将重定向到该回调 URL 由于我的生产站点
  • 使用ngx-bootstrap modalService时添加自定义类的方法

    当寻找ngx引导程序 https valor software com ngx bootstrap 源代码 https github com valor software ngx bootstrap here 模态选项 class ts h
  • x86 PIC,QEMU 在所有 CPU 上引发中断是否正确?

    我最近不得不解决 x86 PIC 的专有操作系统问题 其中操作系统预期定时器中断仅在 CPU0 上 我启用了 IO APIC 来解决这个问题并进行了 CPU 控制 因此中断仅到达 CPU0 问题解决了 有人告诉我 我们的硬件已经损坏 无法做
  • Tensorflow:使用 CPU 的特定核心执行操作

    目前可以通过 tf device 函数指定用于特定操作的 CPU 或 GPU 但是无论如何您都可以指定一个coreCPU 的 目前没有用于将操作固定到特定核心的 API 尽管这将是一个很好的选择功能要求 https github com t
  • 子类化 UIAlertController 并遇到运行时错误

    我是 iOS 和 OSX 编程新手 决定从 Swift 开始 使用 iOS8 API 来测试应用程序 并尝试一些我在其他环境中使用的编程技术 然而 我遇到了一个奇怪的情况 我希望有人能够识别并帮助我 这涉及到 UIAlertControll
  • 自定义 std::allocator_traits::construct

    我想定制std vector不默认构造元素类型的行为 例如int 因为对于大向量来说这样做的成本很高 看着这个 我认为做到这一点的唯一方法就是专业化std allocator traits
  • 当 ssh 管道损坏时停止 python 程序

    我正在编写一个带有无限 while 循环的 python 脚本 我正在 ssh 上运行该脚本 我希望脚本在有人杀死 ssh 时终止 例如 脚本 script py while True do something 将运行为 ssh foo s
  • 如何使用 WebDriver 单击

    这是一段UI代码
  • 重写从 us-central1 以外的其他区域从托管到云功能的路由

    我有一个http触发的云函数部署在欧洲 西部1区域和使用 firebase 托管托管的 Web 应用程序 我还在我的中设置了对该 http 函数的重写firebase json file 我注意到重写仅适用于美国中央1功能 有没有办法让重写
  • django根据文本长度过滤

    我想根据文本的长度过滤我的模型 就像是 MyModel objects filter len text gt 10 其中 text 是 MyModel 模型中的 Char 或 Text 字段 对于现代 Django gt 1 9 海内克 h
  • (为什么)使用未初始化的变量是未定义的行为?

    如果我有 unsigned int x x x 很明显x should在这个表达式之后为零 但是我到处都看到 他们说behavior这段代码的值是未定义的 而不仅仅是x 直到减法之前 两个问题 Is the behavior这段代码确实未定