Я только что обнаружил, что 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:%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
не может обнаружить эти случаи.