Opened 5 years ago

Closed 4 years ago

#217 closed ожидаются исправления (задача сдана)

WW #2

Reported by: egipti.pavel Owned by: egipti.pavel
Component: WW_strings Version: 2.0
Keywords: Cc:

Description


Change History (7)

comment:1 Changed 5 years ago by Egor Suvorov

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

Проверялась ревизия 830 или более ранняя.

Не компилируется:

osboxes@osboxes:~/cpp2019/cpp19/egipti.pavel/lab_02$ make
gcc -c -o  obj/test_str.o -Iinclude -Wall -Wextra -Werror src/test_str.c  
src/test_str.c: In function ‘test_strcpy’:
src/test_str.c:17:7: error: assignment makes integer from pointer without a cast [-Werror=int-conversion]
     y = strcpy(s1,s2);
       ^
In file included from src/test_str.c:1:0:
src/test_str.c:18:12: error: implicit declaration of function ‘my_strcpy’ [-Werror=implicit-function-declaration]
     assert(my_strcpy(s1,s2) == y);
            ^
cc1: all warnings being treated as errors
Makefile:15: recipe for target 'obj/test_str.o' failed
make: *** [obj/test_str.o] Error 1

Я предположил, что у нас могут быть разные версии компиляторов и разные предупреждения. Отключил флаг -Werror. Следующая ошибка:

osboxes@osboxes:~/cpp2019/cpp19/egipti.pavel/lab_02$ make
mkdir -p obj
gcc -c -o obj/str.o -Iinclude -Wall -Wextra src/str.c 
gcc -c -o  obj/test_str.o -Iinclude -Wall -Wextra src/test_str.c  
src/test_str.c: In function ‘test_strcpy’:
src/test_str.c:17:7: warning: assignment makes integer from pointer without a cast [-Wint-conversion]
     y = strcpy(s1,s2);
       ^
In file included from src/test_str.c:1:0:
src/test_str.c:18:12: warning: implicit declaration of function ‘my_strcpy’ [-Wimplicit-function-declaration]
     assert(my_strcpy(s1,s2) == y);
            ^
make: *** No rule to make target 'str.h', needed by 'obj/test.o'.  Stop.

То есть неправильная зависимость прописана в Makefile. Поправил. Дальше падают ваши тесты:

osboxes@osboxes:~/cpp2019/cpp19/egipti.pavel/lab_02$ ./lab_02
lab_02: src/test_str.c:10: test_strlen: Assertion `my_strlen("somebody") == x' failed.

Наши тесты тоже падают.

Корректность:

  1. Не компилируется, пока не исправить код, не проходят ваши тесты.
  2. Сигнатуры не в точности соответствуют стандарту: надо возвращать size_t из my_strlen. А из my_strcpy/my_strcmp — указатель, а не символ.
  3. Нет тестов на strlen.

my_strlen и my_strcmp за исключением этих больших проблем корректны.

Стиль:

  1. Следующие порядки должны совпадать: порядок определений my_*, порядок объявлений my_*, порядок описания этих функций в стандарте, порядок этих функций в задании, порядок объявлений тестовых функций, порядок определений тестовых функций, порядок вызовов тестов.
  2. Используйте для отступов либо везде пробелы, либо везде табы, иначе это плохо отображается в редакторах, где таб не равен вашему по ширине. В любом нормальном редакторе есть кнопка "заменять все табы на пробелы".
  3. Ставьте пробелы вокруг бинарных операторов: x[a + b] = y[c];
  4. Вместо while (*s != 0) лучше while (*s) (и в Си, и в C++, и во всех лабах).
  5. Вместо '\0' лучше использовать просто 0.
  6. В тестах можно сравнивать прямо строковые литералы (они уже лежат в константной памяти, на них можно брать указатели), незачем их сначала класть в массив.

Итого 1 балл за всё вместе.

comment:2 Changed 4 years ago by egipti.pavel

Resolution: задача НЕ сдана
Status: closedreopened
Version: 1.02.0

comment:3 Changed 4 years ago by Дмитрий Лапшин (lapshin)

Status: reopenedassigned

comment:4 Changed 4 years ago by Egor Suvorov

Owner: changed from Egor Suvorov to egipti.pavel

Дорешивание. Стало сильно лучше. Компилируется, автотесты проходит.

Корректность:

  1. Непонятно, зачем test.c включает str.h.
  2. my_strlen должен возвращать size_t

Стиль:

  1. Следующие порядки должны совпадать: порядок определений my_*, порядок объявлений my_*, порядок описания этих функций в стандарте, порядок этих функций в задании, порядок объявлений тестовых функций, порядок определений тестовых функций, порядок вызовов тестов.
  2. В тестах лучше не используйте my_strcmp/my_strlen/strcmp/strlen для проверки. Проверяйте прямо содержимое массивов напрямую.
  3. В test_strlen нехорошо присваивать константную строку в char*. Аналогично в test_strcmp.
  4. Поехавшие отступы в my_strcpy и my_strcat.

Баллы за корректность 5/7:

  • Корректный makefile и структура папок +1
  • Ваши тесты проходят +1
  • Корректный strcpy и тест +1
  • Корректный strcat и тест +1
  • Корректный strcmp и тест +1

Стиль 2/3.

comment:5 Changed 4 years ago by Egor Suvorov

P.S. Вместо -lasan надо указывать -fsanitize=address

comment:6 Changed 4 years ago by Egor Suvorov

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

comment:7 Changed 4 years ago by Egor Suvorov

Resolution: задача сдана
Status: assignedclosed
Note: See TracTickets for help on using tickets.