Change History (3)

comment:1 Changed 5 years ago by Артур Гулецкий (huletski)

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

Собирается (+0.01), не работает на примере из задания (падает и формат вывода не соответствует ожидаемому):

{lab_03}[2181]$ pwd && svn up && svn status
/home/hfx/dvl/cpp19/sabirova.milyausha/lab_03
Updating '.':
At revision 1247.
{lab_03}[2182]$ make
mkdir obj
gcc -c -Wall -Wextra -Werror -Iinclude -fsanitize=address src/clist.c -o obj/clist.o
gcc -c -Wall -Wextra -Werror -Iinclude -fsanitize=address src/main.c -o obj/main.o
gcc obj/clist.o obj/main.o  -o lab_03 -fsanitize=address
{lab_03}[2183]$ cat ~/dvl/private-labs/lab_03/check/tests/00-smoke.input 
add 1 2
add 3 6
add 4 6
len
add 1 2
print
sort
rm 1 2
print
rma
print
len
add 2 -4
print
exit
{lab_03}[2184]$ ./lab_03 < ~/dvl/private-labs/lab_03/check/tests/00-smoke.input  
3
1 2
=================================================================
==7083==ERROR: AddressSanitizer: heap-use-after-free on address 0x6030000000a8 at pc 0x00000040122a bp 0x7ffda0aecdc0 sp 0x7ffda0aecdb0
READ of size 8 at 0x6030000000a8 thread T0
    #0 0x401229 in show_all_points (/home/hfx/dvl/cpp19/sabirova.milyausha/lab_03/lab_03+0x401229)
    #1 0x401621 in main (/home/hfx/dvl/cpp19/sabirova.milyausha/lab_03/lab_03+0x401621)
    #2 0x7fe1da13482f in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2082f)
    #3 0x400ae8 in _start (/home/hfx/dvl/cpp19/sabirova.milyausha/lab_03/lab_03+0x400ae8)

0x6030000000a8 is located 8 bytes inside of 24-byte region [0x6030000000a0,0x6030000000b8)
freed by thread T0 here:
    #0 0x7fe1da5e9bff in __interceptor_free (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x10bbff)
    #1 0x401208 in show_all_points (/home/hfx/dvl/cpp19/sabirova.milyausha/lab_03/lab_03+0x401208)
    #2 0x401621 in main (/home/hfx/dvl/cpp19/sabirova.milyausha/lab_03/lab_03+0x401621)
    #3 0x7fe1da13482f in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2082f)

previously allocated by thread T0 here:
    #0 0x7fe1da5e9ff8 in malloc (/usr/lib/x86_64-linux-gnu/libasan.so.5+0x10bff8)
    #1 0x400eea in add_point (/home/hfx/dvl/cpp19/sabirova.milyausha/lab_03/lab_03+0x400eea)
    #2 0x4014d2 in main (/home/hfx/dvl/cpp19/sabirova.milyausha/lab_03/lab_03+0x4014d2)
    #3 0x7fe1da13482f in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2082f)

SUMMARY: AddressSanitizer: heap-use-after-free (/home/hfx/dvl/cpp19/sabirova.milyausha/lab_03/lab_03+0x401229) in show_all_points
Shadow bytes around the buggy address:
  0x0c067fff7fc0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0c067fff7fd0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0c067fff7fe0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0c067fff7ff0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0c067fff8000: fa fa 00 00 00 fa fa fa 00 00 00 fa fa fa 00 00
=>0x0c067fff8010: 00 fa fa fa fd[fd]fd fa fa fa fa fa fa fa fa fa
  0x0c067fff8020: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c067fff8030: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c067fff8040: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c067fff8050: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c067fff8060: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
Shadow byte legend (one shadow byte represents 8 application bytes):
  Addressable:           00
  Partially addressable: 01 02 03 04 05 06 07 
  Heap left redzone:       fa
  Freed heap region:       fd
  Stack left redzone:      f1
  Stack mid redzone:       f2
  Stack right redzone:     f3
  Stack after return:      f5
  Stack use after scope:   f8
  Global redzone:          f9
  Global init order:       f6
  Poisoned by user:        f7
  Container overflow:      fc
  Array cookie:            ac
  Intra object redzone:    bb
  ASan internal:           fe
  Left alloca redzone:     ca
  Right alloca redzone:    cb
  Shadow gap:              cc
==7083==ABORTING

Кроме того, как минимум нужно починить отступы.

comment:2 Changed 5 years ago by Milyausha Sabirova

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

comment:3 Changed 5 years ago by Артур Гулецкий (huletski)

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

Все еще падает на примере из условия:

{lab_03}[2435]$ pwd && svn up && svn status
/home/hfx/dvl/cpp19/sabirova.milyausha/lab_03
Updating '.':
At revision 1327.
{lab_03}[2436]$ make
mkdir obj
gcc -c -Wall -Wextra -Werror -Iinclude -fsanitize=address src/clist.c -o obj/clist.o
gcc -c -Wall -Wextra -Werror -Iinclude -fsanitize=address src/main.c -o obj/main.o
gcc obj/clist.o obj/main.o  -o lab_03 -fsanitize=address
{lab_03}[2437]$ cat ~/dvl/private-labs/lab_03/check/tests/00-smoke.input add 1 2
add 3 6
add 4 6
len
add 1 2
print
sort
rm 1 2
print
rma
print
len
add 2 -4
print
exit
{lab_03}[2438]$ ./lab_03 < ~/dvl/private-labs/lab_03/check/tests/00-smoke.input  
AddressSanitizer:DEADLYSIGNAL
=================================================================
==12883==ERROR: AddressSanitizer: SEGV on unknown address 0x000000000008 (pc 0x000000400d57 bp 0x7ffdcc766c40 sp 0x7ffdcc766c30 T0)
==12883==The signal is caused by a WRITE memory access.
==12883==Hint: address points to the zero page.
    #0 0x400d56 in add_node (/home/hfx/dvl/cpp19/sabirova.milyausha/lab_03/lab_03+0x400d56)
    #1 0x400fd3 in add_point (/home/hfx/dvl/cpp19/sabirova.milyausha/lab_03/lab_03+0x400fd3)
    #2 0x401517 in main (/home/hfx/dvl/cpp19/sabirova.milyausha/lab_03/lab_03+0x401517)
    #3 0x7fead2ed782f in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2082f)
    #4 0x400b28 in _start (/home/hfx/dvl/cpp19/sabirova.milyausha/lab_03/lab_03+0x400b28)

AddressSanitizer can not provide additional info.
SUMMARY: AddressSanitizer: SEGV (/home/hfx/dvl/cpp19/sabirova.milyausha/lab_03/lab_03+0x400d56) in add_node
==12883==ABORTING

Замечания:

  • clist.h: заголовочные файлы обычно включают после/внутри include guard'a;
  • remove_point: если в теле цикла изменяется (помимо тривиального обновления, связанного с переходом к следующей итерации) переменная, по которой происходит итерация, то естественнее использовать цикл while;
  • bug в реализации add_node: при добавлении первого узла node->next равен NULL -> программа падает на clist.c:13. Вариант fix'a: проверять на NULL перед присваиванием -> -1 (за баг) -1 (за то, что не тестировали программу, т.к. "добавить точку в список" - первый тест, который в голову приходит, т.к. на пустом нет смысла проверять остальные содержательные команды);
  • не освобождается память, выделенная под head. Варианты как это исправить обсуждали на паре -> -1.5.

Итог: 8.5/12.

Note: See TracTickets for help on using tickets.