Change History (9)

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

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

По условию main должен вызывать тесты, написанные вами. В текущей версии (rev 639) этого не происходит (иначе вы бы заметили, что, например, my_strlen "зависает" из-за ошибки в реализации). Исправьте, пожалуйста.

comment:2 Changed 5 years ago by potryasaeva.anna

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

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

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

Реализация корректная, +10.

Замечания:

  • test_str.c:4 - включаете "локальный" string.h, которого нет, непонятно зачем;
  • с точки зрения производительности strlen лучше реализовать итеративно;
  • написанные тесты не вызываются (см. ниже).

По условию задания main должна вызывать тесты:

В файле test.c реализуйте main() с вызовом всех автоматических тестов. Таким образом при запуске исполняемого файла lab_02 должны проверяться все ваши функции из пункта 1.

Ваша реализация main этого не делает: вместо вызовов функций - их объявления:

{lab_02}[2031]$ pwd && svn up && svn status
/home/hfx/dvl/cpp19/potryasaeva.anna/lab_02
Updating '.':
At revision 701.
{lab_02}[2032]$ cat src/test.c 
int main(void){
	void my_test_strcpy ();
	void my_test_strcat ();
	void my_test_strcmp ();
	void my_test_strlen ();
	return 0;
}

Так как тесты не вызываются, -4 балла.

--
Итог: 6/10, если хотите полный балл - реализуйте вызов собственных тестов.

comment:4 Changed 5 years ago by potryasaeva.anna

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

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

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

Вызов есть -> +4.

Запустил -> тесты падают -> -4. Зачем компилировать с -fsanitize=address, если тесты не запускать, или у вас не падает?

{lab_02}[2096]$ pwd && svn up && svn status 
/home/hfx/dvl/cpp19/potryasaeva.anna/lab_02
Updating '.':
At revision 713.
{lab_02}[2097]$ ./
include/ src/     
{lab_02}[2097]$ make
mkdir -p obj/
g++ -c -Wall -Wextra -Werror -fsanitize=address -Iinclude src/str.c -o obj/str.o 
g++ -c -Wall -Wextra -Werror -fsanitize=address -Iinclude src/test.c -o obj/test.o
g++ -c -Wall -Wextra -Werror  -fsanitize=address -Iinclude src/test_str.c -o obj/test_str.o
g++ -Wall -Wextra -Werror -fsanitize=address obj/str.o obj/test.o obj/test_str.o -o lab_02
{lab_02}[2098]$ ./lab_02 
=================================================================
==6240==ERROR: AddressSanitizer: stack-buffer-overflow on address 0x7ffd4f6ef8f3 at pc 0x000000400ac2 bp 0x7ffd4f6ef890 sp 0x7ffd4f6ef880
WRITE of size 1 at 0x7ffd4f6ef8f3 thread T0
    #0 0x400ac1 in my_strcpy(char*, char const*) (/home/hfx/dvl/cpp19/potryasaeva.anna/lab_02/lab_02+0x400ac1)
    #1 0x400e42 in my_test_strcpy() (/home/hfx/dvl/cpp19/potryasaeva.anna/lab_02/lab_02+0x400e42)
    #2 0x400d8f in main (/home/hfx/dvl/cpp19/potryasaeva.anna/lab_02/lab_02+0x400d8f)
    #3 0x7f5eaa66c82f in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2082f)
    #4 0x400978 in _start (/home/hfx/dvl/cpp19/potryasaeva.anna/lab_02/lab_02+0x400978)

Address 0x7ffd4f6ef8f3 is located in stack of thread T0 at offset 35 in frame
    #0 0x400dc5 in my_test_strcpy() (/home/hfx/dvl/cpp19/potryasaeva.anna/lab_02/lab_02+0x400dc5)

  This frame has 1 object(s):
    [32, 35) 's' (line 5) <== Memory access at offset 35 overflows this variable
HINT: this may be a false positive if your program uses some custom stack unwind mechanism, swapcontext or vfork
      (longjmp and C++ exceptions *are* supported)
SUMMARY: AddressSanitizer: stack-buffer-overflow (/home/hfx/dvl/cpp19/potryasaeva.anna/lab_02/lab_02+0x400ac1) in my_strcpy(char*, char const*)
Shadow bytes around the buggy address:
  0x100029ed5ec0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x100029ed5ed0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x100029ed5ee0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x100029ed5ef0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x100029ed5f00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
=>0x100029ed5f10: 00 00 00 00 00 00 00 00 00 00 f1 f1 f1 f1[03]f3
  0x100029ed5f20: f3 f3 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x100029ed5f30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x100029ed5f40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x100029ed5f50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x100029ed5f60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
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
==6240==ABORTING

--
Итог: все еще 6/10.

comment:6 Changed 5 years ago by potryasaeva.anna

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

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

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

Часть ошибок вы починили, но еще не все.

Убрать флаг компиляции, добавляющий проверки корректного обращения с памятью, чтобы избавиться от падения программы - не лучший способ ее "починить", так как это не устраняет причину падения.

Зачем компилировать с -fsanitize=address, если тесты не запускать, или у вас не падает?

Я плохо выразился, имелось в виду "Запускайте, пожалуйста, собственные тесты, перед тем как отсылать решение на проверку". Флаг компиляции можно оставить.

Один из ваших тестов неверно работает с памятью, выделенной на стеке, найдите, пожалуйста, ошибку и исправьте. Также опишите в комментарии, в чем заключалась ошибка.

comment:8 Changed 5 years ago by potryasaeva.anna

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

Ошибка - выход за предел списка

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

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

Зачтено, +10.

Ошибка - выход за предел списка

*массива. Видимо, вы не учли, что my_strcpy нуль-терминатор тоже копирует и завели тестовый буфер на единицу меньшего размера, чем нужно.

Note: See TracTickets for help on using tickets.