Opened 5 years ago
Closed 5 years ago
#182 closed ожидается проверка (задача сдана)
WW #3
Reported by: | Gleb Marin | Owned by: | Sokolov Viacheslav |
---|---|---|---|
Component: | WW_intrusive_list | Version: | 3.0 |
Keywords: | Cc: | Sokolov Viacheslav |
Description
Change History (8)
comment:1 Changed 5 years ago by
Owner: | changed from Evgeny Linsky to Sokolov Viacheslav |
---|---|
Status: | new → assigned |
comment:2 Changed 5 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|
comment:3 Changed 5 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|---|
Version: | 1.0 → 2.0 |
comment:4 Changed 5 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|
Остался отладочный вывод
comment:5 Changed 5 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|---|
Version: | 2.0 → 3.0 |
comment:6 Changed 5 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|
В init_list не инициализируется head.
Запуск из-под valgrind:
==15421== Conditional jump or move depends on uninitialised value(s) ==15421== LEAK SUMMARY: ==15421== definitely lost: 24 bytes in 1 blocks ==15421== indirectly lost: 24 bytes in 1 blocks ==15421== possibly lost: 0 bytes in 0 blocks ==15421== still reachable: 0 bytes in 0 blocks ==15421== suppressed: 0 bytes in 0 blocks
comment:7 Changed 5 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|
comment:8 Changed 5 years ago by
Resolution: | → задача сдана |
---|---|
Status: | assigned → closed |
Несколько комментариев.
void init_list(intrusive_list *list) { if (!list) { list = malloc(sizeof(intrusive_list)); }
Так делать не надо, потому что если снаружи все же передадут NULL и здесь произойдет аллокация, не получится позвать free, потому что указатель (который вернул malloc) теряется. Нужно сделать одно из двух:
- принимать not null list
- возвращать не void, а intrusive_list *
malloc может вернуть NULL, нужны assert-ы
intrusive_list *list = malloc(sizeof(intrusive_list));
здесь не нужна аллокация, можно выделять на стэке.
--help дарует индульгенцию
Note: See
TracTickets for help on using
tickets.
Цель all тоже стоит пометить как .PHONY
Не гарантируется, как именно будет заполнена область памяти, выделенная с помощью malloc. В частности, указатель head может быть не нулевым, что повлияет на корректность программы. Для этого и нужен init_list.
Написал на вики про требования, в частности, проверка контрактов.
Примеры контрактов:
Опечатка
size_t lenght = 0;
Выдержка из Стандарта:
Note that %s and %[ may lead to buffer overflow if the width is not provided.
В данном случае нужно делать как-то так
scanf("%238s", request);
like за --help
У меня программа ничего не выводит на запрос
В текущем виде в программе утечка памяти, рекомендую собрать ее с -fsanitize=leak , это должно помочь в поиске.