了解错误'double free or corruption'

Understanding 'double free or corruption' error

本文关键字:or corruption free double 了解 错误      更新时间:2023-10-16

我正在从python脚本(OS Ubuntu 14.04)调用C++应用程序,如下所示:

import sys, subprocess
run = subprocess.Popen(['app'] + args, stdout = subprocess.PIPE,
                       stderr = subprocess.PIPE)
stdout, stderr = run.communicate()
if stderr:
    sys.stderr.write('Error in app: ' + stderr.decode('utf-8'))
    sys.exit(1)

然后我得到以下错误消息(尽管地址每次都不同):

*** Error in `/usr/bin/app': double free or corruption (!prev): 0x00007f50eae98070 ***

应用程序本身是第三方二进制文件,这意味着,我无法访问源代码。然而,即使在建议下,有一些bug在app导致删除尝试相同的实体两次有3个奇怪的行为,我无法理解:

  1. 错误随机发生,相当罕见(大约20%的运行在相同的数据上)。app的其他一些用户也会得到这个错误;然而,他们中的一些人从来没有得到它。
  2. 它不会被子进程的stderr流捕获(因此sys.exit(1)不会执行)。
  3. 有时我在括号中看到top而不是!prev
谁能给我解释一下,这些特性是如何产生的,或者甚至给一个c++代码的例子来重现这种行为?

Double free就是这个意思:

int *a = new int;
delete a;
delete a;

对于损坏,如:

int *a = new int[10];
a++;
delete a;

当应用程序请求释放一些已经释放的内存,或者地址与分配时获得的地址不对应时,glibc会生成此消息。

相关文章: