如果存在可能的未定义行为,为什么编译器不会警告您?

2023-12-03

我正在读著名的未定义的行为可能导致时间旅行发帖并注意到这部分:

首先,您可能会注意到循环中的逐一错误 控制。结果是该函数读取了超过末尾的一位 放弃之前的表数组。经典编译器不会 特别关心。它只会生成代码来读取 越界数组元素(尽管事实上这样做是 违反语言规则),如果 数组末尾的内存恰好匹配。

另一方面,后经典编译器可能会执行 以下分析:

前四次循环中,该函数可能返回 true。

当 i 为 4 时,代码执行未定义的行为。由于未定义的行为让我可以做任何我想做的事情,所以我可以完全忽略 在这种情况下,并假设 i 永远不会是 4。(如果 假设被违反,那么就会发生不可预测的事情,但是 没关系,因为未定义的行为允许我 不可预料的。)

根据这篇文章,(较新的)编译器已经可以在编译时对未定义的行为采取行动,这意味着它在某些情况下完全能够发现未定义的行为。与其让恶魔从你的鼻子里飞出来,或者通过消除 UB 代码或仅仅转换它来生成龙,因为它是允许的,为什么编译器不直接发出一个警告,表明这可能不是有意的?


编译器的工作是将高级语言的代码编译为低级语言。如果您收到描述性错误或警告消息,那么是时候感谢编译器为您做了额外的工作。为了获得所需的警告,请使用一些静态代码分析 tool.

规范中未明确定义的任何内容都是未定义的,并且不可能准备未定义行为的完整列表。对所有此类行为发出警告可能是不可能的。

实际上,在许多情况下,编译器确实会警告未定义的行为,特别是使用适当的警告标志,例如-W -Wall -Wextra -O2关于海湾合作委员会。 (带有优化标志,例如-O2编译器会对代码进行回归分析,并可能生成更多警告)

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

如果存在可能的未定义行为,为什么编译器不会警告您? 的相关文章

随机推荐

  • FindAll 包含涉及复杂的多对多关系 (sequelizejs)

    这有软件工程 SE 中的一个兄弟问题 考虑Company Product and Person 之间存在多对多的关系Company and Product 通过联结表Company Product 因为给定的公司可能生产不止一种产品 例如
  • init_fs_encoding:无法获取文件系统编码的Python编解码器

    我正在 apache 上运行 Django 网站 这是我的尾巴httpd conf file ServerName 127 0 0 1 8080 Django Project LoadFile c python39 python39 dll
  • 在 Linux 上使用可滚动 x(时间/水平)轴绘制数据

    我想绘制 x 轴较长的数据 如果我绘制整个 x 轴 那么绘图就会缩小并且几乎无法读取 我发现了this回答 SO 指向下列的scipy matplotlib 代码 但是当我尝试运行上述代码时 出现以下错误 Traceback most re
  • Java-不透明颜色

    我正在尝试画一些线 问题在于颜色 例如 我有几条红色线 然后我画了一条蓝色线 或相反 有时 对于最后一个来说 那条线更多 是不透明的 我尝试制作新颜色并使用 alpha 复合 0 7 设置颜色 对于更多线条 我保留默认的一种颜色 不透明 a
  • 如何使用 iOS 获取 UIKeyboard 大小

    有没有办法以编程方式获取 UIKeyboard 大小 横向高度为 216 0f 高度为 162 0f 以下似乎已被弃用 有没有某种方法可以在 3 0 iPhone OS SDK 和 4 0 iPhone OS SDK 中没有任何警告的情况下
  • 在Python中动态定义/更新ctypes结构

    我已经在 ctypes 中创建了子结构和结构 如下所示 我在结构内部定义了具有某种预定义大小的子结构数组 根据要求SIZE可以设置为0最初 可能会根据用户输入而变化 from ctypes import class MySubStructu
  • 使用回调将 C 库 (GSL) 包装在 cython 代码中

    我是新手cython and c 我想使用 cython 来加快代码的性能 我想用gsl integration我的代码中的库用于集成 更新 test gsl pyx cdef extern from math h double log d
  • 如何在Android中每分钟获取gps坐标?

    我想每分钟获取我的坐标 即使用户没有移动 所以我使用 requestLocationUpdates 和以下参数 locMgr requestLocationUpdates LocationManager GPS PROVIDER 60000
  • NSMutableArray 内的块泄漏 (ARC)

    我有一些在块内的操作 此操作 仅更新一个UIImage像这样 UIImage image self myImage image 我的图像是通过访问互联网来计算的NSURLConnection 当我从互联网上收到图像时 我称该块为NSMuta
  • 如何优化在 postgresql 中查询这些数据?

    我的查询对于特定行来说速度很慢 Postgres 选择做一个Seq Scan而不是使用Index Scan对于某些行 我认为是因为它实际上比使用索引更快 以下是针对正常工作负载使用索引的查询计划 http explain depesz co
  • 高效构建FEM/FVM矩阵

    这是 FEM FVM 方程系统的典型用例 因此可能会引起更广泛的兴趣 从三角形网格 la 我想创建一个scipy sparse csr matrix 矩阵行 列表示网格节点处的值 该矩阵在主对角线上以及两个节点通过边连接的地方都有条目 这是
  • 本地化 MPMoviePlayerViewController 的“完成”按钮

    我正在使用 MPMoviePlayerViewController 来呈现视频 一切都按预期工作 但如果我将设备的语言切换为例如德语 完成 按钮未本地化 我尝试访问该按钮并将其设置为我自己的按钮实现 如下所示 MPMoviePlayerVi
  • 使 openGL 线连接起来

    现在我创建了一个多边形 然后我做了同样的事情 但使用 line loop 来绘制轮廓 我现在的问题是 如果我将线条粗细设置为高 则线条不会连接 它们的末端需要更长 线宽 有没有办法解决这个问题 Thanks glMatrixMode GL
  • Rails 条件验证

    所以我这里有两个模型 class Screen lt ActiveRecord Base belongs to user validates screen size numericality gt less than or equal to
  • 在 c 可执行文件中运行数据 shellcode

    我正在研究这个c 程序 我在 64 位 x64 linux 上用 gcc 编译它 include
  • 新的 React Context API 是否会触发重新渲染?

    我一直在尝试理解新的 React Context API 并正在使用它 我只是想检查一个简单的情况 当提供者的数据更新时 所有内容都会重新呈现 Check Codesandbox 上的这个小例子 所以 在我的例子中 我有一个App组件 具有
  • Paypal 支付 REST API Web 体验配置文件

    我正在使用 PayPal Rest API 并将 PayPal 与付款集成 我设法使用以下代码创建网络体验配置文件 但我无法运行此代码 2 次 它表示该配置文件已存在 这是否意味着我必须创建一个配置文件并将其用于所有客户和所有交易 Web
  • hbase 扫描仪的排序结果

    如何以相同的任何排序顺序检索 hbase 列族 值 like列族 值 列 1 1列 3 2列 4 3列 2 4 HBase 本身不会这样做 相反 您可以使用 Result raw 1 方法检索 KeyValues 列表 将其放入 List
  • F# 匹配两个值

    我对 F 相当陌生 我想使用 match with 语法比较两个值 当我尝试比较两个值时 问题就出现了 如下所示 let value1 19 let isValue1 y match y with value1 gt y 1 gt y 我收
  • 如果存在可能的未定义行为,为什么编译器不会警告您?

    我正在读著名的未定义的行为可能导致时间旅行发帖并注意到这部分 首先 您可能会注意到循环中的逐一错误 控制 结果是该函数读取了超过末尾的一位 放弃之前的表数组 经典编译器不会 特别关心 它只会生成代码来读取 越界数组元素 尽管事实上这样做是