Можем ли мы выполнить модульное тестирование выделения памяти? - PullRequest
14 голосов
/ 16 апреля 2019

Мне нужно протестировать библиотеку, которая предоставляет собственную процедуру выделения памяти:

void* allocation_routine(size_t size) throw();

В документации указано, что эта функция выделяет как минимум размер байтов памяти (разрешено выделять больше). Кстати, функция использует posix_memalign внутри, но реализация может измениться.

Мне интересно, можно ли написать модульный тест для такого рода функций? Как мы можем проверить, был ли выделен необходимый объем памяти?

UPDATE:

Если мы не можем написать модульный тест, то каково самое близкое решение?

Ответы [ 2 ]

16 голосов
/ 16 апреля 2019

Вы не можете написать модульный тест для этой функции, потому что вы не можете выделить память в куче без системного вызова.Следовательно, это интеграционный тест, поскольку вы не можете изолировать тестируемый модуль от операционной системы.

Я бы создал новый небольшой исполняемый файл, который вызывает allocation_routine для n байтов.В зависимости от того, что allocation_routine должен вернуть, вы можете утверждать, что это не nullptr.Затем запишите n байт в эту область памяти.Скомпилируйте и скомпонуйте его с помощью адресного дезинфицирующего средства (доступно как с gcc, так и с clang), затем попытайтесь интегрировать его в программу запуска приложения (ctest и т. Д.).

Возможно, вы также захотите ограничить доступную кучу через POSIX setrlimit , чтобы проверить behvaior при сбое выделения.

0 голосов
/ 16 апреля 2019

Это не модульный тест, но вы можете использовать Valgrind для получения различной информации о памяти.

  • утечки памяти (которые не бесплатны)
  • проблем с памятью

Он в основном используется для отладки, но он предупредит вас, если что-то распределено неправильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...