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 Sokolov Viacheslav

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

запуск на crop-rotate lena_512.bmp out 0 0 512 512

=================================================================
==32274==ERROR: LeakSanitizer: detected memory leaks

Direct leak of 786432 byte(s) in 512 object(s) allocated from:
    #0 0x7f49ad6adb50 in __interceptor_malloc (/usr/lib/x86_64-linux-gnu/libasan.so.4+0xdeb50)
    #1 0x55832014a05e in crop (/home/nicesap/HSE/svn/nosivskoy.vladislav/hw_01/hw_01+0x205e)
    #2 0x55832014c4cc in main (/home/nicesap/HSE/svn/nosivskoy.vladislav/hw_01/hw_01+0x44cc)
    #3 0x7f49ad1ffb96 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21b96)

Direct leak of 786432 byte(s) in 512 object(s) allocated from:
    #0 0x7f49ad6adb50 in __interceptor_malloc (/usr/lib/x86_64-linux-gnu/libasan.so.4+0xdeb50)
    #1 0x55832014a2da in rotate (/home/nicesap/HSE/svn/nosivskoy.vladislav/hw_01/hw_01+0x22da)
    #2 0x55832014c4f0 in main (/home/nicesap/HSE/svn/nosivskoy.vladislav/hw_01/hw_01+0x44f0)
    #3 0x7f49ad1ffb96 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21b96)

Direct leak of 786432 byte(s) in 512 object(s) allocated from:
    #0 0x7f49ad6adb50 in __interceptor_malloc (/usr/lib/x86_64-linux-gnu/libasan.so.4+0xdeb50)
    #1 0x558320149d51 in load_bmp (/home/nicesap/HSE/svn/nosivskoy.vladislav/hw_01/hw_01+0x1d51)
    #2 0x55832014c27b in main (/home/nicesap/HSE/svn/nosivskoy.vladislav/hw_01/hw_01+0x427b)
    #3 0x7f49ad1ffb96 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21b96)

SUMMARY: AddressSanitizer: 2359296 byte(s) leaked in 1536 allocation(s).

в программе можно легко сократить пиковое потребление памяти

save_int_in_byte реализуется проще:
*((int*)(dest)) = x;

вычисление сдвига стоит вынести в отдельную функцию

Кажется, сейчас выбрана не очень удачная архитектура приложения. Размеры изображения существует отдельно от изображения, с этим связаны различные ошибки: в разных местах перепутаны ширина и высота. Рекомендую позапускаться, попробовать вырезать, например, левый нижний прямоугольник какого-нибудь изображения.
В результирующем изображении неправильно заполняются поля bfSize, biSizeImage. Кроме того, в main получается очень много знания о том, как именно хранится изображение. Этого знания было бы хорошо избежать, оставив в main только управляющие конструкции (разбор аргументов командной строки; вызов функций, им соответствующих; обработка ошибок и очистка памяти).

stego не смотрел, потому что пока что основной функционал далек от работающего.

Сейчас не выполняется требование

При проблемах с аргументами, открытием файла, выделением памяти и прочим, программа должна корректно завершить работу и вернуть ненулевой код возврата.

поскольку не обрабатываются описанные возможные проблемные ситуации

comment:2 Changed 4 years ago by Vladislav Nosivskoy

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

comment:3 Changed 4 years ago by Sokolov Viacheslav

не хватает инклудов

╰─>$ 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 Sokolov Viacheslav

запуск на Лене

==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 Sokolov Viacheslav

biSizeImage и bfSize должны отличаться на 54

кажется, в stego неверно инетрпретируются (x, y) либо соответствие RGB каналов смещениям в данных (напоминаю, картинка хранится перевернутой)

comment:6 Changed 4 years ago by Vladislav Nosivskoy

Понял, что заслал в RGB, а должно быть BGR, сейчас исправлю

UPD: Исправил

Last edited 4 years ago by Vladislav Nosivskoy (previous) (diff)

comment:7 Changed 4 years ago by Sokolov Viacheslav

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

В финальной версии требование

При проблемах с аргументами, открытием файла, выделением памяти и прочим, программа должна корректно завершить работу и вернуть ненулевой код возврата.

выполнено не до конца:
при проблемах не будет освобождена память / закрыты файловые дескрипторы. Это не влияет на корректность в смысле каких-либо утечек, но влияет в том смысле, что отлаживаться в случае проблем будет труднее (санитайзер и другие инструменты будут считать, что произошла утечка памяти).
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)

Note: See TracTickets for help on using tickets.