Opened 5 years ago
Closed 5 years ago
#167 closed ожидается проверка (задача НЕ сдана)
WW_ #2
Reported by: | Шиповалов Артем | Owned by: | Egor Suvorov |
---|---|---|---|
Component: | WW_strings | Version: | 3.0 |
Keywords: | Cc: |
Description
Change History (5)
comment:1 Changed 5 years ago by
Owner: | changed from Egor Suvorov to Шиповалов Артем |
---|---|
Type: | ожидается проверка → ожидаются исправления |
comment:2 Changed 5 years ago by
Owner: | changed from Шиповалов Артем to Egor Suvorov |
---|---|
Type: | ожидаются исправления → ожидается проверка |
Version: | 1.0 → 2.0 |
comment:3 Changed 5 years ago by
Owner: | changed from Egor Suvorov to Шиповалов Артем |
---|---|
Type: | ожидается проверка → ожидаются исправления |
- Ваши тесты всё ещё падают с segmentation fault. И просто так, и под Valgrind (он, правда, не успевает понять, что не так). Подсказка: строковые литералы — это указатели на константную память, которую нельзя менять.
- Не хватает
const
/restrict
в нужных местах, из-за этого не компилируются наши тесты с вашей реализацией. - Файл должен называться
lab_02
, а неmain
.
comment:4 Changed 5 years ago by
Owner: | changed from Шиповалов Артем to Egor Suvorov |
---|---|
Type: | ожидаются исправления → ожидается проверка |
Version: | 2.0 → 3.0 |
Я очень надеюсь, что вы решите проверить сегодня вечером🙄
comment:5 Changed 5 years ago by
Resolution: | → задача НЕ сдана |
---|---|
Status: | assigned → closed |
Проверялась ревизия 830 или более ранняя.
Корректность:
- В ваших тестах куча undefined behaviour:
osboxes@osboxes:~/cpp2019/cpp19/shipovalov.artem/lab_02$ valgrind ./lab_02 ==4931== Memcheck, a memory error detector ==4931== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al. ==4931== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info ==4931== Command: ./lab_02 ==4931== ==4931== Conditional jump or move depends on uninitialised value(s) ==4931== at 0x400613: my_strcpy (in /home/osboxes/cpp2019/cpp19/shipovalov.artem/lab_02/lab_02) ==4931== by 0x40085D: test_strcpy (in /home/osboxes/cpp2019/cpp19/shipovalov.artem/lab_02/lab_02) ==4931== by 0x4005A3: main (in /home/osboxes/cpp2019/cpp19/shipovalov.artem/lab_02/lab_02) ==4931== ==4931== Conditional jump or move depends on uninitialised value(s) ==4931== at 0x40076E: my_strcmp (in /home/osboxes/cpp2019/cpp19/shipovalov.artem/lab_02/lab_02) ==4931== by 0x400870: test_strcpy (in /home/osboxes/cpp2019/cpp19/shipovalov.artem/lab_02/lab_02) ==4931== by 0x4005A3: main (in /home/osboxes/cpp2019/cpp19/shipovalov.artem/lab_02/lab_02) ==4931== ==4931== Conditional jump or move depends on uninitialised value(s) ==4931== at 0x40079A: my_strcmp (in /home/osboxes/cpp2019/cpp19/shipovalov.artem/lab_02/lab_02) ==4931== by 0x400870: test_strcpy (in /home/osboxes/cpp2019/cpp19/shipovalov.artem/lab_02/lab_02) ==4931== by 0x4005A3: main (in /home/osboxes/cpp2019/cpp19/shipovalov.artem/lab_02/lab_02) ==4931== ==4931== Conditional jump or move depends on uninitialised value(s) ==4931== at 0x4007C9: my_strcmp (in /home/osboxes/cpp2019/cpp19/shipovalov.artem/lab_02/lab_02) ==4931== by 0x400870: test_strcpy (in /home/osboxes/cpp2019/cpp19/shipovalov.artem/lab_02/lab_02) ==4931== by 0x4005A3: main (in /home/osboxes/cpp2019/cpp19/shipovalov.artem/lab_02/lab_02) ==4931== ==4931== Conditional jump or move depends on uninitialised value(s) ==4931== at 0x4007F8: my_strcmp (in /home/osboxes/cpp2019/cpp19/shipovalov.artem/lab_02/lab_02) ==4931== by 0x400870: test_strcpy (in /home/osboxes/cpp2019/cpp19/shipovalov.artem/lab_02/lab_02) ==4931== by 0x4005A3: main (in /home/osboxes/cpp2019/cpp19/shipovalov.artem/lab_02/lab_02) ==4931== ==4931== Conditional jump or move depends on uninitialised value(s) ==4931== at 0x4006C7: my_strlen (in /home/osboxes/cpp2019/cpp19/shipovalov.artem/lab_02/lab_02) ==4931== by 0x4006D9: my_strlen (in /home/osboxes/cpp2019/cpp19/shipovalov.artem/lab_02/lab_02) ==4931== by 0x4006D9: my_strlen (in /home/osboxes/cpp2019/cpp19/shipovalov.artem/lab_02/lab_02) ==4931== by 0x4006D9: my_strlen (in /home/osboxes/cpp2019/cpp19/shipovalov.artem/lab_02/lab_02) ==4931== by 0x4006D9: my_strlen (in /home/osboxes/cpp2019/cpp19/shipovalov.artem/lab_02/lab_02) ==4931== by 0x4006D9: my_strlen (in /home/osboxes/cpp2019/cpp19/shipovalov.artem/lab_02/lab_02) ==4931== by 0x4006D9: my_strlen (in /home/osboxes/cpp2019/cpp19/shipovalov.artem/lab_02/lab_02) ==4931== by 0x4008FD: test_strcat (in /home/osboxes/cpp2019/cpp19/shipovalov.artem/lab_02/lab_02) ==4931== by 0x4005B7: main (in /home/osboxes/cpp2019/cpp19/shipovalov.artem/lab_02/lab_02) ==4931== ==4931== Conditional jump or move depends on uninitialised value(s) ==4931== at 0x40065D: my_strcat (in /home/osboxes/cpp2019/cpp19/shipovalov.artem/lab_02/lab_02) ==4931== by 0x400922: test_strcat (in /home/osboxes/cpp2019/cpp19/shipovalov.artem/lab_02/lab_02) ==4931== by 0x4005B7: main (in /home/osboxes/cpp2019/cpp19/shipovalov.artem/lab_02/lab_02) ==4931== ==4931== Conditional jump or move depends on uninitialised value(s) ==4931== at 0x40069A: my_strcat (in /home/osboxes/cpp2019/cpp19/shipovalov.artem/lab_02/lab_02) ==4931== by 0x400922: test_strcat (in /home/osboxes/cpp2019/cpp19/shipovalov.artem/lab_02/lab_02) ==4931== by 0x4005B7: main (in /home/osboxes/cpp2019/cpp19/shipovalov.artem/lab_02/lab_02) ==4931== ==4931== ==4931== HEAP SUMMARY: ==4931== in use at exit: 0 bytes in 0 blocks ==4931== total heap usage: 0 allocs, 0 frees, 0 bytes allocated ==4931== ==4931== All heap blocks were freed -- no leaks are possible ==4931== ==4931== For counts of detected and suppressed errors, rerun with: -v ==4931== Use --track-origins=yes to see where uninitialised values come from ==4931== ERROR SUMMARY: 10 errors from 8 contexts (suppressed: 0 from 0)
- Во всех тестах undefined behavior: вы не ставите закрывающий ноль и происходит выход за границу.
- Не хватает include guard`.
- У функции
strcpy
параметры идут в другом порядке. - У тестовых функций нет параметров => в сигнатуре должно быть
(void)
, иначе в языке Си это означает "любые параметры" (в C++ не так).
При этом сами функции выглядят довольно корректно, но увы.
Баллы за корректность:
- Корректный makefile и структура папок +1
Баллы за стиль — 0.5/3:
- Ставьте пробелы вокруг бинарных операторов:
x[a + b] = y[c];
- Вместо
while (*s != 0)
лучшеwhile (*s)
(и в Си, и в C++, и во всех лабах). - Вместо
'\0'
лучше использовать просто0
. - Ставьте пробелы между
for
/while
/if
и следующей скобочкой:while (1)
, неwhile(1)
. Аналогично сelse
. - Ставьте пробелы перед открывающей фигурной скобкой:
while (1) {
, а неwhile (1)
. - Ставьте пустые строки между функциями.
- Не пишите толпу операций на одной строчке. Например,
while
вmy_strcpy
должен занимать четыре строчки, а не одну. my_strlen
так надо решать на Haskell, а не на Си или C++ :) На Haskell это будет канонично, а на Си надо написать цикл с переменной.- В
my_strcmp
лучше в цикле сделать условие&&
, чтобы было очевидно, что мы никогда не выйдем за границу ни одной из строк. Сейчас это тоже верно, но неочевидно. - В
my_strcmp
вам не нужен разбор трёх случаев в конце. Если вы вышли из цикла, то два из трёх случаев не реализуются. - Вместо
return 42;
лучше поставитьassert(false);
- Вместо
_Exit()
используйтеexit()
из<stdlib.h>
, а конкретно в тестах лучше писатьassert(my_strcmp(f, f2) == 0);
вместоif
.
Note: See
TracTickets for help on using
tickets.
'0'
— это цифра ноль, а не нулевой символ, на который заканчиваются строки в стиле Си.AAAAAAAAA
.