Opened 4 years ago

Closed 4 years ago

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

WW #14

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

Description


Change History (10)

comment:1 Changed 4 years ago by Egor Suvorov

Owner: changed from Sokolov Viacheslav to Surkov Petr
Type: ожидается проверкаожидаются исправления

comment:2 Changed 4 years ago by Surkov Petr

Owner: changed from Surkov Petr to Sokolov Viacheslav
Type: ожидаются исправленияожидается проверка

comment:3 Changed 4 years ago by Sokolov Viacheslav

mkdir obj
g++ -c -Wall -Wextra -Werror -Iinclude -g -fsanitize=address -std=c++17 src/Matrix.cpp -o obj/Matrix.o
src/Matrix.cpp: In member function ‘std::istream& Matrix::operator>>(std::istream&)’:
src/Matrix.cpp:69:34: error: catching polymorphic type ‘class std::ios_base::failure’ by value [-Werror=catch-value=]
   69 |     catch (std::istream::failure e) {
      |                                  ^
cc1plus: all warnings being treated as errors
Makefile:20: recipe for target 'obj/Matrix.o' failed
make: *** [obj/Matrix.o] Error 1

comment:4 Changed 4 years ago by Sokolov Viacheslav

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

9 explicit MatrixSize?() = default;

10 size_t rows = 0, columns = 0;

не лучше ли вместо этого реализовать конструктор по-умолчанию / не требовать конструктор по-умолчанию?

10 static const size_t ARRSZ = 10;
лучше constexpr, чтобы выделить intention (использовать на этапе компиляции)

==5817==ERROR: AddressSanitizer? failed to allocate 0xdfff0001000 (15392894357504) bytes at address 2008fff7000 (errno: 12)
==5817==ReserveShadowMemoryRange? failed while trying to map 0xdfff0001000 bytes. Perhaps you're using ulimit -v
на данных из условия

обработка std::bad_alloc дублируется, что намекает на то, что она расположена не в том месте, где надо

 38     Matrix thisCopy(*this);
 39 
 40     sz.columns = otherSz.columns;
 41     v.resize(sz.rows);
 42     for (auto &row : v) {
 43         row.resize(sz.columns);
 44         fill(row.begin(), row.end(), 0);
 45     }
 46 

здесь не так уж сложно обеспечить более строгую гарантию исключений; если аллокация не удастся, обьект окажется в сломанном состоянии

adl намеренно используется?

59 is.exceptions(std::istream::failbit | std::istream::badbit);
зачем делать это в этом месте, а не в main?

69 catch (const std::istream::failure& e) {
70 *this = thisCopy;
71 throw MatrixException?("LOAD: invalid file format.");

лучше поменять логику - заполнять копию и если все ок, делать присваивание (в идеале - move)

comment:5 Changed 4 years ago by Sokolov Viacheslav

Про address_sanitizer понял

62 v.resize(sz.rows, std::vector<int>(sz.columns));

тут ошибка

comment:6 Changed 4 years ago by Sokolov Viacheslav

по стандарту int может быть 16-битным, поэтому лучше везде использовать типы фиксированного размера

comment:7 Changed 4 years ago by Surkov Petr

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

comment:8 Changed 4 years ago by Sokolov Viacheslav

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

9 explicit MatrixSize?(size_t rows_, size_t columns_);

можно вместо конструктора использовать direct initialization

32 struct MatrixException? final {
33 explicit MatrixException?(std::string error_);
34 std::string error;
35 };

какая мотивация делать поле публичным?

22 arr[reg1] *= arr[reg2];
поехало

умножение реализовано неправильно, что легко видеть даже из размерностей

comment:9 Changed 4 years ago by Surkov Petr

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

comment:10 Changed 4 years ago by Sokolov Viacheslav

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