#55 closed ожидается проверка (задача сдана)
Домашнее задание №2
Reported by: | agapova.tatyana | Owned by: | Vladimir Rutsky |
---|---|---|---|
Priority: | проверка | Milestone: | |
Component: | HA#2 huffman | Version: | |
Keywords: | Cc: | tatjana.agapova@… |
Description
Здравствуйте! Проверьте работу, пожалуйста.
Change History (7)
comment:1 Changed 7 years ago by
Milestone: | ha2-milestone1 → ha2-milestone2 |
---|---|
Type: | ожидается проверка → ожидаются исправления |
comment:2 Changed 7 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|
Исправлены замечания.
comment:3 Changed 7 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|
Замечания:
- Вы не инициализируете
stats.initialSize
при декодировании пустого файла, и фактически выводите произвольное число в статистике.
Исправьте, пожалуйста, в ближайшее время.
comment:4 Changed 7 years ago by
valgrind находит и другие места, где происходит чтение неинициализированной памяти.
***** abababab.1.in ****** ==18315== Use of uninitialised value of size 8 ==18315== at 0x403ADA: decode(std::vector<bool, std::allocator<bool> > const&, unsigned int, Node const*, std::vector<char, std::allocator<cha r> >&) (huffman.cpp:281) ==18315== by 0x403C28: decode(std::istream&, Node const*, CompressionStatistics&, unsigned short) (huffman.cpp:310) ==18315== by 0x403FE5: decompress(std::istream&, std::ostream&) (huffman.cpp:349) ==18315== by 0x4024CF: main (main.cpp:106) ***** 00_to_ff.256.in ****** ==19481== Invalid read of size 8 ==19481== at 0x403AC6: operator bool (stl_bvector.h:81) ==19481== by 0x403AC6: operator* (stl_bvector.h:321) ==19481== by 0x403AC6: operator[] (stl_bvector.h:863) ==19481== by 0x403AC6: decode(std::vector<bool, std::allocator<bool> > const&, unsigned int, Node const*, std::vector<char, std::allocator<cha r> >&) (huffman.cpp:281) ==19481== by 0x403C28: decode(std::istream&, Node const*, CompressionStatistics&, unsigned short) (huffman.cpp:310) ==19481== by 0x403FE5: decompress(std::istream&, std::ostream&) (huffman.cpp:349) ==19481== by 0x4024CF: main (main.cpp:106) ==19481== Address 0x5ae31e0 is 0 bytes after a block of size 256 alloc'd ==19481== at 0x4C2E0EF: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==19481== by 0x40484B: allocate (new_allocator.h:104) ==19481== by 0x40484B: allocate (alloc_traits.h:491) ==19481== by 0x40484B: _M_allocate (stl_bvector.h:492) ==19481== by 0x40484B: std::vector<bool, std::allocator<bool> >::_M_insert_aux(std::_Bit_iterator, bool) (vector.tcc:790) ==19481== by 0x403A33: push_back (stl_bvector.h:926) ==19481== by 0x403A33: readBoolVector(std::istream&) (huffman.cpp:270) ==19481== by 0x403B78: decode(std::istream&, Node const*, CompressionStatistics&, unsigned short) (huffman.cpp:298) ==19481== by 0x403FE5: decompress(std::istream&, std::ostream&) (huffman.cpp:349) ==19481== by 0x4024CF: main (main.cpp:106)
Поймите, где может происходить такая ошибка, и исправьте её (я крайне *не рекомендую* пытаться инициализировать всё подряд, т.к. не факт, что вам повезёт и вы угадаете, что вызывает данные ошибки).
comment:5 Changed 7 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|
Спасибо за замечания, исправила ошибку работы с памятью.
Note: See
TracTickets for help on using
tickets.
Замечания:
Huffman
статические --- сделайте их свободными функциями, а функции не относящиеся к интерфейсу кодирования/декодирования (например,buildFrequencyTable()
,readFrequencyTable()
,FrequencyTable
) перенесите в cpp файл.<iostream>
вhuffman.cpp
.out.put((char)(8 - remainder));
. Эта информация не является необходимой --- её можно вычислить имея таблицу встречаемости символов, не записывайте её в архив.Исправьте, пожалуйста, в течение 60 часов.