使用 std::launder 从指向非活动对象的指针获取指向活动对象成员的指针?

2023-11-22

This question followes this one

让我们考虑一下这个示例代码:

struct sso
  {
  union{
    struct {
      char* ptr;
      char size_r[8];
      } large_str;
    char short_str[16];
    };

  bool is_short_str() const{
    return *std::launder(short_str+15)=='\0'; //UB?
    }
  };

If short_str不是活动成员在没有取消引用指针的情况下std::launder将是UB。让我们考虑一下 ABI 已明确指定,并且我们知道 size_r[7] 与 Short_str[15] 位于同一地址。做std::launder(short_str+15)返回一个指向size_r[7] when short_str不是工会的活跃成员吗?


注:我认为情况是这样的,因为[ptr.launder]/3

存储字节可通过指向对象 Y 的指针值访问,如果该指针值位于 Y 占用的存储空间内,则该对象 Y 位于 Y 占用的存储空间内,或者是可与 Y 指针相互转换的对象,或者如果 Y 是数组元素则指向直接封闭的数组对象。


让我们考虑 ABI 已明确指定,并且我们知道 size_r[7] 与 Short_str[15] 位于同一地址

这完全取决于该保证的确切含义。

编译器可以自由地保证

Sso.short_str[15]

可以访问和修改一切,即使Sso.large_str当前处于活动状态,并且完全获得您期望的语义。

或者不提供这种保证也是自由的。

对于格式错误或表现出未定义行为的行为或程序没有任何限制。

由于那里没有任何物体,&Sso.short_str[15]不能与任何东西进行指针互换。不存在的对象不具有与另一个对象“相同的地址”。

Launder 是根据指向预先存在的对象的指针来定义的。然后该指针被销毁,并创建一个具有相同地址的新对象(这是明确定义的)。std::launderthen 让您获取指向不再存在的对象的指针并获取指向现有对象的指针。

你正在做的事情不是那样的。如果你拿了&short_str[15]当它was订婚后,您将拥有一个指向对象的指针。 ABI 可以说该地址与size_r[7]。现在std::launder将在有效性范围内。

但编译器可以更进一步并定义它short_str[15]指的是同一个对象size_r[7]即使它不活跃。

我认为与你的内容一致的最弱的 ABI 保证只有在你获取了地址时才有效short_str[15]当它处于活动状态时;稍后,您将参与large_str,然后你可以从&short_str[15] to &size_r[7]。与您的陈述一致的最强有力的 ABI 保证要求std::launder不需要。在中间的某个地方std::launder将被要求。

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

使用 std::launder 从指向非活动对象的指针获取指向活动对象成员的指针? 的相关文章

  • 注销租约抛出 InvalidOperationException

    我有一个使用插件的应用程序 我在另一个应用程序域中加载插件 我使用 RemoteHandle 类http www pocketsilicon com post Things That Make My Life Hell Part 1 App
  • 如何将 protobuf-net 与不可变值类型一起使用?

    假设我有一个像这样的不可变值类型 Serializable DataContract public struct MyValueType ISerializable private readonly int x private readon
  • 在 LINQ 中按 Id 连接多表和分组

    我想按categoryId显示列表产品的名称组 这是我的代码 我想要我的视图显示结果 Desktop PC HP Red PC Dell Yellow PC Asus Red SmartPhone Lumia 720 Blue 我的组模型
  • 使用 Newtonsoft 和 C# 反序列化嵌套 JSON

    我正在尝试解析来自 Rest API 的 Json 响应 我可以获得很好的响应并创建了一些类模型 我正在使用 Newtonsoft 的 Json Net 我的响应中不断收到空值 并且不确定我的模型设置是否正确或缺少某些内容 例如 我想要获取
  • 如何创建包含 IPv4 地址的文本框? [复制]

    这个问题在这里已经有答案了 如何制作一个这样的文本框 我想所有的用户都见过这个并且知道它的功能 您可以使用带有 Mask 的 MaskedTestBox000 000 000 000 欲了解更多信息 请参阅文档 http msdn micr
  • 使用接口有什么好处?

    使用接口有什么用 我听说它用来代替多重继承 并且还可以用它来完成数据隐藏 还有其他优点吗 哪些地方使用了接口 程序员如何识别需要该接口 有什么区别explicit interface implementation and implicit
  • 从 Linux 内核模块中调用用户空间函数

    我正在编写一个简单的 Linux 字符设备驱动程序 以通过 I O 端口将数据输出到硬件 我有一个执行浮点运算的函数来计算硬件的正确输出 不幸的是 这意味着我需要将此函数保留在用户空间中 因为 Linux 内核不能很好地处理浮点运算 这是设
  • 标准化 UTF-8 到底是什么?

    The 重症监护室项目 http userguide icu project org transforms normalization 现在也有一个PHP库 http us php net manual en class normalize
  • 我可以使用 moq Mock 来模拟类而不是接口吗?

    正在经历https github com Moq moq4 wiki Quickstart https github com Moq moq4 wiki Quickstart 我看到它 Mock 一个接口 我的遗留代码中有一个没有接口的类
  • 如何在 Xaml 文本中添加电子邮件链接?

    我在 Windows Phone 8 应用程序中有一些大文本 我希望其中有电子邮件链接 例如 mailto 功能 这是代码的一部分
  • Azure 辅助角色“请求输入之一超出范围”的内部异常。

    我在辅助角色中调用 CloudTableClient CreateTableIfNotExist 方法 但收到一个异常 其中包含 请求输入之一超出范围 的内部异常 我做了一些研究 发现这是由于将表命名为非法表名引起的 但是 我尝试为我的表命
  • 如何禁用 fread() 中的缓冲?

    我正在使用 fread 和 fwrite 读取和写入套接字 我相信这些函数用于缓冲输入和输出 有什么方法可以在仍然使用这些功能的同时禁用缓冲吗 Edit 我正在构建一个远程桌面应用程序 远程客户端似乎 落后于服务器 我不知道可能是什么原因
  • C# 中的合并运算符?

    我想我记得看到过类似的东西 三元运算符 http msdn microsoft com en us library ty67wk28 28VS 80 29 aspx在 C 中 它只有两部分 如果变量值不为空 则返回变量值 如果为空 则返回默
  • 等待进程释放文件

    我如何等待文件空闲以便ss Save 可以用新的覆盖它吗 如果我紧密地运行两次 左右 我会得到一个generic GDI error
  • “接口”类似于 boost::bind 的语义

    我希望能够将 Java 的接口语义与 C 结合起来 起初 我用过boost signal为给定事件回调显式注册的成员函数 这非常有效 但后来我发现一些函数回调池是相关的 因此将它们抽象出来并立即注册所有实例的相关回调是有意义的 但我了解到的
  • 使用管道时,如果子进程数量大于处理器数量,进程是否会被阻塞?

    当子进程数量很大时 我的程序停止运行 我不知道问题是什么 但我猜子进程在运行时以某种方式被阻止 下面是该程序的主要工作流程 void function int process num int i initial variables for
  • Cmake 链接共享库:包含库中的头文件时“没有这样的文件或目录”

    我正在学习使用 CMake 构建库 构建库的代码结构如下 include Test hpp ITest hpp interface src Test cpp ITest cpp 在 CMakeLists txt 中 我用来构建库的句子是 f
  • 方法优化 - C#

    我开发了一种方法 允许我通过参数传入表 字符串 列数组 字符串 和值数组 对象 然后使用这些参数创建参数化查询 虽然它工作得很好 但代码的长度以及多个 for 循环散发出一种代码味道 特别是我觉得我用来在列和值之间插入逗号的方法可以用不同的
  • WebSocket安全连接自签名证书

    目标是一个与用户电脑上安装的 C 应用程序交换信息的 Web 应用程序 客户端应用程序是 websocket 服务器 浏览器是 websocket 客户端 最后 用户浏览器中的 websocket 客户端通过 Angular 持久创建 并且
  • 当从finally中抛出异常时,Catch块不会被评估

    出现这个问题的原因是之前在 NET 4 0 中运行的代码在 NET 4 5 中因未处理的异常而失败 部分原因是 try finallys 如果您想了解详细信息 请阅读更多内容微软连接 https connect microsoft com

随机推荐

  • Python 3.2 中 hexdigest 的 C# 等效项是什么?

    我目前正在开发一个将 Python 3 2 程序转换为 C 的项目 在 python 程序中 有一行代码返回一个双倍长度的字符串对象 仅包含十六进制数字 Python 程序中的代码如下 if sha1 hexdigest upper has
  • 角度翻译广告选项

    我正在尝试翻译一个选择下拉列表 但我不喜欢我这样做的方式 因为它很麻烦并且绕过了整个角度翻译框架 语言环境数据看起来像 lang label text select k1 var1 k2 var2 如果我按下 select 作为控制器作用域
  • Blazor wasm 中的定期后台任务

    在 Blazor wasm 中 我想定期执行一项作业 代码 即使用户正在浏览页面 例如每 x 分钟 那可能吗 什么是实用的方法 创建一个服务来管理计时器 public class JobExecutedEventArgs EventArgs
  • 按元素检查字符串是否存在

    我正在寻找一种方法来检查一个字符串是否可以在另一个字符串中找到 str contains仅采用固定字符串模式作为参数 我宁愿在两个字符串列之间进行按元素比较 import pandas as pd df pd DataFrame long
  • GDB 远程调试错误

    我尝试在 x86 64 suse linux 上远程调试 32 位应用程序 但收到此 远程寄存器格式错误 错误 我启动 gdbserver 监听端口 12345 gdbserver localhost 12345 my prog 这是错误
  • 在 pip install 上运行 Makefile

    我有一些协议缓冲区定义 需要将其构建为 Python 源代码 作为pip install过程 我已经子类化了setuptools command install命令输入setup py但我认为它试图在安装包后运行 Makefile 因此无法
  • Quasar框架q-select在v-model中设置一个对象比id

    我有以下代码供我选择
  • 有没有办法知道有人是否为您的网站添加了书签? [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我想为我的网站进行统计 我想做的一件事是知道有多少人为我的网站添加了书签 在没有调查的情况下做到这一点的最佳方法是什么 没有办法说清楚 一部分未发送引荐来源信息就到达该页面的人会为其
  • 如何通过数据库绑定将选项“全部”添加到 WPF 中的组合框

    我有以下内容ComboBox在 WPF 中 我知道我可以添加选项ALL与 CompositeCollection 但我不知道如何 如果有人帮助我提供一个简短的教程 那就太好了
  • Spring:hibernate + ehcache

    我正在使用 hibernate 处理一个 spring 项目 并希望使用 ehcache 实现二级缓存 我看到了很多解决这个问题的方法 spring modules cache其中介绍了 Cacheable注解 ehcache spring
  • 如何以编程方式找出哪些频道属于给定 YouTube 网络?

    似乎没有官方的 YouTube API 来查找 YouTube 网络列表或哪些频道属于给定网络 有什么想法如何找到该信息吗 如果没有直接的方法 socialblade com 使用什么算法获得近似列表 我不知道这是否是像socialblad
  • 对 CUDA 内核中不同部分进行计时

    我有一个 CUDA 内核 可以调用一系列设备函数 获取每个设备功能的执行时间的最佳方法是什么 获取设备函数之一中一段代码的执行时间的最佳方法是什么 在我自己的代码中 我使用clock 函数以获得精确的计时 为了方便起见 我有宏 enum t
  • 从推送通知启动时,launchOptions 始终为零

    我正在从 Django 应用程序发送推送通知 使用django 推送通知 到 iOS 应用程序 该应用程序面向 iOS 13 我在运行 iOS 13 3 1 的 iPhone 7 上运行它 我正在 Xcode 11 3 1 中调试 我正在尝
  • Numpy 的特征值/向量不正确

    我试图找到以下矩阵的特征值 向量 A np array 1 0 0 0 1 0 1 1 0 使用代码 from numpy import linalg as LA e vals e vecs LA eig A 我得到这个作为答案 print
  • 正确使用SQL Server中的事务

    我有 2 个命令 需要两个命令都正确执行 否则都不执行 所以我认为我需要一个交易 但我不知道如何正确使用它 下面的脚本有什么问题 BEGIN TRANSACTION Tran1 INSERT INTO Test dbo T1 Title A
  • 如何在 GitHub 上搜索提交消息?

    Not 在 Git 存储库中 而是在GitHub具体来说 如何仅搜索特定存储库 分支的提交消息 您过去可以执行此操作 但 GitHub 在 2013 年中期的某个时候删除了此功能 要在本地实现此目的 您可以执行以下操作 git log g
  • 实现多个通用接口 - 类型错误

    我正在尝试做这样的事情 public interface IRepository
  • Jquery过滤列表不区分大小写

    我想过滤列表而不区分大小写 我只想匹配不匹配大写或小写的字符 XXXXXXX yyyyyyy XXxxx 如果我在搜索框中输入 X 它会同时显示 1 和 3 我添加了下面的代码 但它也区分大小写
  • bash 计算文件中单词的出现次数

    我很抱歉问了这个非常菜鸟的问题 但我还是个新手bash编程 几天前开始 基本上我想要做的是将一个文件与另一个文件中出现的所有单词一起保存 我知道我可以这样做 sort uniq c sort 问题是 之后我想获取第二个文件 再次计算出现次数
  • 使用 std::launder 从指向非活动对象的指针获取指向活动对象成员的指针?

    This question followes this one 让我们考虑一下这个示例代码 struct sso union struct char ptr char size r 8 large str char short str 16