我刚刚发现,如果内存块的大小不是 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
保证了这种对齐。典型的对齐要求是 4
、8
或 16
。
当 malloc 对齐方式为 16
且分配大小为 1
时,efence
将无法检测到任何小于 15 字节的溢出,因为它安排分配的结尾与页边界相邻(通常 4096
或更多),但仍必须满足对齐约束。
关于c - 如果 block 的大小不是 4 的倍数,为什么 efence 无法检测到越界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55946025/