Double free при заполнении и полном освобождении стека и последующем вызове деструктора
kirilliliych opened this issue · comments
int main() {
stack_t stack1;
stackCtor(stack1);
for (stackElementType i = 0; i < 10; ++i) {
stackPush(&stack1, i);
}
stackElementType value;
for (stackElementType i = 0; i < 10; ++i) {
stackPop(&stack1, &value);
printf("%lld\n", value);
}
stackDtor(&stack1);
return 0;
}
Следующий код приводит к тому, что если заполнить и полностью освободить стек, то в stackChangeCapacity newCapacity = (size_t) fmax((double) stack->capacity * SHRINK_COEF, 0);
станет 0, дальше в recalloc newPtr = (stackCanaryType *) recalloc(stack->data, getStackArraySize(newCapacity), 1);
в режиме DEBUG_LEVEL_DISABLE передастся 0, в recalloc void* newPtr = realloc(ptr, sizeToAllocate);
освободит память, а дальше это попытается сделать деструктор и не обнаружит, что она уже была освобождена. Таким образом, возникает double free.
Исправлено 355db4c, спасибо.