Как получить ошибку двойного освобождения во время выполнения в моем коде C ++ - PullRequest
0 голосов
/ 30 декабря 2018

Я использую библиотеку Jansson в своем коде c ++.В библиотеке, когда создается любая переменная Jansson, переменная должна быть освобождена, чтобы освободить ссылку, и я использую метод 'json_decref (json_t * json)' для освобождения.Но иногда это вызывает проблему двойного освобождения, и я не получил проблему во время выполнения.Возможно, это ненормально, но я хочу получить ошибку во время выполнения, когда пытаюсь освободить некоторые ссылки.Например, я запускаю следующий тестовый код:

json_t *root = json_loads(any_json_message, 0, &error);
json_decref(root);
json_decref(root);

Как вы видите, есть проблема, и я не получаю никаких ошибок во время выполнения, как double free.

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

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 30 декабря 2018

В документации сказано, что 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(&copy);

Однако 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), пока он не заработает.Однако я не уверен, что вы сможете заставить его работать - это всего лишь предположение о том, как работают внутренние компоненты этой библиотеки.

0 голосов
/ 30 декабря 2018

Поведение доступа к указанному объекту не определено после его освобождения.В документации ничего не сказано, но вызов json_decref более одного раза (плюс количество вызовов json_incref для указателя) также имеет неопределенное поведение.

Возможно, это не такнормально, но я хочу получить ошибку времени выполнения при попытке освободить некоторые ссылки.

Что ж, Янссон не дает этого за вас.

Ваш компилятор может предоставить время выполненияанализатор, который может обнаружить какое-то неопределенное поведение и завершить программу сообщением.Информацию о том, как использовать анализатор, см. В руководстве к вашему компилятору.

...