Opened 5 years ago

Closed 5 years ago

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

WW #3

Reported by: Maria Chizhova Owned by: Egor Suvorov
Component: WW_intrusive_list Version: 3.0
Keywords: Cc:

Description


Change History (5)

comment:1 Changed 5 years ago by Egor Suvorov

Owner: changed from Egor Suvorov to Maria Chizhova
Type: ожидается проверкаожидаются исправления

Идеи верные, структурки норм, осталось додебажить :)

На тесте из примера:

  1. Завершайте каждую строчку в выводе переводом строки.
  2. Не выводите пробел в конце списка точек.
  3. Под виндой len выводит отрицательное число. На Linux такого нет => наверняка UB где-то спрятался.
  4. Утечки памяти прямо от address sanitizer в вашей программе:
    osboxes@osboxes:~/cpp2019/cpp19/chizhova.mariya/lab_03$ make
    mkdir -p obj/
    gcc -g -c -Wall -Wextra -Werror -fsanitize=address -Iinclude src/clist.c -o obj/clist.o
    gcc -g  -c -Wall -Wextra -Werror -fsanitize=address -Iinclude src/main.c -o obj/main.o
    gcc -g -Wall -Wextra -Werror -fsanitize=address obj/clist.o obj/main.o -o lab_03
    osboxes@osboxes:~/cpp2019/cpp19/chizhova.mariya/lab_03$ ./lab_03
    add 1 2
    add 3 6
    add 4 6
    len
    3add 1 2
    print
    (1 2) (4 6) (3 6) (1 2) sort
    Unknown commandrma
    print
    len
    0add 2 -4
    print
    (2 -4) exit
    
    =================================================================
    ==6664==ERROR: LeakSanitizer: detected memory leaks
    
    Direct leak of 24 byte(s) in 1 object(s) allocated from:
        #0 0x7f8cab858602 in malloc (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x98602)
        #1 0x4010a0 in add_point src/main.c:13
        #2 0x40156f in main src/main.c:63
        #3 0x7f8cab41682f in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2082f)
    
    Indirect leak of 48 byte(s) in 2 object(s) allocated from:
        #0 0x7f8cab858602 in malloc (/usr/lib/x86_64-linux-gnu/libasan.so.2+0x98602)
        #1 0x4010a0 in add_point src/main.c:13
        #2 0x40156f in main src/main.c:63
        #3 0x7f8cab41682f in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2082f)
    
    SUMMARY: AddressSanitizer: 72 byte(s) leaked in 3 allocation(s).
    

Подсказки:

  1. Упростите add_node. Случаи "список пустой" и "список непустой" отличаются только одной строчкой.
  2. Не заглушайте ошибку "удаляем из пустого списка". Такого в корректной программе быть не должно, а вы молча делаете return в этом случае. Лучше assert(l->head); поставить.
  3. В remove_node разбирайте не 2*2=4 случая с 2*2*=8 тонкостями, а сначала два случая про node->prev отдельно с одной тонкостью в каждом, а потом независимо от этого — два про node->head с одной тонкостью в каждом. Итого 2*1+2*1=4 тонкости, в два раза меньше думать.
  4. Проблемы есть и в main.c тоже (например, потому что выделение памяти есть только там, а с ним точно проблемы), но считывание вроде адекватное.
  5. Повыводите промежуточные состояния списка. Можете сделать функцию check_list, которая пробегается по списку и проверяет, что все ссылки стоят правильно.

comment:2 Changed 5 years ago by Maria Chizhova

Owner: changed from Maria Chizhova to Egor Suvorov
Type: ожидаются исправленияожидается проверка
Version: 1.02.0

comment:3 Changed 5 years ago by Egor Suvorov

Owner: changed from Egor Suvorov to Maria Chizhova
Type: ожидается проверкаожидаются исправления

Корректность — 7/8:

  1. print выводит лишний пробел в конце строки.
  2. Если скормить на вход очень длинную команду, то переполнится буфер str, будет UB.

В остальном по корректности отлично.

Стиль — 2.5/4:

  1. Объявляйте переменные в самом вложенном месте, где они в первый раз нужны.
  2. s --> command, a, b --> x, y (и объявить в самом вложенном месте, где можно).
  3. printf("%s", "foo"); лучше заменить на printf("foo");
  4. Лучше не if (x != NULL), а просто if (x).

код будет чуть красивее и симметричнее, имхо.

  1. temp для итерации по списку — item/entry/point_node.
  2. del, elem --> point/pt.
  3. В show_all_points прекрасно подойдёт цикл for вместо while.
  4. В add_node лучше сначала выставлять свойства node, а потом все остальные. Тогда 1. remove_node весьма хорош, но можно ещё упростить. Подсказка: вам нужно несколько строк вне if и два if с ветками else: один с условием node->prev != NULL, один с условием node->next != NULL.

Последние два пункта (исправления в списке) стоят +1 балл по стилю.

comment:4 Changed 5 years ago by Maria Chizhova

Owner: changed from Maria Chizhova to Egor Suvorov
Type: ожидаются исправленияожидается проверка
Version: 2.03.0

comment:5 Changed 5 years ago by Egor Suvorov

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

Успех, 12/12!

Note: See TracTickets for help on using tickets.