Sun Studio 12 Update 1:使用 dbx 调试程序

访问错误

如果启用了访问检查,运行时检查会检测并报告下列类型的错误。

错误释放 (baf) 错误

问题: 尝试释放尚未分配的内存。

可能的原因: 将非堆数据指针传递给了 free()realloc()

示例:

char a[4];
char *b = &a[0];

free(b);                    /* Bad free (baf) */

重复释放 (duf) 错误

问题: 尝试释放已释放过的堆块。

可能的原因: 多次使用同一指针调用 free()。在 C++ 中,多次对同一指针使用删除操作符。

示例:

char *a = (char *)malloc(1);
free(a);
free(a);                    /* Duplicate free (duf) */

未对齐释放 (maf) 错误

问题: 尝试释放未对齐的堆块。

可能的原因: 将未正确对齐的指针传递给了 free()realloc();更改了 malloc 返回的指针。

示例:

char *ptr = (char *)malloc(4);
ptr++;
free(ptr);                    /* Misaligned free */

未对齐读 (mar) 错误

问题: 尝试从未正确对齐的地址中读取数据。

可能的原因: 分别从那些没有半字对齐、字对齐或双字对齐的地址中读取 2 个、4 个或 8 个字节。

示例:

char *s = “hello world”;
int *i = (int *)&s[1];
int j;

j = *i;                    /* Misaligned read (mar) */

未对齐写 (maw) 错误

问题: 尝试将数据写入未正确对齐的地址。

可能的原因: 将 2 个、4 个或 8 个字节分别写入没有半字对齐、字对齐或双字对齐的地址。

示例:

char *s = “hello world”;
int *i = (int *)&s[1];

*i = 0;                    /* Misaligned write (maw) */

内存不足 (oom) 错误

问题: 尝试分配超出可用物理内存的内存。

原因: 程序无法从系统获得更多的内存。查找在未检查 malloc() 的返回值是否为 NULL(一个常见编程错误)时发生的问题时会有用。

示例:

char *ptr = (char *)malloc(0x7fffffff);
/* Out of Memory (oom), ptr == NULL */

从数组越界中读 (rob) 错误

问题:尝试从数组越界内存中进行读取。

可能的原因:溢出堆块边界的迷失指针。

示例:

char *cp = malloc (10);
char ch = cp[10];

从未分配的内存中读 (rua) 错误

问题: 尝试从不存在、未分配或未映射的内存中进行读取。

可能的原因: 溢出堆块边界或访问已被释放的堆块的迷失指针。

示例:

char *cp = malloc (10);
free (cp);
cp[0] = 0;

从未初始化的内存中读 (rui) 错误

问题: 尝试从未初始化的内存中进行读取。

可能的原因: 读取尚未初始化的局部数据或堆数据。

示例:

foo()
{   int i, j;
    j = i;    /* Read from uninitialized memory (rui) */
}

写入到数组越界内存 (wob) 错误

问题:尝试写入到数组越界内存。

可能的原因:溢出堆块边界的迷失指针。

示例:

char *cp = malloc (10);
cp[10] = 'a';

写入到只读内存 (wro) 错误

问题: 尝试写入到只读内存。

可能的原因: 向文本地址写入、向只读数据区 (.rodata) 写入或向已由 mmap 设置为只读的页写入。

示例:

foo()
{   int *foop = (int *) foo;
    *foop = 0;                /* Write to read-only memory (wro) */
}

写入到未分配内存 (wua) 错误

问题: 尝试写入到不存在、未分配或未映射的内存。

可能的原因: 溢出堆块边界或访问已被释放的堆块的迷失指针。

示例:

char *cp = malloc (10);
free (cp);
cp[0] = 0;