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
comment:2 Changed 5 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|
Повторный запуск make делает что-то нетривиальное.
Не хватает зависимостей .o от .h
Мне кажется более удобным предположение, что list и node - not null, а list - инициализирован.
В любом случае fail-fast проверки на NULL лучше выносить на самый верх, чтобы не делать в таком случае лишних аллокаций.
Желательно в функциях add_node / remove_node проверять, что вершины отсуствует / присутствует, для чего удобно сделать вспомогательный метод. Это тоже контракт этих функций.
Закомментированные строчки - удалить (printf можно оставить)
между функциями - перевод строки
comment:3 Changed 5 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|---|
Version: | 1.0 → 2.0 |
Не очень понимаю, что не так с fail-fast, и зачем отдельный метод для проверки наличия вершины
comment:4 Changed 5 years ago by
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
Resolution: | → задача сдана |
---|---|
Status: | assigned → closed |
Я вроде решил проблему