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 Egor Suvorov

Owner: changed from Egor Suvorov to Шиповалов Артем
Type: ожидается проверкаожидаются исправления
  1. Ваши тесты не работают, программа падает. Подсказка: '0' — это цифра ноль, а не нулевой символ, на который заканчиваются строки в стиле Си.
  2. Тесты не являются автоматическими: если тест не пройден, то программа не падает, а надо смотреть, не было ли выведено AAAAAAAAA.

comment:2 Changed 5 years ago by Шиповалов Артем

Owner: changed from Шиповалов Артем to Egor Suvorov
Type: ожидаются исправленияожидается проверка
Version: 1.02.0

comment:3 Changed 5 years ago by Egor Suvorov

Owner: changed from Egor Suvorov to Шиповалов Артем
Type: ожидается проверкаожидаются исправления
  1. Ваши тесты всё ещё падают с segmentation fault. И просто так, и под Valgrind (он, правда, не успевает понять, что не так). Подсказка: строковые литералы — это указатели на константную память, которую нельзя менять.
  2. Не хватает const/restrict в нужных местах, из-за этого не компилируются наши тесты с вашей реализацией.
  3. Файл должен называться lab_02, а не main.

comment:4 Changed 5 years ago by Шиповалов Артем

Owner: changed from Шиповалов Артем to Egor Suvorov
Type: ожидаются исправленияожидается проверка
Version: 2.03.0

Я очень надеюсь, что вы решите проверить сегодня вечером🙄

comment:5 Changed 5 years ago by Egor Suvorov

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

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

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

  1. В ваших тестах куча 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)
    
    
  2. Во всех тестах undefined behavior: вы не ставите закрывающий ноль и происходит выход за границу.
  3. Не хватает include guard`.
  4. У функции strcpy параметры идут в другом порядке.
  5. У тестовых функций нет параметров => в сигнатуре должно быть (void), иначе в языке Си это означает "любые параметры" (в C++ не так).

При этом сами функции выглядят довольно корректно, но увы.

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

  • Корректный makefile и структура папок +1

Баллы за стиль — 0.5/3:

  1. Ставьте пробелы вокруг бинарных операторов: x[a + b] = y[c];
  2. Вместо while (*s != 0) лучше while (*s) (и в Си, и в C++, и во всех лабах).
  3. Вместо '\0' лучше использовать просто 0.
  4. Ставьте пробелы между for/while/if и следующей скобочкой: while (1), не while(1). Аналогично с else.
  5. Ставьте пробелы перед открывающей фигурной скобкой: while (1) {, а не while (1).
  6. Ставьте пустые строки между функциями.
  7. Не пишите толпу операций на одной строчке. Например, while в my_strcpy должен занимать четыре строчки, а не одну.
  8. my_strlen так надо решать на Haskell, а не на Си или C++ :) На Haskell это будет канонично, а на Си надо написать цикл с переменной.
  9. В my_strcmp лучше в цикле сделать условие &&, чтобы было очевидно, что мы никогда не выйдем за границу ни одной из строк. Сейчас это тоже верно, но неочевидно.
  10. В my_strcmp вам не нужен разбор трёх случаев в конце. Если вы вышли из цикла, то два из трёх случаев не реализуются.
  11. Вместо return 42; лучше поставить assert(false);
  12. Вместо _Exit() используйте exit() из <stdlib.h>, а конкретно в тестах лучше писать assert(my_strcmp(f, f2) == 0); вместо if.
Note: See TracTickets for help on using tickets.