c - 如果 block 的大小不是 4 的倍数,为什么 efence 无法检测到越界

标签 c debugging segmentation-fault

我刚刚发现,如果内存块的大小不是 4 的倍数,efence 无法检测出越界错误。

我的测试代码:

int main() {
  char *arr;
  int i;
  size_t size_arr[] = {1, 2, 3, 5, 6, 7, 9, 10, 4, 128, 256, 512};
  for (i = 0; i < 12; i++) {
    printf("%s:%d: OOB test size:%lu\n", __func__, __LINE__, size_arr[i]);
    arr = (char *)malloc(sizeof(char) * size_arr[i]);
    arr[size_arr[i]] = 0;
    free(arr);
    printf("%s:%d: next loop\n", __func__, __LINE__);
  }
  ...
}

输出:

$ LD_PRELOAD=/usr/lib/libefence.so ./test
main:10: OOB test size:1
main:16: next loop
main:10: OOB test size:2
main:16: next loop
main:10: OOB test size:3
main:16: next loop
main:10: OOB test size:5
main:16: next loop
main:10: OOB test size:6
main:16: next loop
main:10: OOB test size:7
main:16: next loop
main:10: OOB test size:9
main:16: next loop
main:10: OOB test size:10
main:16: next loop
main:10: OOB test size:4
Segmentation fault (core dumped)

我想知道为什么 efence 无法检测到这些情况。

最佳答案

在当今时代,永远不应该使用 efence,除非您使用的是不起眼的平台。

使用 -fsanitize=address 或 Valgrind 效果会更好。

I wonder why efence cannot detect those cases.

在大多数平台上,数据需要在一定的边界上对齐,而malloc保证了这种对齐。典型的对齐要求是 4816

当 malloc 对齐方式为 16 且分配大小为 1 时,efence 将无法检测到任何小于 15 字节的溢出,因为它安排分配的结尾与页边界相邻(通常 4096 或更多),但仍必须满足对齐约束。

关于c - 如果 block 的大小不是 4 的倍数,为什么 efence 无法检测到越界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55946025/

相关文章:

C 程序使用函数将 float 四舍五入到小数点后 3 位?

c - 在 C 中使用 fgets 从文件中读取字符串

C 程序停止工作

javascript - 在 Visual Studio 11 中使用 Chrome 启用脚本调试

java - 对 rt.jar 中的 java.lang.String 的微不足道的修改导致 VM 段错误

c - 尝试扫描字符串时如何修复段错误?

c - 暂时在指针中前进

php - 跟踪 PHP "out of memory"错误

java - Eclipse java调试: source not found

c++ - 返回对齐结构后出现段错误