В документации сказано, что json_t
содержит счетчик ссылок.Я предполагаю, что первый вызов json_decref
уменьшает счетчик ссылок с 1 до 0 и освобождает память.Второй вызов json_decref
видит, что счетчик ссылок равен 0, и ничего не делает.
Чтобы сгенерировать ошибку двойного освобождения, необходимо скопировать старое содержимое объекта json_t
.Примерно так (но не буквально; см. Ниже):
json_t *root = json_loads(any_json_message, 0, &error);
json_t copy = *root;
json_decref(root);
json_decref(©);
Однако json_t
- это (я предполагаю) непрозрачный тип, то есть пользователи могут создавать только указатели на него, а не объекты.Чтобы принудительно создать копию объекта, вы можете угадать размер объекта json_t
и использовать memcpy
:
json_t *root = json_loads(any_json_message, 0, &error);
char copy[42];
memcpy(copy, root, sizeof copy);
json_decref(root);
json_decref((json_t *)copy);
Попробуйте с различными размерами (вместо 42), пока он не заработает.Однако я не уверен, что вы сможете заставить его работать - это всего лишь предположение о том, как работают внутренние компоненты этой библиотеки.