比较已释放的指针是否会调用 UB?

2023-11-22

这似乎是一种相当常见的模式,例如在 hexchat 中(可能无法编译,另请参阅插件文档。另请注意hexchat_plugin_get_info一直没有被使用,所以为了简单起见我省略了它):

static hexchat_plugin *ph;
static int timer_cb(void *userdata) {
    if (hexchat_set_context(ph, userdata)) { /* <-- is this line UB? */
        /* omitted */
    }
    return 0;
}
static int do_ub(char *word[], char *word_eol[], void *userdata) {
    void *context = hexchat_get_context(ph);
    hexchat_hook_timer(ph, 1000, timer_cb, context);
    hexchat_command(ph, "close"); /* free the context - in practice this would be done by another plugin or by the user, not like this, but for the purposes of this example this simulates the user closing the context. */
    return HEXCHAT_EAT_ALL;
}
int hexchat_plugin_init(hexchat_plugin *plugin_handle, char **plugin_name, char **plugin_desc, char **plugin_version, char *arg) {
    *plugin_name = "do_ub";
    *plugin_desc = "does ub when you /do_ub";
    *plugin_version = "1.0.0";
    ph = plugin_handle;
    /* etc */
    hexchat_hook_command(ph, "do_ub", 0, do_ub, "does UB", NULL);
    return 1;
}

该行在timer_cb导致 hexchat 比较 (在本例中可能已释放 - 绝对已释放,请参阅中的评论do_ub) 与另一个指针的指针,如果您遵循 from这里(plugin.c#L1089,hexchat_set_context)你最终会在这里(hexchat.c#L191,is_session)。要调用此代码,请运行/do_ub在十六进制聊天中。

相关代码:

int
hexchat_set_context (hexchat_plugin *ph, hexchat_context *context)
{
    if (is_session (context))
    {
        ph->context = context;
        return 1;
    }
    return 0;
}

int
is_session (session * sess)
{
    return g_slist_find (sess_list, sess) ? 1 : 0;
}

这是UB的事情吗?


在它指向的对象到达其生命周期结束后使用指针的值是不定如中所述C11标准草案6.2.4p2(对象的存储期限)(重点是我的):

对象的生命周期是程序执行期间的部分 保证为其保留哪个存储空间。一个物体存在, 有一个常量地址,并保留其最后存储的值 在其整个生命周期中。如果一个对象在其外部被引用 生命周期,行为是未定义的。指针的值变为 不定当它指向(或刚刚过去)的对象到达 其生命周期结束。

使用它的价值(只是为了任何东西)是一个明确的未定义的行为如中所述附件J.2(未定义的行为):

在以下情况下,该行为未定义:[...] 使用指向生命周期已结束的对象的指针的值 (6.2.4)。

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

比较已释放的指针是否会调用 UB? 的相关文章

  • 将运算符 << 添加到 std::vector

    我想添加operator lt lt to std vector
  • 将类对象放置在向量中?

    我注意到我可以将一个类放置在一个向量中 这是我的程序 我收到以下错误 out blackjack exe blackjack obj blackjack obj error LNK2019 unresolved external symbo
  • 前向声明类型和“已声明为类类型的非类类型”

    我对以下代码有问题 template
  • 循环遍历 C 结构中的元素以提取单个元素的值和数据类型

    我有一个要求 我有一个 C 语言的大结构 由大约 30 多个不同数据类型的不同元素组成 typedef struct type1 element1 type2 element2 type3 element3 type2 element4 1
  • 从复选框列表中选择循环生成的复选框中的一个复选框

    抱歉我的英语不好 在我的 ASP NET 网站上 我从 SQL 表导入软件列表 看起来像这样 但实际上要长得多 Microsoft Application Error Reporting br br Microsoft Applicatio
  • 无法注册时间触发的后台任务

    对于 Windows 8 应用程序 在 C Xaml 中 我尝试注册后台任务 很难说 但我想我的后台任务已正确注册 但是当我单击调试位置工具栏上的后台任务名称时 我的应用程序停止工作 没有任何消息 我查看了事件查看器上的日志 得到 具有入口
  • 如何将 .txt 文件中的数据转换为 xml? C#

    我在一个文本文件中有数千行数据 我想通过将其转换为更容易搜索的内容来轻松搜索 我希望 XML 或其他类型的大型数据结构 尽管我不确定它是否是最好的对于我的想法 每行的数据如下所示 第 31 册 托马斯 乔治 32 34 154 每本书都不是
  • 在 C# 中检查 PowerShell 执行策略的最佳方法是什么?

    当你跑步时Get ExecutionPolicy在 PowerShell 中 它得到有效的执行政策 https learn microsoft com en us powershell module microsoft powershell
  • 如何使用 x64 运行 cl?

    我遇到了和这里同样的问题致命错误 C1034 windows h 未设置包含路径 https stackoverflow com questions 931652 fatal error c1034 windows h no include
  • 已发布的 .Net Core 应用程序警告安装 .Net Core,但它已安装

    我制作了一个 WPF 和控制台应用程序 供某人在我无法访问的私人服务器上使用 我使用 Visual Studio 2019 的内置 发布向导 来创建依赖于框架的单文件应用程序 当该人打开 WPF 应用程序时 他们会看到标准警告 他们单击 是
  • 如果输入被重定向则执行操作

    我想知道如果我的输入被重定向 我应该如何在 C 程序中执行操作 例如 假设我有已编译的程序 prog 并且我将输入 input txt 重定向到它 我这样做 prog lt input txt 我如何在代码中检测到这一点 一般来说 您无法判
  • 不可变类与结构

    以下是类与 C 中的结构的唯一区别 如果我错了 请纠正我 类变量是引用 而结构变量是值 因此在赋值和参数传递中复制结构的整个值 类变量是存储在堆栈上的指针 指向堆上的内存 而结构变量作为值存储在堆上 假设我有一个不可变的结构 该结构的字段一
  • 将 Word 转换为 PDF - 禁用“保存”对话框

    我有一个用 C 编写的 Word 到 PDF 转换器 除了一件事之外 它工作得很好 有时 在某些 Word 文件上 后台会出现一条消息保存源文件中的更改 gt 是 否 取消 但我没有对源文件进行任何更改 我只想从 Word 文件创建 PDF
  • C++ 对象用 new 创建,用 free() 销毁;这有多糟糕?

    我正在修改一个相对较大的 C 程序 不幸的是 并不总是清楚我之前的人使用的是 C 还是 C 语法 这是在一所大学的电气工程系 我们 EE 总是想用 C 来做所有事情 不幸的是 在这种情况下 人们实际上可以逃脱惩罚 但是 如果有人创建一个对象
  • WPF DataGrid / ListView 绑定到数组 mvvm

    我们假设你有 N 个整数的数组 表示行数的整数值 在模型中 该整数绑定到视图中的 ComboBox Q1 如何将数组 或数组的各个项目 绑定到 DataGrid 或 ListView 控件 以便 当您更改 ComboBox 值时 只有那么多
  • 了解 Lambda 表达式和委托 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我已经尝试解决这个问题很长一段时间了 阅读在线博客和文章 但到目前为止还没有成功 什么是代表 什么是 Lambda 表达式 两者的优点
  • 在 Win32 控制台应用程序中设置光标位置

    如何在 Win32 控制台应用程序中设置光标位置 最好 我想避免制作句柄并使用 Windows 控制台功能 我花了整个早上沿着那条黑暗的小巷跑 它产生的问题比它解决的问题还要多 我似乎记得当我在大学时使用 stdio 做这件事相对简单 但我
  • 为什么空循环使用如此多的处理器时间?

    如果我的代码中有一个空的 while 循环 例如 while true 它将把处理器的使用率提高到大约 25 但是 如果我执行以下操作 while true Sleep 1 它只会使用大约1 那么这是为什么呢 更新 感谢所有精彩的回复 但我
  • 我可以使用 lambda 函数或 std::function 对象来代替函数指针吗?

    我有一个需要使用的库 它定义了以下内容 typedef void CallbackFunction const int i 并且有一个注册回调的函数 如下所示 void registerCallback CallbackFunction p
  • 如何在 C 中将 char 连接到 char* ?

    我怎样才能前置char c to char myChar 我有c值为 A and myChar值为 LL 我怎样才能前置c to myChar使 ALL 这应该有效 include

随机推荐

  • C++98 中的 move() 是什么?

    include
  • 程序接收信号SIGABRT

    我在 iPhone 应用程序中工作 我使用 UIImage 选择器控件从照片库中选取图像 然后处理它并分别使用 UIImageview 和 UITextview 显示图像和相应的输出 对于某些图像 它工作正常 对于某些图像 程序崩溃了 在使
  • 如何检查列表中的两个数字是否相同

    我很好奇如何检查列表中的两个数字是否相同 例如 myList 1 7 9 3 1 2 8 在这种情况下 1 在 myList 中重复 我将如何编写一个程序来检查列表中的两个数字是否相同 重复 尝试使用循环 以便我能够理解 因为我还没有学习复
  • 在实体上显式加载多个引用/集合

    考虑以下实体模型 public class Parent public virtual FirstChild FirstChild get set public virtual SecondChild SecondChild get set
  • 如何在 PHP 中启用跨域 POST?

    我正在将 POST 数据从一个站点发送到另一个站点 这两个站点都是由我们开发的 问题是 如果从另一个域请求该页面 则 POST 变量不可用 即使我在本地测试 但指定完整的url POST数据也没有了 所以 这会起作用
  • MediaRecorder 启动错误代码

    我想录制没有声音并可能进行硬件加速的原始 h 264 视频 并稍后进行流式传输 所以我决定使用MediaRecorder 和插座hack用于流式传输 我有以下代码 final MediaRecorder recorder new Media
  • 计算 ArrayList 中单词的出现次数[重复]

    这个问题在这里已经有答案了 我有一个ArrayList具有重复条目的单词 我想计算并保存数据结构中每个单词的出现次数 我该怎么做 如果您没有大量的字符串列表 那么实现它的最短方法是使用Collections frequency方法 像这样
  • 为什么我的程序在内存不足时偶尔会出现段错误而不是抛出 std::bad_alloc?

    我有一个程序 它实现了几种启发式搜索算法和几个领域 旨在通过实验评估各种算法 该程序用C 编写 使用GNU工具链构建 并在64位Ubuntu系统上运行 当我进行实验时 我使用 bashulimit命令限制进程可以使用的虚拟内存量 以便我的测
  • 在 MySQL (InnoDB) 中查找最佳匹配行

    我有以下测试字符串engine mail key和一个看起来像这样的表 query engine engine pdf engine mail 我想找到最匹配的行 最佳匹配由字符串 行开头的最匹配字符指定 我已经构建了一个 RegExp 但
  • 对 Coq 导入感到困惑

    有人可以告诉我之间的区别吗 Require Name Require Import Name Import Name Require 加载外部库 通常来自标准库或user contribs 文件夹 Import 导入模块中的名称 例如 如果
  • 将命令的输出分配给变量(BASH)

    我需要将命令的输出分配给变量 我尝试的命令是 grep UUID fstab awk ext4 print 1 awk print substr 0 6 我尝试用这段代码来分配一个变量 UUID grep UUID fstab awk ex
  • 查找重复文件并删除它们

    我正在编写一个 Python 程序来查找并删除文件夹中的重复文件 我有 mp3 文件和一些其他文件的多个副本 我使用的是sh1算法 如何找到这些重复的文件并删除它们 最快的算法 与接受的答案相比 性能提高了 100 倍 真的 其他解决方案中
  • ARC 下指向 Objective-C 对象的 C 风格指针数组

    我有一个指向 Objective C 实例的 2D 指针数组 用于跟踪地图网格上的游戏对象 现在我正在将代码转换为 ARC Xcode 指出了错误 我知道指向对象的指针不允许作为结构成员 但这让我 几乎 措手不及 我了解 ARC 限制背后的
  • 使用 git 和子模块,什么是好的文件夹结构?

    我将 git 与子模块一起使用 并且我很难弄清楚如何组织我的文件 我使用 PHP 进行开发 并使用单元测试 所以现在 我对每个模块都使用这个组织 src tests 这似乎是一个绝妙的主意 但问题是 当我对项目执行 git submodul
  • 剧作家:从非输入元素上传文件不能使用page.setInputFiles?

    我正在通过 Playwright 上的非输入 HTML 标签上传文件 例如 您可以使用setInputFiles像这样 这有效 await page setInputFiles input type file headphone png 但
  • python中的排序列表

    如果我有一个字符串列表 例如 a143 txt a9 txt 如何按列表中的数字而不是字符串按升序对其进行排序 IE 我想 a9 txt 出现在之前 a143 txt since 9 lt 143 thanks 这就是所谓的 自然排序 从h
  • Owin 如何在 Application_EndRequest 阶段之后设置 Asp.Net 身份验证 cookie?

    作为测试 我使用 Visual Studio 2013 中的最新模板创建了一个新的 Asp Net MVC5 应用程序 我将以下方法添加到 Global asax cs protected void Application PreSendR
  • Azure TopicClient 线程安全吗?

    我一直在处理来自 TopicClient 的大量超时 我认为这可能与对象生存期和处置有关 我正在使用TopicClient班级来自Microsoft ServiceBus Messaging并阅读本文最佳实践指南 states 您不应该在发
  • MYSQL 查询 - 获取与帖子相关的最新评论

    我试图获取与我下载的每篇帖子相关的最新 1 或 2 条评论 有点像 Instagram 的做法 因为它们显示每篇帖子的最新 3 条评论 到目前为止 我正在获取帖子和点赞数 现在我需要做的就是弄清楚如何获取最新的评论 不太确定如何处理它 这就
  • 比较已释放的指针是否会调用 UB?

    这似乎是一种相当常见的模式 例如在 hexchat 中 可能无法编译 另请参阅插件文档 另请注意hexchat plugin get info一直没有被使用 所以为了简单起见我省略了它 static hexchat plugin ph st