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



我刚刚发现efence无法检测到越野故障,如果内存块的大小不是4的倍数。

我的测试代码:

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:%lun", __func__, __LINE__, size_arr[i]);
    arr = (char *)malloc(sizeof(char) * size_arr[i]);
    arr[size_arr[i]] = 0;
    free(arr);
    printf("%s:%d: next loopn", __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。

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

在大多数平台上,必须将数据在某个边界上对齐,并且malloc保证了这种对齐。典型的对齐要求是4816

使用16的MALLOC对齐和1的分配大小,efence将无法检测到任何溢出少于15个字节,因为它安排了分配的结束以与页面边界相邻(通常是4096或更多(,但仍然必须满足对齐约束。

从这里,

ef_alignment

这是一个整数,指定了Malloc((,Calloc((和realloc((将返回的任何内存分配的对齐。该值在字节中指定,因此4值将导致内存与32位边界对齐,除非您的系统没有8位字符。默认情况下将ef_alignment设置为sizeof(int(,因为这通常是您的CPU的单词大小。

如果您不设置ef_alignment,则将ef_alignment设置为sizeof(int(,在许多环境中为4。在这种情况下,efence无法检测到所述情况。但是,如果将ef_alignment设置为1,则efence可以检测到这些。

相关内容

  • 没有找到相关文章

最新更新