Почему efence не может обнаружить вне пределов, если размер чанка не кратен 4 - PullRequest
0 голосов
/ 02 мая 2019

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

Ответы [ 2 ]

1 голос
/ 02 мая 2019

В наши дни нельзя использовать efence, если только вы не используете неясную платформу.

Вам будет гораздо лучше использовать -fsanitize=address или Valgrind.

Интересно, почему efence не может обнаружить эти случаи.

На большинстве платформ данные должны быть выровнены по определенной границе, и malloc гарантирует такое выравнивание. Типичные требования для выравнивания: 4, 8 или 16.

При выравнивании malloc 16 и размере выделения 1, efence не сможет обнаружить переполнение менее чем на 15 байтов, поскольку он организует, чтобы конец выделения был смежным с границей страницы (обычно 4096 или более), но все равно должны удовлетворять ограничениям на выравнивание.

0 голосов
/ 17 мая 2019

С здесь ,

EF_ALIGNMENT

Это целое число, которое определяет выравнивание для любых выделений памяти, которые будут возвращены malloc (), calloc() и realloc ().Значение указывается в байтах, поэтому значение 4 приведет к выравниванию памяти по 32-битным границам, если ваша система не имеет 8-битных символов.EF_ALIGNMENT по умолчанию установлен на sizeof (int), так как обычно это размер слова вашего процессора.

Если вы не установите EF_ALIGNMENT, EF_ALIGNMENT будет установлен на sizeof (int), что4 во многих средах.В этом случае efence не может обнаружить описанные случаи.Но если вы установите EF_ALIGNMENT в 1, efence сможет их обнаружить.

...