Opened 5 years ago
Closed 5 years ago
#129 closed ожидается проверка (задача сдана)
WW #2
Reported by: | potryasaeva.anna | Owned by: | Артур Гулецкий (huletski) |
---|---|---|---|
Component: | WW_strings | Version: | 3.0 |
Keywords: | Cc: |
Description
Change History (9)
comment:1 Changed 5 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|
comment:2 Changed 5 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|---|
Version: | 1.0 → 2.0 |
comment:3 Changed 5 years ago by
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
Type: | ожидаются исправления → ожидается проверка |
---|---|
Version: | 2.0 → 3.0 |
comment:5 Changed 5 years ago by
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
Type: | ожидаются исправления → ожидается проверка |
---|
comment:7 Changed 5 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|
Часть ошибок вы починили, но еще не все.
Убрать флаг компиляции, добавляющий проверки корректного обращения с памятью, чтобы избавиться от падения программы - не лучший способ ее "починить", так как это не устраняет причину падения.
Зачем компилировать с -fsanitize=address, если тесты не запускать, или у вас не падает?
Я плохо выразился, имелось в виду "Запускайте, пожалуйста, собственные тесты, перед тем как отсылать решение на проверку". Флаг компиляции можно оставить.
Один из ваших тестов неверно работает с памятью, выделенной на стеке, найдите, пожалуйста, ошибку и исправьте. Также опишите в комментарии, в чем заключалась ошибка.
comment:8 Changed 5 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|
Ошибка - выход за предел списка
comment:9 Changed 5 years ago by
Resolution: | → задача сдана |
---|---|
Status: | assigned → closed |
Зачтено, +10.
Ошибка - выход за предел списка
*массива. Видимо, вы не учли, что my_strcpy нуль-терминатор тоже копирует и завели тестовый буфер на единицу меньшего размера, чем нужно.
По условию
main
должен вызывать тесты, написанные вами. В текущей версии (rev 639) этого не происходит (иначе вы бы заметили, что, например,my_strlen
"зависает" из-за ошибки в реализации). Исправьте, пожалуйста.