Opened 5 years ago

Closed 4 years ago

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

WW #5

Reported by: Surkov Petr Owned by: Sokolov Viacheslav
Component: WW_c_io Version: 3.0
Keywords: Cc:

Description


Change History (6)

comment:1 Changed 5 years ago by Sokolov Viacheslav

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

Не собирется

src/main.c:39:12: error: suggest parentheses around assignment used as truth value [-Werror=parentheses]
     assert(file = fopen(load_path, "rb"));
            ^

Так вообще делать не стоит, потому что при release сборке (-DNDEBUG) вырежется важный код (все присваивание). В assert-ах не должно быть никаких модификаций чего-бы-то-ни-было.

13 obj/main.o: src/main.c | obj

не хватает зависимостей от заголовочных файлов

В остальном все хорошо, like за декомпозицию

comment:2 Changed 5 years ago by Surkov Petr

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

comment:3 Changed 5 years ago by Sokolov Viacheslav

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

10 int result = bytes[0] + (1 << 8) * bytes[1] + (1 << 16) * bytes[2];
более явно (и производительнее)
10 int result = ((int)bytes[0]) | (((int)bytes[1]) << 8) | (((int)bytes[2]) << 16);

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

comment:4 Changed 5 years ago by Surkov Petr

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

comment:5 Changed 5 years ago by Sokolov Viacheslav

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

Сообщение об ошибки misleading: memory - это оперативная память. Место на диске - это disk space.
assert здесь ставить не стоит, потому что это вполне ожидаемое поведение (я бы сказал, более ожидаемое и важное, чем нехватка оперативной памяти). Assert-ы в первую очередь для проверки инвариантов, то есть для валидации того, что программа идет по ожидаемому пути исполнения (и непонятно, что делать в противном случае). Падение по assert-у - аварийное завершение программы. Здесь же понятно, что делать, если место кончилось - штатно завершить работу, проинформировать об этом пользователя. Аварийно завершаться просто незачем, штатное завершение реализуется не сложнее.
Как я уже писал выше, единственное спорное место - это поведение в случае возникновения такой ситуации (что делать с уже записанными данными).

comment:6 Changed 4 years ago by Sokolov Viacheslav

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