如果启用了访问检查,运行时检查会检测并报告下列类型的错误。
问题:尝试释放尚未分配的内存。
可能的原因:将非堆数据指针传递给了 free() 或 realloc()。
示例:
char a[4]; char *b = &a[0]; free(b); /* Bad free (baf) */
问题:尝试释放已释放过的堆块。
可能的原因:多次使用同一指针调用 free()。在 C++ 中,多次对同一指针使用删除操作符。
示例:
char *a = (char *)malloc(1); free(a); free(a); /* Duplicate free (duf) */
问题:尝试释放未对齐的堆块。
可能的原因:将未正确对齐的指针传递给了 free() 或 realloc();更改了 malloc 返回的指针。
示例:
char *ptr = (char *)malloc(4); ptr++; free(ptr); /* Misaligned free */
问题:尝试从未正确对齐的地址中读取数据。
可能的原因:分别从那些没有半字对齐、字对齐或双字对齐的地址中读取 2 个、4 个或 8 个字节。
示例:
char *s = “hello world”; int *i = (int *)&s[1]; int j; j = *i; /* Misaligned read (mar) */
问题:尝试将数据写入未正确对齐的地址。
可能的原因:将 2 个、4 个或 8 个字节分别写入没有半字对齐、字对齐或双字对齐的地址。
示例:
char *s = “hello world”; int *i = (int *)&s[1]; *i = 0; /* Misaligned write (maw) */
问题:尝试分配超出可用物理内存的内存。
原因:程序无法从系统获得更多的内存。查找在未检查 malloc() 的返回值是否为 NULL(一个常见编程错误)时发生的问题时会有用。
示例:
char *ptr = (char *)malloc(0x7fffffff); /* Out of Memory (oom), ptr == NULL */
问题:尝试从不存在、未分配或未映射的内存中进行读取。
可能的原因:溢出堆块边界或访问已被释放的堆块的迷失指针。
示例:
char c, *a = (char *)malloc(1); c = a[1]; /* Read from unallocated memory (rua) */
问题:尝试从未初始化的内存中进行读取。
可能的原因:读取尚未初始化的局部数据或堆数据。
示例:
foo() { int i, j; j = i; /* Read from uninitialized memory (rui) */ }
问题:尝试写入到只读内存。
可能的原因:向文本地址写入、向只读数据区 (.rodata) 写入或向已由 mmap 设置为只读的页写入。
示例:
foo() { int *foop = (int *) foo; *foop = 0; /* Write to read-only memory (wro) */ }
问题:尝试写入到不存在、未分配或未映射的内存。
可能的原因:溢出堆块边界或访问已被释放的堆块的迷失指针。
示例:
char *a = (char *)malloc(1); a[1] = ”\0’; /* Write to unallocated memory (wua) */