Ошибки AddressSanitizer при тестировании производительности односвязного списка - PullRequest
0 голосов
/ 17 февраля 2019

Я работаю над созданием односвязного списка.Чтобы создать это, я написал такие структуры, как struct node и операции типа list_free_node.Теперь я впервые использую malloc и pointers, и я получаю несколько ошибок (я думаю, связанных с этими двумя упомянутыми понятиями), которых я никогда раньше не видел.

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

Однако, когда я использую make check, он проверяется автоматически check_list.c .Когда это происходит, я получаю ошибки, которых раньше никогда не видел.

Errors about Deadlysignal.

Я искал эти ошибки и обнаружил, что это как-то связано спереполнение стека.Я думаю, что ошибка может заключаться в том, что я использую указатель, который не существует, или что-то в этом роде.Однако, когда я запускаю свой код вручную, кажется, что он работает нормально.Я не понимаю, как это происходит.

Любой совет будет оценен.

1 Ответ

0 голосов
/ 18 февраля 2019

По крайней мере, есть следующие ошибки:

  • in list_add_front()

                if (l -> head == NULL) {
                        l -> head = n;
                        return 0;
    

    Здесь вы забыли, что n->next не был инициализирован;что-то эквивалентное n->next = NULL отсутствует.Конечно, вы можете объединить похожие if и else тела и написать только

                n -> next = l -> head;
                l -> head = n;
                return 0;
    
  • в list_add_back()

    Здесь вы также забыли, что n->next не был инициализирован и n->next = NULL отсутствует.

    В качестве альтернативы вы можете установить n->next = NULL в list_new_node().

  • в list_cleanup()

                currentnode = nextnode;
                list_free_node(currentnode);
                nextnode = list_next(nextnode);
    

    Мы не должны использовать содержимое узлапосле того, как узел был освобожден, таким образом, мы не должны вызывать list_next() (для которого нужен указатель ->next узла) после list_free_node().Просто поменяйте местами последние две строки.

...