Opened 5 years ago

Closed 4 years ago

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

WW #5

Reported by: Alexander Morozov Owned by: Sokolov Viacheslav
Component: WW_c_io Version: 2.0
Keywords: Cc:

Description


Change History (3)

comment:1 Changed 5 years ago by Sokolov Viacheslav

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

23 int ans = 0;
лучше именовать не answer, а result, потому что у функции - возвращаемое значение (return value, результат работы)

not null проверки в from_bytes, to_bytes

 45   static unsigned char buffer[NUM_BYTES * 2 + 1];

здесь static лучше не использовать, потому что в многопоточной среде это повлияет на корректность (функцию можно будет звать только из одного потока), а экономия несущественная

printer_fmt реализован некорректно. Не нужно вручную разбирать форматную строчку, нужно просто передать ее в printf вместе с двумя аргументами. Если форматная строка выглядит как-то так "%2d %2d", работать будет неправильно.

Вообще глобальных состояний лучше избегать. Вот какая-то статья на эту тему https://habr.com/ru/company/mailru/blog/454946/ (быстро не смог найти ничего лучше), она вызывает некоторые вопросы, но кажется, что верхнеуровнево по делу написано

83   struct intrusive_list* list = malloc(sizeof(struct intrusive_list));

какая мотивация аллоцировать на куче?

Нужно поправить на допбалл:
fprintf / fwrite / fputc может не получиться, если на файловой системе место кончилось.
Нужно как-нибудь специфицировать поведение программы в таком случае - как минимум сообщать об этом с помощью кода возврата. Для этого стоит либо поменять сигнатуру apply (протащить возможность рапортовать ошибку), либо использовать exit. Кроме того, стоит решить, что делать с частично записанными данными - либо оставить, как есть, либо удалить файл целиком, либо оставить только успешно записанные точки, но в любом случае поведение должно быть донесено до конечного пользователя утилиты либо комментарием в main, либо с помощью --help.

Запуск на тестовом примере

=================================================================
==6398==ERROR: LeakSanitizer: detected memory leaks

Direct leak of 8 byte(s) in 1 object(s) allocated from:
    #0 0x7fc1e3e3fb50 in __interceptor_malloc (/usr/lib/x86_64-linux-gnu/libasan.so.4+0xdeb50)
    #1 0x564f73aa0c6b in main src/main.c:83
    #2 0x7fc1e3991b96 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21b96)

Indirect leak of 72 byte(s) in 3 object(s) allocated from:
    #0 0x7fc1e3e3fb50 in __interceptor_malloc (/usr/lib/x86_64-linux-gnu/libasan.so.4+0xdeb50)
    #1 0x564f73aa1f00 in read_fn src/point_list.c:64
    #2 0x564f73aa17c0 in apply src/clist.c:72
    #3 0x564f73aa232b in read_list src/point_list.c:82
    #4 0x564f73aa0d1a in main src/main.c:89
    #5 0x7fc1e3991b96 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21b96)

Indirect leak of 24 byte(s) in 1 object(s) allocated from:
    #0 0x7fc1e3e3fb50 in __interceptor_malloc (/usr/lib/x86_64-linux-gnu/libasan.so.4+0xdeb50)
    #1 0x564f73aa1887 in add_point src/point_list.c:14
    #2 0x564f73aa230e in read_list src/point_list.c:81
    #3 0x564f73aa0d1a in main src/main.c:89
    #4 0x7fc1e3991b96 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21b96)

SUMMARY: AddressSanitizer: 104 byte(s) leaked in 5 allocation(s).

comment:2 Changed 4 years ago by Alexander Morozov

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

Вроде все исправил, но хочу заметить, что в задании написано: "вывести все точки на экран, использовать printf-строчку <fmt> для вывода. Должно встречаться ровно два спецификатора: первый %d соответствует x-координате, второй — y-координате; Разделители, не указанные в <fmt>, добавляться не должны (например, пробелы). После вывода ваша программа должна вывести перевод строки.", то есть реализация вроде бы была корректна, потому что %2d не бывает.

comment:3 Changed 4 years ago by Sokolov Viacheslav

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

Да, в рамках этого задания, наверное, корректная, но его можно было бы сформулировать иначе (по факту важно только количество аргументов и их типы).

В финальной версии остались глобальные состония:

  • in_file, out_file
  • 67 static unsigned char buffer[NUM_BYTES + 1];

выгоды от этого мало, потенциальных проблем много

Бонус не работает из-за неправильного ассерта (тестировать надо!)

30 assert(0 <= result && result < MAX_NUM);

В данном задании exit - ОК, но вообще его лучше избегать.

Note: See TracTickets for help on using tickets.