Opened 5 years ago

Closed 5 years ago

#148 closed ожидается проверка (задача сдана)

WW #2

Reported by: Filippov Denis Owned by: Дмитрий Свиридкин
Component: WW_strings Version: 2.0
Keywords: Cc:

Description

Я смог победить assertion в vargrind!!! Создал отдельный массив строк для теста strcmp (задал его по другому).

Change History (4)

comment:1 Changed 5 years ago by Дмитрий Свиридкин

Owner: changed from Дмитрий Свиридкин to Кирилл Туров
Type: ожидается проверкаожидаются исправления

Ок.

  1. В cmake для Debug не надо дополнительно указывать -g.

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

  1. А можете без вот этого?
    while (len-- > 0)
        dest--;
    
    
  1. Ну и по поводу assert:
    #define NumOfStrsForTest 5
    
    int my_strcmp( const char *s1, const char *s2 )
    {
     #ваша реализация#
    }
    
      char *Strs[NumOfStrsForTest] =
    {
      "ФМЛ№30 ",
      "",
      "& ",
      "CGSG forever!!!!!!!!!\n",
      "(Computer graphics support group)\n"
    };
    
    int test_strcmp( void )
    {
      int real, mine;
    
      for (int i = 0; i < NumOfStrsForTest; i++)
        for (int j = 0; j < NumOfStrsForTest; j++)
        {
          real = strcmp(Strs[i], Strs[j]);
          mine = my_strcmp(Strs[i], Strs[j]);
          printf("%d %d\n", real, mine);
          assert(real == mine);
        }
    
      return 1;
    }
    
    
gcc -o main  -O0 -g  src/*
./main

Test of 'my_strcmp' function: 0 0
208 208
170 170

gcc -o main  -O0 -g  -fsanitize=undefined -fsanitize=address src/*
./main 
Test of 'my_strcmp' function: 0 0
1 208
main: src/test.c:36: test_strcmp: Assertion `real == mine' failed.
Aborted (core dumped)

Так что не стоит надеяться на особенности реализации, там водятся драконы.

comment:2 Changed 5 years ago by Filippov Denis

Owner: changed from Кирилл Туров to Дмитрий Свиридкин
Type: ожидаются исправленияожидается проверка
Version: 1.02.0
  1. Исправил.
  2. Исправил. В своё оправдание могу сказать следующее. Когда я реализовывал my_strcat, я увидел, что нужно использовать слово restrict, и как порядочный программист решил не обманывать компилятор. Поэтому решил не создавать дополнительный указатель, для сохранения адреса начала строки.
  3. )))

comment:3 Changed 5 years ago by Дмитрий Свиридкин

Зачтено.

В принципе, можно было заменить цикл на вычитание :)
restrict запрещает обращаться к одной и той же памяти через разные указатели. Копировать же указатели никто не запрещал.

comment:4 Changed 5 years ago by Дмитрий Свиридкин

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