问题标签 [double-free]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
306 浏览

c - 将 mallopt M_CHECK_ACTION 错误输出到日志文件

我正在尝试使用 mallopt(M_CHECK_ACTION, 3) 保护我的进程免受可能导致双重释放场景的潜在恶意代码的影响。

有没有办法在双重释放到日志文件的情况下输出错误?我的进程已经重定向了标准错误(即“错误”调用被记录到一个文件中),但是这个特定的错误被打印到屏幕上。

0 投票
2 回答
1842 浏览

c++ - 交换自身内部的对象

我正在尝试在其内部交换一个对象。它可以工作,但是当我添加一个析构函数时,它会给我一个双重免费错误。有没有办法防止这种情况?我说的方法是void swap(SimpleArray &object)

(抱歉,如果您在我的帖子中有错误信息之前阅读了此内容...)

这可行,但是一旦我添加了析构函数,它就会给我一个“双重释放或损坏错误”。我该如何解决这个问题?这是 main 中的函数,它搞砸了。

0 投票
3 回答
1116 浏览

c++ - 递归方法 C++

我现在正在练习链表结构,并且我已经使用该算法编写了一个程序。在程序中有一个递归方法来删除链表的每个元素。但是,该程序在该方法中崩溃。

此方法在用户想要退出时运行。“phead”代表人员列表的第一个元素。显示的问题是:双重释放或损坏(fasttop)

这是类 Person :

谢谢。

0 投票
2 回答
1130 浏览

memory-management - 如何检测谁发出了错误的 kfree

我怀疑我的内核代码中有双重 kfree。基本上,我有一个在模块中被 kzalloced 和 kfreed 的数据结构。我注意到分配了相同的地址,然后再次分配,而没有在模块中释放。

我想知道我应该采用什么技术来查找错误的 kfree 发布位置。

0 投票
2 回答
912 浏览

c++ - 在解构器中删除指针后执行中的双释放错误

我有一个包含成员指针的类,该指针在其构造函数中动态分配,如下所示:

它基本上将输入缓冲区复制到动态分配的成员缓冲区中。我继续在另一个类的构造函数中使用这个类:

但是,当我实例化此类时,出现以下错误,这似乎表明我正在双重释放m_bufRecord

我猜问题在于插入了一个包含指向vector元素的指针的类,并且在同一个指针上调用了两次析构函数,但我不确定这是怎么发生的。我在这里做错了什么?

0 投票
2 回答
840 浏览

c++ - 没有任何动态内存分配的双重释放

一般来说,什么会导致不包含任何动态内存分配的程序中的双重释放?

更准确地说,我的代码都没有使用动态分配。我正在使用 STL,但这更有可能是我做错的事情,而不是 G++/glibc/STL 的错误实现。

我四处搜索试图找到这个问题的答案,但我找不到任何在没有任何动态内存分配的情况下生成此错误的示例。

我很想分享产生这个错误的代码,但我不允许发布它,我不知道如何将问题减少到足够小,可以在这里给出。我会尽力描述我的代码在做什么的要点。

离开函数时抛出错误,堆栈跟踪显示它来自 a 的析构函数std::vector<std::set<std::string>>。向量中的一些元素正在被初始化emplace_back()。在最后一次尝试中,我将其更改为push_back({{}}),问题就消失了。通过设置环境变量MALLOC_CHECK_=2也可以避免该问题。据我了解,该环境变量应该导致 glibc 中止并提供更多信息,而不是导致错误消失。

这个问题只是为了满足我的好奇心,所以我会在黑暗中回答。我能想到的最好的结果是它是一个编译器错误,但这总是我的错

0 投票
1 回答
76 浏览

c - 双释放错误释放 1000 个字节

我编写了一个小程序来测试内存中的分配+访问时间:

该程序甚至适用于高值(400M 字节),但它在确切的字节数时失败:1000。

继续尝试,我发现同样的问题也会影响以下值:200、600、1000、1400,...通常是 400n + 200。我真的不明白为什么会发生。

我在Linux 3.2.0-4-amd64 #1 SMP Debian 3.2.46-1 x86_64 GNU/Linux下使用gcc (Debian 4.7.2-5) 4.7.2编译了这个。

0 投票
1 回答
88832 浏览

c - double free or corruption (fasttop)

The following section of my code gives me this messege when executing * glibc detected ./a.out: double free or corruption (fasttop): 0x08e065d0 **

i have gone through the code many times but i cant clealry see how i am misusing the free (temp2)

0 投票
2 回答
196 浏览

multithreading - Vala:当加入的线程未被引用时读取无效

当我在 valgrind 中编译并运行下面的代码时,看起来当我加入线程时线程被释放,然后当它被未引用时,一些已经释放的内存被读取。

这是来自 valgrind 的“误报”吗?如果不是,那么在较大的并行程序中忽略通常是否安全?我该如何解决?

当我手动添加“thread = NULL;” 在生成的 C 代码中的连接调用和 _g_thread_unref0 宏之间,无效读取在 valgrind 输出中消失了。

0 投票
4 回答
54922 浏览

c - “双免”是什么意思?

正如标题所暗示的那样,我是 C 的新手,很快就会有期中考试。我目前正在修改过去的论文,一个反复出现的主题是双重免费问题。我知道这是free()两次调用同一内存位置的过程,但我有几个问题我不是 100% 确定如何回答:

问题 1:C 中 double free 的结果是什么,为什么会出现这样的问题?

这将导致双重释放:

我对此的回应是它会返回一个 0x0 内存地址并导致系统不稳定/崩溃。另外,如果我没记错的话,双重释放实际上可以调用malloc两次,这会导致缓冲区溢出,从而使系统易受攻击。

简要总结这个问题的最佳方式是什么?

问题 2:描述一个特别容易在 C 中引入 double free 的情况?

我在想当你在你周围传递指针时可能会不小心在一个函数中释放它,并且在没有意识到的情况下再次释放它?

同样,总结这一点的“最佳”方式是什么?