
Комментарии 9
У вас в коде на Github есть две ошибки (уверен что их больше, но это первое что бросилось в глаза) при работе с std::vector в файлах main.cpp и allocator_test.cpp. std::vector::reserve не изменяет размер вектора. Замените на resize или укажите размер в конструкторе.
После этих исправлений allocator_test выдаёт ошибку: ERROR: memory: Bad magic number в виде 20988 строк на тестах: MallocTest.EvenNotEvenFreeAligned, CombinedTest.RepeatedAlignedAllocations и AlignedAllocation.VerifyAlignment. При этом тесты считаются пройденными.
ERROR: memory: Bad magic number это избыточный лог который выводится функцией mem_block_check_block которая вызывается в коде следующего вида:
static void mem_block_resolve_from_align(void ptr){ auto p = ptr; if (!mem_block_check_block(ptr)) {
auto offset = *mem_block_get_magic_from_header(ptr);
p = mem_block_char_ptr(ptr) - offset;
} return p;
}
думаю этот лог нужно убрать и оставить лог только в функции проверки целостности
сделаю и только что увидел что не помешало бы добавить проверку в mem_realloc как в mem_free
Благодарю вас что навели на мысль: https://github.com/GNUDimarik/small_allocator/commit/b77123deb5f6c6d2e7f50f5358413d0a0318de18#diff-45b5c5bc4e257b0cd52937a7cfb5217b4d4f26711cc3300c5e7aef051b4ef9e9R558
не стесняйтесь создавать issue на github если наши ошибку где-то.
Буду признателен если ошибки будут не в main.cpp он тестовый и его функция лишь в визуализации дампа для статьи и дебага, просто пишите каменты сюда о нем
Да это я так, можно сказать случайно заметил. Изучать аллокаторы мне не особо интересно.
А почему вы используете C++20 и при этом у вас от C++ практически ничего нет? Я имею в виду new, delete, шаблоны и прочее.
Это будет уже в libcxxabi, часть я взял из libcxxrt. Идея состоит в том, что у меня будут С совместимые апи в духе vsnprintf (будет следующая статья, уже в черновиках есть), malloc и т.д. и на этой базе я реализую уже new/delete с itatium hooks но без исключений. С апи нужны что бы взять например деманглер из libcxxrt, в общем зависимости для стороеннего кода на С который я возможно захочу использовать
По делу. Важный нюанс: на ARM (Cortex-A) unaligned доступ к atomic вызывает не деградацию, а исключение. C++17 решает это через over-aligned new — интересно сравнить с вашим подходом.
Тест CallocTest.OverflowDetection бесполезен, т.к. он не проверяет переполнение. Точнее, переполнение не проверяет функция mem_calloc. Честно говоря, я не понимаю как вы собирались "поймать" переполнение такой записью: size_t count = size * num;
Вот вам для примера вызов функции: mem_calloc( 18’446’744, 1’000’000’004’000 ). На x86-64 внутри функции переменная count будет равна 77’424’384, и это уже нормальный размер который функция mem_malloc вполне может выделить. Можно подобрать и другие параметры при которых count будет ещё меньше.
OSDEV: Разработка аллокатора на С++ часть 4. mem_malloc_aligned