我刚刚发现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
保证了这种对齐。典型的对齐要求是4
,8
或16
。
使用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
可以检测到这些。