Opened 5 years ago

Closed 5 years ago

#176 closed ожидается проверка (задача сдана)

WW #3

Reported by: tarasov.denis Owned by: Sokolov Viacheslav
Component: WW_intrusive_list Version: 2.0
Keywords: Cc:

Description

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

Change History (5)

comment:1 Changed 5 years ago by tarasov.denis

Я вроде решил проблему

comment:2 Changed 5 years ago by Sokolov Viacheslav

Type: ожидается проверкаожидаются исправления

Повторный запуск make делает что-то нетривиальное.
Не хватает зависимостей .o от .h

Мне кажется более удобным предположение, что list и node - not null, а list - инициализирован.
В любом случае fail-fast проверки на NULL лучше выносить на самый верх, чтобы не делать в таком случае лишних аллокаций.

Желательно в функциях add_node / remove_node проверять, что вершины отсуствует / присутствует, для чего удобно сделать вспомогательный метод. Это тоже контракт этих функций.

Закомментированные строчки - удалить (printf можно оставить)

между функциями - перевод строки

comment:3 Changed 5 years ago by tarasov.denis

Type: ожидаются исправленияожидается проверка
Version: 1.02.0

Не очень понимаю, что не так с fail-fast, и зачем отдельный метод для проверки наличия вершины

comment:4 Changed 5 years ago by Sokolov Viacheslav

fail-fast - отличная концепция, с ней все так.
Проблема в том, что она не соблюдена.

  intrusive_node_t *cur;

  if (list == NULL || list->head == NULL || node == NULL)
    return;

Здесь аллоцируется указатель на стэке. Если переставить эти два блока местами, программа никогда не станет работать хуже, а иногда будет работать лучше. Читаемость при этом не пострадает.

Отдельный метод для проверки наличия вершины стоит, чтобы не дублировать код, а также чтобы полностью вырезать в release сборке (с флагом -DNDEBUG) все assert-ы, включая проверку корректности программы.
Фукнция remove_node явно предполагает, что node содержится в list, но если кто-то позовет эту функцию, не соблюдя это условие (контракт функции), будет проблема, которая будет обнаружена весьма нескоро. Чтобы обнаруживать проблемы максимально быстро, нужны проверки контрактов функций.

comment:5 Changed 5 years ago by Sokolov Viacheslav

Resolution: задача сдана
Status: assignedclosed
Note: See TracTickets for help on using tickets.