Change History (8)

comment:1 Changed 5 years ago by Gleb Marin

Owner: changed from Evgeny Linsky to Sokolov Viacheslav
Status: newassigned

comment:2 Changed 5 years ago by Sokolov Viacheslav

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

Цель all тоже стоит пометить как .PHONY

Не гарантируется, как именно будет заполнена область памяти, выделенная с помощью malloc. В частности, указатель head может быть не нулевым, что повлияет на корректность программы. Для этого и нужен init_list.

Написал на вики про требования, в частности, проверка контрактов.

Примеры контрактов:

  • указатели ненулевые
  • если вершину просят из списка удалить, стоит поставить assert, что ее там нет изначально
  • malloc может вернуть NULL

Опечатка size_t lenght = 0;

Выдержка из Стандарта:

Note that %s and %[ may lead to buffer overflow if the width is not provided.

В данном случае нужно делать как-то так scanf("%238s", request);

like за --help

У меня программа ничего не выводит на запрос

add 1 2
len

В текущем виде в программе утечка памяти, рекомендую собрать ее с -fsanitize=leak , это должно помочь в поиске.

comment:3 Changed 5 years ago by Gleb Marin

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

comment:4 Changed 5 years ago by Sokolov Viacheslav

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

Остался отладочный вывод

comment:5 Changed 5 years ago by Gleb Marin

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

comment:6 Changed 5 years ago by Sokolov Viacheslav

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 Gleb Marin

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

comment:8 Changed 5 years ago by Sokolov Viacheslav

Resolution: задача сдана
Status: assignedclosed

Несколько комментариев.

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.