Opened 4 years ago
Closed 4 years ago
#508 closed ожидается проверка (задача сдана)
HW #1
Reported by: | Vladislav Nosivskoy | Owned by: | Sokolov Viacheslav |
---|---|---|---|
Component: | HW #1 (BMP) | Version: | 2.0 |
Keywords: | Cc: |
Description
Если что, номер коммита 1967, предыдущий был закоммичен с опечаткой.
Change History (7)
comment:1 Changed 4 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|
comment:2 Changed 4 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|---|
Version: | 1.0 → 2.0 |
comment:3 Changed 4 years ago by
не хватает инклудов
╰─>$ make gcc -Iinclude -c -fsanitize=address -Wall -Wextra src/bmp.c -o obj/bmp.o In file included from src/bmp.c:6:0: include/bmp.h:11:5: error: unknown type name ‘uint32_t’ uint32_t height, width; ^~~~~~~~ src/bmp.c:8:7: error: unknown type name ‘uint32_t’ const uint32_t BMP_HEADER_SIZE = 54; ^~~~~~~~ src/bmp.c: In function ‘free_bmp’: src/bmp.c:13:10: error: unknown type name ‘uint32_t’; did you mean ‘u_int32_t’? for (uint32_t i = 0; i < picture->height; ++i) { ^~~~~~~~ u_int32_t src/bmp.c: At top level: src/bmp.c:20:1: error: unknown type name ‘uint32_t’; did you mean ‘u_int32_t’? uint32_t get_shift(uint32_t width) { ^~~~~~~~ u_int32_t src/bmp.c:20:20: error: unknown type name ‘uint32_t’; did you mean ‘u_int32_t’? uint32_t get_shift(uint32_t width) { ^~~~~~~~ u_int32_t src/bmp.c: In function ‘load_bmp’: src/bmp.c:41:5: error: unknown type name ‘uint32_t’; did you mean ‘u_int32_t’? uint32_t shift = get_shift(picture->width); ^~~~~~~~ u_int32_t src/bmp.c:41:22: warning: implicit declaration of function ‘get_shift’ [-Wimplicit-function-declaration] uint32_t shift = get_shift(picture->width); ^~~~~~~~~ src/bmp.c:50:10: error: unknown type name ‘uint32_t’; did you mean ‘u_int32_t’? for (uint32_t i = 0; i < picture->height; ++i) { ^~~~~~~~ u_int32_t src/bmp.c:57:14: error: unknown type name ‘uint32_t’; did you mean ‘u_int32_t’? for (uint32_t j = 0; j < picture->width; ++j) { ^~~~~~~~ u_int32_t src/bmp.c: At top level: src/bmp.c:67:34: error: unknown type name ‘uint32_t’; did you mean ‘u_int32_t’? void change_header(BMP* picture, uint32_t width, uint32_t height) { ^~~~~~~~
comment:4 Changed 4 years ago by
запуск на Лене
==12097==ERROR: LeakSanitizer: detected memory leaks Direct leak of 24 byte(s) in 1 object(s) allocated from: #0 0x7f55af4e9b50 in __interceptor_malloc (/usr/lib/x86_64-linux-gnu/libasan.so.4+0xdeb50) #1 0x55611fdc5627 in rotate (/home/nicesap/HSE/svn/nosivskoy.vladislav/hw_01/hw_01+0x2627) #2 0x55611fdc7c0f in main (/home/nicesap/HSE/svn/nosivskoy.vladislav/hw_01/hw_01+0x4c0f) #3 0x7f55af03bb96 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21b96) Direct leak of 24 byte(s) in 1 object(s) allocated from: #0 0x7f55af4e9b50 in __interceptor_malloc (/usr/lib/x86_64-linux-gnu/libasan.so.4+0xdeb50) #1 0x55611fdc48d5 in load_bmp (/home/nicesap/HSE/svn/nosivskoy.vladislav/hw_01/hw_01+0x18d5) #2 0x55611fdc79f0 in main (/home/nicesap/HSE/svn/nosivskoy.vladislav/hw_01/hw_01+0x49f0) #3 0x7f55af03bb96 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21b96) Direct leak of 24 byte(s) in 1 object(s) allocated from: #0 0x7f55af4e9b50 in __interceptor_malloc (/usr/lib/x86_64-linux-gnu/libasan.so.4+0xdeb50) #1 0x55611fdc5154 in crop (/home/nicesap/HSE/svn/nosivskoy.vladislav/hw_01/hw_01+0x2154) #2 0x55611fdc7bd6 in main (/home/nicesap/HSE/svn/nosivskoy.vladislav/hw_01/hw_01+0x4bd6) #3 0x7f55af03bb96 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21b96) Indirect leak of 786432 byte(s) in 512 object(s) allocated from: #0 0x7f55af4e9b50 in __interceptor_malloc (/usr/lib/x86_64-linux-gnu/libasan.so.4+0xdeb50) #1 0x55611fdc4c37 in load_bmp (/home/nicesap/HSE/svn/nosivskoy.vladislav/hw_01/hw_01+0x1c37) #2 0x55611fdc79f0 in main (/home/nicesap/HSE/svn/nosivskoy.vladislav/hw_01/hw_01+0x49f0) #3 0x7f55af03bb96 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21b96) Indirect leak of 786432 byte(s) in 512 object(s) allocated from: #0 0x7f55af4e9b50 in __interceptor_malloc (/usr/lib/x86_64-linux-gnu/libasan.so.4+0xdeb50) #1 0x55611fdc5363 in crop (/home/nicesap/HSE/svn/nosivskoy.vladislav/hw_01/hw_01+0x2363) #2 0x55611fdc7bd6 in main (/home/nicesap/HSE/svn/nosivskoy.vladislav/hw_01/hw_01+0x4bd6) #3 0x7f55af03bb96 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21b96) Indirect leak of 786432 byte(s) in 512 object(s) allocated from: #0 0x7f55af4e9b50 in __interceptor_malloc (/usr/lib/x86_64-linux-gnu/libasan.so.4+0xdeb50) #1 0x55611fdc5926 in rotate (/home/nicesap/HSE/svn/nosivskoy.vladislav/hw_01/hw_01+0x2926) #2 0x55611fdc7c0f in main (/home/nicesap/HSE/svn/nosivskoy.vladislav/hw_01/hw_01+0x4c0f) #3 0x7f55af03bb96 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21b96) Indirect leak of 4096 byte(s) in 1 object(s) allocated from: #0 0x7f55af4e9b50 in __interceptor_malloc (/usr/lib/x86_64-linux-gnu/libasan.so.4+0xdeb50) #1 0x55611fdc5845 in rotate (/home/nicesap/HSE/svn/nosivskoy.vladislav/hw_01/hw_01+0x2845) #2 0x55611fdc7c0f in main (/home/nicesap/HSE/svn/nosivskoy.vladislav/hw_01/hw_01+0x4c0f) #3 0x7f55af03bb96 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21b96) Indirect leak of 4096 byte(s) in 1 object(s) allocated from: #0 0x7f55af4e9b50 in __interceptor_malloc (/usr/lib/x86_64-linux-gnu/libasan.so.4+0xdeb50) #1 0x55611fdc52bd in crop (/home/nicesap/HSE/svn/nosivskoy.vladislav/hw_01/hw_01+0x22bd) #2 0x55611fdc7bd6 in main (/home/nicesap/HSE/svn/nosivskoy.vladislav/hw_01/hw_01+0x4bd6) #3 0x7f55af03bb96 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21b96)
comment:5 Changed 4 years ago by
biSizeImage и bfSize должны отличаться на 54
кажется, в stego неверно инетрпретируются (x, y) либо соответствие RGB каналов смещениям в данных (напоминаю, картинка хранится перевернутой)
comment:6 Changed 4 years ago by
Понял, что заслал в RGB, а должно быть BGR, сейчас исправлю
UPD: Исправил
comment:7 Changed 4 years ago by
Resolution: | → задача сдана |
---|---|
Status: | assigned → closed |
В финальной версии требование
При проблемах с аргументами, открытием файла, выделением памяти и прочим, программа должна корректно завершить работу и вернуть ненулевой код возврата.
выполнено не до конца:
при проблемах не будет освобождена память / закрыты файловые дескрипторы. Это не влияет на корректность в смысле каких-либо утечек, но влияет в том смысле, что отлаживаться в случае проблем будет труднее (санитайзер и другие инструменты будут считать, что произошла утечка памяти).
fread / fwrite могут не состояться (проблемы с файловой системой, например, место на диске кончилось).
не выполнена первая часть требования
Достаточно проверить относительно тривиальные ошибки: выход за границы изображения и нехватку аргументов
38 picture->width = *((int*)(picture->header + 18));
39 picture->height = *((int*)(picture->header + 22));
здесь используется, что int конкретного размера (32 бита)
stego:
read_and_code_message может вернуть NULL, что не обрабатывается корректно в дальнейшей части программы
при записи в таблицу перепутано обращение по индексам: должно быть [y][x], а не [x][y].
Тем не менее по смыслу stego делает то, что нужно (с помощью приложения можно записать и прочитать тайное послание).
стиль:
main состоит из if-else ("лапша"), что тяжело для восприятия. Строковые константы дублируются (лучше бы именованные константы).
не хватает проверок контрактов (указатели ненулевые), в crop предполагается y >= h,...
в программе смешаны camelCase и snake_case (lenKey, return_result)
запуск на crop-rotate lena_512.bmp out 0 0 512 512
в программе можно легко сократить пиковое потребление памяти
save_int_in_byte реализуется проще:
*((int*)(dest)) = x;
вычисление сдвига стоит вынести в отдельную функцию
Кажется, сейчас выбрана не очень удачная архитектура приложения. Размеры изображения существует отдельно от изображения, с этим связаны различные ошибки: в разных местах перепутаны ширина и высота. Рекомендую позапускаться, попробовать вырезать, например, левый нижний прямоугольник какого-нибудь изображения.
В результирующем изображении неправильно заполняются поля bfSize, biSizeImage. Кроме того, в main получается очень много знания о том, как именно хранится изображение. Этого знания было бы хорошо избежать, оставив в main только управляющие конструкции (разбор аргументов командной строки; вызов функций, им соответствующих; обработка ошибок и очистка памяти).
stego не смотрел, потому что пока что основной функционал далек от работающего.
Сейчас не выполняется требование
поскольку не обрабатываются описанные возможные проблемные ситуации