Valgrind没有抓到Segfaults

dar*_*sky 4 c valgrind segmentation-fault

我知道Valgrind以一种允许捕获段错误的方式跟踪内存.但是,为什么没有捕获以下段错误?

int main() {
    char *x = calloc(16, 1);
    char *y = calloc(16, 1);

    x[80] = 'c';
    y[-80] = 'c';

    printf("%c %c\n", *x, *y);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

是不是应该捕获堆中的超出访问权限?根据Valgrind的文件:

But it should detect many errors that could crash your program (eg. cause a segmentation fault).
Run Code Online (Sandbox Code Playgroud)

Tom*_*omH 6

我认为你赋予valgrind权力而不是超越可能性.

它将尝试检测各种类型的错误并向您报告,但它无法检测到所有错误,即使在它尝试检测的某些错误类中也是如此.

在这种情况下,你正在处理的是一个越界写入数组,如果valgrind设法捕获它,将被报告为"无效写入"错误.通过跟踪哪些地址"有效"来检测它们,因为它们是已知堆块的一部分.

问题是,如果你索引到数组的开头或结尾太远,你实际上最终会得到一个地址,它是相邻块中的有效地址,因此valgrind看起来非常好.为了减少发生这种情况的可能性,valgrind在块的每一侧添加了一个填充区域(称为"红色区域"),但默认情况下这只是16个字节.

如果使用该--redzone-size=128选项增加红色区域大小,则会发现valgrind确实检测到此程序中的错误.

  • 我在 Valgrind 中看不到 `--redzone-size` 标志。此外,访问 N 处的数组位置(因此数组后面的 1 个元素,因为它从 0 开始索引),也不会被 Valgrind 捕获。 (2认同)